域随机化(Domain Randomization)是解决仿真到现实迁移问题的核心技术之一。通过在训练过程中系统性地改变仿真环境的参数,我们能够训练出对参数不确定性具有鲁棒性的策略。本章深入探讨域随机化的理论基础、实现方法以及在强化学习中的应用,特别关注如何设计有效的随机化策略来弥合仿真与现实之间的差距。
域随机化的核心在于如何选择和设计参数分布。这不仅涉及技术实现,更需要深入理解物理系统的不确定性来源。
物理参数是影响系统动力学行为的基本量。在实际系统中,这些参数往往存在测量误差、制造公差和时变性。
质量与惯性参数
对于刚体系统,质量 $m$ 和惯性张量 $\mathbf{I}$ 的不确定性主要来源于:
通常采用对数正态分布来建模质量参数: \(m \sim \text{LogNormal}(\mu_m, \sigma_m^2)\)
这确保质量始终为正,且允许存在较大的相对偏差。对于惯性张量,我们需要保证其正定性: \(\mathbf{I} = \mathbf{R} \text{diag}(I_1, I_2, I_3) \mathbf{R}^T\) 其中 $I_i \sim \text{LogNormal}(\mu_{I_i}, \sigma_{I_i}^2)$,$\mathbf{R}$ 是随机旋转矩阵。
摩擦系数随机化
摩擦是接触动力学中最难准确建模的现象之一。库仑摩擦模型中的静摩擦系数 $\mu_s$ 和动摩擦系数 $\mu_d$ 在实际中受多种因素影响:
摩擦系数的随机化策略:
μ_s ~ Uniform(0.3, 1.5) # 静摩擦系数
μ_d ~ Uniform(0.2, min(μ_s, 1.2)) # 动摩擦系数,保证 μ_d ≤ μ_s
对于各向异性摩擦,可以引入方向依赖的摩擦系数: \(\mu(\theta) = \mu_0 + \Delta\mu \cos(n\theta + \phi)\) 其中 $\theta$ 是滑动方向,$n$ 是表面纹理的周期数。
阻尼参数
关节阻尼 $b$ 和结构阻尼 $c$ 影响系统的能量耗散: \(\tau_{\text{damping}} = -b\dot{q} - c|\dot{q}|\dot{q}\)
阻尼参数的不确定性来源于:
通常采用对数均匀分布: \(b \sim \text{LogUniform}(b_{\min}, b_{\max})\)
几何参数的变化直接影响碰撞检测和接触力计算。
尺寸变化
对于连杆长度 $l$ 和半径 $r$: \(l \sim \mathcal{N}(l_0, \sigma_l^2), \quad r \sim \mathcal{N}(r_0, \sigma_r^2)\)
需要注意保持运动学约束的一致性。例如,对于闭链机构,需要确保随机化后的尺寸仍满足闭环约束。
形状扰动
使用主成分分析(PCA)来参数化形状变化: \(\mathbf{v} = \mathbf{v}_0 + \sum_{i=1}^k \alpha_i \mathbf{e}_i\) 其中 $\mathbf{v}_0$ 是标称形状,$\mathbf{e}_i$ 是形状变化的主成分,$\alpha_i \sim \mathcal{N}(0, \lambda_i)$。
选择合适的参数分布需要平衡覆盖性和训练效率。
最大熵原则
在只知道参数的均值和方差时,根据最大熵原则应选择正态分布。对于有界参数,均匀分布具有最大熵: \(H(p) = -\int p(x)\log p(x) dx\)
β分布的灵活性
对于归一化参数(如摩擦系数比例),β分布提供了灵活的建模能力: \(p(x; \alpha, \beta) = \frac{x^{\alpha-1}(1-x)^{\beta-1}}{B(\alpha, \beta)}\)
通过调整 $\alpha$ 和 $\beta$,可以实现从均匀分布到钟形分布的平滑过渡。
实际系统中的参数往往存在相关性,忽略这些相关性可能导致不现实的参数组合。
协方差建模
使用多元正态分布捕获参数间的线性相关性: \(\boldsymbol{\theta} \sim \mathcal{N}(\boldsymbol{\mu}, \boldsymbol{\Sigma})\)
其中协方差矩阵 $\boldsymbol{\Sigma}$ 可以通过系统辨识获得。
Copula方法
对于非线性相关性,使用Copula函数: \(C(u_1, ..., u_n) = P(U_1 \leq u_1, ..., U_n \leq u_n)\)
常用的Gaussian Copula: \(C_{\text{Gauss}}(\mathbf{u}; \mathbf{R}) = \Phi_{\mathbf{R}}(\Phi^{-1}(u_1), ..., \Phi^{-1}(u_n))\)
固定的参数分布可能过于保守或不够充分。自适应域随机化通过动态调整参数分布来提高训练效率。
性能度量
定义仿真中的性能指标 $J_{\text{sim}}(\pi, \theta)$ 和真实世界的性能 $J_{\text{real}}(\pi)$,目标是最小化性能差距: \(\Delta J = |J_{\text{real}}(\pi) - \mathbb{E}_{\theta \sim p(\theta)}[J_{\text{sim}}(\pi, \theta)]|\)
参数分布更新
使用梯度上升更新分布参数: \(\phi_{t+1} = \phi_t + \alpha \nabla_{\phi} \mathbb{E}_{\theta \sim p_{\phi}(\theta)}[J_{\text{sim}}(\pi, \theta)]\)
其中 $\phi$ 是分布的参数(如均值和方差)。
贝叶斯优化提供了一种原则性的方法来搜索最优参数分布。
高斯过程建模
假设性能函数服从高斯过程: \(J(\phi) \sim \mathcal{GP}(m(\phi), k(\phi, \phi'))\)
其中核函数 $k$ 常选择Matérn核: \(k_{\text{Matérn}}(r) = \frac{2^{1-\nu}}{\Gamma(\nu)}\left(\sqrt{2\nu}\frac{r}{\ell}\right)^{\nu}K_{\nu}\left(\sqrt{2\nu}\frac{r}{\ell}\right)\)
获取函数
使用期望改进(EI)作为获取函数: \(\text{EI}(\phi) = \mathbb{E}[\max(0, J(\phi) - J^*)]\)
其中 $J^*$ 是当前最优值。
逐步增加随机化的难度可以加速学习过程。
方差调度
随训练进度增加参数方差: \(\sigma^2(t) = \sigma_0^2 + (\sigma_{\max}^2 - \sigma_0^2) \cdot \min(1, t/T)\)
自动课程学习
基于策略性能自动调整难度: \(p_{t+1}(\theta) = \begin{cases} p_t(\theta) & \text{if } J_t < J_{\text{threshold}} \\ \text{expand}(p_t(\theta)) & \text{otherwise} \end{cases}\)
对抗域随机化通过最坏情况优化来提高策略的鲁棒性。
鲁棒优化公式
寻找对最坏参数具有鲁棒性的策略: \(\pi^* = \arg\max_{\pi} \min_{\theta \in \Theta} J(\pi, \theta)\)
这可以转化为零和博弈: \(\min_{\pi} \max_{\theta} -J(\pi, \theta)\)
不确定性集合设计
定义参数的不确定性集合: \(\Theta = \{\theta : \|\theta - \theta_0\|_{\mathbf{W}} \leq \epsilon\}\)
其中 $\mathbf{W}$ 是权重矩阵,反映不同参数的相对不确定性。
双层优化
交替更新策略和对抗参数:
for iteration in range(N):
# 对抗者更新:寻找最坏参数
θ_adv = argmin_θ J(π, θ)
# 策略更新:针对最坏情况优化
π = argmax_π J(π, θ_adv)
RARL算法
鲁棒对抗强化学习(RARL)同时训练主角和对抗者: \(\mathcal{L}_{\text{protagonist}} = -\mathbb{E}_{\tau \sim \pi}[R(\tau)]\) \(\mathcal{L}_{\text{adversary}} = \mathbb{E}_{\tau \sim \pi}[R(\tau)]\)
Lipschitz连续性
如果奖励函数关于参数是Lipschitz连续的: \(|J(\pi, \theta_1) - J(\pi, \theta_2)| \leq L\|\theta_1 - \theta_2\|\)
则鲁棒策略的性能下界为: \(J(\pi^*, \theta) \geq J(\pi^*, \theta^*) - L\epsilon\)
CVaR优化
使用条件风险价值(CVaR)来优化尾部风险: \(\text{CVaR}_{\alpha}(J) = \mathbb{E}[J | J \leq F_J^{-1}(\alpha)]\)
其中 $F_J^{-1}(\alpha)$ 是 $J$ 的 $\alpha$-分位数。
理解域随机化的理论基础有助于设计更有效的随机化策略。
PAC-Bayes理论提供了泛化误差的概率界限。
基本界限
对于任意后验分布 $Q$ 和先验分布 $P$: \(\mathbb{P}\left[\mathbb{E}_{\theta \sim Q}[L(\theta)] \leq \hat{L}_S(Q) + \sqrt{\frac{KL(Q||P) + \ln(2\sqrt{n}/\delta)}{2n}}\right] \geq 1-\delta\)
其中 $\hat{L}_S(Q)$ 是经验损失,$n$ 是样本数。
域随机化的解释
域随机化可以看作是在参数空间上定义了一个先验分布 $P(\theta)$。策略在不同参数下的平均性能对应于期望损失: \(L(\pi) = \mathbb{E}_{\theta \sim P(\theta)}[-J(\pi, \theta)]\)
Rademacher复杂度
策略类的Rademacher复杂度: \(\mathcal{R}_n(\Pi) = \mathbb{E}_{\sigma, S}\left[\sup_{\pi \in \Pi} \frac{1}{n}\sum_{i=1}^n \sigma_i J(\pi, \theta_i)\right]\)
其中 $\sigma_i$ 是Rademacher随机变量。
泛化界限: \(\mathbb{E}_{\theta}[J(\pi, \theta)] \geq \hat{J}_S(\pi) - 2\mathcal{R}_n(\Pi) - 3\sqrt{\frac{\ln(2/\delta)}{2n}}\)
覆盖数理论
要以概率 $1-\delta$ 学习到 $\epsilon$-最优策略,所需的参数样本数: \(N = O\left(\frac{1}{\epsilon^2}\ln\left(\frac{\mathcal{N}(\epsilon/2, \Theta, \|\cdot\|)}{\delta}\right)\right)\)
其中 $\mathcal{N}(\epsilon, \Theta, |\cdot|)$ 是 $\Theta$ 的 $\epsilon$-覆盖数。
维度诅咒
对于 $d$ 维参数空间,覆盖数随维度指数增长: \(\mathcal{N}(\epsilon, B_d(1), \|\cdot\|_2) = O\left(\left(\frac{1}{\epsilon}\right)^d\right)\)
这说明高维参数空间需要更多的随机化样本。
渐进式随机化
class ProgressiveDR:
def __init__(self, initial_range, final_range, steps):
self.initial = initial_range
self.final = final_range
self.steps = steps
def sample(self, step):
alpha = min(1.0, step / self.steps)
current_range = self.initial + alpha * (self.final - self.initial)
return np.random.uniform(-current_range, current_range)
选择性随机化
只随机化对任务影响显著的参数: \(\text{Sensitivity}_i = \left|\frac{\partial J}{\partial \theta_i}\right|_{\theta=\theta_0}\)
优先随机化高敏感度参数。
鲁棒性度量
策略鲁棒性的量化指标: \(R(\pi) = \frac{1}{|\Theta_{\text{test}}|}\sum_{\theta \in \Theta_{\text{test}}} \mathbb{I}[J(\pi, \theta) > J_{\text{threshold}}]\)
最坏情况性能
\[J_{\text{worst}}(\pi) = \min_{\theta \in \Theta_{\text{test}}} J(\pi, \theta)\]机械臂抓取任务
关键随机化参数:
四足机器人行走
环境参数随机化:
Josh Tobin及其合作者在2017年的工作”Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World”标志着域随机化技术的重要里程碑。他们展示了通过极端的视觉随机化(包括随机纹理、光照、相机位置等),可以训练出能够直接迁移到真实世界的视觉策略。
这项工作的关键见解是:如果在足够多样化的仿真环境中训练,真实世界可以被视为另一个随机化的变体。他们的方法成功地将物体检测和姿态估计网络从纯仿真训练迁移到真实机器人系统。
Tobin的贡献不仅在于技术创新,更在于改变了社区对sim-to-real问题的思考方式:从追求高保真仿真转向拥抱可控的随机性。
MAML通过学习良好的初始化来实现快速适应: \(\theta^* = \arg\min_{\theta} \sum_{i=1}^N \mathcal{L}_{\tau_i}(\theta - \alpha\nabla_{\theta}\mathcal{L}_{\tau_i}(\theta))\)
其中 $\tau_i$ 是不同环境参数下的任务。
与域随机化的结合
将域随机化视为任务分布: \(p(\tau) = p(\theta)p(T|\theta)\)
通过元学习获得能快速适应新参数的策略。
隐式参数推断
训练策略同时进行参数推断和控制: \(\pi(a|s, h) = \int \pi(a|s, \theta)p(\theta|h) d\theta\)
其中 $h$ 是历史观测。
循环神经网络实现
class AdaptivePolicy(nn.Module):
def __init__(self, state_dim, action_dim, hidden_dim):
super().__init__()
self.lstm = nn.LSTM(state_dim, hidden_dim)
self.policy_head = nn.Linear(hidden_dim, action_dim)
def forward(self, states, hidden=None):
lstm_out, hidden = self.lstm(states, hidden)
actions = self.policy_head(lstm_out)
return actions, hidden
粒子滤波器
维护参数的后验分布: \(p(\theta_t|o_{1:t}) \propto p(o_t|\theta_t)p(\theta_t|\theta_{t-1})p(\theta_{t-1}|o_{1:t-1})\)
使用粒子表示: \(p(\theta|o_{1:t}) \approx \sum_{i=1}^N w_t^{(i)} \delta(\theta - \theta_t^{(i)})\)
差分进化优化
在线优化参数估计:
def differential_evolution_update(particles, fitness, F=0.8, CR=0.9):
N = len(particles)
new_particles = []
for i in range(N):
# 选择三个不同的粒子
indices = np.random.choice([j for j in range(N) if j != i], 3, replace=False)
a, b, c = particles[indices]
# 变异
mutant = a + F * (b - c)
# 交叉
trial = np.where(np.random.rand(len(mutant)) < CR, mutant, particles[i])
# 选择
if fitness(trial) > fitness(particles[i]):
new_particles.append(trial)
else:
new_particles.append(particles[i])
return new_particles
域随机化是解决仿真到现实迁移问题的强大工具。本章的关键要点包括:
关键公式回顾:
练习 13.1 设计摩擦系数的概率分布
给定机器人夹爪与物体间的摩擦系数标称值为 $\mu_0 = 0.8$,实验测得相对标准差为20%。请设计一个合适的概率分布来建模这个参数,要求:(a) 保证摩擦系数始终为正;(b) 反映测量的不确定性;(c) 避免产生物理上不合理的值(如 $\mu > 3$)。
Hint: 考虑截断分布或Beta分布的变换。
练习 13.2 计算参数敏感度
考虑单摆系统 $\ddot{\theta} = -\frac{g}{l}\sin\theta - b\dot{\theta}$,其中 $g=9.81$,$l=1.0$,$b=0.1$。使用能量作为性能指标 $J = \int_0^T (\dot{\theta}^2 + \theta^2) dt$。请计算各参数的敏感度,并确定随机化优先级。
Hint: 使用有限差分或解析求导。
练习 13.3 实现简单的自适应域随机化
编写伪代码,实现基于成功率的自适应域随机化。当任务成功率超过80%时,增加参数范围;低于60%时,减小参数范围。
Hint: 使用指数平均来平滑成功率估计。
练习 13.4 设计相关参数的联合分布
机器人的连杆质量和长度存在相关性(密度近似恒定)。给定第i个连杆的标称质量 $m_i = \rho V_i = \rho \pi r_i^2 l_i$,设计一个保持物理一致性的联合随机化策略。
Hint: 使用条件分布或Copula。
练习 13.5 分析域随机化的样本复杂度
证明:对于d维参数空间的域随机化,要保证以概率 $1-\delta$ 覆盖参数空间的 $1-\epsilon$ 体积,所需的最少样本数为 $N = O(d\log(1/\delta)/\epsilon)$。
Hint: 使用Chernoff界和覆盖理论。
练习 13.6 对抗域随机化的纳什均衡
考虑零和博弈:策略 $\pi$ 最大化奖励 $R(\pi, \theta)$,对抗者选择参数 $\theta \in \Theta$ 最小化奖励。证明:如果 $R$ 是凹-凸的,则存在唯一的纳什均衡 $(\pi^, \theta^)$。
Hint: 使用minimax定理。
练习 13.7 元学习与域随机化的等价性
证明:在特定条件下,域随机化训练等价于MAML的一阶近似(FOMAML)。
Hint: 比较两者的梯度更新规则。
问题:参数范围设置过大,导致大部分采样配置物理不合理或无法完成任务。
解决方案:
问题:独立随机化相关参数产生不现实的组合(如超轻但超大惯性的物体)。
调试技巧:
# 检查参数相关性
correlation_matrix = np.corrcoef(sampled_params.T)
assert np.all(np.abs(correlation_matrix - expected_correlation) < threshold)
问题:测试时使用的参数分布与训练时不同。
最佳实践:
问题:在某些参数配置下,策略梯度估计严重偏差。
诊断方法:
# 监控不同参数下的梯度范数
grad_norms = []
for theta in param_samples:
grad = compute_gradient(policy, theta)
grad_norms.append(np.linalg.norm(grad))
if np.std(grad_norms) / np.mean(grad_norms) > 2.0:
print("Warning: High gradient variance across parameters")
问题:过多的随机化增加了训练时间。
优化策略: