本文在理解该高质量文章:https://zhuanlan.zhihu.com/p/614115887时提出些自己的白话版理解。
强化学习分两大类:
- 基于值函数的强化学习(先算好坏再选动作;训练收敛后 Q 值固定,每次遇到同一个状态,必然选同一个动作 ,即确定性策略;典型算法有Q-Learning、SARSA、DQN)
- 基于策略的强化学习(直接学怎么选动作)
基于策略的强化学习的核心逻辑:
- 不再计算 Q 值打分,直接拟合选动作的策略本身
- 用参数
定义策略:
,处于状态s时,在参数
下,选择动作a的概率
- 训练目标:用梯度上升/下降优化参数
,调整各个动作的选择概率,让总奖励变高
- 选动作规则:输出每个动作的概率,按概率随机抽样选动作,不是固定选某一个,即随机性策略
目标函数公式:
= 所有可能轨迹的总奖励的数学期望(平均值)
:遍历智能体和环境交互能走出来的全部可能轨迹
:这条轨迹
被当前策略走出来的概率
:这条轨迹的总奖励
- 所有轨迹的概率 × 奖励累加,就是平均总奖励
调整参数,总奖励很高的好轨迹,提高它出现的概率;总奖励很低的坏轨迹,压低它出现的概率。最终整体平均收益越来越高。
轨迹概率公式:
每一步由两部分概率相乘:
:策略自己选动作的概率。输入状态
,会在参数为
的策略网络中输出所有可选动作的概率分布。选出动作
的概率即为该值。【智能体自己内部选这个动作的概率】
:环境状态转移概率。执行动作
后,环境从
跳到下一个状态
的概率(由环境规则固定)【动作执行完毕后,环境跳转结果的随机性,就是说,动作做完之后去往哪个下一个状态有概率】
整条轨迹是一步一步串联出来的,所以总概率 = 每一步的概率依次相乘。
传统策略梯度推导:
先定总目标: 我们要最大化平均奖励,必须求梯度
,然后用梯度上升更新参数
。
第一步:初始变形
求和的导数 = 导数的求和
第二步:对数导数恒等式
根据链式法则:设,
就会有:
代入原式梯度:
变成了期望形式:求和本身就是数学期望定义,写成期望形式更简洁。
好处就是,取对数后连乘变累加,求导更加简单。
第三步:拆解求导部分
之前轨迹概率:
两边取对数,
求梯度时,第一项是环境自带转移概率,完全不受网络参数控制,对
求导结果 = 0,直接整项消失;只剩下第二项求导了。
此时完整策略梯度公式:
第四步:采样近似处理
要遍历全部无穷多条轨迹求和,现实不可能算,所以用蒙特卡洛采样近似期望: 期望 ≈ 多条采样轨迹的平均值
采集 m 条完整交互轨迹:
如果按照逐样本梯度汇总,把所有轨迹所有时间步拆开,总共有 n 个 =样本,直接平均:
第五步:梯度更新规则
策略梯度是梯度上升(要最大化 ,和神经网络梯度下降相反)
,其中
是学习率,控制每次参数更新步长
强化学习独有致命问题: 监督学习数据集固定,跳歪了下个 epoch 还能拉回来; 但强化学习策略一变,收集到的交互样本立刻跟着变。一旦跳到差策略,后续采集的全是低分轨迹,用坏样本继续更新策略,形成恶性循环,彻底困在局部差区域,很难再走回最优。
而调小学习率会导致收敛极慢,这也是 PPO 等算法要做裁剪约束更新幅度的原始动机。
只关心斜率,忽略了曲面曲率。直观理解不知道自己脚下是不是有急转弯。眼前一小段路看着坡度很缓(梯度小),但往前一点点路就会急拐弯陡变(曲率大),传统梯度看不见这个拐弯,很容易一步踩崩。
曲率大,极小参数改动就会让收益剧烈波动、策略剧变。曲率小,曲线拐弯非常平缓,做相同的改动,策略几乎没变。
自然策略梯度的推导:
为什么要计算策略分布差异,而不是衡量参数差值 ?
- 过冲(Overshooting):更新错过了奖励峰值并落入了次优策略区域
- 下冲(Undershooting):在梯度方向上采取过小的更新步长会导致收敛缓慢
如果用约束 (限制参数改动距离)防止过冲,会有以下问题:
- 在分布陡峭、曲率大的区域:很小的参数改动会使得策略剧烈大变,极易过冲翻车
- 在分布平缓、曲率小的区域:很大的参数改动会使得策略几乎没变化,更新浪费效率
如果直接控制策略分布差异呢?直接管策略本身改动幅度?引入KL 散度。
KL 散度公式【量化更新前后两个策略(动作概率分布)到底相差多大】
:所有可选动作的全集;遍历每一个动作 x 计算差值再求和
:旧策略选动作 x 的概率
:新策略选动作 x 的概率
使用log的好处就是,如果新旧策略几乎一模一样,那么log里面会趋近于 1,log(1)=0,整体 KL≈0,如果新旧策略差别巨大,大量动作的选择概率发生剧变,KL 数值会明显变大。
优化式:
硬性规定:不管参数改多改少,新旧策略的差距不能超过阈值
- 策略敏感区(曲率大、σ 小):为了不超 KL 上限,参数只能微调极小幅度,自动防止过冲
- 策略迟钝区(曲率小、σ 大):允许参数大步改动,只要分布变化没超限就行,收敛更快
注意:KL 不是对称距离:,这里固定是旧策略在前、新策略在后。
下面求解权重更新方案:
对以上优化式拉格朗日松弛,约束变惩罚项:
因为、
都是复杂非线性函数,没法直接求极值,在旧参数
附近做局部泰勒展开:
奖励函数J:一阶泰勒展开
一元函数一阶泰勒展开整理,已知函数 在
处可导,自变量增量
,即
,一阶泰勒展开近似公式为:
对应下面式子:
,只保留一阶梯度项,二阶及以上太小可以忽略。
KL 散度:二阶泰勒展开
补充说明:KL 在处,零阶、一阶导数都等于 0,最低非零项是二阶项:
把两个展开式代入拉格朗日式子:
00
继续化简 ——用 Fisher 信息矩阵F替换KL的Hessian二阶矩阵:
、
都不随
变化,求
时可以直接删掉,式子简化为:
将替换为Fisher信息矩阵F。因为在当前策略点处,KL 散度的二阶 Hessian 矩阵 = Fisher 信息矩阵
于是替换后得到最终简洁形式:
Fisher 有期望形式计算公式,采样即可估算:
求导数并令其等于0,解出来得到极值:
补充矩阵求导公式:
单独看第二项导数:
所以整体求导式子为:
移项整理:
注:这里原博主的极值求解答案应该写错了,没有那个-1/2。
该问题属于不等式约束优化问题,拉格朗日函数求导、令梯度 = 0,是满足了KKT 平稳性条件,是最优解的必要条件。还需要满足互补松弛条件,也就是
。如果
,就必须
,最优解卡在约束边界,取等。
根据上文可知,KL被泰勒展开二阶近似了,并且其值有一个约束:
将刚刚求得的代进去(
,
,这里是简化了一下写法)
代入 KL 等式:
展开:
把 代回:
于是:
解出 :
这里进行传统策略和自然策略更新式子的对比:
传统策略梯度更新格式:
:学习率;
:普通梯度,这是深度学习/强化学习最通用的参数更新形式。
上文得到的自然梯度形式的更新:
定义了自然策略梯度:
再令,就写成统一格式:
最终的权重更新方案为:
该方案的强大之处在于,无论分布的表示如何,它总是以相同的幅度改变策略。
信赖域策略优化算法(TRPO)的理解:
如何理解自然策略梯度算法的缺陷?
①推导时我们只用二阶泰勒展开近似 KL 散度,这个近似只在极小的局部才精准。因此,如果更新步长偏大,近似公式算出来的 KL 值 ≠ 真实 KL,算法按照 “近似 KL=ε” 算出步长去更新参数,更新完成后真实 KL 散度很容易超过预设上限 ε,还是不能解决过冲这个问题;
②求逆计算复杂度极高,Fisher矩阵F尺寸是
,方阵求逆的时间复杂度是立方级
;
③整个推导链条层层近似:KL 泰勒近似、期望用样本均值近似、共轭梯度近似求逆,累积误差很大。【因此可以计算两种策略之间预期回报的差异】
两种策略之间预期回报的差异可以表示为下面这个式子:
:旧策略
的总期望回报
:更新后新策略
的总期望回报
- 第二项 = 新策略相对旧策略的收益增量
- 如果第二项 > 0就说明更新有效、策略变好
- 如果第二项 < 0就说明更新变差,需要拒绝本次更新
再来看看第二项(优势函数)的理解:
:状态 s 在旧策略下的平均长期回报(该状态 “baseline 基础收益”)
:在状态 s 选动作 a,后续长期总回报
- 优势函数 A = 动作 a 超出该状态平均水平的超额收益
- A>0:这个动作比当前状态平均选择更好,值得多提高选择概率
- A<0:这个动作不如平均水平,应该压低选择概率
该表达式在原策略下计算优势函数,完全基于旧策略采样收集的轨迹数据计算;就算评估新策略的收益变化,也不用重新和环境交互、采集新样本。大幅节省交互成本。
此处开始推导化简套路
针对无限时域强化学习任务,环境不存在终止状态,智能体可以一轮又一轮无限交互下去,轨迹长度没有天然上限。
单条轨迹:
单条轨迹的原始总回报:
如果每一步奖励 ,无穷累加结果会趋向正无穷。两个策略回报都是无穷大,无法比较好坏、无法最大化
。引入折扣因子
之后,单条轨迹的折扣回报定义为:
这是等比无穷级数,必然收敛到有限值:
总回报有上界,策略之间才能对比优劣,优化才有数学意义。
随步数 t 增大不断变小,当下即时奖励权重最高,越遥远未来的奖励权重越低。
注:期望依然有上限。
策略期望回报:
遍历所有可能轨迹,按轨迹出现概率加权
- 单条轨迹无穷求和,但因为
,
本身是有限收敛值;
- 所有轨迹的概率
总和为 1,做概率加权平均之后,最终
一定是一个有限数值,不会发散到无穷。
根据上文的策略期望回报继续推导:
交换两个求和顺序(收敛级数可交换):
内层 就是第 t 时刻即时奖励的期望:
于是:
这个可以理解为:对每一个时间步 t,先求该步所有的即时奖励期望,再乘折扣
,把无穷所有时刻全部累加,就是总期望回报。
将期望展开:
期望的定义是对所有状态、动作,用出现概率加权求和
:全程按策略
交互,第 t 步刚好落在状态 s 的概率;
:已经处于状态 s 时,策略选出动作 a 的条件概率;
:该状态动作对应的即时奖励。
级数收敛前提下,可以调换对 t 无穷求和和对有限求和的先后顺序:
可以直观理解为原本是先按时间 t 循环,再遍历状态动作; 现在改成先固定一组 ,把这个状态 s 在所有时刻 t 的加权概率先算完,最后整体累加所有
。
引入定义——折扣状态分布
含义就是,无限时域下,把每个时刻 t 落在状态 s 的概率,乘上之后全部累加,是状态长期加权访问密度。其中,
表示遵循策略
交互,第 t 步恰好处于状态 s 的概率
代入:
最终得到不含时间、只对状态 + 动作有限求和形式:
所以以上证明了单策略的收益化简套路:

