TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

策略梯度与 PPO:为什么要裁剪比例、优势函数与 GAE、价值函数、熵

状态:草稿(2026-10-18),实测。 这些数字是通过笔记本(Apple M1 Max, 10 核,macOS 26.5)上的 Python 3.9.6 和 numpy 2.0.2 直接计算出来的模拟值。 单次训练使用单个进程(1 个 numpy 线程),同时运行 8 个训练任务,每次耗时 5~7 分钟。原始数据与代码:工作目录 measure/robot-arm-basics/rl/的 ppo.py, ttenv.py, exp_rl.py,结果 out/rl/ppo_*_s{0,1,2}.json。没有实际的机器人实验(未进行硬件实测)。 参考资料查阅于 2026-10-18。编写规则:以实测数据为基础,无法测量的标注为“未实测”,无法确认的标注为“未确认”。

目录

1. 直觉:向表现好的方向稍作调整,但切忌幅度过大

假设我们击球 100 次。其中有些挥拍效果比平时好,有些则不如平时。接下来,只要像打得好的挥拍那样去打,而避免像打得不好的挥拍那样去打 就可以了。这就是策略梯度(policy gradient)的全部内容。策略选择该动作的 概率 概率会根据结果比平时好的程度而提升。

问题在于“幅度”。100 次经验包含着很多噪声。如果过于盲目相信某一次打得很好的挥拍并大幅改变策略,新策略就会进入以前的经验完全没有涉及的 区域并在那里崩溃。PPO(proximal policy optimization,近端策略优化)在 目标函数中引入了一种机制: 当新策略与旧策略相差太远时就不再推动它 。多亏了这一点,我们可以用相同的经验进行多次更新。Schulman 等人 2017 年的摘要也将能够对小批量进行多次迭代更新作为新目标函数的优点。

2. 图解:被裁剪的目标函数

PPO 의 잘린 목적: 비율이 멀어지면 기울기를 끊는다 0.8 1 1.2 이점 A > 0 비율 r = π_new / π_old 0.8 1 1.2 이점 A < 0 비율 r = π_new / π_old 굵은 선: min(r·A, clip(r, 0.8, 1.2)·A). 평평한 구간에서는 기울기가 0 이다.
图:PPO 的裁剪替代目标:当比率超过 1±ε 时变得平坦

3. 计算

3.1 策略梯度

对策略性能 J 关于策略参数 θ 求导,会得到以下形式。

∇J(θ) = E[ ∇ log π_θ(a | s) · A(s, a) ]

在高斯策略(均值 μ_θ(s),标准差 σ)中,对数概率的导数非常简单。

log π(a|s) = −½ ((a − μ)/σ)² − log σ − ½ log 2π
∂/∂μ       = (a − μ) / σ²
∂/∂ log σ  = ((a − μ)/σ)² − 1

如果比平均值更大的动作效果更好(A > 0, a > μ),则将均值向该方向移动;如果距离均值较远的动作效果很好,则增大 σ 以进行更广泛的探索。

3.2 优势估计与 GAE

由于无法准确知道优势 A = Q − V,因此需要进行估计。如果单独训练价值函数 V,就可以构造一步时序差分误差(TD error)。

δ_t = r_t + γ V(s_{t+1}) − V(s_t)
GAE:  Â_t = δ_t + (γλ) δ_{t+1} + (γλ)² δ_{t+2} + …
λ = 0:  Â_t = δ_t                      한 걸음만 보고 나머지는 V 를 믿는다(분산 작음, V 가 틀리면 치우침)
λ = 1:  Â_t = G_t − V(s_t)             끝까지 실제 보상을 더한다(치우침 없음, 분산 큼)

广义优势估计(generalized advantage estimation,GAE)通过 λ 来权衡这两者。Schulman 等人 2015 年的摘要解释说,这是用引入少量偏差来换取价值函数方差的大幅减小。对于像乒乓球这样奖励在 100 步之后才出现的任务来说,λ = 0 相当于把训练初期的粗糙 V 反复咀嚼 100 次,这是非常危险的。我们将在第 4 节进行测量。

3.3 PPO 损失

