CMA-ES(协方差矩阵自适应进化策略)

本章定位:理解 无梯度优化方法 在轨迹优化中的应用,掌握 CMA-ES 的核心思想、算法流程和在角色动画中的实际应用。


一、为什么需要无梯度优化?

基于梯度方法的局限

在轨迹优化中,基于梯度的方法(如 iLQR、DDP)需要:

要求问题
可微的动力学模型接触、碰撞等不连续事件不可微
可微的目标函数某些任务指标不可微
良好的梯度信息非凸问题容易陷入局部最优

现实问题

  • 人形角色动画涉及接触约束(脚与地面接触/离开)
  • 目标函数可能高度非凸(多峰、不连续)
  • 仿真器通常是黑盒系统,无法提供解析梯度

无梯度方法的优势

优势说明
无需梯度适用于不可微、不连续问题
黑盒优化只需输入输出,不关心内部机制
全局搜索更有可能跳出局部最优
稳定可靠对噪声和不确定性鲁棒

代表方法

  • CMA-ES(协方差矩阵自适应进化策略)
  • 贝叶斯优化
  • 序列蒙特卡洛方法

二、CMA-ES 核心思想

基本概念

CMA-ES (Covariance Matrix Adaptation Evolution Strategy) 是一种进化策略,属于进化计算的分支。

核心思想

将优化变量建模为高斯分布,通过迭代采样和选择,自适应地更新分布的均值协方差矩阵,使分布逐渐收敛到最优解。


算法框架

目标:找到变量 x 使目标函数 f(x) 最小

1. 初始化高斯分布:x ~ N(μ, Σ)
   - μ: 均值(当前最优估计)
   - Σ: 协方差矩阵(搜索方向和步长)

2. Repeat until convergence:
   (a) 采样:生成候选解 {x₁, x₂, ..., x_λ} ~ N(μ, Σ)
   (b) 评估:计算每个候选解的目标值 {f(x₁), f(x₂), ..., f(x_λ)}
   (c) 选择:保留前 N 个最优样本(精英样本)
   (d) 更新:根据精英样本更新 μ 和 Σ

3. 输出:最优均值 μ*

可视化理解

迭代 1: 初始分布(大方差,探索阶段)
        o
      o o o
    o  *  o      * = 均值 μ
      o o o        o = 采样点
        o

        ↓ 评估 + 选择 + 更新

迭代 2: 分布向最优方向移动(协方差开始适应)
            o
          o o
        o  * →
          o o
            o

        ↓ 继续迭代

迭代 N: 收敛到最优解(小方差,开发阶段)
          ***
         *****
        *******   * = 密集的最优解区域

三、CMA-ES 算法详解

3.1 初始化

均值向量 \(\mu _0\):

  • 可以随机初始化
  • 或使用启发式方法(如参考轨迹)

协方差矩阵 \(\Sigma _0\):

  • 通常初始化为单位矩阵:\(\Sigma _0 = I\)
  • 或根据问题先验知识设置

超参数

  • \(\lambda\):每代采样数量(通常 \(\lambda = 4 + \lfloor 3 \ln n \rfloor\))
  • \(\mu\):精英样本数量(通常 \(\mu = \lfloor \lambda/2 \rfloor\))
  • \(w _i\):样本权重(通常对数权重)

3.2 采样过程

从多元高斯分布中采样:

$$ x_i ^{(g+1)} \sim \mathcal{N}(\mu ^{(g)}, \Sigma ^{(g)}), \quad i = 1, \dots, \lambda $$

高效实现: $$ x_i ^{(g+1)} = \mu ^{(g)} + \sigma ^{(g)} \cdot B ^{(g)} \cdot z_i $$

其中:

  • \(\sigma\):全局步长(控制采样范围)
  • \(B\):协方差矩阵的平方根(\(B \cdot B ^T = \Sigma\))
  • \(z_i \sim \mathcal{N}(0, I)\):标准正态采样

3.3 评估与选择

评估: $$ f_i = f(x_i ^{(g+1)}), \quad i = 1, \dots, \lambda $$

