PPO(近端策略优化)
主要思想: PPO是一种基于策略梯度的强化学习算法,通过限制策略更新的步长来稳定训练过程。它使用裁剪机制,即通过裁剪策略更新的幅度,避免过大的更新导致训练不稳定。其目标函数包含策略梯度项、裁剪机制和KL惩罚项,以防止策略偏离初始模型过远。
一、如何理解策略梯度项、裁剪机制和KL惩罚项?
训练一个对话AI模型(比如ChatGPT)的场景为例,用“培训班老师教学生”的比喻来讲解PPO的三个策略:
场景设定
-
学生:AI模型(刚开始学会基础对话,但回答很生硬)。
-
老师:PPO算法,目标是通过“人类反馈”让学生回答得更自然、更有用。
-
教材:人类的对话数据 + 人类对回答的打分(Reward Model)。
1. 策略梯度项:按“学生表现”调整教学重点
问题:学生一开始的回答随机(比如用户问“怎么煮咖啡?”,它可能回答“咖啡是黑色的”或“先磨豆再加水”)。
老师的做法:
-
观察:如果学生回答“先磨豆再加水”得到人类高分,而“咖啡是黑色的”得低分。
-
策略梯度:老师会重点强化高分回答的逻辑,让学生以后更倾向于说“先磨豆再加水”这类答案。
-
关键:不是直接抛弃低分回答,而是参考新旧回答的概率比例,逐步调整。
效果:学生开始偏向高分回答,但不会完全忘记其他可能性。
2. 裁剪机制:防止“过度偏科”
问题:如果某次学生回答“用蓝山咖啡豆最好”意外获得极高评分,它可能从此只推荐蓝山咖啡豆,忽略其他合理答案。
老师的做法:
-
设定规则:单次训练中,学生对某个答案的“偏爱程度”最多只能比原来增加20%(比如从10%概率提到12%)。
-
裁剪机制:即使“蓝山咖啡豆”答案得分超高,老师也会说:“这个答案可以多练,但今天最多练到12%,明天再看效果”。
效果:避免学生因为一次高分就彻底“钻牛角尖”,保持多样性和稳定性。
3. KL惩罚项:防止“忘本”
问题:经过训练,学生可能为了拿高分,完全改变说话风格(比如从“严谨科普”变成“浮夸营销风”)。
老师的做法:
-
定期检查:对比学生现在的回答风格和最初风格是否差异过大。
-
KL惩罚:如果发现学生开始满嘴“史上最香咖啡!!”,老师会警告:“你偏离基础太远了,回去练练中性表达!”
效果:学生的回答既会优化质量,又不会丢失最初的合理性。
二、实际模型训练中是如何实现重点强化高分回答的逻辑?
在实际模型训练中,策略梯度项通过“试错-反馈-调整”的循环来重点强化高分回答的逻辑,具体实现可以分为以下几步。我用训练一个客服对话AI的场景来类比说明:
1. 试错阶段:模型生成多种回答
-
场景:用户问:“快递多久能到?”
-
模型生成多个候选回答:
-
A. “一般3天。”(普通)
-
B. “省内1天,省外3-5天。”(详细)
-
C. “亲,快递很快哦~”(模糊)
-
2. 反馈阶段:人类或奖励模型打分
-
奖励模型(或人类)评估:
-
A → 5分(及格但简单)
-
B → 9分(详细实用)
-
C → 2分(无效回答)
-
3. 策略梯度强化高分回答
核心逻辑:让模型增加高分回答的生成概率,减少低分回答的概率,但通过以下步骤实现:
(1) 计算“动作的性价比”
-
优势函数(Advantage):
-
回答B的优势值 = 9(实际得分) - 5(平均分) = +4(明显优于平均水平)
-
回答C的优势值 = 2 - 5 = -3(拖后腿)
-
(2) 调整生成概率
-
原始概率:假设模型原本生成B的概率是20%。
-
策略梯度更新:
-
因为B的优势值是+4,模型会显著提高B的概率(比如从20% → 35%)。
-
对C(优势值-3),模型会降低其概率(比如从30% → 15%)。
-
(3) 通过“概率比”控制幅度
-
重要性采样:模型不会直接替换概率,而是通过新旧概率的比例(例如从20%到35%,比例是1.75倍)逐步调整。
-
避免突变:如果比例变化过大(比如突然从1%跳到50%),裁剪机制会介入限制(见下文)。
三、实际模型训练中如何实现KL惩罚项防止模型“忘本”?
1. 什么是“忘本”?
-
初始模型:经过预训练和微调,能稳定生成合理但普通的回答(如“快递一般3天到”)。
-
RLHF训练风险:过度优化奖励后,模型可能变得极端化(比如为了拿高分,所有回答都变成“加急加钱24小时必达!”),丢失最初的平衡性。
2. KL惩罚如何解决问题?
核心思想:在优化目标中增加一个“惩罚项”,直接限制新旧策略生成答案的概率分布差异。
具体实现步骤:
(1) 计算新旧策略的KL散度
-
旧策略(πoldπold):训练前模型对答案的概率分布(例如:“3天到”概率50%,“1-5天”概率30%)。
-
新策略(πθπθ):训练后模型的概率分布(例如:“24小时到”概率飙升到80%)。
-
KL散度:量化新旧分布的差异(公式略,直观理解为“新策略有多偏离旧策略”)。
(2) 将KL散度加入损失函数
总损失函数 = 策略梯度损失 - β×KL散度β×KL散度
-
ββ:调节惩罚力度的超参数(例如0.01)。
-
效果:如果新策略偏离旧策略太多(KL散度过大),损失函数会变差,迫使模型回调。
(3) 动态调整ββ(可选)
-
自适应KL惩罚:
-
如果KL散度超过阈值(如0.1),增大ββ(加强约束)。
-
如果KL散度过低(如<0.01),减小ββ(放松约束)。
-
四、PPO算法的策略特性分析
核心结论:PPO本质上是on-policy算法,但通过技术改进部分借鉴了off-policy的特性,形成混合方法。
1. PPO的原始设计:On-Policy
-
数据来源:必须由当前策略(或接近当前策略的旧版本)生成。
-
传统限制:每次策略更新后,旧数据立即失效,需重新采样(典型on-policy特点)。
2. 引入Off-Policy特性的技术
-
重要性采样(Importance Sampling):
-
允许复用旧策略的数据进行多次梯度更新(如3~10次)。
-
-
裁剪机制(Clipping)或KL惩罚:
-
限制新旧策略的差异,避免因数据复用导致策略偏离太远。
-
3. PPO是“大部分on-policy,小部分off-policy”的混合方法,在保持稳定性的同时提升样本效率。
on-policy和offpolicy算法-CSDN博客
特性 | 传统On-policy(如A2C) | PPO混合设计 | Off-policy(如DQN/SAC) |
---|---|---|---|
数据来源 | 必须来自当前策略 | 当前或接近的旧策略生成 | 任意历史策略(如Replay Buffer) |
数据重用 | 禁止(单次更新后丢弃) | 有限重用(3-10次梯度更新) | 任意重用(长期存储buffer) |
更新约束 | 无直接约束 | 裁剪/KL惩罚限制更新幅度 | 通常无硬约束 |
4. 为什么PPO本质是On-policy?
-
数据时效性要求高
-
虽然允许少量数据复用(如3-10次更新),但长期依赖旧数据会导致性能下降,必须定期重新采样。
-
对比Off-policy:DQN/SAC可无限复用历史数据。
-
-
更新约束严格
-
裁剪机制或KL惩罚强制策略保持接近数据收集时的分布,体现On-policy的保守性。
-
对比Off-policy:SAC/DQN无需强制约束策略差异。
-
-
数据来源限制
-
PPO不能直接使用任意历史数据(如Replay Buffer中的陈旧数据),必须来自当前或近期策略。
-
PPO以On-policy为基础,通过技术改进(重要性采样[策略梯度项]+裁剪/KL惩罚)有限吸收Off-policy的优点。