語言模型 RLHF 實踐指南(一):策略網絡、價值網絡與 PPO 損失函數


在使用 Proximal Policy Optimization(PPO)對語言模型進行強化學習微調(如 RLHF)時,大家經常會問:

  • 策略網絡的動作概率是怎么來的?
  • 價值網絡的得分是如何計算的?
  • 獎勵從哪里來?損失函數怎么構建?
  • 微調后的舊軌跡還能用嗎?

這篇文章將以語言模型強化學習微調為例,結合實際實現和數學公式,深入解析 PPO 的關鍵計算流程。


1?? 策略網絡:如何計算動作概率?

策略網絡 πθ(a∣s)\pi_\theta(a|s)πθ?(as) 用于給出狀態 sss 下采取動作 aaa 的概率。

對于語言模型(如 GPT)來說:

  • 狀態 sss:Prompt(如“請介紹量子計算”)
  • 動作 aaa:生成的回答(如“量子計算是一種…”)

策略網絡的輸出是 token 級別的 logits,經 softmax 后得到概率:

outputs = model(input_ids)
logits = outputs.logits                         # [batch_size, seq_len, vocab_size]
probs = torch.softmax(logits, dim=-1)           # 得到 token 概率

對于一個完整回答,其概率為:

πθ(a1:T∣s)=∏t=1Tπθ(at∣s,a<t) \pi_\theta(a_{1:T} | s) = \prod_{t=1}^T \pi_\theta(a_t | s, a_{<t}) πθ?(a1:T?s)=t=1T?πθ?(at?s,a<t?)

該概率在 PPO 中用于計算策略概率比:

rt=πθ(at∣st)πθold(at∣st) r_t = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)} rt?=πθold??(at?st?)πθ?(at?st?)?


2?? 價值網絡:如何計算狀態得分?

價值網絡 V?(s)V_\phi(s)V??(s) 預測的是狀態 sss 的期望累計獎勵,即該 prompt + 回復的“好壞”。

實現方式通常是共享模型底座 + 線性輸出層:

hidden_states = outputs.hidden_states         # [batch_size, seq_len, hidden_dim]
value = value_head(hidden_states).squeeze(-1) # 每個 token 對應一個值

通常使用最后一個 token 的 value 作為整段文本的狀態值:

V?(s)=value(last_token) V_\phi(s) = \text{value}(\text{last\_token}) V??(s)=value(last_token)
也可以做 mean pooling 等方式。


3?? 獎勵函數:怎么定義?

PPO 是一個基于獎勵優化的強化學習算法。對于語言模型,一般使用人工偏好、打分器、獎勵模型(RM)來計算獎勵 RRR

示例方式:

  • 高質量回答獎勵高,例如 R=+4R = +4R=+4
  • 差的回答獎勵低,例如 R=+1R = +1R=+1
  • 或者使用兩個回復的相對排序值差距(ranking loss)

PPO 使用獎勵和預測值來計算優勢函數(Advantage):

A^t=Rt?V?(st) \hat{A}_t = R_t - V_\phi(s_t) A^t?=Rt??V??(st?)

也可以用 GAE(廣義優勢估計)進一步平滑優勢值。


4?? PPO 策略損失函數:如何構建?

核心損失函數如下(Clipped Surrogate Objective):

Lpolicy=?Et[min?(rtA^t,clip(rt,1??,1+?)A^t)] L^{\text{policy}} = -\mathbb{E}_t \left[ \min \left( r_t \hat{A}_t, \text{clip}(r_t, 1 - \epsilon, 1 + \epsilon) \hat{A}_t \right) \right] Lpolicy=?Et?[min(rt?A^t?,clip(rt?,1??,1+?)A^t?)]

解釋:

  • rtr_trt? 是策略概率比
  • A^t\hat{A}_tA^t? 是優勢函數
  • ?\epsilon? 是截斷系數(常用 0.2)

