LLM場景下的強化學習【PPO】

適合本身對強化學習有基本了解

一、什么是強化學習

一句話:在當前狀態(State)下,智能體(Agent)與環境(Environment)交互,并采取動作(Action)進入下一狀態,過程中獲得獎勵(Reward,有正向有負向),從而實現從環境中學習。

在LLM場景下,提到RL一般是指RLHF(人類偏好對齊),此時上述關鍵概念介紹如下:

  • Agent: 語言模型本身,例如GPT、LLaMA。

  • Environment: 訓練階段,環境是獎勵模型RM,它基于人類標注的偏好數據對生成的文本評分。在部署階段,環境是真實用戶,用戶的實際反饋(如點擊、停留時間、修正等)作為隱式獎勵。

  • State: 當前文本上下文(Prompt+已生成的Token序列),State會受到模型的上下文窗口限制,需要注意力機制捕捉長程依賴。

  • Action: 生成下一個Token。動作空間是整個詞表,每一步選擇一個token生成文本。特點是actions具備強依賴性,單個action的獎勵不好評估,需要對action序列進行評估。

  • Reward: 獎勵模型對完整響應的打分,評價維度一般包含文本的流暢性、相關性、準確性、用戶滿意度等

二、強化學習基本概念

強化學習的目標是最大化累積獎勵的期望

1、馬爾科夫決策過程(Markov Decision Process,MDP

強化學習過程是一個馬爾可夫決策過程,這是指下一個狀態和獎勵僅依賴于當前狀態和動作,即滿足馬爾可夫性。

2、動作空間A

整個詞表

3、狀態空間S

當前環境中所有可能狀態的集合。

狀態 = 當前文本序列(Prompt + 已生成的Token序列)。

因此狀態空間理論上接近無限,但實際會受到上下文窗口大小的限制。

例如,若上下文窗口為2048,詞表大小為50k,則狀態空間規模約為 ?{(50k)}^{2048}

4、策略

智能體在某一狀態下選擇動作的準則,一般有“確定性策略”和“隨機性策略”,在LLM場景下,由于每個動作輸出的是詞表的概率分布,所以都采用“隨機性策略”。

5、運動軌跡

智能體與環境交互過程中產生的一系列狀態、動作和獎勵的序列。

LLM場景下的特點是中間動作的獎勵均為0,僅最后一個動作的獎勵有意義。這種設定會導致稀疏獎勵問題 (Sparse Rewards),使得策略難以學習中間token的長期價值。

6、累積獎勵

累積獎勵(Total Reward)是軌跡中所有獎勵的未折扣總和,即?G = \sum _{t=0}^Tr_t由于LLM場景下,中間獎勵全部為0,所以累積獎勵等于最后一步的獎勵。

(ps:從概念的定義來推斷,能得出這個結論,但是還不確定是否存在中間獎勵不為0的情況)

還需要提到的概念是累積折扣獎勵G = \sum _{t=0}^T \gamma^t r_t會為獎勵增加一個取值在[0,1]之間的折扣因子,作用是更關注近期獎勵。

7、回報

從某一時刻開始的所有未來獎勵的累積,一般使用累積折扣獎勵作為回報。

G_t = \sum _{k=0}^T \gamma^k r_{t+k}

8、價值函數

  • 狀態價值函數 V^\pi(s):評估當前文本狀態的長期預期獎勵(如:"如何泡茶? 先燒"的價值)。

  • 動作價值函數 Q^\pi(s,a):評估特定Token選擇的價值(如:在狀態"如何泡茶? 先"下,生成"燒" vs "準"的預期收益)。

這里我們可以發現動作價值函數和狀態價值函數之間是有關聯的:

Q^\pi(s,a) = E[r_t + \gamma V^\pi(s_{t+1})]

舉例理解就是,在狀態"如何泡茶? 先"下,采取動作"燒"帶來的長期預期價值,等于"燒"這個動作的獎勵 + "如何泡茶? 先燒"這個狀態的狀態價值 的期望。這里取期望是因為"燒"這個動作的獎勵是不確定的,因為我們的策略在更新,動作的獎勵也會變化。只是在實際中為了簡化計算,會直接把期望給去掉,得到:

Q^\pi(s,a) = r_t + \gamma V^\pi(s_{t+1})

9、優勢

優勢定義為動作價值函數 減去 狀態價值函數

A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s) = r_t + \gamma V^\pi(s_{t+1}) - V^\pi(s_{t})

