การปรับแต่งพารามิเตอร์อย่างมีประสิทธิภาพ (PEFT) เป็นแนวทางใหม่สำหรับการปรับแต่งโมเดลภาษาขนาดใหญ่ (LLM) อย่างละเอียด ซึ่งช่วยลดความต้องการด้านการคำนวณและหน่วยความจำได้อย่างมีประสิทธิภาพ เมื่อเทียบกับวิธีการแบบดั้งเดิม

PEFT ใช้การปรับแต่งอย่างละเอียดเฉพาะชุดย่อยเล็กๆ ของพารามิเตอร์ของโมเดล ในขณะที่หยุดเครือข่ายส่วนใหญ่ที่ได้รับการฝึกอบรมล่วงหน้าไว้ กลยุทธ์นี้ช่วยลดการลืมอันเลวร้ายและลดต้นทุนด้านการคำนวณและการจัดเก็บลงอย่างมาก ฉันได้เขียนเกี่ยวกับวิธีการแบบดั้งเดิมใน "บทความ" อีกฉบับหนึ่งนี้

วิธีการ PEFT ต่างๆ ได้รับการพัฒนา เช่น:

  1. การปรับแต่งพร้อมท์ที่แนะนำงาน: เทคนิคนี้ใช้พร้อมต์เฉพาะงานเพื่อเป็นแนวทางในเอาท์พุตของ LLM โดยไม่จำเป็นต้องฝึกโมเดลทั้งหมดใหม่สำหรับงานเฉพาะ
  2. การปรับตัวระดับต่ำ (LoRA): ด้วยการประมาณพารามิเตอร์ของ LLM ด้วยเมทริกซ์ระดับต่ำ LoRA จะลดจำนวนของพารามิเตอร์ที่ได้รับการปรับแต่งอย่างละเอียด ซึ่งจะช่วยเพิ่มประสิทธิภาพ LLM
  3. อะแดปเตอร์: เลเยอร์พิเศษขนาดเล็กเหล่านี้สามารถเพิ่มลงใน LLM เพื่อการปรับเปลี่ยนงาน โดยให้ความยืดหยุ่นและการปรับปรุงประสิทธิภาพ
  4. การปรับแต่งคำนำหน้าที่เกี่ยวข้องกับงาน: การปรับแต่ง LLM อย่างละเอียดบนคำนำหน้าตัวแทนที่เกี่ยวข้องกับงานที่มีอยู่ ช่วยเพิ่มประสิทธิภาพและความสามารถในการปรับตัวของงาน

เทคนิค PEFT แสดงให้เห็นถึงประสิทธิภาพในงานต่างๆ รวมถึงการอนุมานภาษาธรรมชาติ การตอบคำถาม และการสรุปข้อความ นักวิจัยและผู้ปฏิบัติงานสามารถใช้ประโยชน์จาก PEFT เพื่อใช้ LLM ในงานที่หลากหลายได้อย่างมีประสิทธิภาพ

ต่อไปนี้เป็นข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับวิธีการ PEFT ที่กล่าวถึง:

  1. การปรับแต่งพร้อมท์ที่แนะนำงาน: ด้วยการเพิ่มพร้อมท์เฉพาะงานลงในอินพุตข้อมูล LLM จะดำเนินการตามที่ต้องการ ตัวอย่างเช่น การแจ้งว่า “เมืองหลวงของบราซิลคืออะไร” แนะนำให้ LLM สร้างคำตอบ "บราซิเลีย"
  2. การปรับอันดับต่ำ (LoRA): วิธีการขั้นสูงนี้จะประมาณค่าพารามิเตอร์ของ LLM โดยใช้เมทริกซ์ระดับต่ำ ซึ่งช่วยเพิ่มประสิทธิภาพได้อย่างมาก
  3. อะแดปเตอร์: อะแดปเตอร์เป็นเลเยอร์ขนาดเล็กอเนกประสงค์ที่รวมอยู่ใน LLM เพื่อเพิ่มประสิทธิภาพการทำงานเฉพาะงาน
  4. การปรับแต่งคำนำหน้าที่เกี่ยวข้องกับงาน: เพื่อปรับแต่ง LLM สำหรับการตอบคำถาม จะใช้ลำดับคำนำหน้าเฉพาะงานแทนคำถาม

ด้านล่างนี้คือตัวอย่างโค้ด Python ที่สาธิตวิธีการใช้การปรับพารามิเตอร์อย่างมีประสิทธิภาพ (PEFT) สำหรับการปรับแต่งโมเดลภาษาที่ได้รับการฝึกล่วงหน้าอย่างละเอียดโดยใช้ไลบรารี Hugging Face Transformers เราจะใช้ TextClassificationPipeline เพื่อปรับแต่งโมเดล BERT ที่ได้รับการฝึกอบรมล่วงหน้าบนชุดข้อมูล IMDb สำหรับการวิเคราะห์ความคิดเห็น

import torch
from transformers import BertTokenizer, BertForSequenceClassification, AdamW, pipeline
from datasets import load_dataset

# Load the IMDb dataset
dataset = load_dataset("imdb")

# Load the pre-trained BERT model and tokenizer
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)  # Binary sentiment analysis

# Tokenize the dataset
def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

tokenized_dataset = dataset.map(tokenize_function, batched=True)

# Split the dataset into training and validation sets
train_dataset, val_dataset = tokenized_dataset["train"], tokenized_dataset["test"].train_test_split(test_size=0.1)

