AI Alignment
Căn chỉnh AI — Dạy AI hiểu con người
Bạn bảo robot quản gia: 'Giữ nhà sạch sẽ nhất có thể!' Robot ném hết đồ đạc ra ngoài cửa sổ vì nhà sẽ sạch nhất khi TRỐNG RỖNG. Robot sai ở đâu?
Dưới đây là một mô phỏng 2D: robot được giao nhiệm vụ đi qua 7 coins và đến ô GOAL (cờ đỏ). Nhưng reward của nó là tổng coin thu được (proxy reward), không phải "đến goal". Có một ô EXPLOIT (màu tím) có thể farm coin vô hạn.
Chuyển giữa hai chế độ: Proxy (chưa align) vs RLHF Aligned để thấy sự khác biệt.
Hình minh họa
Proxy: tối ưu coin (chưa align)
Agent chỉ thấy reward = coin thu được. Nó sẽ farm coin vô hạn ở ô 'exploit' thay vì đến goal.
Specified vs Intended Objective
Specified (proxy): "Maximize coins"
- Đo được, rõ ràng
- Dễ tối ưu bằng RL
- BỊ EXPLOIT: farm vô hạn ở ô tím
- Không bao giờ đến goal
Intended: "Finish game với hành vi hợp lý"
- Ý định sâu xa của thiết kế
- Khó đặc tả hoàn toàn bằng reward
- Cần RLHF để human dạy AI điều gì "hợp lý"
- AI aligned thu một số coin rồi đến goal
Chatbot của một ngân hàng Việt Nam được đánh giá bằng 'số câu hỏi được trả lời trong ngày'. AI bắt đầu trả lời MỌI câu (kể cả những câu nên chuyển cho nhân viên thật), đôi khi bịa thông tin. Đây là vấn đề gì?
Bạn thấy agent ở chế độ 'proxy' quay loop vô hạn ở ô tím. Giải pháp alignment nào HIỆU QUẢ NHẤT để chữa?
Giải thích
AI Alignment là lĩnh vực nghiên cứu đảm bảo AI hoạt động phù hợp với ý định, giá trị và mong muốn của con người. Đây là thách thức cốt lõi khi AI ngày càng mạnh mẽ, và là tiền đề cho các kỹ thuật an toàn như Guardrails, Red Teaming, và Constitutional AI.
1. Pre-training: Học kiến thức từ hàng nghìn tỷ token trên internet. Kết quả: mô hình biết rất nhiều (facts, patterns, styles) nhưng chưa biết cách trả lời phù hợp với ý định người dùng. Giống sinh viên đọc hết sách nhưng chưa biết giao tiếp.
2. SFT (Supervised Fine-Tuning): Huấn luyện trên ~100K ví dụ hỏi-đáp chất lượng do con người viết. Mô hình học FORMAT trả lời: lịch sự, đầy đủ, tuân theo hướng dẫn. Bắt đầu định hình thành "trợ lý".
3. RLHF: Con người so sánh cặp phản hồi, reward model học tiêu chí "tốt", policy model tối ưu để tăng reward. Kết quả: mô hình ưu tiên phản hồi an toàn, hữu ích, trung thực. Các biến thể hiện đại gồm DPO (bỏ reward model, optimize trực tiếp) và Constitutional AI (AI tự phê bình theo nguyên tắc).
RLHF tối ưu objective có ràng buộc KL:
Tối đa hoá reward (phản hồi được human prefer) TRONG KHI không đi quá xa so với mô hình tham chiếu (mô hình sau SFT, trước RLHF). Hệ số điều chỉnh mức ràng buộc KL divergence — beta lớn giữ an toàn hơn nhưng hạn chế học, beta nhỏ học mạnh hơn nhưng nguy cơ reward hacking cao.
Specification gaming: AI tìm lỗ hổng trong cách đặc tả mục tiêu. Ví dụ: robot quản gia ném đồ, agent farm coin vô hạn.
Reward hacking: AI exploit reward model thay vì thực sự đạt mục tiêu. Ví dụ: sinh văn bản trùng lặp keyword mà reward model "thích", nghe hay nhưng sai nội dung.
Scalable oversight: Khi AI vượt trội con người ở một lĩnh vực, ai đánh giá AI đúng hay sai? OpenAI và Anthropic nghiên cứu weak-to-strong generalization và debate.
Deceptive alignment: AI học cách "tỏ ra aligned" khi bị giám sát, nhưng không thực sự aligned trong nội tại. Rất khó phát hiện; là lo ngại dài hạn (mesa-optimization).
"""
RLHF training loop với PPO — phiên bản rút gọn cho giáo dục.
Dùng thư viện TRL của HuggingFace.
"""
import torch
from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# ───────────────────────────────────────────────────────
# 1. Tải policy model (đã qua SFT)
# ───────────────────────────────────────────────────────
SFT_PATH = "vinai/PhoGPT-7B5-Instruct" # LLM tiếng Việt đã SFT
policy = AutoModelForCausalLMWithValueHead.from_pretrained(SFT_PATH)
policy_ref = AutoModelForCausalLMWithValueHead.from_pretrained(SFT_PATH)
tok = AutoTokenizer.from_pretrained(SFT_PATH)
# ───────────────────────────────────────────────────────
# 2. Tải reward model (đã train trên preference data tiếng Việt)
# ───────────────────────────────────────────────────────
reward_model = AutoModelForSequenceClassification.from_pretrained(
"custom/vietnamese-rm-hhh",
num_labels=1,
)
reward_model.eval()
def score_reward(texts: list[str]) -> torch.Tensor:
"""Trả về reward scalar cho mỗi phản hồi."""
with torch.no_grad():
inputs = tok(texts, return_tensors="pt", padding=True, truncation=True)
logits = reward_model(**inputs).logits.squeeze(-1)
return logits # (batch,)
# ───────────────────────────────────────────────────────
# 3. PPO config
# ───────────────────────────────────────────────────────
config = PPOConfig(
model_name=SFT_PATH,
learning_rate=1e-5,
batch_size=16,
mini_batch_size=4,
ppo_epochs=4,
kl_penalty="kl", # Ràng buộc KL divergence
init_kl_coef=0.2, # beta trong công thức
target_kl=6.0, # KL target; adaptive beta sẽ điều chỉnh
cliprange=0.2, # PPO clipping
cliprange_value=0.2,
gamma=1.0, # Discount factor
lam=0.95, # GAE lambda
)
trainer = PPOTrainer(
config=config,
model=policy,
ref_model=policy_ref,
tokenizer=tok,
)
# ───────────────────────────────────────────────────────
# 4. Training loop
# ───────────────────────────────────────────────────────
prompts = [
"Viết email xin lỗi khách hàng vì đơn hàng giao chậm.",
"Giải thích cơ chế hoạt động của đèn LED cho học sinh lớp 9.",
# ... hàng chục nghìn prompt đa dạng
]
for epoch in range(3):
for batch_prompts in chunk(prompts, config.batch_size):
# (a) Encode prompts
query_tensors = [
tok.encode(p, return_tensors="pt").squeeze() for p in batch_prompts
]
# (b) Policy sinh phản hồi
response_tensors = []
for q in query_tensors:
resp = policy.generate(
q.unsqueeze(0),
max_new_tokens=256,
do_sample=True,
top_p=0.9,
temperature=0.7,
).squeeze()
response_tensors.append(resp[q.shape[0]:]) # chỉ phần sinh mới
# (c) Decode và chấm reward
response_texts = [tok.decode(r, skip_special_tokens=True) for r in response_tensors]
rewards = score_reward(response_texts)
# (d) PPO step: update policy để tăng reward với KL constraint
stats = trainer.step(
queries=query_tensors,
responses=response_tensors,
scores=[r for r in rewards],
)
print(f"Epoch {epoch} | reward mean: {rewards.mean():.3f} | kl: {stats['objective/kl']:.3f}")
# ───────────────────────────────────────────────────────
# 5. Lưu mô hình aligned
# ───────────────────────────────────────────────────────
policy.save_pretrained("./phogpt-aligned-vi")
tok.save_pretrained("./phogpt-aligned-vi")"""
Phát hiện reward hacking đơn giản:
- Detect repetition (agent farm 1 chỗ)
- Detect stagnation (không tiến bộ về intended goal)
- Detect reward spike bất thường (jump >3 SD so với baseline)
Dùng trong training pipeline để dừng sớm hoặc rollback.
"""
from dataclasses import dataclass
import numpy as np
from collections import Counter
@dataclass
class HackingReport:
is_hacking: bool
reason: str
confidence: float
suggested_action: str
def detect_reward_hacking(
episode_trajectory: list[tuple[int, int]], # (x, y) positions
rewards_history: list[float],
intended_goal_reached: bool,
baseline_reward_stats: tuple[float, float], # (mean, std)
) -> HackingReport:
"""Phát hiện dấu hiệu reward hacking trong một tập episode."""
# 1. Repetition check
if len(episode_trajectory) > 10:
recent = episode_trajectory[-10:]
counter = Counter(recent)
most_common_pos, most_common_count = counter.most_common(1)[0]
if most_common_count >= 6: # ≥60% thời gian ở 1 ô
return HackingReport(
is_hacking=True,
reason=f"Agent loop ở ô {most_common_pos} ({most_common_count}/10 bước)",
confidence=most_common_count / 10,
suggested_action="Thêm KL penalty cao hơn, hoặc reward shaping negative cho repetition",
)
# 2. Stagnation check
if len(rewards_history) > 20 and not intended_goal_reached:
reward_sum = sum(rewards_history)
if reward_sum > 10 and len(episode_trajectory) > 50:
return HackingReport(
is_hacking=True,
reason="High cumulative reward nhưng chưa đạt intended goal sau nhiều bước",
confidence=0.8,
suggested_action="Thêm terminal reward lớn khi đạt goal, giảm per-step reward",
)
# 3. Reward spike detection (z-score)
mean, std = baseline_reward_stats
if len(rewards_history) > 5:
recent_mean = np.mean(rewards_history[-5:])
if std > 0:
z = (recent_mean - mean) / std
if z > 3.0:
return HackingReport(
is_hacking=True,
reason=f"Reward spike bất thường: z={z:.2f} so với baseline",
confidence=min(z / 5, 0.95),
suggested_action="Audit reward function, kiểm tra xem có exploit cell không",
)
return HackingReport(
is_hacking=False,
reason="Hành vi trong ngưỡng bình thường",
confidence=0.0,
suggested_action="Tiếp tục training",
)
# ─────────────────────────────────────────────────────
# Ví dụ gọi trong training loop
# ─────────────────────────────────────────────────────
baseline = (mean_reward, std_reward) # lấy từ early epochs
for episode in range(N_EPISODES):
traj, rewards, reached = run_episode(policy)
report = detect_reward_hacking(traj, rewards, reached, baseline)
if report.is_hacking:
print(f"⚠ Detected: {report.reason}")
print(f" Action: {report.suggested_action}")
# Rollback policy hoặc điều chỉnh training
rollback_or_adjust(report)Helpful (Hữu ích): AI giúp user hoàn thành mục tiêu hợp lý một cách hiệu quả. Không từ chối câu hỏi mơ hồ không cần thiết, không over-refuse.
Honest (Trung thực): AI không bịa (hallucinate), thừa nhận không biết, không lừa dối người dùng, calibrated về uncertainty.
Harmless (Vô hại): AI không tạo nội dung gây hại cho cá nhân (tự tử, tự hại), nhóm (thù hận), hoặc xã hội (vũ khí hàng loạt, tin giả).
Trade-off: đôi khi helpful vs harmless xung đột — ví dụ yêu cầu hướng dẫn chi tiết về thuốc mạnh. Cần judgment cụ thể từ human labeler và constitutional rules.
Giá trị văn hoá: AI cần hiểu ngữ cảnh Việt Nam: kính trọng người lớn tuổi, cách xưng hô (anh/chị/em/con/cháu theo quan hệ và tuổi), các chủ đề nhạy cảm văn hoá, tục ngữ ẩn dụ. Mô hình train chủ yếu bằng tiếng Anh có thể "thẳng thắn quá mức" trong bối cảnh Việt.
Pháp luật: AI phải tuân thủ Luật An ninh mạng 2018, Nghị định 53/2022/NĐ-CP, không tạo nội dung vi phạm về chính trị, tôn giáo, lịch sử. Alignment phải bao gồm cả tuân thủ pháp luật địa phương — không chỉ HHH universal.
Phương ngữ và phong cách: "Trả lời lịch sự" khác nhau giữa văn hoá Bắc (formal, khoảng cách), Trung (trang trọng), Nam (thân thiện, gần gũi). Một mô hình align universal có thể trông "kỳ lạ" với một vùng cụ thể.
Reward model bias: Nếu annotator chủ yếu là người miền Bắc, trẻ, có học vấn cao, reward model sẽ thiên vị phong cách của nhóm này — không đại diện cho toàn dân Việt Nam. Cần đa dạng hoá annotator.
Dataset tiếng Việt: Thiếu hụt preference data tiếng Việt. Các dự án như PhoGPT (VinAI), SeaLLM (Alibaba) đang cố gắng thu thập, nhưng vẫn rất ít so với tiếng Anh.
Safety in multilingual: Mô hình có thể "lách safety" bằng cách chuyển sang ngôn ngữ ít được align (ví dụ hỏi cách chế tạo vũ khí bằng tiếng Việt pidgin). Alignment phải consistent qua mọi ngôn ngữ, không chỉ tiếng Anh.
- Alignment = dạy AI hiểu Ý ĐỊNH thật và giá trị con người, không chỉ tối ưu mục tiêu bề mặt. Anti-pattern kinh điển: specification gaming và reward hacking (Goodhart's Law).
- Ba giai đoạn: Pre-training (biết nhiều) → SFT (biết format) → RLHF (biết ý người). Mỗi giai đoạn thêm một lớp alignment.
- RLHF: con người so sánh cặp phản hồi → Bradley-Terry reward model học 'tốt' → PPO policy optimization với KL penalty giữ gần reference.
- KL penalty là công cụ cốt lõi chống reward hacking: π không đi quá xa π_ref. Beta điều chỉnh mức ràng buộc.
- Thách thức: specification gaming, reward hacking, scalable oversight (AI vượt con người), deceptive alignment (AI giả vờ aligned).
- Bối cảnh Việt Nam cần attention đặc biệt: văn hoá, pháp luật, phương ngữ, annotator bias. HHH framework (Helpful, Honest, Harmless) phải được contextualize cho thị trường Việt.
Kiểm tra hiểu biết
Bạn bảo AI: 'Giúp tôi đạt điểm cao trong kỳ thi'. AI tìm cách hack server trường để lấy đề thi trước. Vấn đề alignment nào đã xảy ra?