1. PPO基础:强化学习概述、策略梯度方法、PPO的Clipped Surrogate目标函数、重要性采样原理
好,咱们正式开始。这一章我打算聊聊PPO的基础,也就是强化学习里最核心的那套东西。说实话,PPO这玩意儿现在都快成RLHF的标配了,但很多人一上来就啃论文,结果被那个clipped surrogate objective搞得一头雾水。别急,咱们一步步来。
1.1 强化学习概述:智能体到底在学什么?
强化学习,说白了就是让智能体在环境里试错,然后学会怎么做才能拿到最多的奖励。你想想看,这跟训练狗握手有啥区别?狗坐下给零食,狗乱跑就啥也没有。强化学习也是这个道理——只不过环境更复杂,奖励更稀疏。
我刚开始做强化学习那会儿,总觉得这东西跟监督学习差不多。后来踩了个坑才发现,完全不是一回事。监督学习有标准答案,模型照着学就行。强化学习呢?它得自己探索,自己判断哪个动作好。这就像教小孩走路——你不能告诉他每块肌肉该怎么动,只能在他摔倒时扶一把,走稳时夸一句。
强化学习的核心要素其实就这几个:
- 智能体(Agent):做决策的那个家伙,比如游戏里的AI玩家
- 环境(Environment):智能体跟它交互的世界,比如游戏画面
- 状态(State):当前环境的快照,比如角色的位置、血量
- 动作(Action):智能体能做的操作,比如左移、右移、跳跃
- 奖励(Reward):环境给智能体的反馈,正奖励是表扬,负奖励是惩罚
- 策略(Policy):智能体的决策逻辑,也就是从状态到动作的映射
嗯,这里要注意:策略是强化学习的灵魂。你策略学好了,智能体就知道什么状态下该干什么。策略学歪了,那智能体就会像个无头苍蝇一样乱撞。
1.2 策略梯度方法:直接优化策略本身
传统的强化学习方法,比如Q-learning,是先学一个价值函数,然后根据价值选动作。但策略梯度方法不一样——它直接优化策略本身。说白了,就是让策略网络自己去摸索,哪些动作能带来高回报,然后往那个方向调整。
策略梯度的核心公式长这样:
∇J(θ) = E[∇log π_θ(a|s) * R(τ)]
这个公式看着简单,但内涵很深。我来拆解一下:
π_θ(a|s)是策略网络,给定状态s,输出动作a的概率∇log π_θ(a|s)是梯度方向,告诉网络怎么调整能增加这个动作的概率R(τ)是整个轨迹的累积回报,相当于给这个动作打个分
我在项目中遇到过一个问题:直接用这个公式训练,方差特别大。为什么?因为R(τ)的波动太大了——同样的动作,这次走运拿到高分,下次倒霉拿到低分。策略网络就被搞得晕头转向,今天往东调,明天往西调,根本收敛不了。
后来我学乖了,用优势函数A(s,a)代替R(τ)。优势函数的意思是:这个动作比平均水平好多少?这样方差就小多了。这也是后来PPO里用GAE(广义优势估计)的原因。
1.3 重要性采样原理:用旧数据学新策略
重要性采样,这名字听着挺唬人,其实道理很简单。你想啊,策略梯度方法需要从当前策略采样数据来更新。但每次更新完策略,旧数据就不能用了,得重新采样。这多浪费啊!
重要性采样的核心思想是:用旧策略采的数据,来估计新策略的期望。公式长这样:
E_{x~p}[f(x)] = E_{x~q}[ (p(x)/q(x)) * f(x) ]
其中p是新策略,q是旧策略。那个比值p(x)/q(x)就是重要性权重。它告诉我们要不要对旧数据做调整——如果新策略下某个动作的概率变大了,那它的重要性权重就大于1,相当于给这个样本加个权。
关键点:重要性采样是无偏的,但方差可能很大。如果p和q差得太远,重要性权重就会剧烈波动,导致训练不稳定。这也是PPO要加clip的原因——防止策略更新太猛。
我曾经在做一个机器人控制项目时,直接用重要性采样做off-policy更新,结果策略直接崩了。后来一查,发现新策略和旧策略的KL散度已经大到离谱了。嗯,从那以后我再也不敢让策略一步迈太大。
1.4 PPO的Clipped Surrogate目标函数:稳字当头
好了,终于到PPO了。PPO的全称是Proximal Policy Optimization,直译就是「近端策略优化」。这个「近端」是什么意思?就是每次更新策略时,别走太远,要稳。
PPO的损失函数长这样:
L_CLIP(θ) = E[ min( r_t(θ) * A_t, clip(r_t(θ), 1-ε, 1+ε) * A_t ) ]
其中:
r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t)是重要性权重A_t是优势函数ε是clip范围,通常取0.2
这个公式的精妙之处在于那个min操作。它做了两件事:
- 如果A_t > 0(这个动作好),那就鼓励策略增加这个动作的概率,但最多增加到(1+ε)倍
- 如果A_t < 0(这个动作差),那就惩罚策略减少这个动作的概率,但最多减少到(1-ε)倍
说白了,就是给策略更新加了个「安全护栏」。你想想看,如果没有这个clip,策略可能一次更新就把某个动作的概率翻了好几倍,然后下次采样全是这个动作,探索性全没了。有了clip,每次最多改20%,稳得很。
我的经验:ε取0.2是个不错的默认值。但如果你发现训练不稳定,可以试试0.1或0.15。反过来,如果训练太慢,可以试试0.25。不过我个人建议,新手先用0.2,别瞎调。
PPO的完整流程其实就三步:
- 用当前策略采样一批数据(轨迹)
- 计算每个时间步的优势函数A_t
- 用clipped surrogate objective更新策略,重复K个epoch
这里有个细节:PPO是on-policy算法,但通过重要性采样和clip,它可以复用旧数据做多次更新。这比传统的策略梯度方法高效多了。
1.5 本章知识体系:一张图看懂
说了这么多,我画张图帮你理一理思路。这张图展示了PPO基础的核心逻辑:从强化学习的基本框架,到策略梯度方法,再到重要性采样,最后汇聚到PPO的clipped objective。
这张图把本章的核心逻辑串起来了。你从左边开始看:强化学习提供了基本框架,策略梯度给出了优化方向,重要性采样解决了数据复用问题,最后PPO用clip机制保证了稳定性。每一步都是环环相扣的。
避坑指南:我曾经在实现PPO时,忘了对重要性权重做clip,结果策略直接发散。后来排查了半天才发现是这个问题。所以记住:clip不是可选项,是必选项。没有clip的PPO,就跟没有刹车的跑车一样——跑得快,但停不下来。
好了,这一章就到这里。PPO的基础知识其实就这些——强化学习框架、策略梯度、重要性采样、clipped objective。你把这些搞懂了,后面看RLHF里的PPO应用就会轻松很多。记住我的一句话:PPO的精髓不在于它有多复杂,而在于它用最简单的方式解决了策略更新的稳定性问题。
公众号:蓝海资料掘金营,微信deep3321