TROISINH
BreakthroughsTraining Efficiency

DPO — RLHF không cần reward model, không cần RL loop

Direct Preference Optimization biến alignment thành bài toán phân loại nhị phân đơn giản, loại bỏ hoàn toàn vòng lặp PPO phức tạp và giảm 50% memory footprint

DPO (Direct Preference Optimization) là lý do tại sao giờ đây bạn có thể fine-tune Llama 3 trên laptop cá nhân thay vì cần cluster GPU. Thay vì chạy vòng lặp PPO với 4 mô hình đồng thời trong VRAM, DPO coi bài toán alignment như một bài phân loại đơn giản — nhanh hơn 2-3 lần, ổn định hơn, và không đòi hỏi kiến thức RL chuyên sâu.

Vấn đề

Reinforcement Learning from Human Feedback (RLHF) truyền thống — cụ thể là thuật toán PPO — là một cỗ máy Rube Goldberg trong thế giới AI. Để chạy PPO, bạn cần duy trì đồng thời bốn mô hình trong GPU memory: Policy model (đang học), Reference model (bản sao để so sánh), Reward model (đã train riêng để đánh giá), và Value model (Critic để tính advantage). Với một model 7B parameters, đây là khoảng 56GB VRAM chỉ cho weights, chưa kể gradients và optimizer states.

Vấn đề còn tệ hơn ở tính "động" của quá trình: PPO yêu cầu online generation. Tại mỗi bước training, model phải sinh ra batch completions mới, đánh giá bằng reward model, rồi tính advantage. Quá trình này không chỉ chậm mà còn cực kỳ nhạy cảm với hyperparameters — learning rate sai một chút, policy có thể collapse thành vòng lặp vô nghĩa hoặc overfit vào reward hacking (tìm cách "lừa" reward model mà không thực sự tốt hơn).

Cuối cùng, RLHF là một chuỗi "truyền tin": Human label → Reward model → Policy. Mỗi bước là một nguồn lỗi. Reward model chỉ là proxy cho preference thực sự, và khoảng cách giữa proxy và ground truth ngày càng lớn khi policy evolve.

Ý tưởng cốt lõi

DPO bắt đầu bằng một câu hỏi ngược đời: Thay vì học reward function rồi tối ưu policy, tại sao không tối ưu policy trực tiếp từ preference data?

Đây là "aha moment" cốt lõi: Policy của bạn chính là Reward Model.

Trong RLHF chuẩn, chúng ta tối ưu hóa objective có dạng:

maximize: E[r(x,y)] - β*KL(πθ || π_ref)

Với r(x,y) là reward, β là hệ số penalty để tránh drift quá xa khỏi base model.

Nhà nghiên cứu phát hiện điều kỳ diệu: nghiệm tối ưu của bài toán trên có dạng đóng (closed-form):

π*(y|x) ∝ π_ref(y|x) * exp(r(x,y)/β)

Nếu đảo ngược công thức này, ta rút ra reward function từ policy:

r(x,y) = β * log(πθ(y|x) / π_ref(y|x)) + const

Bây giờ, thay vì học r(x,y) bằng neural network riêng, ta dùng chính log-ratio giữa policy hiện tại và reference model làm reward. Khi so sánh cặp (chosen, rejected) trong preference data, ta áp dụng Bradley-Terry model — một cách mô hình hóa xác suất người dùng prefer A hơn B:

P(y_w ≻ y_l) = σ(r(y_w) - r(y_l))

Thay r(x,y) bằng biểu thức log-ratio phía trên:

P(y_w ≻ y_l) = σ(β * [log(πθ(y_w|x)/π_ref(y_w|x)) - log(πθ(y_l|x)/π_ref(y_l|x))])

Điều này có nghĩa là: DPO chỉ là binary classification. Ta tối ưu hóa cross-entropy loss để model gán xác suất cao hơn cho "chosen" và thấp hơn cho "rejected", dùng chính logits từ policy model. Không cần train reward model. Không cần vòng lặp RL. Không cần Value network.

