醋醋百科网

Good Luck To You!

AI强化学习PPO算法通俗易懂理解_ppo算法pytorch

AI强化学习PPO算法通俗易懂理解

1 用超级玛丽游戏理解PPO 算法

1.1 背景设定:玛丽要通关

训练一个 AI 小玛丽要学会自动过关。

它可以执行的动作有: - 跳(jump)- 左走(left)- 右走(right)- 蹲(down)

它的目标是: - 尽快通过关卡;- 躲避怪物;- 吃金币和蘑菇;- 别掉坑里!

1.2 强化学习核心思想

你让玛丽自己去探索,每次操作会得到一个“奖励”: - 吃金币 +1 分- 被怪踩 -5 分- 走得越远 +分- 通关 +100 分

她需要学会策略:
在每种场景下(状态),选择什么动作能带来更多奖励。于是用 PPO 算法来训练她。

1.3 PPO是怎么让玛丽越来越聪明的?

我们就围绕 PPO 的三个关键“损失”部分,用超级玛丽游戏解释。

1. 策略损失(Policy Loss)

PPO 的核心思想是“聪明得有分寸”。

举个例子:

某个场景下,玛丽面前有一个蘑菇:

  • 原策略觉得“跳”的概率是 0.4;
  • 新策略觉得“跳”的概率是 0.8;
  • 而这个动作确实吃到了蘑菇(奖励高);

于是算法说:“你跳得对,我们应该让策略更偏向跳。”

但 PPO 有个重要限制: > 不要跳得太猛!原来 0.4,现在突然 0.95,太极端,容易过拟合!

所以它会加一个“剪刀”机制(clip),限制策略更新“不要离旧策略太远”,以防“学疯了”。

2. 值函数损失(Value Loss)

估算“这个场景到底值不值”。

比如:
玛丽现在刚吃了个蘑菇,正在通向一个金币雨的区域!

这个状态其实“非常值钱”,因为接下来可能连续吃到 5 个金币。

但如果你训练的价值函数 V(s) 估错了,比如估成只值 2 分,那算法就不懂得珍惜这个状态。

所以: > 你得让价值函数学会“看得懂未来”,即:让它预测的状态价值 V(s) 和真实回报接近。

这就靠: [ L_{} = (V(s) - )^2 ]

3. GAE(优势函数估计)

学会评估:当前这个动作,值不值得做?

举例:
玛丽现在踩了个怪,扣了分(-5),但她接下来跳上了平台,吃了 10 个金币。

所以,从长远看: > 虽然这个“跳”立刻被怪踩了,但之后有很多奖励,是个好动作!

这时 Advantage 不能只看当前瞬间的 reward,还要考虑后面几步的未来回报。

于是引入 GAE,它会把未来几步的奖励“加权平均”回来,形成一个更平滑、更准确的优势估计:

[ t = t + {t+1} + ()^2 {t+2} + ]

这就像玛丽在脑子里想了一下:“虽然现在受伤,但我后面可以赚回来!”

这个想法就是 GAE。

1.4 PPO 的完整“教玛丽变聪明”流程:

  1. 玛丽玩几局游戏,记录她每一步的状态、动作、奖励;
  2. 用价值函数去估她每一步状态到底值不值;
  3. 用 GAE 算每个动作到底是不是比平均好(优势);
  4. 用策略损失调整策略,让“好动作”更可能发生,但不要跳得太猛;
  5. 用值函数损失调整估值器,让状态估值更准确;
  6. 加上熵奖励,让她别老固定用一个动作,要多试试。

PPO 就像一个经验丰富的教练, - 鼓励她做对的事(策略损失), - 教她判断机会值不值(价值损失), - 帮她总结哪些决定确实好(优势函数 GAE), - 并且劝她不要一时冲动学过头(剪切 clip)。

2 PPO原理详解

2.1 PPO 是干嘛的

强化学习的目标是:
> 让智能体不断学习如何行动(action),从而最大化回报(reward)

PPO 是一种非常流行的强化学习算法,它属于 策略梯度方法,用来训练一个策略网络,告诉智能体在不同状态下该怎么行动。

2.2 PPO 避免了什么问题?

在旧的策略梯度方法(如 vanilla policy gradient 或 TRPO)中,有两个问题:

  1. 更新太猛,策略跳得太远,容易学坏;
  2. 约束太复杂,难以实现(比如 TRPO 里的 KL 距离约束);

所以 PPO 的思想是: > 更新时不要离旧策略太远,用一个“剪切”(clip)机制来限制策略更新的幅度,平稳又简单

2.3 PPO 的策略损失函数长什么样?

PPO 的核心策略损失函数如下:

[ L^{}() = _t]

下面来拆开解释:

1. 什么是 ( r_t() )?

这是策略比值:

[ r_t() = ]

意思是:新策略选中当前动作的概率 / 旧策略选中该动作的概率

  • 如果这个比值 = 1,表示策略没变;
  • 如果 >1,说明新策略更倾向选这个动作;
  • 如果 <1,说明新策略不太想选这个动作。

2. 什么是 ( _t )?

这是 Advantage(优势函数): - 表示当前这个动作,比平均水平好多少; - 正的表示做得比预期好; - 负的表示做得差。

3. clip 是干什么的?

clip 会把比值限制在 ([1 - , 1 + ]),防止策略更新太激进。

假设 (= 0.2),那么比值会被截断到 [0.8, 1.2] 范围内。

2.4 为什么要用最小值(min)?

目的是: > 如果 clip 之后的值比原始的还小,就用 clip 的——这样可以避免策略更新得过猛,防止“过度优化”。

总结一句话:

PPO 不仅鼓励做出好的动作(通过 advantage),还防止对策略更新得太过激进(通过 clip 和 min)。

2.5 PPO 的完整损失函数

PPO 的最终优化目标通常由 三部分组成:

[ L_{} = {} + {} - _{} ]

其中 ( c_1 )、( c_2 ) 是超参数,通常设置为: - ( c_1 = 0.5 )(值函数权重) - ( c_2 = 0.01 0.001 )(熵奖励的权重)

模块

用来干啥

PPO 中的作用

策略损失(Policy)

更新行动策略

控制更新幅度,学得稳

值函数损失(Value)

学状态值好坏

为优势函数提供准确估值

熵奖励(Entropy)

鼓励多试试

防止策略太快“自信”

PPO 的优势就在于: 既能学习得好,又不容易学崩,还能保留探索性。

2.6 L_policy策略损失(policy loss)

这个就是我们之前重点讲的: [ L_{} = _t]

作用: - 鼓励好动作(优势大时,让策略更偏好该动作); - 抑制更新过猛(clip 机制避免策略“崩盘”); - 是 PPO 最核心的创新部分。

2.7 L_value 值函数损失(value function loss)

用于训练 价值函数(也叫 critic)去拟合每个状态的价值 ( V(s_t) ),公式如下:

[ L_{} = _t ]

其中: - ( V_t^{ } ) 是使用 GAE(广义优势估计)或 TD(时序差分)计算出的目标值; - ( V(s_t) ) 是模型当前输出的预测值。

作用: - 让 critic 模块学会判断当前状态“值不值”; - 对于 actor 的学习提供参考(比如计算 Advantage);

在强化学习中,我们关心的是: 一个状态到底“值不值得”我们去待着或者从这里出发执行动作。

这就引出了几个核心函数:

名字

数学形式

含义

V(s)

状态值函数

当前状态“本身”值不值(不管动作)

Q(s,a)

动作值函数

在状态 s 选动作 a 能得到的价值

A(s,a)

优势函数

当前动作 a 比“平均策略”好多少

而 Advantage(优势)是这样来的:

[ A(s_t, a_t) = Q(s_t, a_t) - V(s_t) ]

或者在实际中更常用的估计形式是:

[ t = r_t + V(s{t+1}) - V(s_t) ]

这时你就会发现:计算 Advantage,需要用到 V(s)

  • Advantage = 实际回报 - 你对当前状态的预期(也就是 V(s));
  • 如果 V(s) 估得不准,优势函数也就不准,策略优化方向就可能错误;
  • 所以我们必须想办法让 V(s) 尽可能准确。

于是我们引入了“值函数损失”:

[ L_{} = (V(s_t) - V_t{})2 ]

这就是一个回归目标:让你预测的 V(s) 跟“实际看起来应该是的 V 值”尽量接近。

PPO 里的 ( V(s_t) ),也就是“当前状态的价值估计”,是怎么来的?V(s) 是由一个神经网络(也叫“价值网络”或“critic网络”)输入状态 (s),输出一个标量值,表示这个状态“值不值”。

这个网络就是 PPO 中的一部分,和策略网络(actor)并行训练。

PPO 的模型结构是这样的:

状态 s_t

┌──────────┴──────────┐
│ │
策略网络 π(a|s) 价值网络 V(s)
(选动作) (估值这个状态好不好)
│ │
输出动作概率 输出一个标量 V(s)

  • 策略网络是 actor;
  • 价值网络是 critic;
  • PPO 是 “actor-critic” 结构;
  • 有时候这两个网络可以共享底层编码层(比如共享前几层的 CNN 或 Transformer)。
  • 给模型输入一个状态 (s_t)(比如图像、位置信息等);
  • 模型就输出一个 V 值,代表这个状态“从现在起往后看,能拿到多少回报”;
  • 然后你把这个 V(s_t) 拿去算 advantage,或者和真实回报做 MSE 回归。

在策略梯度中,我们的优化目标包含一项:

[ _t [(a_t|s_t) \textcolor{red}{_t}] ]

这个 Advantage(优势)衡量的是: > 当前选择的动作到底比平均水平好多少

一个准的 Advantage 估计可以减少方差、加快训练、稳定学习

最简单的 Advantage 是这样计算的:

[ A_t = Q_t - V(s_t) ]

但是 Q 值(动作值)很难精确算,于是有很多种估计方式: - TD 目标(1步): [ A_t = r_t + V(s_{t+1}) - V(s_t) ] - N 步 TD 目标: [ A_t = r_t + r_{t+1} + ^2 r_{t+2} + + ^{n} V(s_{t+n}) - V(s_t) ]

但问题是:

  • TD(1步):偏差小但方差大
  • Monte Carlo(全轨迹):偏差大但方差小

于是 GAE 就来了!GAE 的目标是: > 在“偏差”和“方差”之间做平衡,构造一个既稳定又准确的 Advantage 估计。

它提出了一种带有“加权平均”的多步 Advantage:

[ t^{(, )} = {l=0}^{} ()^l _{t+l} ]

其中: - (t = r_t + V(s{t+1}) - V(s_t)):就是 1-step TD 残差; - ():控制“长期与短期”的权衡,范围是 [0, 1]; - ():折扣因子。

你可以理解为: > GAE 是多个 TD 目标的加权平均,越往后的权重越小(乘了 (()^l))

在代码中,通常使用从后往前的递推公式来实现 GAE:

[ _t = t + {t+1} ]

从最后一个时间步 (T) 倒着递推回来。

这种实现非常高效,既减少了内存,也容易实现。

λ 值

GAE 的行为

类比于哪种方法

λ = 0

只使用 1-step TD

类似 TD(0),方差高但偏差小

λ = 1

使用所有未来收益

类似 Monte Carlo,方差小但偏差大

一般选择: - PPO 中常用:(= 0.95)、(= 0.99)

这是经验上最好的平衡点。

2.8 Entropy —— 熵损失(entropy bonus)

引入策略的熵(entropy)用于鼓励探索,公式为:

[ () = -_{a} (a|s) (a|s) ]

意思是:如果策略越“确定”(非常偏向某个动作),熵就低;反之,如果策略越“均匀”(还在探索),熵就高。

作用: - 防止策略“太快收敛”到局部最优; - 让 agent 保持一定探索能力。

所以我们在总损失中 减去熵项(因为优化器是最小化函数,减去熵等于奖励高熵)。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言