衡量的是在狀態s下,執行動作a比執行其他動作的優勢

讓我們用一個馬里奧游戲的例子來直觀理解,為什么優勢=動作價值函數-狀態價值函數

  • 假設你在玩馬里奧游戲,你來到了畫面的某一幀。

  • 你在這一幀下有3個選擇:頂金幣,踩烏龜,跳過烏龜。你現在想知道執行“頂金幣”的動作比別的動作好多少。

  • 你先執行了“頂金幣”的動作(即現在你采取了某個確定的策略),在這之后你又玩了若干回合游戲。在每一次回合開始時,你都從(這一幀,頂金幣)這個狀態-動作對出發,玩到游戲結束。在每一回合中,你都記錄下從(這一幀,頂金幣)出發,一直到回合結束的累積獎勵。你將這若干輪回合的獎勵求平均,就計算出從(這一幀,頂金幣)出發后的累積獎勵期望,即動作價值函數?Q^\pi(s,a)

  • 現在你重新回到這一幀,對于“頂金幣”,“踩烏龜”,“跳過烏龜”這三個動作,你按照當前的策略(對于每個回合,你有你自己當前的策略),從這三者中采樣動作(注意,我們沒有排除掉“頂金幣”),并繼續玩這個游戲直到回合結束,你記錄下從這一幀出發一直到回合結束的累積回報。重復上面這個過程若干次,然后你將這若干輪回合的獎勵求平均,就計算出從這一幀出發后的累積獎勵期望,我們記其為 V^\pi(s)

  • 你會發現不管是Q還是V,下標都有一個 π ,這是因為它們和你當前采取的策略是相關的。

  • 從直覺上,我們取 A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)?這個差值,就可以衡量在某個狀態下,執行某個動作,要比其它的動作好多少了。這個差值,我們可以理解為“優勢”(advantage),這個優勢更合理地幫助我們衡量了單步的獎勵。

  • 當優勢越大時,說明一個動作比其它動作更好,所以這時候我們要提升這個動作的概率

10、GAE優勢

GAE(Generalized Advantage Estimator,廣義優勢估計器),目的是解決優勢計算中的方差-偏差的問題。

在計算優勢時,如果依賴局部近似,也就是TD優勢(時序差分優勢)的方案,可能會忽略長期回報,導致策略更新方向出錯(偏差大問題);

如果依賴完整運動軌跡,也就是MC優勢(蒙特卡洛優勢)的方案,能夠反映長期回報,但是對噪聲敏感(方差大問題)

GAE通過引入一個新的超參數λ來平衡方差-偏差的問題

當λ接近0時,GAE優勢會更依賴短期步驟(低方差),從而緩解方差大的問題,但會忽略長期信息導致高偏差;

當λ接近1時,GAE優勢會更依賴未來多個步驟(低偏差),從而緩解偏差大的問題,但累積噪聲會放大方差。

按照經驗,λ的取值一般在0.9~0.99.

上面這個描述可能不好理解,下面詳細解釋下:

首先我們需要明確下,計算“優勢”的目的,就是為了判斷當前狀態下,我們采取的某個動作到底好不好。判斷的方式直觀來看有兩種,第一種是看采取這個動作后能不能馬上帶來收益;第二種是看采取這個動作后對我長期的收益有什么影響。

然后來對比三種優勢的計算公式:

A_t^{GAE} = \sum _{l=0}^\infty (\gamma \lambda ) ^l\delta _{t+l}

A_t^{TD} = \delta _{t} = r_t + \gamma V^\pi(s_{t+1}) - V^\pi(s_{t})

A_t^{MC} = G_t - V(s_t)

從公式中,可以直觀看到,TD優勢只依賴于當前狀態和下一狀態的狀態價值,以及當前狀態下,所采取的動作帶來的獎勵?r_t

