状态:草稿(2026-10-18),实测。 数字是通过笔记本电脑(Apple M1 Max,macOS 26.5)上的 Python 3.9.6 和 numpy 2.0.2 直接计算出的模拟值。 原始数据与代码:工作目录
measure/robot-arm-basics/rl/的ttenv.py(环境)、baselines.py,thr.py,结果out/rl/baselines.json,out/rl/throughput.json。玩具问题是为了展示原理而故意缩小的,不涉及真实的机器人实验(未进行硬件实测)。 球的初始状态来自 DeepMind 数据集(CC-BY 4.0)。参考资料查阅于 2026-10-18。 编写规则:实测数据为默认标准,未能测量者标记为“未实测”,无法确认者标记为“未确认”。
目录
1. 直觉:结果来得比较晚
第 1~10 篇的方法提前计算了“什么是正确的”。而强化学习(reinforcement learning, RL)并不进行这种计算。它是通过尝试、观察结果,然后将行动稍微调整到结果更好的方向。这和儿童学习投球的方式是一样的。
在乒乓球运动中,这个“结果”来得很晚。在把球拍往回拉的那一刻,你无法知道这是否是一个好动作;直到 0.5 秒后球落在对方球台上,成功的信号才会到来。在此期间,手臂已经做出了几十次决定。 弄清楚究竟是哪个决定促成了成功(信用分配,credit assignment)是强化学习的核心难点,本文中的折扣率与价值函数,以及第 12 篇中的优势函数,都是处理这一问题的工具。
我们在第 10 篇中探讨了“什么应该交由学习来完成”。第 11~15 篇将从原理出发重新审视该问题的学习部分。第 11 篇建立框架,第 12 篇直接实现 PPO,第 13 篇讨论奖励和动作空间,第 14 篇探讨从仿真到现实的问题,第 15 篇则处理评估方法。
2. 图解:本系列中的玩具问题
为了能够在几分钟内完成训练,并运行多个随机种子以计算中位数,问题必须足够小。因此我们做了如下设计:
- 侧视二维。 仅保留乒乓球台长度方向(y)和高度方向(z),舍弃宽度(x)。坐标与第 1~10 篇相同。
- 1 自由度摆式球拍。 旋转中心位于 (y, z) = (−1.95, 0.90) m 处,长 0.75 m 的手臂向下悬挂并前后摆动。球拍面的法线垂直于手臂,因此如果在经过最低点之后(φ > 0)击中球,就会将球向上向前击出。关节极限为 φ ∈ [−0.9, 0.9] rad,速度 20 rad/s,加速度 300 rad/s²(大小与第 8 篇的假设相同)。
- 球。 直接使用 DeepMind 数据集中朝向机器人飞来的实际击球的 y、z 位置与速度,以及 ω_x 旋转。飞行采用第 6 篇的模型(重力、阻力、马格努斯效应、反弹),球拍反弹采用第 7 篇的模型(e_r = 0.8,忽略摩擦)。物理学仿真以 1 ms 的间隔进行积分。
- 成功。 弹起的球越过球网并落在对方球台上(0 < y < 1.37 m)即为成功。
- 球的划分。 在经过球拍圆弧附近的 7,315 个球(在面向机器人的 14,703 个球中)里抽出 1,000 个用于评估,不用于训练(第 15 篇)。
由于是 1 自由度,球拍角度和球拍速度无法分别独立选择。击球的时机直接决定了球拍面的角度。因此,有些球无论怎么打都无法回击,我们将在第 4 节中将这种局限性测量为“上限”。
3. 框架:马尔可夫决策过程
强化学习问题通常被描述为马尔可夫决策过程(Markov decision process, MDP)。将这五个要素对应到乒乓球臂上,如下所示:
| 要素 | 含义 | 玩具问题 | 实际乒乓球机器人 |
|---|---|---|---|
| 状态 s | 决定未来所需的所有信息 | φ、φ̇、球的 y·z·v_y·v_z、时间、是否反弹(共 8 个) | 关节角度·速度,球的位置·速度的近期历史,对手信息 |
| 动作 a | 每一步所选择的内容 | 每 10 ms 一个关节加速度(直接),或 2 个击球参数(第 13 篇) | 关节速度·力矩指令,或击球技术选择 |
| 转移 P(s′|s, a) | 决定下一个状态的规则 | 第 6·7 篇的物理学(学习者未知) | 现实 |
| 奖励 r | 每一步收到的数字 | 进球得 1 分(稀疏)或给予塑造的奖励(第 13 篇) | 由设计者决定 |
| 折扣 γ | 未来奖励削减的程度 | 0.99 | 视问题而定 |
马尔可夫性质。 即“只要知道当前状态,就不需要过去”的假设。如果只给出球的位置而省去速度,这个假设就会被打破。因为即使在相同位置,也无法知道球是在飞来还是飞走。存在延迟时也会被打破。如果你看到的是 20 ms 前的球,那么你还需要知道在此期间你发送的指令才能了解现状。因此,实际系统会将多个最近的观测值放入状态中。D'Ambrosio 等人 2024 年的底层策略将球的位置·速度以及关节状态的最近 8 步作为输入(arXiv:2408.03906 II-C 节)。
策略与价值。 策略(policy)π(a|s) 是根据状态选择动作的规则。本系列中的策略是高斯策略,即由神经网络计算出平均值并从正态分布中抽取动作。价值函数(value function)是指“在此状态下遵循该策略,未来将获得的奖励的折扣总和的平均值是多少”。
되돌림(return): G_t = r_t + γ r_{t+1} + γ² r_{t+2} + …
상태 가치: V(s) = E[ G_t | s_t = s ]
행동 가치: Q(s, a) = E[ G_t | s_t = s, a_t = a ]
이점(advantage): A(s, a) = Q(s, a) − V(s) 「평소보다 얼마나 나은 행동이었나」
优势(advantage)用于帮助第 12 篇的 PPO 确定修正动作的方向。必须对**“比平时更好的结果”**(而不是单纯的“好结果”)给予奖励,才能区分球是否容易打还是动作真的好。
折扣率与视界(Horizon)。 γ 会让未来奖励在每一步中按 γ 倍递减。大致可以认为只有 1/(1 − γ) 步之前的范围是“可见的”。
| γ | 0.9 | 0.95 | 0.99 | 0.999 |
|---|---|---|---|---|
| 有效视界 1/(1 − γ) | 10 步(0.1 s) | 20 步 | 100 步(1.0 s) | 1,000 步 |
用随机策略测得的玩具问题回合长度中,第 5、50、95 百分位分别为 62、105、137 步(10 ms 每步)。成功奖励在回合结束时出现一次,因此如果 γ = 0.9,对于 80 步前开始的挥拍,该奖励只剩下 0.9⁸⁰ ≈ 0.0002。因此我们使用 0.99。但视界越长,回报的方差就越大,处理这一问题的方法就是第 12 篇的 GAE。
4. 实测:不经学习能达到什么水平
在开始学习之前,先测量基线(baseline)。正如第 15 篇将再次提到的那样,没有基线的学习曲线什么也说明不了。以下是 1,000 个评估用球的结果。
| 方法 | 成功(回球) | 击中球拍 |
|---|---|---|
| 随机策略(每步加速度均匀随机) | 1.5% | 27.4% |
| 保持不动(维持准备姿势) | 0% | 9.6% |
| 混合动作空间下的最优常数动作(对所有球使用相同的击球参数) | 45.9% | - |
| 经典规划器:使用不了解旋转的模型测试 119 个网格并为每个球选择动作 | 40.0% | - |
| 混合动作空间上限:使用真实结果在网格中为每个球进行选择 | 85.4% | - |
- 如果模型出错,规划的结果甚至可能不如常数动作。 使用不了解旋转的模型为每个球选择“看起来最好”的动作的规划器(40%),其表现甚至比对所有球使用相同动作的方法(46%)还要差。这是因为错误的模型在每个球上的偏差方向各不相同。第 6 篇中提到的“不懂旋转就会产生 5 cm 误差”的后果在这里通过成功率体现了出来。
- 上限 85%。 在相同的动作空间中,即使提前知道结果并进行选择,也有 15% 的球无法回击。这就是 1 自由度球拍的局限性。如果学习超越了这个数字,则意味着动作空间发生了变化(第 13 篇将直接控制与混合动作空间进行对比)。
- 提前透露一下,第 12 篇的 PPO 在面对相同的球时,通过直接控制达到了 83% 的中位数。
4.1 批量并行运行环境
强化学习需要消耗大量样本。第 12 篇的单次训练大约需要消耗 140 万个环境步数。因此,将多个环境打包成向量并批量并行运行是基本操作。我们使用 numpy 通过相同的数组运算来运行 N 个环境并测量吞吐量(在没有其他计算时,舍弃 5 次中的第 1 次后取中位数)。
| 批量运行的环境数量 | 1 | 16 | 256 | 1,024 | 4,096 |
|---|---|---|---|---|---|
| 环境步数/秒(中位数) | 1,103 | 15,742 | 82,200 | 180,870 | 389,283 |
| 相对于单环境的倍数 | 1 倍 | 14 倍 | 75 倍 | 164 倍 | 353 倍 |
当运行单个环境时,Python 单步的开销占了绝大部分;而当数组变大时,该开销被分摊到了多个环境中。Rudin 等人 2021 年将同样的思路推向了 GPU 物理引擎,并行模拟了数千个机器人,并报告称在单张工作站 GPU 上于 4 分钟内训练出了平地步行策略(arXiv:2109.11978 摘要)。D'Ambrosio 等人 2024 年使用 6,000 个并行模拟工作线程对基础策略进行了约 24 亿步的训练(II-C 节)。我们将在第 14 篇中再次讨论这一点。
5. 局限性
- 二维和 1 自由度与真实的乒乓球臂有所不同。我们舍弃了球的左右位置、球拍面的左右方向以及旋转轴的其他分量。
- 球拍可以毫无误差地产生所指令的加速度(排除了第 9 篇中的控制问题)。延迟和噪声将在第 14 篇中单独引入。
- 吞吐量仅代表这个玩具环境的数值。像 MuJoCo 这样物理引擎的吞吐量尚未实测。
6. 总结
- 强化学习的框架包括五个部分:状态、动作、转移、奖励和折扣。在乒乓球臂中,它们分别对应:“球和手臂的状态”、“关节指令或击球参数”、“物理学”、“是否进球”以及“看多远”。
- 如果存在延迟,马尔可夫性质就会被破坏,因此需要将观测历史放入状态中。
- 由于成功奖励在 1 秒后才会到来,因此需要像 γ = 0.99 这样较长的视界。
- 在训练前测量基线。在玩具问题中,随机策略为 1.5%,错误模型的规划器为 40%,动作空间上限为 85%。
小蒂的话。 球落地之后才知道自己做得好不好!所以为了让赞赏能够传达到 1 秒前的挥拍,我们把折扣率设置得很大,达到了 0.99 哟!
参考
所有资料查阅于 2026-10-18。
- D'Ambrosio 等,Achieving Human Level Competitive Robot Table Tennis, arXiv:2408.03906,II-C 节(策略输入)。
- Rudin、Hoeller、Reist、Hutter,Learning to Walk in Minutes Using Massively Parallel Deep Reinforcement Learning, arXiv:2109.11978,摘要。
- Google DeepMind, competitive_robot_table_tennis,CC-BY 4.0。