原来式子:
现在式子:
:新策略总回报;
:旧策略总回报
:新策略对应的折扣状态分布
:新策略在状态 s 选动作 a 的概率
:基于旧策略算出的优势函数
注:由于增量是新策略跑出来的轨迹收益变化,轨迹采样服从新策略。所以使用的是
但是这里做近似处理
理由一:想精确算出,必须拿更新后的新策略重新和环境交互、采集海量轨迹统计状态访问频率;每次迭代都重新采样,样本开销极大、训练很慢。
理由二:由硬性约束可知,限制新旧策略不能相差过大;策略改动幅度很小,两者和环境交互产生的轨迹走向、状态访问规律高度接近,因此状态分布差异很小,近似误差可控。
于是替换得到近似式:
对于该式子,时新策略的概率,没法用旧样本直接算,于是做变形:
把它代入求和式:
【离散形式数学期望的展开写法就是求和形式的,这里是把双重求和写回了期望形式,更加简洁】
把整体结构重新排版对齐:

重要性权重:
于是原式改写为:
把新旧策略收益差值近似部分单独拎出来,定义替代优势:
优化这个替代目标,间接逼近优化真实回报。
TRPO 论文推导出严格下界不等式来量化这个误差:
右边第二项指的是近似带来的最坏误差上限,策略改得越猛,近似偏差就越大,要从替代优势里扣除这个偏差。
:所有状态下新旧策略 KL 散度的最大值,用来衡量新旧两个策略整体差距有多大;策略改动越大,这个值越大
- C:论文严格推导出的固定常数
论文中提到的单调改进定理:
在约束新旧策略 KL 散度不超限的前提下,只要我们优化不等式右侧这个下界表达式,每一轮迭代真实总回报一定单调不降,不会出现更新后策略退化、奖励下跌的情况。 是 TRPO 算法稳定性最核心的理论根基。
MM 算法(Minorize-Maximize,下界最大化/极小极大算法):
MM 思想是不去直接优化原目标,转而最大化原目标的下界
- 只要下界变大,原目标(真实收益增量)必然跟着至少同步变大
- 最大化这个下界,等价于稳步抬升真实收益的下限,实现单调改进
结合定理,TRPO 把优化问题写成带约束形式:
- 最大化替代优势,试图拉高收益;
- KL 约束卡死策略改动幅度,控制近似误差不会过大;
- 依靠单调改进定理,保证每一步更新一定不会变差。
近端策略优化算法(PPO)的理解:
TRPO算法的缺陷是什么?
共轭梯度法(CG, Conjugate Gradient)是求解线性方程组 Ax=b的迭代数值算法。
缺陷一:即使使用共轭梯度法迭代近似求解,但是运算量还是很高,Fisher相关运算天生对大参数量网络不友好。
缺陷二:依旧是使用的自然策略梯度,Fisher 信息矩阵,本质是 KL 散度的 Hessian,属于二阶优化,更新速度慢。而且还不能用Adam等主流一阶优化器。
缺陷三:TRPO 很复杂。TRPO很难解释、实现和调试。当训练没有产生预期的结果时,确定如何提高性能可能会很麻烦(共轭梯度迭代、Fisher向量乘积、KL约束估计、步长线性回溯裁剪,模块特别多,代码冗长;训练震荡、收益不涨时,很难定位是KL阈值设置问题、共轭梯度迭代次数问题、采样方差问题还是数值稳定性问题)
原作者 Schulman 提出 PPO(近端策略优化),做轻量化替代:
- PPO-Penalty:把 TRPO 硬性 KL 约束改成目标函数内KL惩罚项,变成无约束一阶优化,不用 Fisher 矩阵、不用共轭梯度,能直接用 Adam;
- PPO-Clip(最常用):更进一步,直接用比例裁剪Clip机制隐性限制新旧策略差距,彻底避开 KL 计算、二阶求解整套复杂逻辑。
PPO Penalty:
目标函数:
TRPO在理论分析上推导出与KL散度相乘的惩罚项,但在实践中,这种惩罚往往过于严格,只产生非常小的更新。因此,问题是如何可靠地确定缩放参数β ,同时避免过冲。
-
若
设置太大 惩罚力度极强,KL 稍微变大就会大幅扣分,策略不敢大幅度更新,每次参数改动极小、学习速度极慢,和 TRPO 保守更新的毛病一样。
-
若
设置太小 惩罚太弱,约束形同虚设,新旧策略差距失控,出现overshooting(步长过冲):策略一次性改动过猛,打破单调改进前提,回报震荡、甚至越训越差。
-
更深一层麻烦 不存在一个万能
适配所有任务;哪怕同一个任务,训练中后期策略分布、状态特征会持续变化,前期合适的
后期不再适用,手动全程调参工作量极大。
设定一个目标 KL 散度,希望每轮更新后的 KL 散度尽量贴近
,不大不小;每一轮参数更新完,实时计算本轮真实 KL,按规则自动调整
:
- 如果本轮
(改动太大,超上限) 下一轮
,惩罚翻倍,收紧约束,遏制策略剧烈改动;
- 如果本轮
(改动太小,更新不足) 下一轮
,惩罚减半,放宽约束,允许策略更大幅度优化。
TRPO中只单向缩小步长,发现 KL 超标就不断缩回,只能往保守方向修正;PPO是双向调节,改太大就收紧惩罚、改太小就放松惩罚,灵活自适应调整。
阈值1.5 倍目标不是严格数学推导出来的,是工程启发式经验规则。运行过程中,允许短暂违反 KL 约束,依靠下一轮
快速修正兜底,无法像 TRPO 一样每一步严格满足 KL 约束、严格数学单调改进。代价是丢掉了 TRPO 完美的理论单调性保证。但是对超参数鲁棒性很强,
自适应后很好调参;摆脱二阶约束优化框架,用普通 Adam 一阶优化器即可训练。
PPO Clip:
PPO-Clip 思路是彻底抛弃 KL 散度、抛弃惩罚项、不用调,直接对新旧策略比值做硬性区间截断,简单粗暴限制策略改动幅度。
PPO-Clip 目标函数:
里面是两条候选项取最小值:
- 第一项:原始未裁剪替代目标
- 第二项:比例被裁剪之后的目标
:旧策略
:正在优化更新的新策略
含义是同一个(s,a),新策略概率 ÷ 旧策略概率
:新策略更倾向选这个动作
:新策略在压低这个动作的概率
截断函数强行限制新旧策略概率比值不能太离谱,防止单次更新策略跳变过大。
和PPO Penalty一样,可以使用像ADAM等优化器来执行更新。
本文旨在于一步一步理解传统策略梯度算法、自然策略梯度算法、信赖域策略优化算法(TRPO)、PPO算法。对于PPO算法的具体描述较为简略,重点放在了前面三种算法的推导上面。对于文章https://zhuanlan.zhihu.com/p/614115887简写的部分,做了详细的推导补充,尽可能没有推导思路上的断裂。并对其中可能出现的问题做了纠正。谨以此供继续学习交流。

1159

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



