第1章 课程导论与预备知识
各位同学好,我是这门课的主讲。在机器人领域摸爬滚打了十几年,我越来越觉得——强化学习可能是打通「仿真」和「真实」之间那堵墙的最有力工具。今天咱们先不急着写代码,把地基打牢。
1.1 强化学习在机器人控制中的定位
传统的机器人控制,说白了就是「建模+求解」。你给机器人建一个动力学模型,然后设计一个PID或者LQR控制器,让它按照预定轨迹走。这套方法在工厂里用了三四十年,很成熟。但有个致命问题——模型不准,控制就崩。
我记得有一次做六轴机械臂的抓取项目,理论模型算得漂漂亮亮,一上真实硬件就抖得像筛糠。后来发现是关节摩擦力没建模进去。你想想看,真实世界哪有那么完美的模型?
强化学习换了个思路:不建模,直接试。让机器人在环境里瞎跑,跑对了给奖励,跑错了给惩罚。慢慢地,它自己就学会了怎么走、怎么抓、怎么避障。这就像教小孩骑自行车——你跟他讲重心、讲力矩、讲摩擦系数,他肯定听不懂。你扶着他骑两圈,摔几次,自然就会了。
目前业界的主流做法是「传统控制+RL调参」或者「RL生成参考轨迹+底层PID跟踪」。说白了,强化学习负责高层决策,底层执行还是交给经典控制。这个思路我在好几个落地项目里验证过,效果比纯RL或者纯控制都好。
1.2 MuJoCo仿真环境简介
做强化学习,仿真环境就是你的「训练场」。MuJoCo(Multi-Joint dynamics with Contact)是目前机器人RL领域最主流的物理引擎之一。为什么选它?三个原因:
- 快——它的求解器基于凸优化,比Bullet和ODE快一个数量级。我做过对比,同样一个四足机器人步态训练,MuJoCo能跑到实时速度的50倍以上。
- 准——接触模型做得很精细,特别是摩擦锥和弹性阻尼的处理,跟真实硬件对标的误差在可接受范围内。
- Python接口友好——直接pip install mujoco就能用,跟PyTorch、TensorFlow无缝对接。
MuJoCo的核心概念其实就几个:
| 概念 | 说明 | 我踩过的坑 |
|---|---|---|
| Model | 描述机器人本体和环境的XML文件 | 单位制容易搞混,MuJoCo默认是千克-米-弧度 |
| Data | 运行时状态,包括位置、速度、力 | 每次step后要手动更新,别漏了 |
| Actuator | 关节的驱动力矩/力 | 力矩限幅没设好,仿真直接飞了 |
| Sensor | 可观测的物理量(位置、速度、接触力) | 传感器噪声要加,不然策略迁移到真机就废 |
humanoid.xml或者ant.xml跑起来,感受一下物理引擎的「手感」。我当年就是直接上手写四足机器人模型,结果调了三天XML格式。
下面这张图展示了MuJoCo仿真环境与强化学习智能体之间的交互流程:
1.3 课程所需数学基础
说到数学,很多同学就头疼。我当年也一样,看到满屏的公式就想关网页。但做强化学习,你躲不开三样东西:概率论、线性代数、一点点优化理论。别怕,咱们只讲用得上的。
1.3.1 概率论——处理不确定性
强化学习的核心是「在不确定中做决策」。你给机器人一个动作指令,它能不能执行成功?环境会不会有随机扰动?这些都需要概率论来描述。
你需要掌握的核心概念:
- 随机变量与概率分布——状态s和动作a都是随机变量,策略π(a|s)本质上是条件概率分布
- 期望与方差——价值函数V(s)就是累积奖励的期望,策略梯度里用的就是期望的梯度
- 马尔可夫性质——未来只取决于当前状态,跟历史无关。这个假设简化了几乎所有RL算法
- 贝叶斯公式——在做部分可观测的RL(POMDP)时会用到,咱们课程前期用不上
1.3.2 线性代数——描述状态与变换
机器人的状态空间是高维的。一个七轴机械臂,关节位置7维、速度7维、末端位姿6维,加起来就是20维空间。你想想看,在这个空间里做运算,没有线性代数寸步难行。
重点掌握:
| 概念 | 在RL中的用途 | 我的建议 |
|---|---|---|
| 向量与矩阵 | 状态向量、动作向量、权重矩阵 | 搞清楚行向量和列向量的区别,很多bug出在这 |
| 矩阵乘法 | 神经网络前向传播、价值函数近似 | 手算一次2×3乘3×2,比看十遍书都管用 |
| 特征值与特征向量 | 策略梯度中的自然梯度、TRPO/PPO算法 | 前期不要求深入,知道概念就行 |
| 范数 | 奖励函数设计、策略更新步长约束 | L2范数用得最多,L1范数做稀疏奖励 |
举个例子,策略网络本质上就是一个非线性函数:a = π(s; θ)。其中s是输入向量,θ是网络参数矩阵,a是输出向量。前向传播就是一连串的矩阵乘法和激活函数。说白了,你理解了矩阵乘法,就理解了神经网络的一半。
1.3.3 一点点优化理论
强化学习归根结底是个优化问题——找到一组参数θ,让累积奖励的期望最大。所以你需要知道:
- 梯度下降——最基本的优化方法,沿着梯度反方向更新参数
- 学习率——步长太大容易震荡,太小收敛太慢。我一般从3e-4开始调
- Adam优化器——自适应学习率,RL里最常用的优化器,没有之一