r_t(θ)  = π_θ(a_t | s_t) / π_old(a_t | s_t)
L_clip  = E[ min( r_t Â_t ,  clip(r_t, 1 − ε, 1 + ε) Â_t ) ]       (키운다)
L_value = E[ (V(s_t) − (Â_t + V_old(s_t)))² ]                      (줄인다)
L_ent   = E[ 정책의 엔트로피 ]                                       (c_ent 만큼 키운다)

熵奖励可以防止 σ 减小得太快而导致探索过早停止。

3.4 实现

我们没有使用自动微分,而是用 numpy 手动编写了反向传播。核心在于,被裁剪目标的梯度仅在“min 选择了未裁剪项的样本”中流通。

ratio = np.exp(logp_new - logp_old)
unc, clp = ratio * A, np.clip(ratio, 1 - eps, 1 + eps) * A
w = np.where(unc <= clp, A * ratio, 0.0)          # 잘린 표본은 기울기 0
z = (a - mu) / std
d_mu      = -(w[:, None] * z / std) / B            # 손실(−L_clip)의 평균에 대한 기울기
d_log_std = -(w[:, None] * (z**2 - 1)).sum(0) / B - c_ent

设置如下。策略和价值神经网络分别具有 64-64 的隐藏层(tanh),学习率为 3×10⁻⁴(Adam),每次迭代由 64 个环境收集 64 个回合的数据,然后通过 10 个周期、小批量大小为 512 进行更新,ε = 0.2,γ = 0.99,λ = 0.95,梯度范数裁剪为 0.5,初始 σ = 0.61。重复 300 次迭代后,共有 19,200 个回合,环境步数约为 140 万。评估每 20 次迭代进行一次,使用 1,000 个评估球,不使用概率,仅采用平均动作。

4. 实测

4.1 学习曲线

PPO 변형별 학습 곡선(직접 제어, 형태 보상) 0 5k 10k 14k 19k 0 25 50 75 100 학습에 쓴 에피소드(공) 수 평가 성공률(%) 고전 계획기 40% PPO 기본 83% 엔트로피 0.01 88% GAE λ=1 43% GAE λ=0 0% 자르기 없음 0% 평가 공 1,000개 성공률. 선은 시드 3개의 중앙값, 옅은 띠는 최소~최대.
图:不同 PPO 变体的评估成功率曲线
设置(3 个随机种子) 最终评估成功率中位数(最小~最大) 最终 KL(旧→新) 最终 σ
PPO 默认(ε 0.2, λ 0.95) 82.9% (76.8~90.9) 0.007~0.010 0.10~0.12
+ 熵 0.01 87.7% (87.5~87.8) 0.004~0.008 0.18~0.21
GAE λ = 1 42.6% (41.9~84.2) 0.003~0.009 0.13~0.15
GAE λ = 0 0.0% (0.0~0.4) 0.018~0.023 0.09~0.14
无裁剪(相同的 10 个周期) 0.0% (0.0~0.7) 9.4~25.1 0.06~0.10

基线分别为:随机 1.5%、不考虑旋转的经典规划器 40%、混合动作空间的上限 85%(第 11 篇)。

4.2 阅读收获

4.3 真实的乒乓球机器人使用了什么

Büchler 等人(arXiv 2006.05935 v1)使用 PPO 在 100 Hz 下训练了气动肌肉手臂(第 10 篇)。相反,D'Ambrosio 等人 2024 年使用属于进化策略系列的黑盒优化(BGS)而不是 PPO 来训练低级技能,并以 PPO 和 SAC 的动作不够平滑为由作为解释(arXiv:2408.03906 II-C 节)。这与本文默认的 PPO 因触及关节极限而产生顿挫策略的担忧是一样的。选择什么不取决于“哪个算法更好”,而是取决于“你想要什么(成功率、平滑度、样本数量)”。

5. 局限性

6. 总结

TT 的一言。 如果因为某一次打得好而过于兴奋并大幅改变动作,就会漏掉接下来的所有球!PPO 把“只改变一点点”定为了一条规则!

参考

所有资料查阅于 2026-10-18。

登录后即可点赞

评论

还没有评论。

登录后即可发表评论