状态:草稿(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. 图解:被裁剪的目标函数
- 横轴是新策略与旧策略选择相同动作的概率比率 r。如果 r = 1,则说明策略没有改变。
- 如果优势 A 为正(即比平时表现更好的动作),增大 r 会增大目标值,但一旦超过 1 + ε,它就会变平,从而没有理由再继续增大。
- 如果 A 为负,则相反,我们会减小 r,但不会将其推到 1 − ε 以下。
- 在平坦区域,梯度为 0,因此该样本对参数更新没有任何贡献。在本文章的实测中,训练后期大约有 5% 的样本处于此状态。
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 学习曲线
| 设置(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 阅读收获
- 裁剪拯救了训练。 如果不进行裁剪并用相同的数据运行 10 个周期,单次更新就会导致策略偏离旧策略达 KL 9~25 之远(而 PPO 默认值在 0.01 左右)。其中一个种子在前 60 次迭代中上升到了 36% 然后崩溃,另外两个种子从一开始就接近 0%。这表明多次复用相同数据本身就是危险的,而裁剪能够阻止这种危险。
- λ = 0 在这个问题上失败了。 由于奖励在回合结束时才出现一次,因此一步 TD 误差几乎为 0,初期的粗糙价值函数完全替代了信号。λ = 1 的情况下有一个种子达到了 84%,但另外两个种子停留在 43% 附近。由于方差较大,它很大程度上依赖于随机种子的运气。中位数 λ = 0.95 使所有三个种子都超过了 77%。
- 熵奖励在这个问题上带来了收益。 中位数从 83% 上升到了 88%,种子之间的范围从 14% 缩减到 0.3%。在默认设置下,σ 缩减到 0.1 的某个种子过早地停止了探索(77%)。不过,由于只有 3 个种子,很难将这一差异泛化(第 15 篇)。
- 学到的策略触及了关节极限。 在默认设置的最终评估中,根据种子的不同,触及关节极限一次以上的合集占 4~79%。这是因为奖励并未对极限做出惩罚。我们将在第 13 篇中尝试加入惩罚项。
- 同一策略在 1,000 个训练用球上的成功率与评估用球在 1% 以内保持一致(例如:84.1% 对 82.9%)。由于球的分布相同,几乎没有发生过拟合。我们将第 15 篇中讨论评估方法。
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. 局限性
- 3 个随机种子,训练重复 300 次。默认设置下的两个种子在 300 次时仍在上升。运行更长时间的结果未进行实测。
- 未加入观测归一化、学习率衰减、价值损失裁剪等常见的实现技巧。超参数设置(ε、λ、熵系数)仅比较了几个数值。
- 由于无法将 PPO 原论文正文中的实验表格(按 ε 值比较,MuJoCo 设置)的 PDF 转换为文本,因此未能确认(未确认)。本文中的 ε = 0.2 是作为常用值选取的。
6. 总结
- 策略梯度提升了“比平时表现更好的动作”的概率。用来衡量“平时”的是价值函数,其差值就是优势。
- GAE 的 λ 在偏差和方差之间进行权衡。对于奖励滞后的乒乓球任务,λ = 0 失败了,而 0.95 是最稳定的。
- PPO 通过裁剪比率,使得在多次复用相同数据的同时不会发生崩溃。如果不进行裁剪,单次更新的 KL 会飙升至默认设置的约 1,000~2,500 倍并导致崩溃。
- 在玩具摆杆球拍任务中,PPO 仅用 1.9 万个球就达到了 83~88% 的成功率。在相同的球数下,不考虑旋转的经典规划器的成功率为 40%。不过,该策略频繁触及了关节极限。
TT 的一言。 如果因为某一次打得好而过于兴奋并大幅改变动作,就会漏掉接下来的所有球!PPO 把“只改变一点点”定为了一条规则!
参考
所有资料查阅于 2026-10-18。
- Schulman, Wolski, Dhariwal, Radford, Klimov, Proximal Policy Optimization Algorithms, arXiv:1707.06347, 摘要。
- Schulman, Moritz, Levine, Jordan, Abbeel, High-Dimensional Continuous Control Using Generalized Advantage Estimation, arXiv:1506.02438, 摘要。
- Büchler 等人, arXiv:2006.05935 v1。
- D'Ambrosio 等人, arXiv:2408.03906, II-C 节(学习算法)。