选择

  • 对 \({f_1, \dots, f_\lambda}\) 排序
  • 选择前 \(\mu\) 个最优样本(精英样本)

权重分配: $$ w_i = \ln(\mu + 1) - \ln(i), \quad i = 1, \dots, \mu $$

$$ \sum _{i=1}^{\mu} w_i = 1 $$


3.4 更新规则

均值更新

$$ \mu ^{(g+1)} = \sum _{i=1}^{\mu} w_i \cdot x _{i:\lambda}^{(g+1)} $$

其中 \(x _{i:\lambda}\) 表示第 \(i\) 好的样本。

解释:新均值是精英样本的加权平均。


协方差矩阵更新(核心)

CMA-ES 的关键创新:协方差矩阵自适应

$$ \Sigma ^{(g+1)} = (1-c_1-c_\mu)\Sigma ^{(g)} + c_1 \cdot p_c p_c ^T + c_\mu \sum _{i=1}^{\mu} w_i \cdot \frac{(x _{i:\lambda} - \mu)}{\sigma} \frac{(x _{i:\lambda} - \mu)^T}{\sigma} $$

其中:

  • \(c_1\):累积学习率(通常 \(c_1 \approx 2/n^2\))
  • \(c_\mu\):精英学习率(通常 \(c_\mu \approx \mu/n^2\))
  • \(p_c\):进化路径(累积历史信息)

进化路径(Evolution Path)

共轭进化路径 \(p_\sigma\): $$ p_\sigma ^{(g+1)} = (1-c_\sigma)p_\sigma^{(g)} + \sqrt{c_\sigma(2-c_\sigma)}\sqrt{\sum w_i^2} \cdot B^{-1} \frac{\mu ^{(g+1)} - \mu ^{(g)}}{\sigma} $$

协方差进化路径 \(p_c\): $$ p_c ^{(g+1)} = (1-c_c)p_c^{(g)} + \sqrt{c_c(2-c_c)} \sum _{i=1}^{\mu} w_i \cdot \frac{x _{i:\lambda} - \mu}{\sigma} $$

作用:累积历史更新方向,加速收敛。


步长更新

$$ \sigma ^{(g+1)} = \sigma ^{(g)} \cdot \exp\left(\frac{c_\sigma}{d_\sigma}\left(\frac{|p_\sigma^{(g+1)}|}{E[|N(0,I)|]} - 1\right)\right) $$

解释

  • 如果 \(|p_\sigma|\) 太大 → 步长增加(探索)
  • 如果 \(|p_\sigma|\) 太小 → 步长减小(开发)

3.5 完整算法伪代码

算法:CMA-ES

输入:
    - 目标函数 f(x)
    - 初始均值 μ₀ ∈ ℝⁿ
    - 初始步长 σ₀ > 0
    - 种群大小 λ
    - 精英数量 μ

输出:
    - 最优解 x*

1. 初始化:
   μ ← μ₀, σ ← σ₀, Σ ← I, p_c ← 0, p_σ ← 0
   计算权重 w₁, ..., w_μ

2. Repeat until convergence or max iterations:
   
   (a) 采样阶段
       对 i = 1 到 λ:
           z_i ~ N(0, I)
           x_i = μ + σ · B · z_i
   
   (b) 评估阶段
       对 i = 1 到 λ:
           f_i = f(x_i)
   
   (c) 选择阶段
       按 f_i 排序,选择前 μ 个精英样本
       记录精英样本索引 {1:λ, ..., μ:λ}
   
   (d) 更新均值
       μ ← Σᵢ₌₁^μ w_i · x_{i:λ}
   
   (e) 更新进化路径
       p_σ ← (1-c_σ)p_σ + √(c_σ(2-c_σ))√(Σwᵢ²) · B⁻¹(μ_new - μ)/σ
       
       如果 ∥p_σ∥ 较小:
           p_c ← (1-c_c)p_c + √(c_c(2-c_c)) · Σᵢ₌₁^μ w_i · (x_{i:λ} - μ)/σ
           
           更新协方差:
           Σ ← (1-c₁-c_μ)Σ + c₁·p_c·p_cᵀ + c_μ·Σᵢ₌₁^μ w_i·y_i·y_iᵀ
           其中 y_i = (x_{i:λ} - μ)/σ
   
   (f) 更新步长
       σ ← σ · exp((c_σ/d_σ)(∥p_σ∥/E[∥N(0,I)∥] - 1))