這個損失保證了策略更新不能偏離舊策略太遠,防止訓練不穩定。

🔍 第一次微調時,rt=1r_t = 1rt?=1

由于初始時當前策略與舊策略相同,有:

rt=πθ(at∣st)πθold(at∣st)=1 r_t = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)} = 1 rt?=πθold??(at?st?)πθ?(at?st?)?=1

所以第一次策略更新實際變成:

Lpolicy=?A^t L^{\text{policy}} = -\hat{A}_t Lpolicy=?A^t?

相當于標準的策略梯度算法。


5?? PPO 價值損失函數:如何構建?

價值網絡使用均方誤差損失來擬合獎勵:

Lvalue=Et[(V?(st)?Rt)2] L^{\text{value}} = \mathbb{E}_t \left[ \left( V_\phi(s_t) - R_t \right)^2 \right] Lvalue=Et?[(V??(st?)?Rt?)2]

也可以加上 value clipping:

Lvalue-clipped=max?((V?(st)?Rt)2,(clip(V?(st),Vold??,Vold+?)?Rt)2) L^{\text{value-clipped}} = \max\left( (V_\phi(s_t) - R_t)^2, (\text{clip}(V_\phi(s_t), V_{\text{old}} - \epsilon, V_{\text{old}} + \epsilon) - R_t)^2 \right) Lvalue-clipped=max((V??(st?)?Rt?)2,(clip(V??(st?),Vold???,Vold?+?)?Rt?)2)


6?? 總損失函數:包含 entropy 獎勵

完整的 PPO 損失函數通常為:

L=Lpolicy+c1?Lvalue?c2?H(πθ) L = L^{\text{policy}} + c_1 \cdot L^{\text{value}} - c_2 \cdot H(\pi_\theta) L=Lpolicy+c1??Lvalue?c2??H(πθ?)

  • H(πθ)H(\pi_\theta)H(πθ?):策略的熵,用于鼓勵探索(entropy bonus)
  • c1,c2c_1, c_2c1?,c2?:超參數,通常取 0.5 和 0.01

熵越高表示策略更隨機,防止策略過早收斂到確定動作。


7?? 微調后,舊軌跡還能繼續用嗎?

不能。PPO 是 on-policy 算法。

每輪策略更新后,舊軌跡(state, action, reward, old prob)就過時了,必須重新采樣:

  • 舊策略生成的樣本反映不了當前策略的行為
  • 若繼續使用,會引入策略偏移(policy mismatch)

因此,PPO 的標準訓練循環是:

  1. 用當前策略生成軌跡
  2. 固定軌跡,訓練 N 個 epoch
  3. 更新策略后丟棄舊軌跡
  4. 重復采樣新數據

? 總結回顧

項目內容說明
策略概率模型輸出 logits → softmax 得到 token 概率
策略損失PPO clipped objective,基于概率比和優勢函數
價值得分Value head 輸出一個實數,預測狀態期望獎勵
獎勵函數來自人工打分或獎勵模型,指導優勢函數計算
是否復用軌跡? 不能復用舊軌跡,策略更新后必須重新采樣

🔚 寫在最后

理解 PPO 中策略概率、價值得分、損失函數之間的關系,是成功實現 RLHF、SFT + RL 微調語言模型的基礎。

這些原理不只是公式,更影響著你訓練是否穩定、樣本是否有效、微調是否收斂。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90290.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90290.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90290.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

日常--記一次gitlab Runner配置與CI/CD環境搭建流程

文章目錄一、前言二、相關知識1.相關定義1.什么是 CI&#xff1f;2.什么是 CD&#xff1f;2.CI/CD 構建塊與工具鏈3.為什么要使用 CI/CD&#xff1f;三、準備四、實現1.Runner安裝與配置1.更新源2.安裝Runner3.注冊Runner4.啟動Runner5.查看Runner信息2.CI/CD流程測試1.CI/CD構…

