---
# System prepended metadata

title: '[RL] Fine-Tuning Language Models from Human Preferences (RLHF) 論文筆記-ChatGPT鍊成術'
tags: [Finetune, ReinforcementLearning, RLHF, LLM, RL]

---


### [AI / ML領域相關學習筆記入口頁面](https://hackmd.io/@YungHuiHsu/BySsb5dfp)
#### Reinforcement learning
- [[RL] Fine-Tuning Language Models from Human Preferences (RLHF)論文筆記](https://hackmd.io/@YungHuiHsu/Sy5Ug7iV6)
- [[RL] Proximal Policy Optimization(PPO)](https://hackmd.io/@YungHuiHsu/SkUb3aBX6)
- [[RL] Q learning 與 Deep Q Network(DQN)](https://hackmd.io/@YungHuiHsu/BJgnMHbUH6
- [How Agents for LLM Perform Task Planning。大型語言模型的代理如何進行任務規劃](https://hackmd.io/@YungHuiHsu/rkK52BkQp)
---
# Fine-Tuning Language Models from Human Preferences (RLHF)論文筆記-ChatGPT鍊成術
- 原始論文[2019。 openai。Fine-Tuning Language Models from Human Preferences](https://arxiv.org/abs/1909.08593)
- [Official Github](https://github.com/openai/lm-human-preferences)
 
 
- 推薦學習資源
    - deeplearning.ai[2023.12。Reinforcement Learning From Human Feedback](https://www.deeplearning.ai/short-courses/reinforcement-learning-from-human-feedback/)短課程影片 
    - [2022.12。Hugging Face。Illustrating Reinforcement Learning from Human Feedback (RLHF)](https://huggingface.co/blog/rlhf)，後面說明主要根據此篇
    - [2023.09。Basics of Reinforcement Learning for LLMs](https://cameronrwolfe.substack.com/p/basics-of-reinforcement-learning)

## RLHF在LLM時代的重要性與亮點
大型語言模型LLM近年來在根據人類提示生成多樣文本上取得巨大成功，但衡量“好”文本仍是個挑戰，因為這涉及主觀判斷和情境依賴性。傳統訓練方法如預測下一個詞（例如交叉熵）有其局限性，而標準指標如BLEU或ROUGE僅提供簡單的文件比對。這裡就是從人類反饋中學習的強化學習（RLHF）的重要性所在：它透過直接利用人類反饋來優化模型，使得大型語言模型不僅適應廣泛文本資料，還能**對齊人類複雜價值觀**，為語言模型的發展開啟新的可能性。

1. **RLHF在LLM微調中的角色與重要性**：
   - RLHF**將人類判斷轉化為獎勵學習**，這使得可以將強化學習應用於以人類判斷為基準的複雜任務 。
   - 在自然語言處理領域，RLHF利用人類偏好訓練出的獎勵模型對語言模型進行微調，這個過程超越了純粹的監督學習，讓模型**更接近人類的使用和理解方式** 。
   - RLHF特別適用於沒有充足監督資料集的NLP任務，或者當現成的程序化獎勵函數不足以作為真實目標的良好代理時 。

2. **研究亮點**：
   - 在風格化續寫任務中，使用5k個人類比較就能達到良好的結果，微調模型被人類選擇的頻率達到86%，優於無微調的模型（zero-shot）和監督學習微調的情感網絡 。
   - 在摘要任務中，用60k 個人類樣本訓練的模型能夠像“聰明的複製機”一樣工作，它們通常從輸入文章中複製整句，但會變化複製內容以跳過不相關的前言，這種行為自然地從資料收集和訓練過程中產生，沒有使用任何明確的複製機制 。

- OPENAI提供的[ChatGPT鍊成過程](https://openai.com/blog/chatgpt)
    可以看到人類反饋的強化學習（Reinforcement Learning from Human Feedback, RLHF）訓練的三步驟，詳細過程詳見後文說明
    ![image](https://hackmd.io/_uploads/Hy_N1EnNT.png =800x)
    > - Step1: 收集示範資料並訓練監督式策略（Supervised Policy）。
    >     - 從提示資料集中抽取一個提示。
    >     - 標註者展示了期望的輸出行為。
    >     - 利用這些資料對GPT-3.5進行監督學習的微調。
    > - Step2: 收集比較資料並訓練獎勵模型（Reward Model）。
    >     - 抽取一個提示和幾個模型輸出作為樣本。
    >     - 標註者對這些輸出從最好到最差進行排名。
    >     - 使用這些資料來訓練獎勵模型。
    > - Step3: 使用PPO（Proximal Policy Optimization）強化學習算法根據獎勵模型優化策略。
    >     - 從資料集中抽取一個新的提示。
    >     - PPO模型從監督式策略初始化。
    >     - 策略生成一個輸出。
    >     - 獎勵模型為輸出計算獎勵。
    >     - 使用PPO根據獎勵更新策略。
 


 
## Fine-Tuning Language Models from Human Preferences (RLHF)論文中的演算法
![image](https://hackmd.io/_uploads/ryhMqXoV6.png =800x)

原始論文對RLHF演算法的概念說明如下:
(推薦看後面Hugging Face的文章有更直白易懂的的圖解)

### 1. **詞彙與語言模型**：
:::info
:pencil2:以一個預先訓練好的語言模型作為出發點，該模型能夠預測文章序列的機率。
:::


從一個詞彙集 $\Sigma$ 和一個語言模型 $\rho$ 開始，該模型定義了序列 $\Sigma^n$ 上的機率分佈，這可以通過以下公式表示：
    
   - 數學表達
       $$
       \rho(x_0 \cdots x_{n-1}) = \prod_{0 \leq k < n} \rho(x_k|x_0 \cdots x_{k-1})
       $$
       
        :::spoiler
        這個公式表示的是一個語言模型 $\rho$ 用於計算一個序列 $x_0 \cdots x_{n-1}$ 出現的機率，這個序列由 $n$ 個**token（例如單詞或字符）**組成。模型做的是將整個序列的聯合機率分解成了一連串的條件機率的乘積。

        具體來說：

        - $\rho(x_0 \cdots x_{n-1})$ 是整個序列從第一個token $x_0$ 到最後一個token $x_{n-1}$ 的聯合機率。
        - $\prod$ 符號表示乘積，這裡用於連乘每個token $x_k$ 在其前面所有token $x_0 \cdots x_{k-1}$ 已知的情況下出現的條件機率。
        - $\rho(x_k|x_0 \cdots x_{k-1})$ 是給定序列中前 $k-1$ 個token後，第 $k$ 個token出現的條件機率。

        這個乘積過程從序列的第一個token開始，計算第二個token出現在第一個token之後的條件機率，然後計算第三個token出現在前兩個token之後的條件機率，以此類推，直到計算出最後一個token的條件機率。將所有這些條件機率相乘，就得到了整個序列出現的機率。

        這種方法是建立在token序列是按照一定順序依次生成的假設上的，每個token的生成只依賴於它前面的token。這就是語言模型如何**利用過去的信息來預測下一個token(字詞)的基礎**，並且是許多自然語言處理任務的核心，例如文章生成、機器翻譯和語音識別。

        :::


### 2. **任務應用**：
:::info
:pencil2:將語言模型$\rho$應用於特定任務，例如文章摘要，其中任務的輸入是文章($x$)，輸出是摘要($y$)
:::


將該模型應用於輸入空間 $X = \Sigma^{ \leq m}$，資料分佈 $D$ 覆蓋 $X$，輸出空間 $Y = \Sigma^n$ 的任務。例如，$x \in X$ 可以是一篇長達1000字的文章，$y \in Y$ 可以是一個100字的摘要。通過 $\rho(y|x) = \frac{\rho(xy)}{\rho(x)}$ 定義這個任務的機率策略，即固定樣本的開始為 $x$ 並使用 $\rho$ 生成後續token。

:::spoiler
- $\rho(y|x)$ 表示在已知前文 $x$ 的情況下，生成文章 $y$ 的機率。
- $\rho(xy)$ 是連續文章序列 $xy$（即將 $x$ 和 $y$ 結合起來形成的序列）出現的機率。
- $\rho(x)$ 是前文 $x$ 自己出現的機率。

這個公式本質上是在問：在我們已經看到 $x$ 的情況下，接下來看到 $y$ 的機率有多大？這是生成模型特別關注的問題，因為它決定了模型生成文章的連續性和一致性。這種條件機率分佈是語言模型生成文章時的基礎，使模型能夠根據給定的前文繼續生成自然語言文章。
:::



    
### 3. **策略初始化與微調**：
:::info
:pencil2: 先給電腦一個基本指令集$\pi$，然後透過試錯和獎勵$r$來學習如何更好地完成任務。
:::

初始化策略 $\pi = \rho$，然後使用RL微調 $\pi$ 來更好地執行任務。如果任務由一個獎勵函數 $r: X \times Y \rightarrow \mathbb{R}$ 定義，則可以直接使用RL來優化期望獎勵：

- 數學表達
   $$
   \mathbb{E}_{\pi}[r] = \mathbb{E}_{x \sim D, y \sim \pi(.|x)}[r(x, y)]
   $$

    :::spoiler
    這個公式描述的是期望獎勵（expected reward）的計算方法，其中 $\pi$ 是一個策略，它根據輸入 $x$ 生成輸出 $y$ 的機率分佈。具體來說：

    - $\mathbb{E}_{\pi}[r]$ 表示在策略 $\pi$ 下，獎勵函數 $r$ 的期望值。
    - $x \sim D$ 表示從資料分佈 $D$ 中抽樣得到輸入 $x$。
    - $y \sim \pi(.|x)$ 表示根據策略 $\pi$，給定輸入 $x$ 之後生成輸出 $y$。
    - $r(x, y)$ 是獎勵函數，它評估給定輸入 $x$ 和策略生成的輸出 $y$ 的質量或者符合度。

    公式的意義是計算，在所有可能的輸入 $x$ 和相對應的輸出 $y$ 上，獎勵函數 $r$ 的平均值。這個期望值是評估一個策略表現的關鍵指標，在強化學習中用來指導策略的更新和優化。
    :::
    

### 4. **人類評估和獎勵函數學習**：
:::info
:pencil2:利用人類評估來訓練一個獎勵函數，該函數評估生成文章的質量
:::


根據Christianiano等人的方法，通過讓人類標注者選擇對給定輸入 $x$ 最佳的多個 $y_i$ 值，來學習一個獎勵函數。收集資料集 $S$ 並使用以下損失來訓練獎勵模型 $r$：

- 數學表達
   $$
   \text{loss}(r) = \mathbb{E}_{(x, \{y_i\}) \sim S} \left[ \log \frac{e^{r(x,y_b)}}{\sum_i e^{r(x,y_i)}} \right]
   $$
    :::spoiler
    其中 $b$ 是人類選擇的選項。

     這個損失函數 $\text{loss}(r)$ 用於訓練獎勵模型，其中 $r$ 是評估給定輸入 $x$ 和輸出 $y_i$ 組合好壞的函數。 

    - $x$ 是輸入，如一段文章或問題。
    - $y_i$ 是輸出的可能回答，$y_b$ 是被人類評審選擇為最佳回答的選項。
    - $S$ 是包含輸入 $x$ 和所有可能回答 $\{y_i\}$ 的資料集。
    - $e^{r(x,y_i)}$ 表示將獎勵函數的輸出通過指數函數轉換，這常用於將任何數值映射到正數範圍，以便進行機率比較。

    損失函數的目標是最小化模型對於選擇最佳回答的不確定性。在這個公式中，我們尋找一個獎勵函數 $r$，使得當我們對每個輸入 $x$ 和對應的回答集合 $\{y_i\}$ 求期望時，模型選擇人類偏好的 $y_b$ 的機率最大化。 

    $\log$ 函數幫助將指數轉換的結果變回對資料集 $S$ 中每個 $(x, \{y_i\})$ 組合的獎勵進行對數機率評分，並且這個評分反映了人類對每個可能回答的偏好程度。
    :::
   

- code demo
    ```python=
    import torch
    import torch.nn as nn
    def compute_loss(reward_model, x, y):
        scores = reward_model(x)
        exp_scores = torch.exp(scores)
        sum_exp_scores = torch.sum(exp_scores, dim=1, keepdim=True)
        softmax_probs = exp_scores / sum_exp_scores
        # Gather the scores corresponding to the target classes
        selected_score = scores.gather(1, y.view(-1, 1))
        log_prob = torch.log(selected_score / sum_exp_scores)
        # Compute the negative mean of the log probability as the loss
        loss = -torch.mean(log_prob)

        return loss
    ```

### 5. **微調獎勵模型**：
:::info
:pencil2:損失函數幫助訓練獎勵模型，KL懲罰項$\beta KL(\pi, \rho)$防止模型在生成文章時偏離預訓練模型過多，保持一定的一致性和連貫性
:::

微調策略 $\pi$ 來優化獎勵模型 $r$，並添加一個 懲罰項 $\beta$以防止 $\pi$ 從 $\rho$ 太遠，該懲罰項的期望為 $\beta KL(\pi, \rho)$。這樣，執行RL在修改後的獎勵函數R(x, y)上：

$$
R(x, y) = r(x, y_b) - \beta \log \frac{\pi(y|x)}{\rho(y|x)}
$$


#### 這邊的$\log \frac{\pi(y|x)}{\rho(y|x)}$ 為 KL Divergence的一種表達形式
- 可以參考個人筆記複習[[ML] 機器學習基礎指標：Maximum Likelihood Estimation、Softmax、Entropy、 KL Divergence](https://hackmd.io/@YungHuiHsu/SyIdBun4a)
- 詳細推導過程
    :::spoiler
    首先，將 KL Divergence的定義展開：
    $$D_{KL}(p \parallel q) = \sum_y p(y) \log \frac{p(y)}{q(y)}$$

    現在，將該定義中的 $p(y)$ 替換為 $\pi(y|x)$，$q(y)$ 替換為 $\rho(y|x)$：
    $$D_{KL}(\pi(y|x) \parallel \rho(y|x)) = \sum_y \pi(y|x) \log \frac{\pi(y|x)}{\rho(y|x)}$$

    接下來，將 KL Divergence展開成交叉熵和熵的形式：
    $$D_{KL}(\pi(y|x) \parallel \rho(y|x)) = \sum_y \pi(y|x) \log \pi(y|x) - \sum_y \pi(y|x) \log \rho(y|x)$$

    將第一個求和項 $\sum_y \pi(y|x) \log \pi(y|x)$ 視為條件機率分佈 $\pi(y|x)$ 的熵 $H(\pi(y|x))$：
    $$D_{KL}(\pi(y|x) \parallel \rho(y|x)) = H(\pi(y|x)) - \sum_y \pi(y|x) \log \rho(y|x)$$

    最後，將第二個求和項 $\sum_y \pi(y|x) \log \rho(y|x)$ 視為條件機率分佈 $\pi(y|x)$ 和 $\rho(y|x)$ 的交叉熵 $H(\pi(y|x), \rho(y|x))$：
    $$D_{KL}(\pi(y|x) \parallel \rho(y|x)) = H(\pi(y|x)) - H(\pi(y|x), \rho(y|x))$$

    因此，得到了 $\log \frac{\pi(y|x)}{\rho(y|x)}$ 表示為 KL Divergence的交叉熵和熵的差的形式：
    $$D_{KL}(\pi(y|x) \parallel \rho(y|x)) = H(\pi(y|x), \rho(y|x)) - H(\pi(y|x))$$


    因此，$\beta KL(\pi, \rho)$ 和 $\beta\log \frac{\pi(y|x)}{\rho(y|x)}$ 是等價的，可以互相替換使用。它們都用於引入一個懲罰項，以控制策略分佈 $\pi$ 相對於參考分佈 $\rho$ 的偏離程度。
    :::

        
- code demo
    ```python=
    def compute_reward(model, x, y):
        # Calculate the log-probabilities of the Tuned Language Model's predictions
        pi = tuned_model(x).log_softmax(dim=1)
        # Calculate the log-probabilities of the reference distribution of Initial Language Model
        rho = reference_model(x).log_softmax(dim=1)

        # Calculate the KL divergence between pi and rho
        kl_divergence = torch.sum(torch.exp(pi) * (pi - rho), dim=1)

        # Calculate the reward using the modified reward function
        reward = tuned_model(x).gather(1, y.view(-1, 1)) - beta * kl_divergence
    
    return reward
    ```

### 6. **整體訓練過程**：
:::info
:pencil2:使用強化學習算法（如PPO）對語言模型進行微調，以便根據獎勵函數生成更優質的文章樣本並定期重新訓練獎勵模型 $r$。
:::


包括從分佈 $D$ 和 $\rho(.|x)$ 中收集樣本，訓練獎勵模型 $r$，使用PPO微調策略 $\pi$，並在線上資料收集情況下，持續收集額外資料
    
### 懲罰項 $\beta$的微調細節說明 Fine-tuning details 
摘說明核心概念部份


- 為了避免過度擬合，僅使用單一周期進行訓練，並對不同任務採取統一的訓練策略 
- 為了避免訓練時，模型不要偏離原始學習到的知識太遠(梯度一次更新太大)，論文中採用$KL(\pi, \rho)$(機率分布相似度)散度當作指標，來控制原始知識與學習到的知識間的差異不要太大

    - 使用懲罰項 $\beta$動態調整KL值的範圍
        $$
          \beta_{t+1} = \beta_t(1 + K_{\beta}e_t)
        $$
        - $\beta$使用$e_t$對數空間比例控制器(log-space proportional controller)來進行調整，公式如下：
 
          $$
          e_t = \text{clip}\left(\frac{KL(\pi,\rho) - KL_{\text{target}}}{KL_{\text{target}}}, -0.2, 0.2\right)
          $$
          
        :::spoiler
        1. $e_t$ 是在時間點 $t$ 的誤差項，它衡量了當前模型策略 $\pi$ 與目標KL散度 $KL_{\text{target}}$ 之間的差距。將實際的KL散度與目標值的差距，相對於目標值本身，計算出一個比例。
           - 如果 $KL(\pi,\rho)$ 正好等於 $KL_{\text{target}}$，那麼 $e_t$ 就是0，表示沒有誤差。
           - 如果 $KL(\pi,\rho)$ 大於或小於 $KL_{\text{target}}$，$e_t$ 將是一個正或負的值，表示需要調整的方向和大小。
           - :collision:`clip` 函數將 $e_t$ 的值限制在 -0.2 和 0.2 之間，==以避免過大的調整步驟，這有助於保持訓練過程的穩定==(即PPO核心概念)。

        2. $\beta_{t+1}$ 是下一個時間點的KL懲罰項。它基於當前的懲罰項 $\beta_t$ 並加上一個根據誤差項 $e_t$ 調整的值。$K_{\beta}$ 是一個比例常數(這裡為0.1)，用來控制調整的敏感度。

           - 當 $e_t$ 是正值，意味著當前KL散度大於目標值，我們需要增加 $\beta$ 來減小策略 $\pi$ 的變化，使其更接近原始模型 $\rho$。
           - 反之，如果 $e_t$ 是負值，則減小 $\beta$ 來允許更多的變化。
               - 即模型的行為比預期的要更接近原始模型，它沒有充分利用學習過程中的自由度來優化或調整其策略。在這種情況下，我們可能希望模型探索更多新的行為，而不是嚴格地遵循原始模型的行為模式。
               - 通過增加 $\beta$ 值，我們可以減少模型行為上的懲罰，從而鼓勵模型進行更大的探索，嘗試不同於原始模型的新策略。這有助於模型在保持一定的原始知識基礎的同時，也能夠學習到新的、與人類偏好更一致的行為。
            
        :::

        :::success
        這整個過程的目的是動態地調整懲罰項 $\beta$，以確保訓練過程中模型策略 $\pi$ 的行為不會偏離我們設定的目標KL散度太遠，既不要太創新（以至於不實用），也不要太保守（以至於缺乏創新性）。
        :::
        
### code Demo  
 
## Reference & Supplementary

### :100: :+1: [2023.09。Basics of Reinforcement Learning for LLMs](https://cameronrwolfe.substack.com/p/basics-of-reinforcement-learning)

很好的說明強化學習在LLM客製化應用的基礎，從不可微分的離散式獎勵(經典的Q Learning)到連續的、基於梯度(可微分的)RLHF與PPO
![image](https://hackmd.io/_uploads/BJa88xPBa.png)



### :100: :+1: [2022.12。Hugging Face。Illustrating Reinforcement Learning from Human Feedback (RLHF)](https://huggingface.co/blog/rlhf )

#### Step1: **Pretraining language models**
![image](https://hackmd.io/_uploads/rySQI4jEa.png =300x)
預訓練語言模型（Pretraining language models）的過程包括以下步驟：

1. **使用已預訓練的語言模型**：RLHF作為起點使用一個已經過經典預訓練目標預訓練好的語言模型。

2. **參數規模**：OpenAI使用GPT-3的較小版本來建立其首個受歡迎的RLHF模型，InstructGPT。在共享的論文中，Anthropic使用了從1000萬到520億參數的轉換模型（Transformer models）來進行這項任務。DeepMind記錄使用了高達2800億參數的模型Gopher。

3. **可選的微調**：這個初始模型還可以基於額外的文章或條件進行微調，但這不是必須的。例如，OpenAI在人類生成的“更受偏好”的文章上進行了微調，而Anthropic則通過將原始LM對照上下文線索進行蒸餾，產生了適合他們“有用、誠實和無害”標準的初始RLHF語言模型。

4. **生成訓練獎勵模型的資料**：需要生成資料來訓練獎勵模型，這是將人類偏好整合進系統的方式。

這個流程的核心是擁有一個對多樣化指令反應良好的模型。目前還沒有明確的答案說明“哪一個模型”是RLHF起點的最佳選擇。

#### Step2: **Reward model training**
![image](https://hackmd.io/_uploads/H1NqbEoEp.png =400x)


獎勵模型訓練（Reward Model Training）的概念與步驟如下：

獎勵模型（RM，也稱為偏好模型）的目的是建立一個模型，它能夠接收一段文章序列，並返回一個標量獎勵(scalar reward)，這個獎勵數值上代表人類的偏好。
* 「標量獎勵」是指賦予代理（如人工智能模型）的數值，用以評估其在特定任務或情境中的表現。這個獎勵通常是一個標量值，意味著它是一個單一數字而非一組數字或一個向量

在這過程中，使用**初始語言模型生成文章**，以及一個**偏好模型給予評分**，這個評分反映了人類對該文章的感知程度。接下來，Step3中使用RL來優化原始語言模型，以便與獎勵模型相協調。

用 $R_{\theta}(x)$ 表示給定文章 $x$ 的獎勵模型，其中 $\theta$ 表示模型的參數。然後我們通過最大化期望獎勵來訓練語言模型 $\pi$ 的參數 $\phi$：

$$ \max_{\phi} \mathbb{E}_{x \sim \pi_{\phi}}[R_{\theta}(x)] $$

這裡 $x$ 是語言模型 $\pi_{\phi}$ 生成的文章，而 $R_{\theta}(x)$ 是該文章根據獎勵模型獲得的評分。以下是過程中各項目的說明

- **獎勵模型的訓練**：
   - **不同大小模型的使用**：
       - 成功的RLHF系統到目前為止使用了與文章生成（例如，OpenAI的175B語言模型，6B獎勵模型）相對大小不同的獎勵語言模型。
       - 獎勵模型可能是另一個微調過的語言模型或從偏好資料上從頭訓練出的模型。
       - Anthropic通過專門的微調方法來初始化這些模型（preference model pretraining, PMP），這被認為比一般的微調方法更有效率
   - **生成資料集** The training dataset of prompt-generation pairs for the RM：
       - 從預定義的資料集中抽樣一組提示（Prompts）。
       - 這些提示通過初始語言模型（Initial Language Model）來生成新文章。
       - Anthropic主要使用Amazon Mechanical Turk的聊天工具來生成數據，而OpenAI則使用GPT API用戶提交的提示。
    - **人類評分**：
       - 用人類評注者對語言模型生成的文章輸出進行排名。
       - **使用排名而不是直接的標量評分**，以減少不同人類價值觀造成的校準問題和噪音。
    - **排名方法**：
       - 使用比較兩個語言模型在相同提示下生成的文章的方法。
       - 透過頭對頭比較，使用Elo系統對模型和輸出相對於彼此進行排名。
       - 將不同的排名方式轉換成一個數字(標準化為0-1)，作為訓練時對模型的獎勵指標


    在這個階段，擁有一個初始的語言模型（Initial Language Model）用來生成文字，還有一個偏好模型(Reward Model)，它可以將任意的文字評分，衡量人們對其的感知好壞程度。下個步驟將使用強化學習（RL）來優化初始語言模型，使其根據Reward Model得到更好的表現。
    
#### Step3: **Fine-tuning with RL**
![image](https://hackmd.io/_uploads/S1q5WVsET.png =400x)
> - 強化學習（RL）對語言模型（LM）進行微調的過程簡要:
>     1. **資料集提示**：從提示資料集中取出一個提示 $x$，例如："A dog is..."。
>     2. **初始語言模型**：這個模型產生基礎文章 $y$，例如："a furry mammal"。
>     3. **調整語言模型（RL策略）**：經過RL微調的模型根據相同的提示生成調整過的文章，例如："man's best friend"。
>     4. **獎勵（偏好）模型**：評估調整過的文章並返回一個標量的“偏好度” $r_{\theta}(y|x)$。
>     5. **KL預測偏移懲罰**：計算RL策略生成的每個token的機率分佈與初始模型的機率分佈之間的Kullback-Leibler（KL）散度 $D_{KL}(\pi_{\text{PPO}}(y|x) \,||\, \pi_{\text{base}}(y|x))$，這個散度(比對兩個機率分布是否接近)作為懲罰項，防止RL策略與初始預訓練模型相比有太大的偏移。
>     6. **強化學習更新**：使用策略優化演算法(目前主流是Proximal Policy Optimization，PPO)更新模型的參數 $\theta$，按照梯度 $\nabla_{\theta} J(\theta)$ 來更新獎勵函數走向。
> 
> 技術說明：儘管圖表看起來兩個模型為相同的提示生成不同的回應，但實際上是RL遵循策略生成文章，然後將這些文章送入初始模型以產生用於KL懲罰的相對機率。在訓練過程中，這個初始模型不會受到梯度更新的影響。

:::success
觀念轉換：將傳統的**微調(Finetune)任務定義為RL問題**
:::
- 從RL任務說明步驟
    - **策略(policy)**：是一個語言模型，它接收一個提示並返回文章序列或者文章上的機率分佈。
    - **行動空間(action space)**：策略的行動空間是對應於語言模型詞彙庫的所有token（通常是50k左右的token）。
    - **觀察空間 (observation space)**：觀察空間是可能的輸入token序列的分佈，由於前面使用的RL，這也是相當大的（維度大約是詞彙庫大小的長度次方）。
    - **獎勵函數(reward function)**：獎勵函數是偏好模型與策略轉移限制(Policy shift constraint) 的結合。

- **reward function**系統細節
    獎勵函數在強化學習中扮演了將不同模型整合入單一RLHF過程的角色。以下是該過程的關鍵概念和步驟：

    1. **生成文章**：給定資料集中的一個提示 $x$，經過微調策略的當前迭代生成文章 $y$。
    2. **偏好模型評分**：將生成的文章與原始提示串聯後傳遞給偏好模型，它返回一個表示“偏好度”的標量值 $r_{\theta}(y|x)$。
    3. **KL懲罰**：將RL策略的每個token的機率分佈與初始模型的機率分佈進行比較，計算它們之間差異的懲罰。這個懲罰通過Kullback–Leibler (KL) 散度 $D_{KL}$ 量化，用於防止RL策略在每個訓練批次中大幅偏離初始預訓練模型。
    4. **總獎勵計算**：最終發送到RL更新規則的獎勵計算如下：
    $$r = r_{\theta}(y|x) - \lambda D_{KL}$$
    其中 $\lambda$ 是一個縮放因子，用於控制KL散度項對獎勵的影響。
    5. **額外獎勵條款**：一些RLHF系統在獎勵函數中添加了額外的條款，例如OpenAI在InstructGPT上混合了額外的預訓練梯度（來自人類註釋集）進入PPO的更新規則。
    6. **更新規則**：PPO的更新規則是根據當前資料批次最大化獎勵指標的參數更新（PPO是一種on-policy算法，意味著參數僅用當前批次的提示-生成對更新）。PPO是一種信賴域優化算法，它使用梯度上的限制以確保更新步驟不會破壞學習過程。DeepMind對Gopher使用了類似的獎勵設置，但使用了同步優勢演員-評判（ synchronous advantage actor-critic, A2C）來優化梯度，這有顯著的不同，但尚未在外部重現。


- 個人補充 - LM參數更新
    - 初始語言模型（Initial Language Model）的參數在RL微調過程中是固定的    
    - 被微調的語言模型（Tuned Language Model，也被稱為RL Policy）的參數會根據強化學習更新（例如使用PPO算法），注意**Tuned LM中的大部分參數顏色被標記為凍結“Frozen”**，即這些參數在微調過程中保持不變。只有模型的輸出層或者特定的可訓練層進行更新。
    - 在實際應用中，可能會使用或結合Parameter-efficient fine-tuning(PEFT)參數高效的微調方法，如LoRA（Low-Rank Adaptation）、Adapter等來進行微調? 
        - Answer: Yes!
            參見[2023.03。huggingface。Fine-tuning 20B LLMs with RLHF on a 24GB consumer GPU](https://huggingface.co/blog/trl-peft)Demo RLHF + PEFT

        - PEFTF請參考[2022。AACL-IJCNLP。Recent Advances in Pre-trained Language Models:Why Do They Work and How to Use Them
](https://hackmd.io/@YungHuiHsu/B1uq8q_Gp)個人筆記說明

    

#### Open-source tools for RLHF

#### Implicit Language Q-Learning，ILQL。值得關注的新RL演算法


### [2023.03。huggingface。Fine-tuning 20B LLMs with RLHF on a 24GB consumer GPU](https://huggingface.co/blog/trl-peft)
Demo RLHF + PEFT

- Overview of the PPO training setup in TRL.
    ![image](https://hackmd.io/_uploads/rkQxRQ2V6.png =400x)
- Step 2: Add extra trainable adapters using peft
    ![image](https://hackmd.io/_uploads/BkSVRX3Va.png =400x)


### [2023.05。assemblyai。The Full Story of Large Language Models and RLHF](https://www.assemblyai.com/blog/the-full-story-of-large-language-models-and-rlhf/)


![image](https://hackmd.io/_uploads/HJ078mjNp.png =400x)
![image](https://hackmd.io/_uploads/rJ5V8QjNT.png =200x)
![image](https://hackmd.io/_uploads/HkZBIQiVp.png =400x)

- **What RLHF actually does to an LLM**
    這邊從機率分布匹配的觀點來解釋RLHF對LLM的微調如何對齊人類的意圖
    ![image](https://hackmd.io/_uploads/SJHCUmsVa.png =200x)
    > A multimodal distribution with three modes or “peaks”. The base model is trained to approximate the distribution of internet text, which has millions of different modes corresponding to different sources, styles, and voices.

    圖中可以看到一個具有三個模式或“峰值”的多模態分佈。基礎模型（Base Model）被訓練來近似互聯網文章的分佈，這個分佈有數百萬不同的模式，對應於不同的來源、風格和聲音。

    RLHF對於“純粹”的基礎大型語言模型（LLM）的微調實際上是這樣一個過程：

    1. **分佈匹配**：理想的基礎模型可以完美地複製互聯網文章的高度多模態分佈，這意味著它成功地完成了分佈匹配任務。
    2. **輸出的不確定性**：然而，在推理時，這樣的理想模型可能會展現出一種不穩定性，即在選擇數百萬模式中的哪一個時，可能會有所波動。

    例如，當用戶提出有關某著名政治人物的查詢時，模型可能產生一個模仿中立、資訊性維基百科文章調調的輸出（可以說它選擇了分佈中的百科全書模式）。相反地，根據問題的措詞，模型可能會被誘導採用一種更極端的觀點，這種觀點是受到互聯網上遇到的激進觀點的啟發。

    在基礎模型預測在分佈中兩種不同模式之間的數值估計只有細微差異的情況下，應該選擇哪種模式？完全依賴模型的隨機決策性質不是理想的解決方案。

- 以機率模型來理解RLHF
    當我們有一個理想的基礎大型語言模型（LLM），它能夠完美地複製互聯網文章的分佈，我們可以用一個多模態機率分佈來形象化這個情況，記為 $p(x)$。這個分佈由許多不同的峰值或模式構成，每個模式代表了訓練資料中的一種特定的語言風格或內容類型。

    假設在這個分佈中有兩個明顯的模式 $m_1$ 和 $m_2$，分別對應於文章的兩種不同風格。這些模式在分佈中的機率可以表示為 $p(m_1)$ 和 $p(m_2)$。

    在一個多模態分佈中，模型產生輸出的過程可以看作是從這個分佈中抽樣。如果模型在 $m_1$ 和 $m_2$ 之間選擇時的機率相差無幾，即 $p(m_1) \approx p(m_2)$，則模型在給定輸入提示時可能會表現出不確定性，有時可能選擇 $m_1$，有時可能選擇 $m_2$。

    這就是RLHF微調的用武之地。RLHF將人類的反饋引入模型訓練過程，這可以被視為在原有的多模態分佈 $p(x)$ 上施加一個新的偏好權重，記為 $p'(x)$。這個新分佈不僅反映了原始的文章資料，還結合了人類的偏好，從而引導模型優先選擇那些更符合人類評估標準的模式。

    在數學上，這種偏好可以通過修正機率分佈來實現，例如通過在原始分佈上應用一個修正因子 $w(m)$，這個因子會增加或減少特定模式的機率：

    $$
    p'(x) = \frac{w(m) \cdot p(x)}{\sum_{m \in M} w(m) \cdot p(m)} 
    $$

    - 其中 $M$ 是所有可能模式的集合，$w(m)$ 是基於人類偏好而定的權重。這樣，模型就更有可能選擇那些具有更高 $w(m)$ 值的模式，即那些人類標注者偏好的模式。
     - $w(m)$ 可以被理解為是由 RLHF（Reinforcement Learning from Human Feedback）過程中導出的權重。在不同的場景中，根據人類的偏好（也就是給予的 REWARD），RLHF 會調整 $w(m)$ 的值，從而訓練出針對特定人類偏好的模型輸出機率分佈 $w(m) \cdot p(x)$。
    - 在這個框架下，$w(m)$ 的值反映了人類如何評價模型在特定模式 $m$ 下產生的輸出。如果一個模式得到的人類反饋正面，它的權重會增加，這會使該模式在修正後的機率分佈 $p'(x)$ 中占有更大的比重。相反，如果人類反饋負面，該模式的權重會減少，使其在修正後的分佈中占比較小。
    - 這樣，RLHF 就能夠細緻地調整 LLM 的行為，使其更好地符合人類的期望和偏好。這是一個動態過程，通過不斷地從人類的互動中學習，模型能夠逐漸改進其對複雜和多樣化人類語言的模擬和生成能力。
 

#### [2023.09。紫气东来。NLP（七）：RLHF——当语言模型遇上强化学习](https://zhuanlan.zhihu.com/p/613315873)
> 过去几年里，以chatGPT为代表的基于prompt范式的大型语言模型 (Large Language Model，LLM) 取得了巨大的成功。然而，对生成结果的评估是主观和依赖上下文的，这些结果难以用现有的基于规则的文章生成指标 (如 BLUE 和 ROUGE) 来衡量。除了评估指标，**现有的模型通常以预测下一个单词的方式和简单的损失函数 (如交叉熵) 来建模，没有显式地引入人的偏好和主观意见**。
> 
> 因此，训练阶段，如果直接用人的偏好（或者说人的反馈）来对模型整体的输出结果计算reward或loss，显然是要比上面传统的“给定上下文，预测下一个词”的损失函数合理的多。基于这个思想，便引出了本文要讨论的对象——RLHF（Reinforcement Learning from Human Feedback）：即**使用强化学习的方法，利用人类反馈信号直接优化语言模型**。
#### [2023.10。紫气东来。NLP（十五）：反思RLHF，如何更加高效训练有偏好的LLM](https://zhuanlan.zhihu.com/p/634707485)
 

#### [2022.12。夕小瑶。抱抱脸：ChatGPT背后的算法——RLHF | 附12篇RLHF必刷论文](https://zhuanlan.zhihu.com/p/592671478)

### [2023.03。wandb。Implementing RLHF: Learning to Summarize with trlX](https://wandb.ai/carperai/summarize_RLHF/reports/Implementing-RLHF-Learning-to-Summarize-with-trlX--VmlldzozMzAwODM2#dataset)

## 補充

####  head-to-head matchups, an Elo system 頭對頭比較與Elo系統

Elo系統是一種用來評估玩家或模型相對實力的排名系統，最初被用於國際象棋，但後來被廣泛應用於其他領域，包括作為機器學習模型評估的一部分。Elo系統的核心是一個數學模型，它賦予每個參與者一個數值排名，表示其實力水平。當兩個參與者進行比賽時，系統會根據比賽結果來調整它們的排名。

在RLHF（Reinforcement Learning from Human Feedback）的上下文中，頭對頭比較和Elo系統可以幫助決定哪些模型生成的文章更能符合人類偏好。具體步驟如下：

1. **初始排名**：每個語言模型開始時都被分配一個初始Elo排名。
2. **生成文章**：每個模型根據相同的提示生成文章。
3. **頭對頭比較**：將兩個模型生成的文章進行比較。這通常是通過人類評審來完成，他們會選擇他們更偏好的文章。
4. **更新排名**：根據頭對頭比較的結果，使用Elo系統更新模型的排名。如果一個模型的輸出(文章)被選擇，那麼該模型的排名將上升；如果沒被選擇，則下降。
5. **計算新排名**：Elo排名的更新是通過以下公式進行的：

$$ R' = R + K \times (S - E) $$

其中：
- $R'$ 是更新後的排名。
- $R$ 是比賽前的排名。
- $K$ 是系統設定的權重因子，用於控制排名變化的幅度。
- $S$ 是實際比賽結果（勝利為1，平局為0.5，失敗為0）。
- $E$ 是預期比賽結果，由以下公式計算：

$$ E = \frac{1}{1 + 10^{(R_{\text{對手}} - R)/400}} $$

在這裡，$R_{\text{對手}}$ 是對手的排名。

通過這種方法，每次比較後，模型的Elo排名將更加精確地反映其生成文章的質量。這樣，Elo排名可以作為獎勵模型訓練中標量獎勵信號的一部分。