TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

强化学习的框架:通过乒乓球臂理解 MDP、状态·动作·奖励·折扣、策略与价值函数

状态:草稿(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. 图解:本系列中的玩具问题

장난감 문제: 옆에서 본 1자유도 진자 라켓 탁구대 끝 y = −1.37 네트 회전축 준비 φ = −0.5 타격 φ > 0 공(상대가 친 실제 타구) 상태: φ, φ̇, 공 y·z·v_y·v_z(지연·잡음 가능), 시각, 바운스 여부 행동: 10 ms 마다 관절 가속도(직접) 또는 첫 걸음에 타격 파라미터 2개 보상: 상대 탁구대에 넣으면 1(희소) 또는 형태를 준 보상
图:侧视视角的 1 自由度摆式球拍与球,状态·动作·奖励

为了能够在几分钟内完成训练,并运行多个随机种子以计算中位数,问题必须足够小。因此我们做了如下设计:

由于是 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% -

4.1 批量并行运行环境

强化学习需要消耗大量样本。第 12 篇的单次训练大约需要消耗 140 万个环境步数。因此,将多个环境打包成向量并批量并行运行是基本操作。我们使用 numpy 通过相同的数组运算来运行 N 个环境并测量吞吐量(在没有其他计算时,舍弃 5 次中的第 1 次后取中位数)。

환경을 한꺼번에 굴리면: 병렬 수와 처리량 1 16 256 4,096 1,000 10,000 100,000 1,000,000 한꺼번에 굴린 환경 수(로그) 환경 걸음/초(로그) 1,103 15,742 82,200 180,870 389,283 numpy 벡터 연산, CPU 코어 하나. 걸음 = 10 ms 제어 한 번(물리 10번).
图:批量运行的环境数量与吞吐量的关系
批量运行的环境数量 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. 局限性

6. 总结

小蒂的话。 球落地之后才知道自己做得好不好!所以为了让赞赏能够传达到 1 秒前的挥拍,我们把折扣率设置得很大,达到了 0.99 哟!

参考

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

登录后即可点赞

评论

还没有评论。

登录后即可发表评论