# AI 為什麼變得這麼有禮貌？

> 先有一個會打分數的評審，再用 PPO 讓模型往高分方向修正。教程用 GPT-2 示範，讓它學會寫正面影評。

- 作者：Michael Kuo（https://mk-ai-notes.pages.dev/about/）
- 發布日期：2026-11-02（2026-11-02T20:11:00+08:00）
- 原文網址：https://mk-ai-notes.pages.dev/posts/ep11-rlhf/
- 分類：一人公司工作流＋學習系列（https://mk-ai-notes.pages.dev/category/workflow/）
- 系列：動手學大模型 12 問 第 12 篇／共 12 篇（https://mk-ai-notes.pages.dev/series/dive-into-llms/）
- 標籤：RLHF、對齊、強化學習
- 閱讀時間：約 9 分鐘（約 1221 字）
- 參考來源：https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter11

![AI 為什麼變得這麼有禮貌？](https://mk-ai-notes.pages.dev/og/ep11-rlhf.png)

---

## 一句話回答

因為模型在出廠前，被「打分數、再修正」訓練過很多輪。這種方法叫 RLHF（Reinforcement Learning from Human Feedback，人類回饋強化學習）：先有一個代表人類喜好的評審替回答打分，再用 PPO 演算法讓模型往高分方向調整。禮貌、有幫助的回答分數高，模型就慢慢變成那個樣子。

## 為什麼值得知道

聊天 AI 會說「好的，我來幫你」、會婉拒危險要求，這些「個性」大多是後來調教的結果，不是預訓練自然長出來的。

理解 RLHF，就比較能看懂 AI 為什麼有時過度客氣、會迎合你的說法，答案常常在「評審喜歡什麼」。

## 白話原理

把模型想成寫手，旁邊坐著只會打分數的編輯：寫手交稿（產生回答）、編輯打分（評審給分）、寫手依分數修正（更新模型）。重複很多次，寫手就學會寫編輯喜歡的稿子。

### PPO 的三個步驟

教程整理的 PPO（Proximal Policy Optimization，近端策略最佳化）流程：

| 步驟 | 英文 | 在做什麼 |
|---|---|---|
| 1 | Rollout（產生） | 模型根據提問（query）產生回答（response） |
| 2 | Evaluation（評分） | 用函式、模型、人類回饋或它們的組合，替每組「提問＋回答」打一個分數（單一數字） |
| 3 | Optimization（最佳化） | 依分數更新模型，同時加上 KL 懲罰，避免偏離原本的模型太遠 |

### KL 懲罰：別為了分數變成怪物

只追求高分，寫手可能找偷吃步，例如每句都塞「太棒了」，分數很高卻不像人話。

KL 懲罰就是拉住它：保留一份訓練前的模型當參考，計算新舊模型的輸出差多少（KL 散度，KL divergence），差越多扣越多。模型會往高分走，但仍保有原本的語言能力。

## 教程裡實際做了什麼

本章改編自 Hugging Face TRL 官方範例：**用 BERT 情感分類器當評審，訓練 GPT-2 寫正面的 IMDB 電影影評。**

**工具與素材**：

- 函式庫：Transformers、Datasets、TRL（`PPOTrainer`）、Weights & Biases（記錄曲線）
- 資料集：IMDB 電影評論 5 萬則，標註正面或負面
- 要訓練的模型：`lvwerra/gpt2-imdb`（在 IMDB 多微調 1 輪的 GPT-2）
- 評審（獎勵模型）：`lvwerra/distilbert-imdb`（DistilBERT 情感分類器）

**步驟**：

1. 下載資料集與兩個模型。
2. 整理資料：留下超過 200 字元的評論，隨機取開頭 2–8 個 token 當「提問」。
3. 載入兩份 GPT-2：一份訓練、一份當參考模型算 KL 懲罰，模型上另加「價值頭」（value head）供 PPO 使用。
4. 訓練迴圈，每一批資料做三件事：
   - GPT-2 接著評論開頭往下寫 4–16 個 token
   - 把開頭加續寫丟給 BERT，取「正面」類別的分數當獎勵
   - 用（提問、回答、獎勵）呼叫 PPO 更新模型

核心那一步長這樣（摘自原教程，節錄並省略取出正面分數的幾行）：

```python
texts = [q + r for q, r in zip(batch["query"], batch["response"])]
pipe_outputs = sentiment_pipe(texts, **sent_kwargs)
rewards = [torch.tensor(s) for s in positive_scores]
stats = ppo_trainer.step(query_tensors, response_tensors, rewards)
```

5. 比較訓練前後：抽 16 個開頭讓兩個模型各寫一次，原文平均獎勵從約 0.59 升到約 2.24。開頭「What a terrible」，訓練前接「movie!」，訓練後卻硬轉成稱讚。
6. 存下訓練好的模型。

**硬體**：原文寫明單張 NVIDIA A800（80GB）占用約 10GB 顯存，訓練約 35 分鐘。

## 動手試試

這章是 RLHF 最輕量的入門範例，GPT-2 很小，門檻相對低：

1. **看懂評審**：先只載入 DistilBERT 情感分類器，丟幾句英文影評看分數，筆電 CPU 就能跑。
2. **跑完整訓練**：原文約 10GB 顯存，Colab 的 GPU 有機會跑得動，但原文沒在 Colab 測過，時間也會更長。
3. **注意版本**：教程用的是較舊的 TRL 介面（`ppo_trainer.step`），新版寫法已改，建議安裝教程 `requirements.txt` 指定的版本。
4. **做小實驗**：把獎勵改成「負面分數」，看模型會不會變成毒舌影評人。

## 常見誤解

- **「RLHF 一定要真人逐句打分」**：教程的評審是分類模型；實務上常先蒐集人類偏好訓練出獎勵模型，再由它打分。
- **「RLHF 讓模型變聰明」**：它主要調整行為和口吻，不等於增加知識。
- **「KL 懲罰是多餘的」**：少了它，模型容易鑽評審漏洞，寫出高分但不自然的內容。
- **「AI 有禮貌＝理解禮貌」**：它學到的是「這樣說分數較高」。

## 延伸閱讀

- 本章原文：https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter11
- TRL（Hugging Face 的強化學習訓練工具，原教程改編自它的官方 GPT-2 情感範例）：https://github.com/huggingface/trl
- 參數來源論文《Fine-Tuning Language Models from Human Preferences》：https://huggingface.co/papers/1909.08593

> 本文整理自上海交通大學《動手學大模型》第 11 章，原教程：https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter11。內容由 MK 以自己的話解說，如有錯誤歡迎留言指正。

---

本系列整理自上海交通大學《動手學大模型》公益教程（https://github.com/Lordog/dive-into-llms），以自己的話解說，非官方內容。

引用本文請附原文網址：https://mk-ai-notes.pages.dev/posts/ep11-rlhf/（作者：Michael Kuo）
