无梯度与采样优化
并不是所有代价函数都能求导:碰撞是 0 或 1,仿真器是个黑盒,策略的回报要跑完整个回合才知道。这时我们只能"问"函数在某些点的值。采样优化的做法很朴素:撒一把点,看哪些好,把分布挪向好的地方。随机搜索、交叉熵法 (CEM)、CMA-ES 和 MPPI 都是这一思路的变体,其中 MPPI 已经成了机器人实时控制的主力之一。
1为什么机器人需要它
前面几节的所有优化器(6.3、6.6、6.9)都靠一件事吃饭:导数。可机器人的代价函数常常不配合:
- 不连续:路径与障碍物相撞的代价是"撞了 / 没撞",跳变处没有导数,平坦处导数为零,梯度什么也告诉不了你。
- 黑盒:物理仿真器、渲染器、一个已经训练好的神经网络。你可以运行它,但没人写过它的雅可比,用自动微分穿过一个含接触的仿真往往得到噪声很大的梯度。
- 多峰:绕左边还是绕右边?抓杯子的把手还是杯身?每一种选择都是一个局部最小,局部的梯度只会把你带进最近的那一个。
- 噪声:真机上评估一次代价就是做一次实验,结果带随机性。
这时只要能"算出某个候选解的代价"就够了。采样优化不求导,而是让一个分布(通常是高斯)产生一批候选,根据它们的代价更新这个分布。它天然并行(每个候选互不相干,GPU 上一批同时算),对代价函数的形状几乎没有要求,因此成了实时 MPC(MPPI)、强化学习(进化策略 ES)、参数调优(CMA-ES)和任务规划里的常用工具。代价是:在高维空间里它需要的样本数比有梯度时多得多(本节末尾会量化)。
2直觉:撒点就是在估计一个"模糊梯度"
想象在一维曲线上,当前的猜测是 \(\mu\)。我们从 \(\mathcal N(\mu,\sigma^2)\) 里抽 \(N\) 个点 \(x_i\),量出每个点的代价 \(f(x_i)\)。代价低的点更好,所以新的均值应该往它们那边挪:把每个点按它的"好坏程度"打一个权重 \(w_i\),新均值取加权平均 \(\mu'=\sum_iw_ix_i/\sum_iw_i\)。
两种常见的打分办法:精英法 (CEM),只保留最好的 \(\rho N\) 个,权重 1,其余 0;softmax 法 (MPPI),权重 \(w_i=\exp\!\big(-(f_i-f_{\min})/\lambda\big)\),温度 \(\lambda\) 控制"有多挑剔"。
有一个值得记住的事实:这样得到的更新方向,其实是在估计高斯平滑后的函数 \(f_\sigma(x)=\mathbb E_{\epsilon}[f(x+\sigma\epsilon)]\) 的负梯度,与 \(\sigma^2/\lambda\) 成正比。平滑相当于把尖锐的小坑填平,所以 \(\sigma\) 就是它的"视野":\(\sigma\) 小,只看得见脚下的局部最小;\(\sigma\) 大,能越过小山包,但也会把真正最小点的位置抹糊。下图中,琥珀色虚线就是 \(f_\sigma\)。
- 保持 \(\mu\approx 2.9\)(右边的局部最小)、\(\sigma\) 很小,按"运行":均值纹丝不动,被局部最小困住。
- 把 \(\sigma\) 调到 1.2 以上,再按"运行":均值越过小山包,跑到左边的全局最小(\(x\approx-0.96\))。
- 在 MPPI 模式下把温度 \(\lambda\) 拖到最大:权重几乎均匀,新均值几乎不动("有效样本数"接近 \(N\),等于没有挑剔)。再拖到最小:只有一个点有权重,容易被噪声带跑。
3动手玩:四种采样器与梯度的竞技场
下面把四种方法放到同一张二维地形上:
- 随机搜索((1+λ)-ES):围绕当前最好点撒一批,谁比当前点好就搬过去。
- CEM:取最好的 25% 作为精英,用它们的均值和协方差作为下一代的高斯。
- CMA-ES:CEM 的"加强版",对精英加权,并用进化路径平滑地调整协方差和步长(第 4 节)。
- MPPI:固定高斯,样本按 softmax 权重取加权平均。
作对比的是普通梯度下降(用有限差分求数值梯度)。点击地图设定起点;"运行"让所选方法跑完 1200 次函数求值;下方的曲线记录"到目前为止最好的代价",不同方法的曲线可以叠加比较。
- 在 Rastrigin 上从默认起点运行梯度下降:它很快停在最近的局部最小,再也不动。
- 在同一地形上运行 CMA-ES(样本数默认 30):它越过无数个小坑,找到全局最小 \((0,0)\)(最好代价低于 0.05)。若样本数太少,会怎样?
- 切到"不连续"地形,运行 MPPI,把最好代价压到 0.1 以下,而梯度下降做不到。再试 CEM:默认设置下它的方差很快塌缩,停在半路(误区 3),要把样本数和 \(\sigma\) 调大才行。
采样法用全局的视野换局部的精度:它不会被小坑或悬崖卡住,但每一步要付出一批函数求值,而且越接近最小值,需要缩小 \(\sigma\) 才能精确(CEM 和 CMA-ES 自己会缩,MPPI 和随机搜索的 \(\sigma\) 是你给的)。有梯度、且问题是光滑的时候,梯度法几乎总是更快;两者常常搭配:先采样找到好的盆地,再用梯度精修。
4再看数学
提示:把鼠标悬停在公式中带底色的符号上,FIG 1 中对应的元素会被高亮(权重、新均值、平滑函数)。
平滑函数的梯度,用采样估计
定义 \(\hl{fs}{f_\sigma(\x)}=\mathbb E_{\boldsymbol\epsilon\sim\mathcal N(0,I)}\,f(\x+\sigma\boldsymbol\epsilon)\)。对高斯求导有一个漂亮的恒等式:
右边只用到函数值,不用导数,这是进化策略 (ES)、有限差分的随机版本、策略梯度里 REINFORCE 的共同祖先。减去 \(f(\x)\) 不改变期望,却大幅降低方差(这叫基线)。
加权平均:CEM 与 MPPI
设样本 \(\x_i\sim\mathcal N(\mathbf m,\Sigma)\),代价 \(f_i=f(\x_i)\)。它们共用同一个更新形式:
MPPI 的权重是 \(\exp(-f/\lambda)\) 的重要性采样:把目标分布取为 \(q^\star(\x)\propto p(\x)e^{-f(\x)/\lambda}\)("低代价的地方概率更大"),\(\mathbf m'\) 就是 \(q^\star\) 的均值,用样本估计。把它代入上面的高斯恒等式可得,当 \(f\) 在样本云内变化不大时
所以 MPPI 是对平滑代价的梯度下降,步长为 \(\sigma^2/\lambda\),只是梯度用采样估计。温度 \(\lambda\) 太小,权重集中在一个样本上("有效样本数" \((\sum w)^2/\sum w^2\to1\)),估计噪声大;太大,权重趋于均匀,\(\mathbf m'\approx\mathbf m\),不再前进。CEM 的精英法是一个不需要调温度的"秩"版本:只看排名,对代价的尺度不敏感。CEM 还要更新协方差:取精英的经验协方差(矩匹配,等价于让高斯到精英分布的 KL 散度最小)。
CMA-ES 一瞥
CMA-ES 把排名前 \(\mu\) 的样本 \(\mathbf y_{(i)}=(\x_{(i)}-\mathbf m)/\sigma\) 加权(权重 \(w_i\) 随名次递减),更新均值、协方差与步长:
其中 \(\mathbf p_c,\mathbf p_\sigma\) 是"进化路径",即各代均值位移的指数滑动平均:如果连续几代都朝同一个方向走,路径就长,\(\sigma\) 变大;来回打转,路径短,\(\sigma\) 变小。协方差会逐渐"对齐"到地形的狭长方向,这相当于在没有 Hessian 的情况下学出了一个近似的二阶度量。FIG 2 里的 CMA-ES 就是这套更新(\(n=2\) 的精确实现,参数取 Hansen 教程的默认值)。
5机器人中的它:MPPI 实时避障
MPPI(Model Predictive Path Integral control,Williams 等)把 MPC(6.8 节)的"预测未来、选最好的控制序列、只执行第一个"和上面的采样更新结合起来:每个控制周期,在当前计划 \(U=(\mathbf u_0,\dots,\mathbf u_{H-1})\) 上加 \(K\) 份随机扰动,用模型把每一份往前仿真 \(H\) 步,得到总代价 \(S_k\),按 \(\exp(-S_k/\lambda)\) 加权平均,更新计划,执行 \(\mathbf u_0\),把计划向前平移一格,下个周期重来。
它不要求代价和动力学可导,所以可以直接用"撞了就罚一个大数"这种不连续代价(下图里每步撞障罚 160),也可以用任何非线性动力学(轮式、四旋翼、带摩擦的接触)。下图是一个质点机器人(加速度控制)要穿过三个障碍物到达绿色目标。每条细线是一次 rollout,越不透明权重越大(红色表示撞到了),琥珀色粗线是加权平均后的计划。拖动目标或障碍物,计划会实时重新规划。
- 按"开始",让机器人不碰任何障碍物地到达目标(距离 0.4 以内)。
- 机器人运动途中,把一个障碍物拖到它的前方:看计划如何实时绕开。
- 把样本数 \(K\) 降到 8:轨迹变得抖动,更容易撞到障碍物。样本越多,计划越稳。
没有免费午餐:维数的代价
采样法的弱点是维度。下面是一个真实的小实验:在 \(d\) 维的病态二次函数 \(f(\x)=\tfrac12\sum_ic_ix_i^2\)(\(c_i\) 从 1 到 \(\kappa\) 几何分布)上,数一数把代价压到初值的百万分之一需要多少次函数求值:①用有限差分求梯度的梯度下降(每个梯度要 \(2d\) 次求值);②(1+1)-ES(每次只采 1 个点,用"1/5 成功率法则"调步长,是最简单的无梯度方法);③有解析梯度的梯度下降(一次梯度约等于 3 次函数求值,与 \(d\) 无关)。按"运行"开始。
- 按"运行",再把条件数 \(\kappa\) 拖到 100:三条曲线都上移,但斜率不变。
MPPI 在越野自动驾驶(如 AutoRally 的激进驾驶)、四旋翼避障、足式机器人的实时规划里被广泛使用,一次更新通常并行评估几千条 rollout(GPU 上几毫秒)。实用中还要加:对控制序列做平滑滤波(否则输出抖动)、用上一周期的计划热启动(FIG 3 的"平移计划")、对采样噪声使用相关性(让控制序列更平滑)。CMA-ES 则常用于调超参数、标定、步态参数和奖励函数的优化;进化策略 (OpenAI-ES) 还被用来训练神经网络策略,利用的正是上面的 \(\nabla f_\sigma\) 估计与海量并行。
6常见误区
FIG 4 的结论很直白:维度翻倍,需要的求值次数大约也翻倍。在 FIG 2 把 CMA-ES 的样本数调到很小,在多峰地形上就会掉进局部最小。MPPI 的维度是"\(H\times\) 控制维数",视野越长、控制通道越多,需要的 rollout 越多。别指望用几十个样本优化几百维的东西。
\(\exp(-f/\lambda)\) 里 \(f\) 与 \(\lambda\) 的比值才是关键。把代价乘 100,同样的 \(\lambda\) 就从"适中"变成"只有最好的一个样本有权重"。务必减去最小值(数值稳定),并把 \(\lambda\) 设成相对于样本代价散布的量(如 FIG 3 的"×标准差"),或者干脆用 CEM 那样的排名权重。
CEM 用精英的协方差当下一代的协方差;精英总是比整体更集中,所以方差一代比一代小,常常在到达最小点之前就缩没了(早熟收敛)。常见补救:给协方差加一个下限、对新旧协方差做平滑混合、或增加样本数。CMA-ES 的进化路径机制正是为了避免这个问题。
真机上评估一次代价可能带噪声。如果只跑一次,随机搜索里的"谁更好"可能被噪声翻转,整个搜索被误导。对噪声问题要用更多样本、对代价重复评估取平均,或使用对噪声更稳健的权重方案(排名比绝对值更稳健)。
7小练习
8延伸阅读
- N. Hansen, The CMA Evolution Strategy: A Tutorial, arXiv:1604.00772, 2016 — FIG 2 中 CMA-ES 的出处,参数默认值和每一步更新都在里面
- G. Williams, P. Drews, B. Goldfain, J. M. Rehg & E. A. Theodorou, Information Theoretic MPC for Model-Based Reinforcement Learning, ICRA 2017 — MPPI 的信息论推导与越野驾驶实验
- R. Y. Rubinstein & D. P. Kroese, The Cross-Entropy Method, Springer, 2004 — 交叉熵法的经典专著
- T. Salimans, J. Ho, X. Chen, S. Sidor & I. Sutskever, Evolution Strategies as a Scalable Alternative to Reinforcement Learning, arXiv:1703.03864, 2017 — 用 \(\nabla f_\sigma\) 估计训练神经网络策略
- J. Nocedal & S. J. Wright, Numerical Optimization, 2nd ed., Springer, 2006 — 有限差分梯度与无导数方法的背景