PPO过程由浅入深
1概述
PPO 的三个字母含义:
P:Proximal(近端、接近的意思)
P:Policy(策略)
O:Optimization(优化)
直译就是 近端策略优化。PPO 的核心:限制新旧策略的更新幅度,保证优化过程 既稳定,又高效。
往下看完会发现ppo的本质其实是在保证新策略与就策略尽量接近的情况下,尽量朝着优势收益最大化的方向前进,可能这句话不好理解(比如优势收益是什么,如何最大化优势收益,新旧策略接近如何实现等),我们带着这些问题往下看,会发现其实强化学习,ppo,dpo,grpo并不难。
2 LLM为什么要使用强化学习
偏好是相对的,而不是确定的标签
-
监督学习需要正确答案,而人类偏好只是“回答 A 比 B 更好”**。
-
RL 可以通过 reward 直接建模相对优劣,而不需要 ground truth。
生成过程是序列决策问题
-
LLM 输出每个 token,就像 RL agent 根据当前的state(prompt token)在每一步选择动作。
-
最终的好坏评价(reward)可能要等到整段回答生成后才知道 → 延迟奖励问题,正是 RL 的强项。
探索 (exploration) 与利用 (exploitation)
-
如果只靠监督微调,模型会过拟合已有标注回答。
-
RL 能够通过采样探索更多潜在回答空间,发现更优解。
-
RL更有人形容其是屎上雕花,其实有一定道理,之所以说是屎,更多的是因为其无法提升模型的天花板,“雕花”意味着矮子里边挑高个
监督学习
- 像学生做选择题,老师告诉你每道题的标准答案,学生提前训练好,然后开始做题。
强化学习
- 像玩游戏,老师不告诉你每一步该按哪个键,只在你通关或失败时告诉你结果,到达这个结果的路径有N条,学生可以在这N条路中去探索学习较优trajectory的分布。
在强化学习中,我们不需要为每个输出给定精确的“标准答案”(标签),只要能提供一个偏好信号(reward激励),RL 就能通过策略优化来学习。
3. 马尔科夫假设是什么?
在序列决策问题中,我们关心的是“在某个时间点,某件事情发生的概率”。例如预测天气:知道第1到第3天的天气后(第一天晴天,第二天雨天,第三天多云),我们希望计算第4天晴、雨、阴等天气的条件概率。即求:
P
(
s
4
∣
s
1
=
s
u
n
n
y
,
s
2
=
r
a
i
n
,
s
3
=
c
l
o
u
d
y
)
(1)
P(s_4|s_1=sunny,s_2=rain,s_3=cloudy) \tag{1}
P(s4∣s1=sunny,s2=rain,s3=cloudy)(1)
解决这个问题有很多种办法,从最简单的统计频率发过度到马尔科夫,过程如下:
3.1 直接统计频率法**:(最简单的方法)
我们可以统计所有长度为4的连续天气序列(四元组),然后用最后一天出现不同天气的频率来估计概率。
问题是链(序列)长度越长,需要统计的数据量呈指数级增长:长度为3可能需要几十万条数据,长度为10、100甚至1000,则数据需求极为庞大,这在实际中不可行。同时伴随着链(序列)上每个节点的状态变化范围的增大,要求数据量会更大,而且这种方法较难扩展。
3.2 简化思路——马尔科夫假设(Markov Assumption)**
既然直接统计频率的方法对于长序列的依赖导致数据统计量指数级增长,那么我们减少序列长度是不是就可以减少统计量呢?马尔科夫假设以及马尔科夫链确实也是这么来做的。
- 如果我们假设“下一时刻的状态只依赖上一时刻的状态”,那么预测只需要考虑当前状态即可。
- 数据量需求大幅下降,从指数级变为线性(或常数级),计算和存储成本显著降低。
基于马尔科夫假设(Markov Assumption)我们构建数据模型,得到马尔科夫链(Markov Chain)即:
P
(
s
t
∣
s
1
,
s
2
,
.
.
.
,
s
t
−
1
)
=
P
(
s
t
∣
s
t
−
1
)
(2)
P(s_{t}|s_1,s_{2},...,s_{t-1}) = P(s_{t}|s_{t-1}) \tag{2}
P(st∣s1,s2,...,st−1)=P(st∣st−1)(2)
4. 马尔科夫决策过程(MDP)
4.1 马尔科夫决策过程(Markov Decision Process, MDP)
- 在马尔科夫链的基础上,引入了 决策者的动作(Action) 和 奖励(Reward)。
- 它是一个五元组:
M = < S , A , P , R , γ > (3) M=<S, A, P, R, \gamma > \tag{3} M=<S,A,P,R,γ>(3)
各部分含义:
s
s
s:状态空间(State space)
A A A:动作空间(Action space)
P ( s t + 1 ∣ s t , a t ) P(s_{t+1}|s_t, a_t) P(st+1∣st,at):状态转移概率,表示在状态 下执行动作,转移到下一个状态的概率
r r r:奖励函数,表示在状态下执行动作获得的即时奖励
γ \gamma γ:折扣因子,用于平衡即时奖励与未来奖励(即时奖励和未来奖励我们后边会讲解)
4.2 强化学习与马尔科夫决策关系:
马尔科夫链是“自然演化的过程”,而 马尔科夫决策过程则是“在演化中可以做选择,并且有奖励反馈”。
到这里是不是发现上边强化学习的公式和马尔科夫决策过程有很多相似的内容,没错,强化学习的本质,就是在马尔科夫决策过程中学习策略。
- 马尔科夫决策过程(MDP) 是数学建模框架,它定义了一个智能体(Agent)和环境(Environment)的交互规则
- 强化学习就是在 MDP 上寻找最优策略。
策略 : π ( a ∣ s ) \pi(a|s) π(a∣s) 在状态 s s s下选择动作 A A A的概率分布
目标:找到一个最优策略 π ∗ \pi^* π∗,最大化智能体的期望累计奖励
E [ ∑ t = 0 ∞ γ t r ( s t , a t ) ] (4) \mathbb{E}\Big[\sum_{t=0}^{\infty} \gamma^t r(s_t,a_t)\Big] \tag{4} E[t=0∑∞γtr(st,at)](4)
举个例子:玩游戏(比如超级玛丽)
- 状态 s s s:游戏画面(玛丽的位置、怪物位置、金币数…)
- 动作 a a a:跳、走、蹲、攻击
- 奖励 r r r:吃到金币 +1,过关 +100,被怪物撞到 -10
- 状态转移概率 p p p:不同动作可能导致不同的场景变化(跳不一定成功,可能掉下去)
- 强化学习的目标 π ( a ∣ s ) \pi(a|s) π(a∣s):学一个策略(什么时候跳、什么时候走),让累计奖励(过关 + 拿金币)最大化
4.3 PPO与MDP
PPO 的目标函数(优势函数、概率比率)都建立在 MDP 框架下:
- 奖励函数 r ( s ∣ a ) r(s|a) r(s∣a)
- 状态转移概率 P ( s t + 1 ∣ s t , a ) P(s_{t+1}|s_t, a) P(st+1∣st,a)
- 优势函数 A ( s , a ) = Q ( s , a ) − V ( s ) A(s,a) = Q(s, a) - V(s) A(s,a)=Q(s,a)−V(s)这些定义的合理性,都需要依赖马尔科夫过程。
- PPO 使用旧策略 π θ o l d \pi\theta_{old} πθold采样,然后用比率 r t ( θ ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) r_t(\theta) = \frac{\pi_{\theta}(a_t \mid s_t)}{\pi_{\theta_{\text{old}}}(a_t \mid s_t)} rt(θ)=πθold(at∣st)πθ(at∣st)来修正分布偏差。这个修正假设每一步的 s t , a t s_t,a_t st,at满足马尔科夫性质,否则采样分布的独立性和一致性就会破坏,重要性采样失效。
其实ppo的主要贡献是在重要性采样的基础上引入了clip来控制参数更新的力度,其他的在其前身trpo中都是已经有的,顺便提下ppo和trpo是同一个作者
4.4 总结
- 马尔科夫假设:定义问题,降低计算存储复杂度,定义环境演变条件
- 马尔科夫链:基于马尔科夫假设,让环境自己演化,没有选择。
- 马尔科夫决策过程(MDP):基于马尔科夫链,构建环境 + 选择(动作) + 奖励模型。
- 强化学习:在 MDP 框架下,学习一个策略去做选择,使得长期奖励最大化。
5. PPO过程拆解
5.1 关键问题有哪些
- 1 价值函数是什么,如何定义,为什么要引入价值函数?
- 2 优势是什么,如何定义,为什么要引入优势?
- 3 如何最大化优势收益?
- 4 如何实现新旧策略尽量接近?新策略,就策略分别是指什么
带着这些问题,我们过一遍ppo(强化学习在LLM应用的一种)看看ppo是如何定义和解决我们面临的上述问题。
5.2 价值函数(Value Function)
先给出定义,在强化学习中,常见的价值函数有两类:
- 状态价值函数(State Value Function)
V
π
(
s
)
=
E
π
[
∑
t
=
0
∞
γ
t
r
t
∣
s
t
=
s
]
(5)
V^{\pi}(s) = E_\pi[\sum_{t=0}^{\infty } \gamma^t r^t|s_t=s] \tag{5}
Vπ(s)=Eπ[t=0∑∞γtrt∣st=s](5)
意思是:从状态
s
s
s出发,按照策略
π
\pi
π行动,获得的折扣累计奖励期望。
- 动作价值函数(Action Value Function / Q 函数)
Q
π
(
s
,
α
)
=
E
π
[
∑
t
=
0
∞
γ
t
r
t
∣
s
t
=
s
,
a
t
=
α
]
(6)
Q^{\pi}(s, \alpha) = E_\pi[\sum_{t=0}^{\infty } \gamma^t r^t|s_t=s, a_t=\alpha] \tag{6}
Qπ(s,α)=Eπ[t=0∑∞γtrt∣st=s,at=α](6)
意思是:在状态
s
s
s下先执行动作
a
a
a,之后按照策略
π
\pi
π行动,获得的折扣累计奖励期望。
在之前的介绍中,不管是马尔科夫决策还是强化学习,我们都提到了奖励 r r r(reward),它表示环境在状态下 s t s_t st给出的即时回报。但如果只关注当前的即时奖励,眼光就显得过于短浅了:因为当下的状态和动作不仅影响当前回报,还会影响未来的状态和动作,从而决定长期收益。
因此,更合理的设计方式是:在时刻
t
t
t,状态
s
s
s的总收益 = 当前的即时收益
r
r
r + 从该状态出发能够带来的未来收益。用公式表达, 即:
V
t
=
r
t
+
γ
V
t
+
1
(7)
V_{t} = r_{t} + \gamma V_{t+1} \tag{7}
Vt=rt+γVt+1(7)
其中:
- V t V_t Vt:时刻的总收益,包含了即时与未来两部分
- r t r_t rt:时刻的即时奖励,也称为即时收益
- V t + 1 V_{t+1} Vt+1:下一个时刻的总收益
- γ \gamma γ:折扣因子,决定了我们在多大程度上将未来收益折算为当下价值
其实这里的 V t V_t Vt展开计算后(把 V t + 1 V_{t+1} Vt+1带入式子中),与公式(5)中的状态价值函数完全一致。到此关于价值函数的定义和意义,已经明确。那为什么要引入价值函数呢?原因就是价值函数是“未来收益的预估器”,用来告诉智能体在某个状态/动作下,长期来看值不值。也就是说强化学习需要一个价值函数来估计当前状态下,执行某个动作带来的收益,依据收益最大化来进行参数更新。
5.3 PPO组件
强化学习求解nlp
先验知识:现在主流大语言模型都是基于next token prediction来进行的
- 我们先给模型一个 prompt,希望它能生成符合人类偏好的 response。
- 在时间步 ttt,模型会根据已有的上下文生成一个 token。这个 token 在强化学习中可以类比为一个
动作(action),记作。所以在 NLP
场景下,动作空间其实就是词表(qwen的此表范围是151643,其实就是每个token的类别个数)。 - 模型生成动作后,会得到一个即时收益,而从长期角度,它对应的总收益为(包含即时和未来的收益,就是我们上边提到的价值函数)。这个收益可以理解为“人类偏好的衡量指标”。
- 随着新 token 的生成,模型的状态从转变为,即“旧的上下文”扩展为“旧上下文 + 新 token”。
- 在这个框架下,智能体是语言模型本身,环境则是它生成并反馈的语料。
PPO算法中共有四个模型,各模型的角色和训练方式可以理解为:
- Actor Model(演员模型):就是我们希望训练的目标语言模型,用于生成文本
- Critic Model(评论家模型):用于估计整个生成序列的总收益(价值),帮助指导 Actor 的更新
- Reward Model(奖励模型):负责计算即时奖励,衡量生成当前token下的奖励表现
- Reference Model(参考模型):负责为Actor提供约束,防止其生成偏离期望的内容,从而避免训练“走歪”。(尽量保持和sft模型的输出分布一致)
训练策略上:
- Actor 和 Critic 模型在 RLHF 阶段是需要训练的。
- Reward 和 Reference 模型的参数在训练过程中保持冻结。
此外,Actor, Critic、Reward 和 Reference 模型共同构成了一个“奖励-损失计算体系”。我们综合它们的结果来计算最终的 loss,用于更新 Actor 和 Critic 模型,从而指导目标语言模型朝正确方向优化。
5.3.1 Actor model
Actor model,是我们想要训练,且最终训练好用于推理环境进行next token 预测的模型,它初始化为sft后的模型(包括结构和参数)。ppo中的action即为Actor模型每次吐出一个token。同时,生成的token会更新当前的prompt(即状态s),例如t时刻,有状态
s
=
p
r
o
m
p
t
t
s = prompt_t
s=promptt,此时预测下一个token为动作
a
t
a_t
at,到t+1时刻,状态更新为
s
=
p
r
o
m
p
t
+
a
t
s = prompt+a_t
s=prompt+at, 然后继续下一个token,然后这样一直重复下去,直到句子末尾
更新中
本文为原创文章,未经作者允许禁止转载。
8万+

被折叠的 条评论
为什么被折叠?