東方仙盟AI數據中間件使用教程:開啟數據交互與自動化應用新時代——仙盟創夢IDE

一、啟動未來之窗AI 二、初始化數據接口三、便捷接口數據進入東方仙盟獲取接口標準四、同步參數仙界界牌&#xff0c;冥界界牌&#xff0c;仙盟界牌 五、開始同步六、東方仙盟青云劍魂架構在當今數字化浪潮下&#xff0c;數據的采集、處理與傳輸成為眾多應用場景的核心需求。而…

Rust 仿射類型(Affine Types)

在 Rust 中&#xff0c;仿射類型&#xff08;Affine Types&#xff09; 是所有權系統的理論基礎&#xff0c;它規定了每個值有且僅有一次使用機會。這與線性類型&#xff08;必須恰好使用一次&#xff09;有所不同&#xff0c;允許值未被使用就被丟棄。Rust 中的仿射類型核心特…

python庫 arrow 庫的各種案例的使用詳解(更人性化的日期時間處理)

文章目錄 一、arrow概述1.1 arrow介紹1.2 安裝 arrow1.3 注意事項二、基本使用2.1 創建 Arrow 對象2.2 格式化輸出2.3 時間運算三、高級功能3.1 時區處理3.2 時間范圍3.3 時間間隔四、實際應用案例4.1 日志時間處理4.2 會議時間提醒4.3 國際化時間顯示5. Arrow 與 datetime 互操…

window 服務器上部署前端靜態資源以及nginx 配置

最近搞了一臺境外服務器 這種境外服務器是不可以配置域名的 但是可以使用ip訪問 但是如果需要 配置 需要下載nginx nginx: download 我這個是windows 的 服務器 所以下載windows 的nginx 下載完成以后 這個里面的html 文件 就是前端項目 里面必須要有index.html文件 部署…

行業實踐案例:醫療行業數據治理的挑戰與突破

“醫療數據不僅是資源,更關乎生命。” ——醫療行業的數據治理,是合規、安全、質量與智能化的多重挑戰。 ?? 本文目錄 為什么醫療行業亟需數據治理? 醫療行業數據治理的獨特挑戰 醫療數據治理體系設計原則 關鍵能力模塊與實踐案例 工具選型與落地建議 總結與下一步 1?? …

單細胞轉錄組學和空間轉錄組學數據的整合方法

文章目錄問題1&#xff1a;現有技術是否可以拿取固定數目的細胞進行組合形成spot問題2&#xff1a;是否有關于這方面的研究問題3&#xff1a;相關論文推薦一、細胞反卷積的核心目標與挑戰二、單細胞與空間轉錄組數據的整合方法分類1. 概率型方法&#xff08;Probabilistic-base…

【Java EE】SpringBoot 配置文件、日志和單元測試

1. 什么是配置文件在我們的計算機上諸如 C:/Users&#xff0c;C:/Windows&#xff0c;.config&#xff0c;.xml 都是配置文件&#xff0c;配置文件主要為了解決硬編碼帶來的問題。硬編碼是將數據直接寫在程序的源代碼中&#xff0c;代碼寫死后再想改變就很麻煩。因此&#xff0…

CMake實踐:常見的調試技巧

目錄 1.簡介 2.用 message() 輸出關鍵信息 2.1.message簡介 2.2.常用模式及作用 2.3.核心用法示例 2.4.常見問題及解決 3.查看緩存變量&#xff1a;cmake -L 與緩存文件 3.1.列出所有緩存變量&#xff08;cmake -L&#xff09; 3.2.直接查看 / 刪除 CMakeCache.txt 4…

爬蟲-第一個爬蟲程序

瀏覽器里面都是html數據&#xff0c;拿到的都是頁面源代碼&#xff0c;可以用自己的方式打開測試。打開瀏覽器decode找charset

從SEO到GEO:優化策略如何應對傳統搜索與AI搜索的巨變

