Fine-Tuning
Fine-tuning - Tinh chỉnh mô hình
Bạn có mô hình GPT-4 biết mọi thứ. Bạn muốn nó trở thành chuyên gia y khoa. Cách nào hiệu quả nhất?
Hình minh họa
Parameter-Efficient Fine-Tuning: 4 phương pháp
Đỏ = trọng số được cập nhật (trainable). Xám = đóng băng (frozen). Chọn phương pháp và điều chỉnh tỉ lệ trainable để xem mạng thay đổi thế nào.
Low-Rank Adaptation · 2021
Chèn ma trận low-rank A·B song song với W. Đóng băng W, chỉ học A & B. Gần như không mất accuracy.
Hình minh họa
Accuracy vs tham số học (log scale)
Càng nhiều tham số học, accuracy càng tăng — nhưng đường cong bão hoà rất sớm. LoRA chỉ dùng 0.1–1% tham số đã đạt ~99% accuracy của full FT.
78.6%
Accuracy ước tính
0.30%
Tham số học
333×
Tiết kiệm so với full FT
Hình minh họa
VRAM sử dụng: LLaMA-7B (ước lượng)
Tham chiếu: full FT trên 7B LLaMA cần ~80–100 GB VRAM (fp16 + Adam). LoRA có thể chạy trên 1 GPU 24 GB. QLoRA đẩy xuống dưới 16 GB.
Chi tiết cho phương pháp đang chọn (LoRA):
- Trọng số đóng băng: ~14 GB
- Gradient + Adam cho phần học: ~0 GB
- Activations & overhead: ~8 GB
- Tổng: ~23 GB
Fine-tuning không phải dạy mô hình kiến thức mới từ con số 0 — mà là kích hoạt và chuyên biệt hoá kiến thức mà nó đã biết sẵn. Giống như bác sĩ đa khoa đã hiểu cơ thể người, chỉ cần học thêm chuyên khoa tim mạch thay vì vào lại trường y từ năm nhất.
Điểm then chốt của PEFT: cập nhật cần thiết ΔW có rank hiệu dụng rất thấp. Nghĩa là phần kiến thức mới mà model cần học thực ra rất nhỏ — và LoRA chính là cách khai thác sự thật đó để tiết kiệm 99% bộ nhớ mà vẫn giữ gần như toàn bộ chất lượng.
Bạn fine-tune mô hình trên 500 mẫu dữ liệu pháp lý trong 20 epoch. Mô hình đạt 99% trên dữ liệu huấn luyện nhưng chỉ 60% trên dữ liệu mới. Vấn đề là gì?
Công ty bạn có 5 sản phẩm cần chatbot chuyên biệt. Ngân sách GPU hạn chế. Kiến trúc triển khai nào hợp lý nhất?
Hình minh họa
Phòng thí nghiệm Trainer
Điều chỉnh 3 tham số và quan sát chất lượng mô hình thay đổi. Đây là các hyperparameter quan trọng nhất khi gọi Trainer.train() trong Hugging Face.
73.5%
Chất lượng ước tính
Thấp
Nguy cơ overfitting
Thấp
Nguy cơ quên kiến thức cũ
Giải thích
Fine-tuning là quá trình huấn luyện thêm một mô hình đã được pre-train trên tập dữ liệu chuyên biệt nhỏ hơn, nhằm thích ứng mô hình cho tác vụ hoặc lĩnh vực cụ thể. Về mặt toán học:
Trong đó được khởi tạo từ trọng số pre-train thay vì ngẫu nhiên. Đây chính là sức mạnh của transfer learning — không phải bắt đầu từ số 0. So với prompt engineering, fine-tuning thay đổi trọng số mô hình vĩnh viễn (xem thêm Fine-tuning vs Prompting).
LoRA re-formulation. Thay vì học toàn bộ ΔW ∈ ℝd×d, LoRA giả định ΔW có rank thấp và phân rã:
Trong forward pass: . Khi fine-tune xong, có thể merge để không tăng chi phí inference.
Các loại fine-tuning phổ biến:
- Full Fine-tuning: Cập nhật tất cả trọng số. Hiệu quả nhất nhưng tốn bộ nhớ GPU và dễ overfitting trên tập nhỏ.
- SFT (Supervised Fine-Tuning): Huấn luyện trên các cặp (instruction, response) để mô hình học cách tuân theo chỉ dẫn. Bước đầu của RLHF.
- PEFT (Parameter-Efficient): Chỉ cập nhật một phần nhỏ trọng số — LoRA, Adapter, Prefix, Prompt Tuning. Tiết kiệm bộ nhớ đáng kể.
- DPO / Alignment: Sau SFT, dùng pairwise preferences để căn chỉnh hành vi (DPO, RLHF, GRPO).
from transformers import AutoModelForCausalLM, Trainer, TrainingArguments
from datasets import load_dataset
# Tải mô hình đã pre-train
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3-8B")
# Chuẩn bị dữ liệu chuyên biệt
dataset = load_dataset("json", data_files="medical_qa.jsonl")
# Fine-tune với learning rate nhỏ (tránh phá vỡ kiến thức cũ)
args = TrainingArguments(
output_dir="./llama-medical",
learning_rate=2e-5, # Nhỏ hơn pre-training 10-100x
num_train_epochs=3, # Ít epoch tránh overfitting
per_device_train_batch_size=4,
warmup_ratio=0.03,
lr_scheduler_type="cosine",
gradient_checkpointing=True, # Tiết kiệm VRAM
bf16=True, # Mixed precision
)
trainer = Trainer(model=model, train_dataset=dataset["train"], args=args)
trainer.train()
trainer.save_model()from transformers import AutoModelForCausalLM
from peft import LoraConfig, get_peft_model, TaskType
# Tải backbone và "đóng băng" trọng số
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3-8B",
load_in_4bit=True, # → QLoRA: backbone 4-bit, adapter fp16
)
# Chèn LoRA adapter
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=8, # rank — càng lớn càng nhiều tham số
lora_alpha=16, # scaling
lora_dropout=0.05,
target_modules=["q_proj", "v_proj"], # chỉ attention Q, V
)
model = get_peft_model(model, lora_config)
# Chỉ 0.1–0.3% tham số được học
model.print_trainable_parameters()
# → trainable params: 8,388,608 || all params: 8,038,274,048
# || trainable%: 0.104
# Phần còn lại giống Trainer thông thường:
trainer.train()
model.save_pretrained("./llama-medical-lora") # ~65 MB, không phải 14 GB!- Fine-tuning là huấn luyện thêm mô hình pre-train trên dữ liệu chuyên biệt — tận dụng transfer learning thay vì học từ đầu. Chi phí giảm từ hàng trăm triệu USD xuống hàng trăm USD.
- Ba tham số huấn luyện quan trọng: số lượng dữ liệu (càng đa dạng càng tốt), learning rate (nhỏ: 1-5e-5), số epoch (ít: 2-5).
- Catastrophic forgetting: lr quá lớn hoặc fine-tune quá lâu → mô hình quên kiến thức cũ. Luôn đo lại accuracy trên task gốc trước và sau fine-tune.
- PEFT là mặc định hiện đại: LoRA (phổ biến nhất, 0.1–1% tham số), Adapter (chèn module nhỏ), Prefix Tuning (thêm vector học được). Thường đạt ≥ 97% accuracy của full FT.
- LoRA = ΔW chia thành hai ma trận low-rank B·A. Tiết kiệm VRAM 80–90% và cho phép multi-tenant: nhiều adapter cùng một backbone, hot-swap trong runtime.
- Quy trình hiện đại cho instruction-following LLM: pre-train → SFT (fine-tune có nhãn) → DPO/RLHF (alignment). Ứng dụng phổ biến: chatbot chuyên ngành, copilot, domain expert.
Kiểm tra hiểu biết
Tại sao fine-tuning hiệu quả hơn huấn luyện từ đầu?