Thành phần β đóng vai trò kép: vừa là temperature của Bradley-Terry, vừa là implicit KL-divergence penalty. Khi β nhỏ, model aggressive hơn trong việc tách biệt good/bad responses; khi β lớn, model conservative hơn, bám sát reference.

Tại sao nó hoạt động

DPO hoạt động vì nó khai thác tính tuyến tính của gradient trong không gian log-probability. Thay vì ước lượng giá trị tuyệt đối của một response (cực kỳ khó với không gian token vô hạn), DPO chỉ cần so sánh tương đối: response này tốt hơn response kia bao nhiêu "logit unit".

Quan trọng hơn, DPO là offline algorithm. Toàn bộ training data (prompt, chosen, rejected) được generate trước một lần bởi reference model (hoặc bất kỳ model nào), sau đó DPO chỉ cần chạy gradient descent trên static dataset này. Điều này loại bỏ overhead của online generation — không còn phải sinh text trong vòng lặp training, không còn latency của reward inference.

Tuy nhiên, có một trade-off subtle: vì không có reward model để "filter" noise, DPO cực kỳ nhạy cảm với chất lượng preference data. Nếu trong dataset có cặp (chosen, rejected) bị đảo ngược hoặc ambiguous, DPO sẽ overfit ngay lập tức. Đây là lý do các bài toán domain adaptation (legal, medical) dùng DPO thường cần data curation kỹ lưỡng.

Một hiện tượng thú vị là length bias: DPO models có xu hướng drift về responses dài hơn, vì trong nhiều preference dataset, humans thường đánh giá cao câu trả lời chi tiết hơn. Không có explicit reward shaping để chống lại điều này như trong PPO.

Ý nghĩa thực tế

Hiệu quả tài nguyên: DPO giảm ~50% memory footprint so với PPO (chỉ cần policy và reference, không cần reward/value models). Điều này khiến nó trở thành lựa chọn mặc định cho QLoRA — bạn có thể chạy DPO với 4-bit quantization trên RTX 4090 24GB cho model 70B.

Tốc độ: Training nhanh hơn 2-3 lần vì không có overhead từ online sampling. Không cần điều chỉnh hyperparameters phức tạp như PPO (clip ratio, value loss coef, etc.).

Giới hạn: DPO là single-stage, offline. Không giống PPO có thể iterative (generate → reward → update → repeat), DPO chỉ chạy một lần trên static data. Nghiên cứu NeurIPS 2024 cho thấy nếu có cùng data và compute, PPO vẫn có thể outperform DPO, nhưng DPO chiến thắng về cost-efficiency và ổn định.

Trong thực tế, DPO đã trở thành công cụ "alignment cho mọi nhà": Mistral dùng DPO cho Mixtral, Meta dùng cho Llama 3 Instruct, và hàng trăm fine-tune open-source (Zephyr, Starling) đều dựa trên DPO thay vì PPO phức tạp.

Đào sâu hơn

Paper gốc: Direct Preference Optimization: Your Language Model is Secretly a Reward Model (Rafailov et al., 2023) — trình bày đầy đủ toán học và chứng minh sự tương đương với RLHF.

Cùng cụm (training-efficiency):

  • QLoRA — Kết hợp 4-bit quantization với DPO để train model lớn trên GPU consumer
  • PEFT Overview — Các phương pháp efficient fine-tuning bao gồm LoRA thường dùng với DPO
  • Gradient Accumulation — Kỹ thuật giả lập batch lớn khi DPO trên VRAM hạn chế

Đọc tiếp:

  • Online DPO — Phiên bản generate response on-the-fly để giải quyết distribution shift
  • ORPO — Gộp SFT và DPO thành một stage duy nhất, không cần reference model
  • SimPO — Bỏ luôn reference model, chỉ dùng average log-probability
  • Alignment Basics — Nền tảng RLHF và Bradley-Terry model (Level 0)
  • GRPO — Cho reasoning tasks, loại bỏ cả value model trong RL

On this page