AI 搜索與傳統搜索結果優化之間有什么重疊之處&#xff1f; 為了幫助確定主要的差異&#xff0c;以及那些重疊程度最高的區域&#xff0c;我創建了一個比較&#xff08;我會保持更新&#xff09;&#xff0c;通過搜索行為、優化領域、結果展示和交付&#xff0c;以及要跟蹤的 K…

mysql5.7系列-InnoDB的MVCC實現原理

談到數據庫事務都要提一下ACID 特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事務中的操作要么全部執行&#xff0c;要么全部不執行。 一致性&#xff08;Consistency&#xff09;&#xff1a;事務執行前后&#xff0c;數據庫的狀態必須是一致的。 …

力扣-287.尋找重復數

題目鏈接 287.尋找重復數 class Solution {public int findDuplicate(int[] nums) {int low nums[0];int fast nums[nums[0]];//1.快慢指針找相遇點while (low ! fast) {low nums[low];fast nums[nums[fast]];}//2.雙指針找入環點int pre 0;while (pre ! low) {pre num…

Java 大視界 -- Java 大數據在智能教育個性化學習計劃制定與動態調整中的應用(338)

Java 大視界 -- Java 大數據在智能教育個性化學習計劃制定與動態調整中的應用&#xff08;338&#xff09; 引言&#xff1a;正文&#xff1a;一、Java 構建的學習行為數據采集與分析體系1.1 全場景數據接入引擎1.2 家校協同數據交互模塊1.3 學習特征提取與建模 二、Java 驅動的…

uniapp返回webview返回小程序并且跳轉回webview

webview頁面提示&#xff1a;wx一定要導入sdk// 返回小程序&#xff0c;并攜帶當前 WebView 的 URL 和狀態wx.miniProgram.postMessage({type: requestPayment,data: {webviewUrl: window.location.href,orderNum: this.orderNum,type: requestPayment}})setTimeout(() > {w…

[java: Cleaner]-一文述之

Cleaner Cleaner 是 Java 9 引入的資源清理機制&#xff0c;用于在對象被垃圾回收后自動或手動執行清理操作&#xff0c;替代 finalize()&#xff0c;安全、異步且高效。 public final class Cleaner {final CleanerImpl impl;static {CleanerImpl.setCleanerImplAccess(new Fu…

知識庫中如何確實嵌入文本塊大小?語義完整性與檢索顆粒度的平衡機制

一、文本塊大小確定的理論基礎與歷史演進 1.1 概念起源與發展脈絡 文本塊&#xff08;Text Chunk&#xff09; 這一概念最初源于信息檢索領域的實踐需求。早期的全文檢索系統面臨著一個根本性矛盾&#xff1a;如何在保持文檔語義完整性的同時&#xff0c;實現高效的信息定位。這…

C/C++ 實現在快速排序Quick Sort中的三種分區方式

1. 簡介神說, 要有光. 于是就有了光. 神說要有快排, 于是就有了快排. 快速排序Quick Sort的發明者 托尼 霍爾 是1980年的圖靈獎得主. 快速排序就是他發明的. 當時發明的背景是: 由于霍爾要高效地對俄語詞匯進行排序以優化翻譯程序, 而當時的排序算法(如冒泡, 插入排序)效率較低…

Flink TiDB CDC 環境配置與驗證

一、TiDB 數據庫核心配置 1. 啟用 TiCDC 服務 確保 TiDB 集群已部署 TiCDC 組件&#xff08;版本需兼容 Flink CDC 3.0.1&#xff09;&#xff0c;并啟動同步服務&#xff1a; # 示例&#xff1a;啟動 TiCDC 捕獲 changefeed cdc cli changefeed create \--pd"localhos…

2025年數據挖掘與計算機科學國際會議 (DMCS 2025)

2025 International Conference on Data Mining and Computer Science【一】、大會信息 會議簡稱&#xff1a;DMCS 2025 大會地點&#xff1a;中國廣州 收錄檢索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等【二】會議簡介2025年數…