3. 返回 μ(最优均值)

四、CMA-ES 在角色动画中的应用

4.1 轨迹优化问题

优化变量

  • 目标轨迹 \(\tilde{x}(t)\)
  • 或控制轨迹 \(u(t)\)

目标函数: $$ \min {\theta} J(\theta) = w{\text{track}} \cdot E_{\text{track}} + w_{\text{control}} \cdot E_{\text{control}} + w_{\text{stable}} \cdot E_{\text{stable}} $$

说明
\(E_{\text{track}}\)跟踪误差(与参考轨迹的距离)
\(E_{\text{control}}\)控制代价(力矩大小)
\(E_{\text{stable}}\)稳定性(质心高度、不摔倒)

4.2 参数化表示

直接参数化

  • 优化每一帧的状态/控制
  • 参数数量大(高维)

曲线参数化(推荐): $$ x(t) = \text{Spline}(\theta_1, \dots, \theta_k) $$

  • 优化样条曲线的控制点
  • 参数数量少(低维)
  • 自动平滑

4.3 应用实例

实例 1:动物步态优化 [Wampler and Popović 2009]

问题

  • 优化虚拟动物的步态
  • 目标:行走速度最快

方法

  • 使用 CMA-ES 优化步态参数
  • 参数:脚部落点、摆动轨迹、关节角度

结果

  • 自动发现高效的行走模式
  • 与真实动物步态相似

实例 2:角色全身轨迹优化 [Al Borno et al. 2013]

问题

  • 优化角色在复杂接触下的轨迹
  • 接触序列未知

方法

  • CMA-ES 优化目标轨迹
  • 物理仿真评估可行性

优势

  • 无需梯度,处理接触不连续性
  • 自动发现合适的接触序列

4.4 与 SAMCON 的关系

CMA-ES 的缺点

  1. 每次都从头到尾做仿真,计算量大
  2. 如果仿真轨迹长,则难收敛

SAMCON 改进

  • 将轨迹分段
  • 每段用序列蒙特卡洛方法优化
  • 保留多个假设(粒子),避免局部最优
CMA-ES: 整条轨迹 → 一次仿真 → 评估
            ↓
SAMCON: 分段轨迹 → 逐帧仿真 → 粒子滤波

五、CMA-ES 与其他方法对比

5.1 与基于梯度方法对比

维度CMA-ESiLQR/DDP
梯度需求无需需要(一阶/二阶)
适用问题不可微、非凸平滑、可微
收敛速度慢(线性)快(iLQR 线性,DDP 二阶)
样本效率低(需要大量采样)
全局性较好(不易陷入局部最优)较差(依赖初始猜测)
并行性好(采样可并行)较差
计算成本高(仿真次数多)中(需要计算梯度)

5.2 与其他无梯度方法对比

方法适用维度样本效率全局搜索
CMA-ES低~中维 (<100)
贝叶斯优化低维 (<20)
随机搜索任意
粒子群优化任意

5.3 方法选择建议

更多方法对比请参见:方法对比与分类

问题特点 → 推荐方法
─────────────────────────
线性、可微 → LQR
平滑非线性 → iLQR/DDP
接触频繁、不可微 → CMA-ES
样本昂贵 → 贝叶斯优化
高维 (>100) → 考虑基于梯度方法
实时控制 → MPC/SAMCON
需要泛化 → 强化学习 (DeepMimic)

5.4 应用:用 CMA-ES 学习线性反馈策略

除了优化轨迹,CMA-ES 还可以用于学习参数化的策略函数