# Hyperparameters and Training Configuration
learning_rate = 2e-5
batch_size = 16
num_epochs = 3

# Define the optimizer
optimizer = AdamW(model.parameters(), lr=learning_rate)

# Fine-tuning function using PEFT
def fine_tune(model, train_dataset, optimizer, num_epochs, batch_size):
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model.to(device)

    for epoch in range(num_epochs):
        total_loss = 0
        model.train()

        for i in range(0, len(train_dataset), batch_size):
            batch = train_dataset[i:i+batch_size]
            input_ids = torch.tensor(batch["input_ids"]).to(device)
            attention_mask = torch.tensor(batch["attention_mask"]).to(device)
            labels = torch.tensor(batch["label"]).to(device)

            optimizer.zero_grad()
            outputs = model(input_ids=input_ids, attention_mask=attention_mask, labels=labels)
            loss = outputs.loss
            loss.backward()
            optimizer.step()
            total_loss += loss.item()

        print(f"Epoch: {epoch+1}/{num_epochs}, Average Loss: {total_loss / len(train_dataset)}")

# Fine-tune the model using PEFT
fine_tune(model, train_dataset, optimizer, num_epochs, batch_size)

# Save the fine-tuned model
output_dir = "fine_tuned_model/"
model.save_pretrained(output_dir)
tokenizer.save_pretrained(output_dir)

# Load the fine-tuned model using the TextClassificationPipeline
classifier = pipeline("text-classification", model=output_dir, tokenizer=output_dir)

# Test the fine-tuned model on a sample text
sample_text = "This movie was fantastic! I loved every bit of it."
result = classifier(sample_text)
print(result)

โค้ดนี้สาธิตวิธีการใช้ PEFT สำหรับการปรับแต่งโมเดล BERT สำหรับการวิเคราะห์ความรู้สึกบนชุดข้อมูล IMDb โมเดลที่ได้รับการปรับแต่งอย่างละเอียดสามารถบันทึกและนำไปใช้สำหรับการอนุมานได้โดยใช้ TextClassificationPipeline

PEFT (การเรียนรู้ด้วยการถ่ายโอนที่มีประสิทธิภาพด้วยพารามิเตอร์) เป็นแนวทางใหม่ในการถ่ายโอนการเรียนรู้ที่ออกแบบมาให้มีประสิทธิภาพมากกว่าการปรับแต่งแบบละเอียดแบบดั้งเดิม PEFT ทำสิ่งนี้โดยใช้กระบวนการสองขั้นตอน:

  1. มีการเพิ่มเลเยอร์อะแดปเตอร์จำนวนเล็กน้อยลงในโมเดลที่ได้รับการฝึกล่วงหน้า เลเยอร์อะแดปเตอร์เหล่านี้มีหน้าที่ในการปรับโมเดลให้เข้ากับงานใหม่
  2. เลเยอร์ของอะแดปเตอร์ได้รับการฝึกฝนโดยใช้ข้อมูลจำนวนเล็กน้อยจากงานใหม่

กระบวนการสองขั้นตอนนี้ทำให้ PEFT สามารถบรรลุประสิทธิภาพที่ดีในงานใหม่ ในขณะที่ใช้พารามิเตอร์น้อยกว่าการปรับแต่งแบบละเอียดแบบดั้งเดิมอย่างมาก

ในทางตรงกันข้าม การเรียนรู้แบบถ่ายโอนเป็นวิธีทั่วไปในการใช้แบบจำลองที่ได้รับการฝึกอบรมล่วงหน้ากับงานใหม่ การเรียนรู้แบบถ่ายโอนสามารถนำมาใช้ได้หลากหลายวิธี ได้แก่:

  • การเรียนรู้การถ่ายโอนตามคุณลักษณะ: ในการเรียนรู้การถ่ายโอนตามคุณลักษณะ คุณลักษณะที่แยกจากแบบจำลองที่ได้รับการฝึกอบรมล่วงหน้าจะถูกนำมาใช้เป็นข้อมูลป้อนเข้าสู่แบบจำลองใหม่ที่ได้รับการฝึกอบรมเกี่ยวกับงานใหม่
  • การปรับแต่งอย่างละเอียด: ในการปรับแต่งอย่างละเอียด น้ำหนักของแบบจำลองที่ได้รับการฝึกล่วงหน้าจะได้รับการอัปเดตโดยใช้ข้อมูลจำนวนเล็กน้อยจากงานใหม่
  • อะแดปเตอร์ที่ได้รับการฝึกอบรม: อะแดปเตอร์ที่ได้รับการฝึกอบรมเป็นประเภทของชั้นอะแดปเตอร์ที่ได้รับการฝึกอบรมล่วงหน้ากับชุดข้อมูลขนาดใหญ่ที่ไม่มีป้ายกำกับ อะแดปเตอร์ที่ได้รับการฝึกล่วงหน้าสามารถใช้เพื่อปรับปรุงประสิทธิภาพของ PEFT ในงานใหม่ได้

PEFT เป็นนิยายหรือเปล่า? ใช่ PEFT เป็นแนวทางใหม่ในการถ่ายทอดการเรียนรู้ที่ออกแบบมาให้มีประสิทธิภาพมากกว่าการปรับแต่งแบบเดิมๆ อย่างไรก็ตาม การถ่ายโอนการเรียนรู้เป็นแนวทางทั่วไปในการใช้แบบจำลองที่ได้รับการฝึกอบรมล่วงหน้ากับงานใหม่