所以我們說TD優勢依賴局部近似,也就是說它看的是“采取這個動作后能不能馬上帶來收益”,這種判斷方式的問題也很明顯,有時短期能帶來收益,但是長期來看這個動作并不好。

比如我們的LLM要生成一句話「“如何泡茶?先燒開水,再準備茶葉”」,現在LLM已經生成了「“如何泡茶?先”」,接下來要從{“燒”、“準”}中選擇一個動作,計算TD優勢,發現“準”的短期收益更大,那么策略就會向著讓“準”生成概率更大的方向來更新,最后生成的答案變成了「“如何泡茶?先準備茶葉,再燒開水”」,從長期來看,這個策略是不對的,整個策略的更新方向出錯。將這個問題稱為“偏差大”問題。

再看看MC優勢的公式,使用當前狀態的回報減去當前狀態的價值,需要注意下,回報是我們根據采樣得到的實際得到的獎勵,而狀態價值是我們使用Critic模型估計得到的預期獎勵,所以兩者之差其實是實際獎勵與預期之間的差值。如果實際獎勵比預期要好,說明我們采取的動作帶來的未來收益比平均未來收益要高,應該在策略更新中增加采取該動作的概率。

這種方法的問題在于計算?G_t?時,我們是根據當前狀態和當前策略,采樣了一條運動軌跡,這種采樣實際上隨機性很大,因為對于未來的每一個動作,實際都是“概率分布”,我們對每個動作的采樣,其實都是一個隨機事件,兩次采樣的軌跡可能對每個動作的選擇都不同。

所以MC優勢的缺點是采樣到的運動軌跡對噪聲敏感,用MC優勢指導策略更新會時好時壞,存在“方差大”問題。

最后看GAE公式,當λ接近0時,只有l=0的項有意義,退化成TD優勢公式。當λ接近1時,退化成MC優勢公式。所以λ越小,越能緩解方差問題,λ越大,越能緩解偏差問題,我們可以找到一個合適的λ值,從而在方差問題與偏差問題中找到一個平衡點。

11、策略更新方法

  • 基于策略的方法:以往方法是基于策略梯度,引入可學習參數θ,然后構造目標函數。在LLM場景下,一般使用PPO算法。

三、PPO算法

PPO算法的實現方式有兩種:PPO-Penalty和PPO-Clip

  • PPO-Penalty:使用KL散度衡量新策略與舊策略之間的分布差異,作用是作為懲罰項,如果KL散度大,則懲罰也大,會減少策略更新幅度,否則懲罰小,對策略更新的約束也小。

  • PPO-Clip:引入一個參數ε,當策略更步長大于1+ε或者小于1-ε時,直接采取裁剪,將步長限制在1-ε到1+ε之間。由于Clip方法效果更好,所以LLM場景中默認使用Clip

PPO算法中有兩個很重要的目標函數,至于為什么會有兩個,在后面會講

1.?Actor目標函數/策略目標函數

?

公式中前面的項對應綠色線,后面的Clip項對應藍色線,取min操作,得到的是紅色線。

當A>0時,說明當前動作是優于平均的,我們應該讓策略向著以后多采取這個動作的方向(x軸正向)更新,但是當新策略更新到與舊策略的比值等于1+ε時,我們就停止繼續正向更新,從而實現策略更新的約束。

當A<0時,說明當前動作是低于平均的,我們就應該讓更新后的策略降低采取當前動作的概率,也即向著x軸負向更新,同理,更新到新舊策略比值等于1-ε時,就停止負向更新。?

舉個例子,模型在狀態s時,可以采取的動作有輸出{"you", "me", "he"}。