问题设定

  • 目标:学习一个反馈策略 \(\pi(s)\),将状态映射到动作
  • 参数化:线性策略 \(\delta a = M \cdot \delta s + \hat{a}\)
  • 优化变量:反馈矩阵 \(M\) 和前馈项 \(\hat{a}\)

优化流程

1. 用 SAMCON 优化开环轨迹,得到参考控制 â
2. 参数化线性反馈策略:a = M·δs + â
3. 用 CMA-ES 优化参数 (M, â)
   - 采样候选参数 {θᵢ}
   - 仿真评估每个候选策略
   - 更新高斯分布的均值和方差
4. 输出最优策略参数 θ*

工程实践(Liu et al. 2012 - Terrain Runner)

技巧说明效果
手动选择状态仅选择关键状态(根结点旋转、质心位置/速度、支撑脚位置)12 维 → 减少无关信息
手动选择控制仅对少数关键关节加反馈9 维 → 减少优化变量
矩阵分解\(M_{12×9} = M_{12×3} · M_{3×9}\)108 参数 → 63 参数

优化成本

  • 优化变量:63 维
  • 计算时间:12 分钟(24 核并行)

与轨迹优化的对比

轨迹优化策略优化
输出一条轨迹 \((x,u)\)一个策略函数 \(\pi(s)\)
优化对象有限维向量函数参数 \(\theta\)
泛化能力❌ 仅适用于该轨迹✅ 可处理新状态
计算成本中(秒级)高(分钟级)

注意:这里的策略优化仍然是离线优化,不同于强化学习的在线学习。


六、工程实践

6.1 调参建议

参数推荐值说明
\(\lambda\)\(4 + \lfloor 3 \ln n \rfloor\)种群大小
\(\mu\)\(\lfloor \lambda/2 \rfloor\)精英数量
\(\sigma_0\)根据问题尺度设置初始步长
\(c_1\)\(2/n^2\)累积学习率
\(c_\mu\)\(\mu/n^2\)精英学习率

6.2 实用技巧

1. 参数缩放

  • 将参数归一化到 [0, 1] 范围
  • 避免某些参数主导搜索

2. 约束处理

  • 使用罚函数:\(J' = J + \lambda \cdot \text{constraint}\)
  • 或在采样时截断

3. 早停策略

  • 如果连续 N 代没有改进,则停止
  • 节省计算资源

4. 多起点

  • 从多个初始点运行 CMA-ES
  • 选择最优结果

6.3 并行化

CMA-ES 的主要计算成本在评估阶段,可以并行:

# 串行(慢)
for i in range(λ):
    f[i] = f(x[i])

# 并行(快)
from joblib import Parallel, delayed
f = Parallel(n_jobs=-1)(delayed(f)(x[i]) for i in range(λ))

七、关键要点总结

核心思想

  1. 高斯分布建模:将优化变量视为随机变量,用高斯分布表示
  2. 自适应协方差:根据精英样本更新协方差矩阵,学习搜索方向
  3. 进化路径:累积历史信息,加速收敛

算法流程

初始化 → 采样 → 评估 → 选择 → 更新 → 检查收敛
   ↑                                        ↓
   └────────────────────────────────────────┘

优缺点

优点缺点
无需梯度,适用于黑盒问题样本效率低,收敛慢
能处理不可微、非凸问题高维问题效果差
全局搜索能力强计算成本高
采样可并行需要调参

适用场景

  • ✅ 接触频繁的轨迹优化
  • ✅ 不可微目标函数
  • ✅ 黑盒仿真系统
  • ✅ 低~中维优化问题 (<100 维)
  • ❌ 实时控制(计算太慢)
  • ❌ 高维问题(收敛太慢)

八、深入学习

前置知识

相关方法

  • SAMCON - CMA-ES 的改进版本
  • iLQR - 基于梯度的替代方案
  • DDP - 二阶方法

参考资料

代码资源


本文出自 CaterpillarStudyGroup,转载请注明出处。 https://caterpillarstudygroup.github.io/GAMES105_mdbook/