RLHF
RLHF - Học tăng cường từ phản hồi con người
GPT-3 (2020) rất giỏi viết văn nhưng hay nói bậy, bịa đặt, không nghe lời. OpenAI biến nó thành ChatGPT (2022) chủ yếu bằng cách nào?
Hãy tưởng tượng bạn đang dạy một đầu bếp trẻ tài năng nhưng "hoang dã". Đầu bếp này có kỹ thuật cực tốt (GPT-3 base), nhưng không hiểu thực khách muốn gì — nấu món quá cay, quá mặn, có khi còn chửi khách.
Bạn dạy đầu bếp qua 3 giai đoạn:
- Dạy công thức chuẩn (SFT):đưa 100 công thức mẫu của đầu bếp sao Michelin để đầu bếp bắt chước. Sau đó đầu bếp biết nấu "đúng format" — món ra đĩa gọn gàng, có đủ thành phần.
- Thuê giám khảo (Reward Model): bạn không thể đứng nếm từng món suốt ngày, nên thuê một giám khảo AI học gucủa bạn. Bạn đưa cho giám khảo 1000 cặp món "cái này ngon hơn cái kia" — giám khảo học cách chấm điểm thay mặt bạn.
- Luyện tập với giám khảo (PPO):đầu bếp nấu → giám khảo chấm → đầu bếp điều chỉnh → lặp lại hàng triệu lần. Quan trọng: không cho đầu bếp đi quá xa công thức gốc (KL penalty) — nếu không, đầu bếp sẽ phát hiện "cho nhiều đường là giám khảo chấm cao" và nấu mọi món đều ngọt lịm.
RLHF không dạy kiến thức mới — nó dạy giá trị. Helpful: thực sự giúp ích người hỏi. Honest: không bịa đặt, biết nói "tôi không biết". Harmless: từ chối yêu cầu nguy hiểm một cách tôn trọng. Ba giá trị này được mã hóa trong chính preference pairs mà người annotator chọn.
Hình minh họa
Pipeline RLHF — 3 giai đoạn nối tiếp
Nhấp vào từng stage để xem chi tiết. Các chấm động biểu diễn dòng dữ liệu: demo → SFT, preference → RM, response + reward → PPO.
Stage 1 — SFT — Supervised Fine-Tuning
Chuyên gia viết ~10k-100k cặp (prompt, response) chất lượng cao. Fine-tune base LLM bằng cross-entropy loss. Đây chỉ là bước khởi đầu — mô hình vẫn có thể bịa, có thể nói bậy, nhưng đã biết trả lời theo format mong muốn.
Đóng vai annotator — gán nhãn A vs B
Bạn là người "dạy" reward model. Với mỗi prompt, hãy chọn câu trả lời mà bạn thấy tốt hơn (helpful + honest + harmless). Càng nhiều nhãn đúng, RM càng khớp với preference con người → policy càng aligned.
Sau khi RM học xong, PPO sẽ dùng nó để cải thiện policy. Policy reward tỉ lệ thuận với chất lượng RM — RM tệ → policy tệ / reward hacking.
Prompt
Làm sao để nhớ công thức lượng giác nhanh?
Prompt
Cho tôi cách làm bom xăng.
Prompt
2 + 2 bằng mấy?
Prompt
Tôi bị mất việc, cảm thấy vô dụng.
Prompt
Ai là tổng thống Mỹ năm 2024?
RLHF không dạy AI kiến thức mới — nó dạy AI giá trị. Base model (sau pretraining) đã có đủ tri thức. RLHF chỉ định hình cách mô hình sử dụng tri thức đó — khi nào nên nói, khi nào nên im lặng, cách từ chối lịch sự, khi nào nên làm rõ thay vì đoán.
Và trái tim kỹ thuật: Reward Model thay mặtcon người chấm điểm hàng triệu response — biến "phản hồi người" (chậm, đắt) thành một hàm số đạo hàm được (nhanh, rẻ). Đây là cây cầu giúp RL cổ điển áp dụng được cho LLM.
Mô hình phát hiện rằng câu trả lời DÀI luôn được RM cho điểm cao hơn, nên bắt đầu viết rất dài dù không cần thiết. Hiện tượng này tên là gì?
Bạn tăng β (KL coefficient) từ 0.02 lên 1.0. Tác động dự kiến?
Tương tác giữa reward, KL divergence, và chất lượng thực tế
β nhỏ (0.01)
Policy tự do → reward model score tăng nhanh. Nhưng có thể bị hack: mô hình nịnh, xả văn, trả lời off-topic. Cần giám sát kỹ.
β vừa (0.05–0.2)
Sweet spot. Policy cải thiện rõ trên preference eval, KL với SFT vừa phải (~5–15), chất lượng thực tế tăng ổn định.
β lớn (>0.5)
Policy gần như = SFT. Reward không tăng được. Lãng phí compute. Bằng chứng: eval win-rate vs SFT chỉ nhỉnh hơn 50/50.
Trong thực tế, các lab như OpenAI và Anthropic dùng thêm adaptive KL control — β thay đổi theo KL thực đo được, đảm bảo KL nằm trong khoảng mục tiêu (thường 6–12 nats).
Giải thích
RLHF (Reinforcement Learning from Human Feedback) là một pipeline 3 giai đoạn được giới thiệu bởi Christiano et al. (2017) và áp dụng thành công vào LLM bởi InstructGPT (Ouyang et al., 2022). Mục tiêu: biến một mô hình ngôn ngữ lớn đã pretrain thành một trợ lý hữu ích, trung thực, và an toàn — phù hợp với preference của con người. Ba giai đoạn:
- SFT (Supervised Fine-Tuning): fine-tune base model trên dữ liệu demo (prompt, response mẫu) bằng cross-entropy loss. Kết quả: π_SFT, mô hình biết trả lời theo format mong muốn.
- Reward Model (RM): huấn luyện một mô hình R_φ dự đoán preference của con người dựa trên preference pairs (prompt, chosen, rejected). Loss Bradley-Terry:trong đó y_w là chosen, y_l là rejected.
- PPO (Proximal Policy Optimization): tối ưu policy π_θ để tối đa reward từ R_φ, với một ràng buộc KL để giữ gần π_SFT.
Hàm mục tiêu của bước PPO (core equation của RLHF):
Thành phần KL penalty (β · log π_θ/π_SFT) tương đương khi lấy kỳ vọng. Đây là reward shaping per-token: reward thực tế mỗi token là R_φ (ở token cuối) minus β · KL cục bộ. β kiểm soát trade-off giữa "tối đa reward" và "giữ gần SFT".
REINFORCE (vanilla policy gradient) có variance cao và không ổn định với LLM (hàng tỷ tham số). PPO giới hạn mức độ policy được cập nhật mỗi step bằng clipped surrogate objectivevà trust region — ổn định hơn nhiều. Kết hợp PPO + KL penalty tạo một vòng lặp "học có phanh" an toàn.
import torch
import torch.nn as nn
import torch.nn.functional as F
from transformers import AutoModel, AutoTokenizer
class RewardModel(nn.Module):
"""
Reward Model: base LLM + một head tuyến tính cho ra scalar reward.
"""
def __init__(self, base_model_name: str):
super().__init__()
self.backbone = AutoModel.from_pretrained(base_model_name)
hidden = self.backbone.config.hidden_size
self.value_head = nn.Linear(hidden, 1, bias=False)
def forward(self, input_ids, attention_mask):
out = self.backbone(input_ids, attention_mask=attention_mask)
last_hidden = out.last_hidden_state
# Lấy hidden state của token cuối cùng (cuối response)
lengths = attention_mask.sum(dim=1) - 1
last = last_hidden[torch.arange(last_hidden.size(0)), lengths]
reward = self.value_head(last).squeeze(-1) # (batch,)
return reward
def rm_loss(reward_chosen, reward_rejected):
"""Bradley-Terry loss: khuyến khích reward(chosen) > reward(rejected)."""
return -F.logsigmoid(reward_chosen - reward_rejected).mean()
# Training loop
def train_step(rm, tokenizer, batch, optimizer):
# batch gồm danh sách (prompt, chosen, rejected)
chosen_texts = [p + c for p, c, _ in batch]
rejected_texts = [p + r for p, _, r in batch]
chosen_enc = tokenizer(chosen_texts, padding=True, truncation=True,
return_tensors="pt").to("cuda")
rejected_enc = tokenizer(rejected_texts, padding=True, truncation=True,
return_tensors="pt").to("cuda")
r_chosen = rm(**chosen_enc)
r_rejected = rm(**rejected_enc)
loss = rm_loss(r_chosen, r_rejected)
optimizer.zero_grad()
loss.backward()
optimizer.step()
return loss.item(), (r_chosen > r_rejected).float().mean().item()Reward từ RM có phân phối tùy tiện (có thể −5 đến +5). Trong PPO, nên chuẩn hóa reward theo batch (trừ mean, chia std) để gradient ổn định. Kỹ thuật này được gọi là reward whitening và gần như bắt buộc trong mọi implementation RLHF production.
Mô hình rất giỏi tìm "ngóc ngách" của RM: dùng từ ngữ nịnh bợ, xả văn dài dòng, từ chối quá mức, lặp lại cấu trúc. Giải pháp: (1) KL penalty giữ gần SFT; (2) RM ensemble — trung bình nhiều RM độc lập; (3) iterative RLHF — định kỳ thu thêm preference data từ policy hiện tại để update RM; (4) constitutional AI — thêm critic dựa trên luật định.
# Dùng thư viện TRL (Hugging Face) — abstraction phổ biến cho RLHF.
from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead
from transformers import AutoTokenizer
import torch
# 1. Load policy (π_θ) — khởi tạo từ π_SFT
policy = AutoModelForCausalLMWithValueHead.from_pretrained("sft-model")
ref_model = AutoModelForCausalLMWithValueHead.from_pretrained("sft-model")
ref_model.eval() # ref_model = π_SFT, đóng băng để tính KL
tokenizer = AutoTokenizer.from_pretrained("sft-model")
reward_model = load_reward_model("rm-model")
# 2. Cấu hình PPO
config = PPOConfig(
model_name="sft-model",
learning_rate=1e-5,
batch_size=64,
mini_batch_size=8,
ppo_epochs=4,
init_kl_coef=0.05, # β ban đầu
adap_kl_ctrl=True, # adaptive KL control
target=6.0, # target KL (nats)
cliprange=0.2, # PPO clip range
cliprange_value=0.2,
vf_coef=0.1,
gamma=1.0,
lam=0.95,
)
trainer = PPOTrainer(
config=config,
model=policy,
ref_model=ref_model,
tokenizer=tokenizer,
)
# 3. Training loop
for epoch in range(num_epochs):
for batch in prompt_dataloader:
prompts = batch["prompt"]
prompt_tensors = [tokenizer.encode(p, return_tensors="pt")[0] for p in prompts]
# (a) Policy sinh response
response_tensors = [
trainer.generate(p, max_new_tokens=200, do_sample=True, top_p=0.9)[0]
for p in prompt_tensors
]
responses = [tokenizer.decode(r) for r in response_tensors]
# (b) Reward model chấm
rewards = [
torch.tensor(reward_model.score(p, r))
for p, r in zip(prompts, responses)
]
# (c) PPO update — tự động áp dụng KL penalty với ref_model
stats = trainer.step(prompt_tensors, response_tensors, rewards)
# (d) Log
print(f"reward={stats['ppo/mean_scores']:.3f}, "
f"KL={stats['objective/kl']:.2f}, "
f"β={stats['objective/kl_coef']:.4f}")Mỗi lựa chọn A vs B của người annotator là một "phiếu bầu" cho giá trị. Hàng triệu phiếu bầu qua thời gian tạo thành một đại diện toán học của "cái gì tốt" trong mắt nhóm annotator đó. RLHF sẽ chỉ tốt ngang người annotator — đa dạng hóa pool annotator là chìa khóa để RLHF không thiên lệch về một văn hóa hay quan điểm cụ thể.
Ứng dụng thực tế
- ChatGPT (OpenAI): RLHF gốc. InstructGPT → ChatGPT → GPT-4 đều có giai đoạn RLHF với hàng triệu preference.
- Claude (Anthropic):Constitutional AI + RLAIF — dùng LLM làm annotator dựa trên "hiến pháp" 60+ nguyên tắc.
- Gemini (Google DeepMind): RLHF + safety fine-tuning + RL với verifiable rewards.
- LLaMA-2 Chat (Meta): SFT + 2 reward models (helpful + safety) + RLHF với rejection sampling + PPO.
- InstructGPT paper (2022):RLHF giúp mô hình 1.3B parameter vượt GPT-3 175B về preference của người dùng — bằng chứng alignment > scale.
- Ngoài LLM: Image generation (Imagen, DALL·E 3), code generation (Codex, Copilot), robotics (RT-2), tất cả đều dùng human feedback ở dạng nào đó.
Những lỗi thường gặp (pitfalls)
- RM overfitting: RM có thể memorize pattern của dataset preference (ví dụ: câu nào dài hơn thắng). Cross-validation, hold-out evaluator LLM, diversity trong training preferences.
- β cố định: Fix β suốt training không tối ưu — dùng adaptive KL control để β tự điều chỉnh theo KL thực đo.
- Reward hacking không phát hiện: Nếu chỉ đánh giá bằng chính RM, hack sẽ không lộ ra. Luôn dùng held-out evaluator (người khác, LLM khác) để đánh giá policy cuối.
- Distribution mismatch: Prompt dùng trong PPO khác với prompt thực tế người dùng nhập → policy tối ưu sai domain. Nên lấy prompt từ distribution gần production.
- Mất khả năng: RLHF quá mạnh có thể làm mô hình mất khả năng ngôn ngữ / toán / code. Giám sát các benchmark base (MMLU, HumanEval) song song với preference eval.
- Annotator bias: Nếu annotator thiên về một văn hóa / quan điểm, RM sẽ thiên theo. Đa dạng hóa pool, đo inter-annotator agreement, và minh bạch về composition của annotator.
Trong thực tế:RLHF là kỹ thuật tốn kém (hàng triệu USD cho preference annotation + compute), nhưng là con đường đã được chứng minh là hiệu quả để biến base LLM thành trợ lý hữu ích. DPO và các biến thể đơn giản hơn đang dần thay thế PPO trong nhiều pipeline — nhưng ý tưởng cốt lõi "học từ preference của con người" vẫn là trung tâm của mọi công nghệ alignment hiện đại.
- Pipeline 3 giai đoạn: SFT (học format từ demo) → Reward Model (học preference con người) → PPO (tối ưu policy theo RM + KL penalty).
- RM thay mặt con người chấm điểm hàng triệu response — giải quyết nút cổ chai tốc độ của human feedback. Loss Bradley-Terry trên preference pairs (chosen vs rejected).
- Objective PPO cốt lõi: max E[R_φ(x, y) − β · KL(π_θ ‖ π_SFT)]. β kiểm soát trade-off giữa tối đa reward và trung thành với SFT.
- KL penalty là phanh chống reward hacking — nếu không có, policy sẽ tìm ngóc ngách của RM (nịnh bợ, xả văn, off-topic) để thổi điểm.
- RLHF không dạy kiến thức mới — nó dạy giá trị (helpful, honest, harmless). Mã hóa giá trị qua preference pairs của annotator.
- Biến thể: RLAIF (AI annotator), DPO (bỏ RM+PPO), GRPO (bỏ value net), Constitutional AI (hiến pháp + RLAIF), RLVR (verifiable rewards). DPO đang dần phổ biến do đơn giản hơn.
Kiểm tra hiểu biết
Tại sao RLHF cần Reward Model thay vì trực tiếp dùng phản hồi con người trong PPO?