1. 项目思路拆解:从橡皮鸭调试法到实物机器人
这年头,卷强化学习的人不少,但能把算法讲到“捡袜子”这个份上的,还真不多见。我第一眼看到“小黄鸭不仅能帮你捡袜子,还能教会你强化学习”这个标题时,先是会心一笑,然后认真想了想,这个切入点其实非常高明——它把“枯燥的算法训练”和“有真实触感的日常任务”绑在了一起。你在学的是策略梯度、奖励塑形、域随机化,但你在做的,却是让一只橡胶小鸭子学会把地上的脏袜子叼起来放进洗衣篮。这种反差感,恰恰是理解强化学习本质的最佳路径。
先说结论:这个项目本质上是一个端到端的强化学习机器人控制实验,载体是一只改装过的小黄鸭(或者说鸭子外形的移动机械臂),任务是“捡袜子”。它的核心价值不在于“捡袜子”本身有多厉害,而在于把强化学习中几个最难啃的骨头——奖励函数设计、样本效率、仿真到真实迁移(sim-to-real)、安全约束——全部用一个低成本、高容错、可复现的平台串了起来。适合谁呢?适合那些学了三个月强化学习理论但还没跑通一个真实硬件实验的人,也适合想给本科生或者自己带的新人做一个“能看得见摸得着”的入门项目的教育工作者。
在我拆解具体实现之前,先解释一个背景:计算机科学里有个著名的“橡皮鸭调试法”(Rubber Duck Debugging),意思是当你被代码bug卡住时,找一只橡皮鸭,对着它一行一行讲你的代码逻辑,讲着讲着你就会发现自己的问题所在。这个小黄鸭项目,巧妙地借用了这个梗——只不过,这只鸭子不再是用来“听你讲代码”的,而是它自己就是被调试、被训练的对象。这个隐喻特别好,因为它直观传递了一个强化学习的核心观念:智能体就是一张白纸,你给它的奖励信号,决定了它会长成什么样子。
1.1 为什么用“捡袜子”作为教学任务
“捡袜子”这个任务,看起来简单,实际上在强化学习任务设定里是个标准的“稀疏奖励 + 长时程操作”问题。它比CartPole(小车平衡)复杂,比Atari游戏更有物理实感,又比“机械臂抓取随机物体”简单得多——刚好卡在“新手能跑通”和“有足够挑战性”之间的甜蜜点。
具体来说,捡袜子涉及三个阶段:
- 导航靠近:小黄鸭需要移动到袜子所在位置,这涉及移动底盘控制或机械臂的粗定位。
- 夹取抓起:末端执行器需要对准袜子,闭合夹爪,施加合适的力。
- 运送释放:将袜子运到目标点(比如洗衣篮上方),准确释放。
这三个阶段对应着强化学习里三种典型问题的混合体:导航问题是稀疏奖励环境,抓起问题需要精细的连续控制,运送释放则考验策略的稳定性。如果直接把这三个阶段交给一个单一的强化学习策略去端到端学习,会发现样本效率极低——这是新人最容易踩的坑,后面我会专门讲怎么拆解这个任务。
1.2 目标读到这里,你可能会问:为什么非要强化学习,用传统控制不行吗
这是个特别好的问题。如果只是捡袜子,用传统视觉伺服加运动规划确实也能实现,而且更稳定。但强化学习在这里的价值不只是“完成任务”,而是让机器人自己学会完成任务。这意味着:
- 你不必手工编写“如何判断袜子朝向再决定夹取角度”的规则。
- 策略可以泛化到没见过的袜子颜色、摆放位置甚至光照条件。
- 整个过程从“工程师写逻辑”变成了“工程师写目标函数”。
在教育场景下,这种思维转变才是真正的教学目的。传统控制教你的是“怎么设计一个控制器”,强化学习教你的是“怎么定义一个问题让机器自己找解法”。后者在当前AI应用中的重要性,我想不用我多说了。
2. 核心模块设计:状态空间、动作空间与奖励函数
强化学习三要素——状态、动作、奖励——是所有算法的基石。小黄鸭项目里,这三个要素的设计直接决定了训练是否收敛、收敛后策略是否鲁棒。我见过太多人在算法上折腾半天,最后发现问题是state没归一化、reward尺度不对,这种坑属于“看似不起眼,实则致命”的典型。
2.1 状态空间设计:该给机器人看什么
在仿真阶段(我们用的是MuJoCo物理引擎),状态空间的设计有两条路线:
第一条是低维向量路线:把机器人的关节角度(joint angles)、关节角速度、末端执行器坐标、袜子相对位置等拼成一维向量。这条路线的优点是轻量、训练快,适合用来验证算法正确性。缺点是泛化能力差,换一个环境布局模型基本就废了。
第二条是视觉输入路线:直接给机器人一个俯视摄像头或者第一人称视角的RGB图像。这样策略网络需要自己从图像里提取特征,泛化能力强很多,但训练难度也随之上升。小黄鸭这种结构简单的任务,一般建议先用低维向量把整个pipeline跑通,再逐步增加视觉输入的复杂度。
这里有一个经验值:只要能解决问题,状态维度越低越好。很多初学者把能测到的量全部怼进状态空间,觉得“信息越多越聪明”,但实际上强化学习非常吃状态设计的合理性,无关维度会严重拖慢收敛甚至导致训练发散。小黄鸭项目的合理状态空间大约在20到30维之间,包括底盘位姿、机械臂关节角度、夹爪开合度、袜子相对末端的位置偏移量。
动作空间方面,如果小黄鸭是轮式底盘加小型机械臂,动作空间通常是连续的,用一个向量表示,例如[线速度, 角速度, 肩关节角度, 肘关节角度, 夹爪开合度]。使用连续动作空间,就意味着我们需要选择支持连续动作的算法——PPO(Proximal Policy Optimization)和SAC(Soft Actor-Critic)是当前最主流的选择。PPO胜在稳定、调参经验丰富;SAC胜在样本效率高。对小黄鸭这种“训练预算有限、希望快速看到效果”的场景,PPO是我的第一推荐。
2.2 奖励函数设计:捡袜子的“糖”和“鞭子”
奖励函数是整个项目中最微妙、也最考验功力的部分。结构上我推荐分阶段设计,而不是端到端一个大而全的reward。
具体来说可以拆成三层:
第一层是稀疏任务奖励:只有当袜子最终被放入洗衣篮时,给一个大的正向奖励,比如+10。这保证了策略优化的最终目标是正确的。
第二层是过程密集奖励:为了让模型不那么迷茫,需要给一些中间过程的“小甜头”。典型的有:
- 靠近袜子时,距离减小给一个小的正向奖励(比如每靠近0.1米给+0.1)。
- 夹住袜子时给+1,袜子离地时再给+1。
- 往洗衣篮方向移动袜子时,距离减小给一个小的正向奖励。
第三层是惩罚项/约束项:包括:
- 每一步动作执行给一个微小的时间惩罚(-0.01),防止策略原地摸鱼。
- 机械臂关节超出安全范围时给较大惩罚。
- 袜子跌落时给一个小负向奖励,但不要太大,否则策略会变得过度保守。
这里要专门敲黑板强调一个核心概念:奖励塑形(Reward Shaping)偏差。理论上,如果大量使用过程奖励,学习到的策略可能会“钻空子”——比如只追求靠近袜子,但永远不抓起来,因为靠近袜子的奖励比抓住袜子更容易刷。解决这个问题有两种常见手段:一是引入“奖励塑形一致性”理论(potential-based reward shaping),保证不改变最优策略;二是工程上打开回放视频去检查策略行为,发现钻空子行为就调整奖励系数。
2.3 奖励尺度的小细节
很多人容易忽视奖励函数的数值尺度问题。如果正向奖励是+10,而时间惩罚是-0.01,那么策略在训练初期会天然倾向于“什么都不做”,因为-0.01的惩罚微不足道,而+10的正奖励又太难拿到。这个现象在强化学习里叫奖励稀疏性问题,处理不好就直接导致训练不收敛。
我常用的做法是把所有奖励归一化到相近尺度:
- 让单步奖励基本落在-1到+1之间。
- 任务完成的大奖励设定在+5到+10。
- 一个episode累计奖励的无偏期望在几十这个量级。
这个尺度下PPO的超参数(特别是clip ratio和learning rate)不需要太极端就能稳定训练。如果你发现训练曲线一直平着不涨,先别急着换算法,去检查一下奖励信号是不是太稀疏或者尺度过大,往往问题就出在这。
3. 算法选型与训练流程:PPO、IQL和错误奖励信号
这一节是整个项目的算法核心,也是热搜词里最密集的领域。我按照从简到难的顺序,把训练过程中真正用得上的算法方案讲清楚,包括它们的本质区别和适用场景。
3.1 PPO:默认首选,稳定压倒一切
PPO(Proximal Policy Optimization,近端策略优化)是OpenAI在2017年提出的算法,到现在依然是强化学习工程落地的事实标准。它的核心思想一句话就能概括:每次更新参数的幅度不要太大,防止策略一步走歪被带崩。
具体来说,PPO通过一个clip比率来限制新旧策略的差异程度。伪代码如下:
# PPO核心更新逻辑(伪代码) ratio = new_policy_prob / old_policy_prob clipped_ratio = clamp(ratio, 1 - epsilon, 1 + epsilon) surrogate_loss = min(ratio * advantage, clipped_ratio * advantage) policy_gradient_loss = -mean(surrogate_loss)其中epsilon在0.1到0.2之间,控制更新步长的上限。这个机制让PPO在大多数环境中都能稳定训练,不需要像DQN那样精心设计经验回放的各种细节。对捡袜子这个任务,PPO配合适当的状态归一化和奖励塑形,通常在几十万步内就能看到一个像模像样的策略。
经验上,我去年的一个类似机械臂抓取项目中,用PPO在MuJoCo仿真里训练,大约20万步(step)左右策略开始有明显抓取动作,60万步左右成功率超过80%。考虑到仿真环境速度快,这个训练时间也就一两个晚上,完全可以接受。
3.2 IQL:离线强化学习不是银弹,但用对了很香
热搜词里出现了“IQL离线强化学习”,我也多说一句。IQL(Implicit Q-Learning)是一种离线强化学习算法,解决的核心问题是:当只有固定数据集、无法跟环境交互时,怎么学出一个好的策略。
小黄鸭项目里,IQL的价值不在于从头训练,而在于从之前PPO采集的历史数据中,再学习一个更优的策略。比如你在真实硬件上跑了一百次捡袜子实验,收集了一批“成功、失败、半成功”的数据,这时候不想再让真机多跑(毕竟硬件损耗和时间成本高),就可以用IQL在这个固定数据集上离线优化策略。IQL的核心创新是“不对超出数据集范围的动作做过度外推”,通过分位数回归的方式,在保守估计Q值的同时,还能学到相对乐观的策略偏移。
这里给一个使用IQL的时机建议:
- 如果你手头有一批真实硬件采集的数据,想在不增加采集成本的情况下提升策略,IQL值得一试。
- 如果是从零开始训练,老老实实上PPO就好,不要一上来就IQL。
3.3 错误奖励信号:当“奖励函数被写错”,这关怎么过
热搜词里有“强化学习遇到错误奖励”,这个场景我觉得特别值得单独拿出来写,因为它在捡袜子这个任务里几乎一定会遇到。
所谓错误奖励,指的是奖励函数与实际目标不一致,导致策略学会了“投机取巧”的行为。最经典的例子:你希望机器人把袜子放入洗衣篮,但因为奖励函数里有一条“袜子离洗衣篮越近越好”,于是机器人学会了把袜子叼到洗衣篮边上但就是不松手。从奖励函数设计者的角度看,机器人“在刷分”;但从机器人的角度看,它完美执行了你给它定义的“目标”。
遇到错误奖励,我的一般处理流程是:
- 可视化策略行为:把训练好的策略在仿真里跑一遍,录制成视频,观察它到底在做什么。绝大多数错误奖励问题一眼就能看出来。
- 分析奖励曲线:如果累计奖励在涨,但任务成功率没涨,基本可以断定奖励函数被钻空子了。
- 按“目标一致性”重新设计:把“完成任务的唯一获取大奖励事件”写清楚、唯一化,然后删掉或削弱可能导致钻空子的辅助奖励。
- 涨一点对抗思维:假设自己是一个“坏机器人”,想最大化奖励但最小化“真实任务完成度”,设计时会更容易发现漏洞。
对小黄鸭项目来说,最容易出现的错误奖励是“靠近袜子给奖励”会让机器人跟袜子贴贴但不动手去抓。我的经验是把“靠近奖励”设置成递减的,并且只有当夹爪已经对准袜子时才开始给,这样能有效避免这种刷分行为。
3.4 基于模型的强化学习:另一个可以扩展的方向
如果你已经把无模型的PPO跑通,觉得样本效率太低,想玩更高级的,可以了解下基于模型的强化学习(Model-Based RL,MBRL)。小黄鸭捡袜子的动力学模型其实相对简单,完全可以用一个神经网络拟合环境转移函数——输入当前状态+动作,输出下一状态。有了这个模型,就可以让机器人在“想象”中多训练很多步,从而大幅减少真实交互次数。
不过我要泼一点冷水:MBRL的工程复杂度比PPO高一个量级,调参难度也大,而且学到的模型有偏差,容易导致策略在真实环境中表现不佳。对小黄鸭项目来说,如果不是为了教学展示“不同范式的对比”,我的建议是先把PPO吃透,MBRL作为进阶挑战再说。
4. 仿真环境搭建与sim-to-real迁移实录
这一章给大家还原我在实际搭建小黄鸭机器人项目时的完整过程,包括环境参数的设置、模型加载、以及从仿真迁移到实体硬件时踩过的那些坑。
4.1 MuJoCo环境搭建
仿真环境我用的MuJoCo,很多做机器人强化学习的人应该都不陌生。它被DeepMind收购后开源,现在成了学术界和工业界的标配仿真工具,支持GPU加速,特别适合做接触丰富的操作任务,比如“夹取袜子”。
一个典型的MuJoCo XML模型文件结构大致如下:
<mujoco> <asset> <mesh file="duck_body.stl" name="duck_body"/> <texture file="duck_tex.png" name="duck_tex"/> <material name="duck_mat" texture="duck_tex"/> </asset> <worldbody> <body name="base" pos="0 0 0.05"> <geom type="mesh" mesh="duck_body" material="duck_mat"/> </body> <body name="joint_1" pos="0 0 0.1"> <joint type="hinge" axis="0 1 0" name="shoulder"/> <geom type="capsule" size="0.02 0.08"/> </body> </worldbody> </mujoco>上面只是一个示意结构,真实项目中机械臂的URDF模型可以直接导入MuJoCo。我个人的建议是:如果只是想快速跑通强化学习流程,直接复用MuJoCo自带的机械臂模型(比如Shadow Hand或者UR5的MuJoCo版本)加上一个鸭子外观的碰撞体,就完全够用了,不需要从零建模。
仿真环境中需要调的重要参数有两个:
第一个是控制频率。MuJoCo的默认仿真步长一般是2ms(500Hz),但强化学习的动作决策频率通常不需要那么高,一般10Hz到30Hz就够,也就是每50到100个仿真步做一个动作决策。这个参数直接决定了你的episode长度和训练速度,建议决策频率设在20Hz左右。
第二个是仿真物理精度。夹取袜子最关键的是接触摩擦(friction)参数。MuJoCo里默认的摩擦力矩其实偏理想,真实夹爪和袜子之间的摩擦系数大约在0.5到0.8之间。我把仿真里的摩擦系数调到0.6左右,同时加入很小的噪声,这样学到的策略迁移到真机时不容易“滑手”。
4.2 任务环境的封装
在强化学习框架里,环境要遵循Gymnasium(以前叫Gym)的接口规范。核心是reset和step两个方法:
import gymnasium as gym import numpy as np class DuckSockEnv(gym.Env): def __init__(self): super().__init__() # 状态空间:底盘位姿(2) + 关节角度(3) + 夹爪开度(1) + 袜子相对位置(3) self.observation_space = gym.spaces.Box( low=-np.inf, high=np.inf, shape=(9,) ) # 动作空间:线速度 + 角速度 + 肩关节 + 肘关节 + 夹爪开度 self.action_space = gym.spaces.Box( low=-1.0, high=1.0, shape=(5,) ) def reset(self, seed=None): # 随机初始化袜子的位置 self.sock_pos = self.np_random.uniform(-0.5, 0.5, size=2) return self._get_obs(), {} def step(self, action): # 执行动作,更新仿真 self.model.forward(action) reward = self._compute_reward() terminated = self._check_task_success() truncated = self._check_time_limit() return self._get_obs(), reward, terminated, truncated, {} def _compute_reward(self): # 核心奖励函数,内部实现 ...这里我要着重说一个环境设计中的隐性坑:episode终止条件与奖励之间的耦合关系。如果袜子在运送半路掉落了,你是直接终止这个episode,还是让它继续跑但给一个负奖励?我的做法是:掉落不立即终止,而是给一个较大的负奖励,同时允许机器人尝试“捡起来继续走”。这样训练出来的策略具备了从失败中恢复的能力,而不会一旦失败就躺平。这个细节对真实机器人尤其重要——真实世界中,失败之后系统并不会帮你按reset键。
4.3 逆向运动学与动作输出的坑
热搜词里出现“mujoco机械臂ppo强化学习逆向运动学(ik)”,这里就涉及一个关键设计:强化学习到底该直接输出关节力矩(torque control),还是先输出末端位置再通过IK解算到关节角,然后由底层PID跟踪?
我在小黄鸭项目里一开始是让RL直接输出关节力矩,结果发现训练非常慢,因为力矩和末端移动之间存在复杂的动力学耦合。后来改成在动作空间上做文章:RL输出的是末端执行器的目标位移(delta position)和夹爪开合指令,然后通过IK计算目标关节角,再由一个底层的PID控制器去跟踪。这样RL不需要学习“怎么控制电机”这种底层物理,只需要学习“末端该往哪挪”,训练效率翻了不止一倍。
具体来说,这个分层方案是:
- RL策略输出末端目标位移向量(比如3维)和夹爪开合指令。
- 当前末端位姿加上目标位移,得到目标末端位姿。
- 用数值IK(阻尼最小二乘法)求解目标关节角。
- 底层PID控制器让每个关节追到目标角度。
这套方案在MuJoCo里跑了之后,训练速度立竿见影。当初用纯力矩控制时,连续训练300万步成功率还不到50%,改成IK+PID分层方案后,大约40万步就有类似表现。分层的本质是把学习问题分解成“学规划”和“学控制”两件事,后者用传统控制搞定,前者留给强化学习。
4.4 sim-to-real迁移:仿真到真机最实用的三个技巧
仿真训练得再好,到了真机都有可能“水土不服”。我做项目时常用的sim-to-real方案有三招,越早设计后期越省心。
第一招:域随机化(Domain Randomization)。在仿真环境里随机化物理参数,比如摩擦系数在0.3到0.9之间随机采样、关节阻尼系数在正负20%范围内随机变化、袜子的材质/摩擦力也随机化。这样训练出来的策略面对真实环境中的不确定性时,天然具有鲁棒性。具体做法是在reset时随机生成环境参数,而不是用固定值。
第二招:观测噪声注入。仿真环境里的传感器数据是完美的,但真实传感器的IMU有漂移、摄像头有噪声、关节编码器有量化误差。我习惯在状态观测里加上高斯噪声,噪声方差设为真实传感器标称误差的1.5倍左右。这样策略“见过”带噪声的数据,就不会因为一点观测扰动就动作变形。
第三招:动作延迟模拟。真实机器人从发出指令到电机响应,存在几十毫秒的延迟,仿真默认是零延迟。我习惯在环境里人为加上一个动作延迟buffer——动作发出后要经过若干个仿真步才会真正生效。这个技巧虽然简单,但对策略的真实性提升巨大。
这里补一句关于硬件平台的话。小黄鸭的改装方案一般有两种:一种是用现成的四轮差速小车底盘带一个小型1-2自由度夹爪,这种方式简单可靠但动作能力受限;另一种是直接用带机械臂的移动平台,比如智元D1这种,但成本就上去了。如果你是在学校里做课程项目,我强烈建议第一种方案——轮式底盘加一个舵机控制的夹爪就完全能实现捡袜子任务,而且替换成其他轻量物体的泛化能力还在。
5. 常见问题与排查技巧实录
这部分内容不是从教科书上抄的,全是我在实际跑小黄鸭这个项目时踩过坑以后整理出来的清单。如果你也遇到了类似问题,按下面的思路去排查,大概率能省下好几天时间。
5.1 训练不收敛,loss乱跳怎么办
这个问题十有八九出在奖励函数或超参数上。我的排查顺序是:
- 第一步,把PPO的
learning_rate调小一个数量级(比如从3e-4调到3e-5),看看训练曲线是否稳定下来。大多数情况下,乱跳是因为学习率太大导致策略更新步长超调。 - 第二步,检查奖励归一化。把一批episode的奖励数据打出来,看量级是否是预期的。如果发现奖励动不动就是几十上百,说明scale太大。
- 第三步,检查状态归一化。PPO假设输入状态在相近尺度内,如果某个维度是角度值另一维度是坐标值,数值差好几个量级,会导致梯度被大数值维度主导。解决方案是用RunningMeanStd对状态做在线归一化。
5.2 夹爪总是差一点才碰到袜子,位置控制不够精确
注意,这个问题大概率不是强化学习的问题,是IK或者底层控制的问题。我之前遇到类似现象时,先排查了IK的收敛精度——阻尼最小二乘法IK在接近奇异位形精度会下降,可以改用带关节限位约束的QP求解器。其次检查底层PID的增益是否足够大,如果末端执行器因为重力作用有下垂,需要加入重力补偿项。
5.3 仿真里跑得很好,真机上成功率骤降
这个问题就回到了sim-to-real迁移。我建议先做一个“开环一致性”测试:把同一组动作序列在仿真和真机各跑一遍,对比轨迹差异。如果末端位置偏差肉眼可见,说明需要加大域随机化强度。另外,真实硬件的夹爪抓力、袜子材质摩擦系数,都是仿真里最容易失真的地方。你可以在仿真里专门把这几个参数随机化范围加大,直到真机表现和仿真“对齐”。
我当初做这个测试时,发现真机的袜子总是从夹爪中滑落,后来在仿真里把袜子与夹爪的摩擦系数从0.5调低到0.2,并且把袜子模型改成了更软的材质(降低刚度),真机表现才和仿真接近。你看,这就是域随机化真正发挥作用的地方。
5.4 训练过程中机器人突然“发疯”乱撞
这是另一类常见问题,叫强化学习策略崩溃。通常表现为已经在收敛的趋势下,突然奖励骤降,动作变得剧烈混乱。排查方向:
- 确认状态观测是否出现异常值(NaN或者远超正常范围的输入),比如关节角度相接处跳变。
- 检查PPO的
clip_range是否偏大,导致策略一次性更新太大。 - 适当增加
entropy_coef(熵系数),让策略保持一定的探索性,避免过早陷入确定性但是错误的策略。
熵系数这个超参数新手很容易忽视。它控制策略的“随机探索程度”,如果设成0,策略会快速变成确定性策略,但也可能锁死在次优解上。我的经验是初始设置0.01,训练中期如果发现策略收敛到了明显不理想的行为,把它调大到0.03到0.05,强行让策略“重新探索”。
5.5 硬件改装的一些细节经验
最后分享几个硬件层面的经验,这些往往是仿真党完全想不到的坑:
- 小黄鸭外形如果太重,会影响底盘的机动性,建议“外皮”用轻质塑料或者布艺材料,内部放控制板、电池和舵机。
- 夹爪选型时优先买那种带减速齿轮的金属舵机,塑料舵机在反复夹取过程中很容易扫齿。
- 如果机器人底盘是两轮差速的,程序里要做运动学解算,把线速度角速度转换为左右轮速度。这个在很多开源库里有现成函数。
- 袜子作为抓取物,形态变化很大(一会团成一团,一会摊开),建议在项目初期统一用“折叠成方块”的袜子作为标准操作对象,后面再增加难度,尝试不同状态的袜子。先易后难,用户体验完全不同。
记住这几条,少走弯路
我在实际跑完整个项目后的几点体会,写在这里,算是对后来者的一点建议吧。
第一个体会是,先仿真后真机这条路对小黄鸭项目来说,性价比极高。仿真训练成本低、迭代快,而且可以通过回放视频直观看到策略的优缺点。不要一上来就抱着真机跑强化学习,那样既慢又危险。真机最适合的角色是“最终验收”,而不是“训练平台”。
第二个体会是,奖励函数值得花一半以上的时间打磨。很多人觉得算法选型和超参调整才是重头戏,但根据我的经验,捡袜子这个任务的成败,80%取决于奖励函数设得好不好。你回头看看第2节,那些关于奖励尺度、稀疏性、塑形偏差的讨论,每一处都对应着我实际踩坑的血泪史。
第三个体会是,如果你的目标是“教会别人强化学习”,那么小黄鸭项目的整个过程中,最值得拿出来反复讲解的,反而不是最后的成功时刻,而是那些失败和修复的过程——奖励被钻空子、训练崩溃、sim-to-real迁移失败,每一个坑都是一堂生动的强化学习课。教学的价值不在展示“它做对了”,而在于展示“它为什么一开始做不对,后来是怎么改对的”。
这个项目后续还可以扩展的方向也挺多:比如给策略加上多任务学习(同时捡袜子和捡毛巾),用多模态输入(视觉+触觉),或者引入人类反馈来修正奖励模型。但不管怎么扩展,核心的那套思维方法——状态怎么定义、动作怎么输出、奖励怎么设计、仿真和真实怎么对齐——都是相通的。把这个项目从头到尾完整做一遍,你对强化学习的理解,会远超那些只会调库跑demo的人。