此時假設采取動作為輸出"me",然后計算優勢 A^\pi(s, ``me") ,假設值是0.8,說明"me"這個動作是優于平均的。

然后我們還需要計算舊策略下,在狀態s的條件下采取動作"me"的概率,\pi_{old}(``me"|s_t) ,假設值是0.5

以及在當前策略下,在狀態s的條件下采取動作"me"的概率,\pi_{t}(``me"|s_t) ,假設值是0.6

按照我們的目標函數,由于A>0,所以我們是希望在接下來更新的策略中,在狀態s下,采取動作"me"的概率能夠提高

假設超參數ε設置為0.3

當前策略與舊策略的概率比 r_t(\theta) = \frac{\pi_\theta(``me"|s_t)}{\pi_{old}(``me"|s_t)} = \frac{0.6}{0.5} = 1.2 < 1 + \epsilon = 1.3 ,所以在接下來的若干次策略更新中,我們的理想狀態是,最終版本的策略,在狀態s下,采取動作"me"的概率等于0.65,也就是達到新舊策略概率比上限1.3

2.?Critic目標函數/價值目標函數

非常復雜的公式,要方便理解只需要看最后一個公式。

其中R_t是真實價值,等于在狀態s下,舊策略的狀態價值 + 當前策略的GAE優勢(相當于當前策略帶來的價值增長)。

目標函數的目標可以這么理解,在狀態s下,讓優化后的Critic Model預測當前策略的狀態價值V_\pi(s_t),使其盡可能逼近真實價值R_t

Clip項的作用是約束更新后的模型預測出的狀態價值不會過度偏離初始Critic模型預測出的狀態價值。

四、RLHF-PPO

下圖參考:https://zhuanlan.zhihu.com/p/13467768873

?整個過程大致三個階段:

階段1:基于預訓練模型,用監督數據訓練一個SFT model,用人類偏好數據訓練一個Reward model。

階段2:PPO過程,部署下述四個模型

來源model用途是否更新
SFT ModelActor Model要被優化的大模型,要學習的策略模型。更新
Reference Model為了控制Actor學習的分布與原始模型的分布相差不會太遠的參考模型(通過loss中增加KL項來達實現)。不更新
Reward ModelCritic Model對每個狀態做打分的價值模型,預估總收益 Vt。更新
Reward Model事先訓練好的ORM(Outcome Reward Model),對整個生成的結果打分,計算即時收益 Rt。不更新

階段3:?

大致流程如上圖所示,逐個步驟來拆解:

(1)采樣一批prompt作為輸入;每一個prompt其實就是一個Environment。

(2)調用Actor Model(policy model),輸出預測token概率分布(即輸出動作);需注意,僅第一步的輸入是q(prompt),后續的輸入是?o_t(prompt+預測token);

(3)調用Reference Model,輸入是?o_t(prompt+預測token),輸出是舊策略(即最開始的策略)預測的token概率分布。Actor Model與Reference Model輸出的新舊策略的概率分布會計算概率比r;需注意,采取clip策略,此處不需要完整計算KL。

r(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{ref}(a_t|s_t)}

(4)調用Reward Model,輸入是完整的qa對(prompt+完整答案),輸出是完整答案的得分,也即最終獎勵?R_TR_T?作用是用于計算每個每個時間步的獎勵?r_t

(5)調用Value Model,輸入是?o_t,輸出是當前策略的狀態價值??V_\pi(s_t)。需注意,舊策略的狀態價值 V_\pi^{old}(s)?是在最開始完成計算并保存。

(6)通過狀態價值?V_\pi(s_t)?和?R_T,可以計算GAE優勢 A_t^{GAE}

(7)通過?r = \frac{\pi_\theta(a_t|s_t)}{\pi_{ref}(a_t|s_t)}和?A_t^{GAE},可以代入Actor目標函數計算策略損失;通過?V_\pi(s_t)V_\pi^{old}(s)和?A_t^{GAE},可以代入Critic目標函數計算價值損失。從而完成兩個模型的更新。

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

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

相關文章

Python爬蟲實戰:研究chardet庫相關技術

1. 引言 1.1 研究背景與意義 在互聯網信息爆炸的時代,網絡數據采集技術已成為信息獲取、數據分析和知識發現的重要手段。Python 作為一種高效的編程語言,憑借其豐富的第三方庫和簡潔的語法,成為爬蟲開發的首選語言之一。然而,在網絡數據采集中,文本編碼的多樣性和不確定…

回溯題解——全排列【LeetCode】

46. 全排列 一、算法邏輯&#xff08;逐步通順講解每一步思路&#xff09; 該算法使用了典型的 回溯&#xff08;backtracking&#xff09; 狀態數組 思路&#xff0c;逐層遞歸生成排列。 題目目標&#xff1a;給定一個無重復整數數組 nums&#xff0c;返回其所有可能的全排…

RICE模型或KANO模型在具體UI評審時的運用經驗

模型是抽象的產物,結合場景才好說明(數據為非精確實際數據,僅供參考,勿照搬)。 ??案例一:RICE模型解決「支付流程優化」vs「首頁動效升級」優先級爭議?? ??背景??:APP電商模塊在迭代中面臨兩個需求沖突——支付團隊主張優化支付失敗提示(減少用戶流失),設計…

緩存中間件

緩存與分布式鎖 即時性、數據一致要求不高的 訪問量大且更新頻率不高的數據 &#xff08;讀多&#xff0c;寫少&#xff09; 常用緩存中間件 redis Spring 如果用spring的情況下&#xff0c;由于redis沒有受spring的管理&#xff0c; 則我們需要自己先寫一個redis的配置類&…

大語言模型全方位解析:從基礎認知到RESTful API應用

文章目錄 前言一、初見大模型1.1 大語言模型基本知識了解&#xff08;一&#xff09;日常可能用到的大語言模型&#xff08;二&#xff09;大模型的作用&#xff08;三&#xff09;核心價值 1.2 大模型與人工智能關系1.3 大語言模型的“前世今生”與發展1.3.1 大語言模型的發展…

網安系列【11】之目錄穿越與文件包含漏洞詳解

文章目錄 前言一 目錄穿越漏洞1.1 什么是目錄穿越&#xff1f;1.2 目錄穿越的原理1.3 目錄穿越的常見形式1.3.1 基本形式1.3.2 編碼繞過1.3.3 絕對路徑攻擊 1.4 實戰案例解析1.4.1 案例1&#xff1a;簡單的目錄穿越1.4.2 案例2&#xff1a;編碼繞過 1.5 目錄穿越的危害 二、文件…

uri-url-HttpServletRequest

1. 使用HttpServletRequest UrlPathHelper 解析 出 url路徑 org.springframework.web.util.UrlPathHelper 是 Spring 框架中用于處理 HTTP 請求路徑的一個工具類&#xff0c;它幫助解析和處理與請求路徑相關的細節。特別是 getLookupPathForRequest(HttpServletRequest request…

Ubuntu22.04安裝p4顯卡 nvidia-utils-570-server 570.133.20驅動CUDA Version: 12.8

Ubuntu22.04安裝p4顯卡 nvidia-utils-570-server 570.133.20驅動CUDA Version: 12.8專業顯卡就是專業顯卡&#xff0c;盡管p4已經掉到了白菜價&#xff0c;官方的支持卻一直都保持&#xff0c;比如它可以裝上cuda12.8,這真的出乎我意料。NVIDIA Tesla P4顯卡的主要情況Pascal架…

工業日志AI大模型智能分析系統-前端實現

目錄 主要架構 前端項目結構 1. 核心實現代碼 1.1 API服務封裝 (src/api/log.ts) 1.2 TS類型定義 (src/types/api.ts) 1.3 Pinia狀態管理 (src/stores/logStore.ts) 1.4 日志分析頁面 (src/views/LogAnalysis.vue) 1.5 日志詳情組件 (src/components/LogDetail.vue) 2…

C++內存泄漏排查

引言 C內存泄漏問題的普遍性與危害內存泄漏排查大賽的背景與目標文章結構和主要內容概述 內存泄漏的基本概念 內存泄漏的定義與類型&#xff08;顯式、隱式、循環引用等&#xff09;C中常見的內存泄漏場景&#xff08;指針管理不當、資源未釋放等&#xff09;內存泄漏對程序性能…

20250706-4-Docker 快速入門(上)-常用容器管理命令_筆記

一、常用管理命令1. 選項&#xfeff;&#xfeff;1&#xff09;ls&#xfeff;功能&#xff1a;列出容器常用參數&#xff1a;-a&#xff1a;查看所有容器包含退出的-q&#xff1a;列出所有容器ID-l&#xff1a;列出最新創建的容器狀態使用技巧&#xff1a;容器很多時使用dock…

基于 Camunda BPM 的工作流引擎示例項目

項目介紹 這是一個基于 Camunda BPM 的工作流引擎示例項目&#xff0c;包含完整的后臺接口和前端頁面&#xff0c;實現了流程的設計、部署、執行等核心功能。 技術棧 后端 Spring Boot 2.7.9Camunda BPM 7.18.0MySQL 8.0JDK 1.8 前端 Vue 3Element PlusBpmn.jsVite 功能…

Day06_刷題niuke20250707

試卷01&#xff1a; 單選題 C 1. 在C中,一個程序無論由多少個源程序文件組成,其中有且僅有一個主函數main().說法是否正確&#xff1f; A 正確 B 錯誤 正確答案&#xff1a;A 官方解析&#xff1a; 在C程序設計中,一個完整的程序確實有且僅有一個main函數作為程序的入口點,這…

洛谷 P5788 【模板】單調棧

題目背景模板題&#xff0c;無背景。2019.12.12 更新數據&#xff0c;放寬時限&#xff0c;現在不再卡常了。題目描述給出項數為 n 的整數數列 a1…n?。定義函數 f(i) 代表數列中第 i 個元素之后第一個大于 ai? 的元素的下標&#xff0c;即 f(i)mini<j≤n,aj?>ai??{…

linux系統運行時_安全的_備份_還原_方法rsync

1.問題與需求 問題: 新部署的機器設備(主控RK3588), 沒有經過燒錄定制鏡像, 研發部署, 直接組裝發送到客戶現場需要通過frpc遠程部署: 安裝ros2 python包 docker鏡像 環境配置 自啟動配置 SN設備信息寫自動部署腳本, 實現一鍵部署升級無奈物聯網卡做了白名單限制, apt 和…

18套精美族譜Excel模板,助力家族文化傳承!

【資源分享】18套精美族譜Excel模板&#xff0c;助力家族文化傳承&#xff01; &#x1f3af; 本文分享一套完整的家族譜系資源&#xff0c;包含18個精心設計的Excel模板&#xff0c;從基礎模板到專業圖表&#xff0c;滿足各類家族的族譜制作需求。 一、為什么要制作族譜&…

MySQL Galera Cluster企業級部署

一、MySQL Galera Cluster簡介 主要特點 同步復制&#xff1a; 所有的寫操作&#xff08;包括插入、更新、刪除&#xff09;在集群中的所有節點上都是同步的。這意味著每個節點上的數據是完全一致的。 多主節點&#xff1a; 集群中的每個節點都是主節點。所有節點都可以處理讀…

HTTP 重定向

什么是 HTTP 重定向&#xff1f; HTTP 重定向&#xff08;HTTP Redirect&#xff09; 是服務器向客戶端&#xff08;通常是瀏覽器&#xff09;發出的指令&#xff0c;告訴客戶端某個請求的資源已被移到新的位置。重定向通常通過發送一個特殊的 HTTP 狀態碼&#xff08;例如 3x…

本地加載非在線jar包設置

項目中存在私有jar包&#xff0c;提示在線獲取不到&#xff0c;需要先獲取到完整的jar包在打進maven中再在項目中進行maven依賴引入 mvn install:install-file -DfileD:\tools\maven\apache-maven-3.5.2\local_repository2\org\ahjk\SixCloudCommon\1.0\SixCloudCommon-1.0-SN…

Codeforces Round 979 (Div. 2)

A c[1]-b[1]0&#xff0c;之后每個c[1]-b[1]最大都是maxa-mina&#xff0c;最大和最小放前兩個 B ans2^(a1)-2^s-1&#xff0c;1一個最小 C 我們可以把式子化為(....)||(....)||(....)括號里沒有||&#xff0c;如果括號全是1那么A贏&#xff0c;A盡量選擇把1選在一起 D …