假设你要为一家餐厅培养一位能独当一面的厨师,最笨的办法是让学徒只在一间装修固定的练习厨房里反复练同一道菜——等他一进真实后厨,发现灶台位置不一样、灯光暗了一档、锅的摩擦力变了,立刻手忙脚乱。聪明的办法,是练习时故意把厨房“变来变去”:今天换一批厨具,明天调暗灯光,后天把食材换成不同颜色。学徒见惯了各种“厨房变体”,反而抓住了做菜的本质——火候、刀工、调味。这就是域随机化(Domain Randomization):在仿真环境里训练机器人时,故意把环境的视觉、物理参数随机扰动,让策略学会“无论世界怎么变,我都能完成任务”。本文会带你从随机化范围怎么定、关键参数怎么选,一直讲到如何识别“随机化过头”。读完你会明白,为什么这招能让仿真里练出来的机器人,在真实世界里依然稳稳当当。

岗位关联

对 AI 从业者的价值:域随机化是仿真到现实(sim-to-real)迁移的基石技术。掌握它,你就能让仿真训练的策略真正落地到真实机器人上,显著提升项目交付的稳定性和泛化能力。

目录
  1. 可视化演示
  2. 第 1 节 基本概念:为什么需要域随机化
  3. 第 2 节 随机化范围:让厨房“换装”的边界
  4. 第 3 节 关键参数选择:最该折腾哪几样
  5. 第 4 节 过度随机化:当厨房不再像厨房
  6. 第 5 节 训练与部署:从练习厨房到真实后厨
  7. 第 6 节 性能评估:怎么知道学徒出师
  8. 第 7 节 工程实践:稳定复现的秘密
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

第 1 节 基本概念:为什么需要域随机化

徒弟“小灶”在一间固定的练习厨房里学做番茄炒蛋。厨房的灶台靠左、灯光雪亮、铁锅特别顺手。他练了三个月,闭着眼都能炒出满分。可正式上岗那天,后厨的灶台换到了右边,灯光昏黄,锅变成了不粘锅——小灶居然连蛋都翻不熟了。问题出在哪?他练的不是“做菜”,而是“在那一间特定厨房里做菜”。对机器人来说,仿真环境就是那间练习厨房,真实世界就是真正的后厨。两者之间的差异,叫做“域差距”(domain gap)。

为了让机器人不变成“只会在一间仿真厨房里耍威风”的偏科生,研究者提出了域随机化:训练时不让环境固定不变,而是给仿真环境里的各种参数随机加扰动——换个背景、改个摩擦、调个重力。这样,机器人见过足够多“变体”之后,学到的就不再是某个特定环境的死记硬背,而是真正的控制策略。换句话说,域随机化是在用“多样化的练习”换取“真实世界的泛化”。

数学上,我们可以把机器人在真实世界中的期望回报,拆成仿真中的期望回报减去一个“域差距”项。想要真机表现好,要么提高仿真表现,要么缩小域差距。

小灶后来学聪明了:练习时让师傅随机调整灶台位置、灯光亮度和锅的材质。六个月后再进后厨,他扫一眼环境就能快速适应。域随机化,就是机器人的“多样化工地训练”,让它从“背板选手”变成“真会做菜的厨师”。

Jreal(πθ)=Jsim(πθ)−Δsim→real\displaystyle J_{\text{real}}(\pi_\theta) = J_{\text{sim}}(\pi_\theta) - \Delta_{\text{sim}\to\text{real}}
这个公式告诉我们:真实世界的表现 = 仿真表现 − 域差距。域随机化的目标,就是通过让仿真环境更多样,把这个 Δ 越压越小。
  1. 左端真实世界的期望回报:表示策略 \(\pi_\theta\) 在真实机器人上执行任务得到的累计奖励,也是我们最终关心的指标。
    Jreal(πθ)J_{\text{real}}(\pi_\theta)
  2. 右端第一项仿真世界的期望回报:同样的策略先在仿真环境里跑,得到的累计奖励。这个值我们可以在训练中直接测量。
    Jsim(πθ)J_{\text{sim}}(\pi_\theta)
  3. 减号的含义真实环境通常比仿真更“刁钻”,所以真实表现一般会打折扣,用减法体现这个损失。
    Δsim→real\Delta_{\text{sim}\to\text{real}}
  4. 域差距项仿真与真实之间所有差异(视觉、物理、动态)造成的性能损失。随机化越充分,这个项越小。
    Δsim→real≥0\Delta_{\text{sim}\to\text{real}} \ge 0

第 2 节 随机化范围:让厨房“换装”的边界

师傅给小灶定了一条规矩:练习厨房可以随便换装,但不能换成一个游泳池。灯光可以从暖黄调到冷白,锅可以从铁锅换成不粘锅,但灶台必须在厨房里、食材必须还是番茄和蛋。这里的“可以变什么、变到多大范围”,就是域随机化的随机化范围(randomization range)。

范围设定是域随机化最核心的工程决策。范围太小,仿真分布盖不住真实分布,练了半天还是偏科;范围太大,训练难度陡增,策略可能根本学不会。通常的做法是给每个参数规定上下界,然后从界内采样。如果某个参数在真实世界中大致服从某种规律(比如光照强度在白天是偏亮的),我们还可以选择更贴近真实分布的采样方式,而不仅仅是最简单的均匀分布。

在实现层面,环境参数被组织成一个向量,每次训练回合开始前从指定分布里抽一组值,再用这组值生成一局仿真。这个采样过程可以形式化地写成:

值得一提的是,随机化范围不是一成不变的。就像师傅先让小灶在灯光只变一档的厨房里练手,等他熟练后再慢慢扩大变化幅度——这叫“课程式随机化”。范围由窄到宽,训练由易到难,最终让策略在“最难但还能学会”的窗口上稳定下来。

ξ=(ξ1,ξ2,…,ξn),ξi∼U(ξimin⁡,  ξimax⁡)\displaystyle \boldsymbol{\xi} = (\xi_1, \xi_2, \dots, \xi_n), \qquad \xi_i \sim \mathcal{U}(\xi_i^{\min},\; \xi_i^{\max})
它表示:环境里共有 n 个可随机化的参数,每个参数都在自己的最小值和最大值之间按均匀分布随机抽取。真实工程中还会用到高斯分布、对数均匀分布等。
  1. 参数向量把光照、摩擦、质量等所有可变参数打包成一个向量,方便统一采样和管理。
    ξ=(ξ1,ξ2,…,ξn)\boldsymbol{\xi} = (\xi_1, \xi_2, \dots, \xi_n)
  2. 均匀分布采样每个参数在其下界和上界之间等概率取值,这是最常用的“无偏”采样方式。
    ξi∼U(ξimin⁡,  ξimax⁡)\xi_i \sim \mathcal{U}(\xi_i^{\min},\; \xi_i^{\max})
  3. 上下界的意义下界和上界划定了这条参数的“活动范围”,相当于给厨房换装规定了边界。
    ξimin⁡≤ξi≤ξimax⁡\xi_i^{\min} \le \xi_i \le \xi_i^{\max}

第 3 节 关键参数选择:最该折腾哪几样

给厨房换装,不是每样东西都要天天折腾。换灯泡省事,但把灶台改成电磁炉、把铁锅改成陶罐,对做菜的影响天差地别。对机器人来说,参数也有“敏感”和“不敏感”之分:随便挑几个参数乱随机化,可能既浪费算力又得不到泛化收益。

域随机化中常见的参数分四类。第一类是视觉参数:纹理、光照、颜色、相机视角——它们决定机器人“看到什么”。第二类是物理参数:摩擦系数、物体质量、关节阻尼——它们决定机器人“感觉到什么手感”。第三类是动态参数:电机力矩、传动延迟、控制频率——它们决定机器人“响应有多快”。第四类是感官噪声:传感器读数上的白噪声、信号丢包——它们模拟真实世界的“不靠谱”。

这么多参数,怎么知道该优先随机化哪个?一个实用的思路是算“灵敏度”:把每个参数单独做微扰,观察策略期望回报的变化幅度。变化越剧烈,说明这个参数越值得随机化。用数学表达,就是回报对参数的偏导数绝对值:

小灶的师傅有一个笔记本,上面记着:灯光怎么变,火候照样练得出来;但锅的导热系数一变,时间火候全得重新调。于是他把“锅的材质”列为重点随机化对象,灯光只做轻扰动。选对重点,事半功倍。

Sensi=∣∂Rˉξ(πθ)∂ξi∣\displaystyle \text{Sens}_i = \left| \frac{\partial \bar{R}_{\boldsymbol{\xi}}(\pi_\theta)}{\partial \xi_i} \right|
灵敏度 = 期望回报对第 i 个参数的偏导数绝对值。它衡量“这个参数动一下,策略表现会被吹走多远”,灵敏度高的参数优先进入随机化清单。
  1. 分子期望回报:在大量随机化回合中,策略获得的平均奖励。它代表策略在当前参数设定下的整体水平。
    Rˉξ(πθ)\bar{R}_{\boldsymbol{\xi}}(\pi_\theta)
  2. 偏导数的方向对某一个参数求偏导,忽略其他参数的干扰,专看这个参数单独变化时回报怎么动。
    ∂Rˉξ(πθ)∂ξi\frac{\partial \bar{R}_{\boldsymbol{\xi}}(\pi_\theta)}{\partial \xi_i}
  3. 绝对值与阈值筛选无论参数让回报变好还是变差,只要波动大就值得随机化。取绝对值后按大小排序,选出前几名的参数重点折腾。
    Sensi≫0⇒纳入随机化\text{Sens}_i \gg 0 \Rightarrow \text{纳入随机化}

第 4 节 过度随机化:当厨房不再像厨房

师傅有一天心血来潮,把练习厨房布置成了太空舱:零重力、食材漂在空中、灶台发出刺眼的霓虹光。小灶练了一个月,不但没进步,连最基本的颠锅都忘了——厨房变化得太离谱,做菜的基本功都被淹没了。这就是过度随机化(over-randomization)。

过度随机化有几个典型信号。第一,训练曲线不收敛:随机化力度越大,机器人面对的环境越千奇百怪,策略更新时梯度方向互相打架,loss 高居不下。第二,任务难度失衡:部分随机参数组合把任务变得不可能完成(比如摩擦系数调到 0,机器人一走路就滑倒),策略在无效回合上浪费大量样本。第三,关键特征丢失:随机化的范围大到把任务的关键线索淹没(比如物体纹理和背景融为一体),机器人根本不知道该看哪里。

要从数学上理解这个问题,可以观察期望回报的方差。随机化带来的方差可以分解为“参数导致的方差”和“策略自身随机性导致的方差”。当参数导致的方差过大时,有效训练信号就像被淹没在噪音里:

识别出过度随机化后,正确做法是“回调”:缩小波动最大的参数范围,或者在训练初期关掉某些参数,等策略基础稳定后再逐步放开。就像师傅立刻把厨房从太空舱恢复成普通厨房,让小灶先找回颠锅的手感,再缓慢增加变化。

σR2⏟总方差=Eξ[Var(Rξ)]⏟策略自身波动+Varξ(E[Rξ])⏟随机化引入波动\displaystyle \underbrace{\sigma_R^2}_{\text{总方差}} = \underbrace{\mathbb{E}_{\boldsymbol{\xi}}\big[\text{Var}(R_{\boldsymbol{\xi}})\big]}_{\text{策略自身波动}} + \underbrace{\text{Var}_{\boldsymbol{\xi}}\big(\mathbb{E}[R_{\boldsymbol{\xi}}]\big)}_{\text{随机化引入波动}}
总方差 = 策略自身随机性引起的波动 + 随机化参数引起的波动。当第二项(随机化引入的波动)占据主导时,说明随机化已经过头,把有用的信号淹没了。
  1. 总方差多次训练中期望回报整体的波动程度,是判断训练是否稳定的重要指标。
    σR2\sigma_R^2
  2. 策略自身波动即使环境完全不变,策略的随机采样也会带来回报波动,这是正常底噪。
    Eξ[Var(Rξ)]\mathbb{E}_{\boldsymbol{\xi}}\big[\text{Var}(R_{\boldsymbol{\xi}})\big]
  3. 随机化引入波动不同随机参数组合导致的回报差异。这一项越大,说明环境变化越“喧宾夺主”。
    Varξ(E[Rξ])\text{Var}_{\boldsymbol{\xi}}\big(\mathbb{E}[R_{\boldsymbol{\xi}}]\big)

第 5 节 训练与部署:从练习厨房到真实后厨

完整的域随机化训练流程,很像师傅带小灶出师的安排。第一步是采样参数:每次训练回合开始前,从随机化分布里抽一组厨房配置。第二步是训练策略:在这样配置的仿真厨房里,让小灶试做、试错、调整动作。第三步是仿真对照实验:在完全不随机化的“标准厨房”里考核一次,确认基本功没有丢。最后一步才是实机部署:进入真实后厨正式掌勺。

整个训练过程的数学目标非常直观:我们需要找到一组策略参数,使得“在所有可能的厨房配置下”的平均表现最好。注意,这里的期望是对随机化分布求的——这正是域随机化与普通强化学习的本质区别:

部署环节还有一个容易被忽略的细节:真机部署前,一定要在“标准仿真环境 + 标准考核任务”上做一次对照实验。如果随机化版本连标准仿真环境的表现都不如固定版本,说明随机化可能干扰了基本功;反之,如果两者差不多,而随机化版本在变化环境里更抗打,那就放心上真机。

θ∗=arg⁡max⁡θ  Eξ∼p(ξ)[Rξ(πθ)]\displaystyle \theta^{*} = \arg\max_{\theta} \; \mathbb{E}_{\boldsymbol{\xi} \sim p(\boldsymbol{\xi})}\big[ R_{\boldsymbol{\xi}}(\pi_\theta) \big]
这个公式表示:我们要找一个最优策略参数 θ*,让策略在所有随机化环境配置下的期望回报最大。训练时不是只在一个环境里练,而是在一整个“环境族”里练。
  1. 最优策略参数训练结束后保存下来的那组网络权重或控制参数,对应“出师的小灶”。
    θ∗\theta^{*}
  2. 求最大值arg max 表示我们要调整参数,让后面的目标函数尽量大。
    arg⁡max⁡θ\arg\max_{\theta}
  3. 对随机化分布求期望把所有可能的厨房配置都考虑进来,求平均回报。这是域随机化训练的核心,相当于“各种厨房里表现的平均分”。
    Eξ∼p(ξ)[Rξ(πθ)]\mathbb{E}_{\boldsymbol{\xi} \sim p(\boldsymbol{\xi})}\big[ R_{\boldsymbol{\xi}}(\pi_\theta) \big]

第 6 节 性能评估:怎么知道学徒出师

小灶练习了大半年,师傅怎么知道他能不能出师?只看他“在练习厨房里的颠锅次数”没用——师傅会做三件事:让他做一桌固定菜单、换个全新厨房突击考试、故意把厨房弄乱看他慌不慌。这对应域随机化的三类评估方法。

第一类是泛化指标:比如“在多种未见过的环境配置下任务成功率”的平均值和方差。成功率平均值高说明策略能力强,方差小说明策略稳定。第二类是域差距度量:把同一策略分别放到仿真和真机上评测,计算两者表现之差。差越小,说明仿真环境模拟得越真实,随机化越有效。第三类是鲁棒性分析:系统性地加大随机化强度,画出“成功率-随机化强度”曲线,观察策略在多大的扰动下开始崩溃。

把这三类方法统一起来,可以提炼出一个核心评估量——泛化差距,即策略在真实环境中的平均表现与它在仿真环境中的平均表现之差:

师傅最终让小灶出师的标准很简单:在完全陌生的厨房里,做同一道菜的合格率超过九成。对机器人团队来说,真机评测就是那道最终的考卷——仿真里的漂亮曲线再好看,也比不上真实世界里一次稳稳的抓取。

Egen=∣Rˉreal(πθ)−Rˉsim(πθ)∣\displaystyle \mathcal{E}_{\text{gen}} = \left| \bar{R}_{\text{real}}(\pi_\theta) - \bar{R}_{\text{sim}}(\pi_\theta) \right|
泛化差距 = 真实平均回报 − 仿真平均回报 的绝对值。它越小,说明策略从仿真迁移到真实世界的“损耗”越小,鲁棒性越好。
  1. 真实环境平均回报把策略部署到真机上跑若干回合,取平均奖励。成本高,但最有说服力。
    Rˉreal(πθ)\bar{R}_{\text{real}}(\pi_\theta)
  2. 仿真环境平均回报在仿真里跑同样多的回合,取平均奖励。这个值容易获得,但可能有水分。
    Rˉsim(πθ)\bar{R}_{\text{sim}}(\pi_\theta)
  3. 绝对值的意义无论真实表现比仿真高还是低,只要差得远就说明评估体系有问题,所以取绝对值。
    Egen≈0⇒迁移良好\mathcal{E}_{\text{gen}} \approx 0 \Rightarrow \text{迁移良好}

第 7 节 工程实践:稳定复现的秘密

带小灶练了一年,师傅总结出三条后厨管理经验:一是练习计划要有节奏,二是记录每一道菜的参数配方,三是每隔一段时间就复盘调整。域随机化的工程实践也是如此,最关键的技巧是随机化调度——不让随机化范围一步到位,而是像“课程”一样逐步展开。

具体做法是:训练初期用小范围随机化(甚至先用固定环境),让策略学到基本功;随着训练推进,按固定节奏逐步扩大随机化范围,直到达到预设的最大值。这个过程可以用一个简单的线性扩展公式描述:

除了调度,工程上还要注意三点:资源管理——并行运行多个随机化仿真环境会大幅提升采样效率,但要小心 CPU/GPU 负载;日志调试——把每次采样到的参数值连同训练指标一起记录下来,方便复现“神奇回合”;迭代优化——每次真机实验后,把真实测量到的参数范围反馈到仿真里,让随机化分布越来越贴近现实。

Rt=R0+(Rmax⁡−R0)⋅min⁡ ⁣(1,  tTwarmup)\displaystyle \mathcal{R}_t = \mathcal{R}_0 + \left(\mathcal{R}_{\max} - \mathcal{R}_0\right) \cdot \min\!\left(1,\; \frac{t}{T_{\text{warmup}}}\right)
它表示在第 t 个训练步时,随机化范围从初始值 R₀ 开始,随着步数线性增大,到热身期 T 结束时达到最大值 R_max,之后保持不变。这保证训练先易后难,策略稳扎稳打。
  1. 当前随机化范围第 t 步训练时,各参数实际使用的随机化范围大小。
    Rt\mathcal{R}_t
  2. 线性插值系数min 函数保证比例不超过 1,当训练步数超过热身期后,范围不再增长。
    min⁡ ⁣(1,  tTwarmup)\min\!\left(1,\; \frac{t}{T_{\text{warmup}}}\right)
  3. 范围扩展路径从初始范围出发,向最大范围均匀推进。这个公式是“课程式随机化”的标准实现。
    R0+(Rmax⁡−R0)⋅(⋯ )\mathcal{R}_0 + \left(\mathcal{R}_{\max} - \mathcal{R}_0\right) \cdot (\cdots)

AI 应用场景

场景一:机械臂抓取与分拣

阶段:仿真训练与 sim-to-real 迁移

解决的问题:在仿真里训练的抓取策略,直接部署到真实机械臂上时,常因物体纹理、光照、摩擦与仿真不符而抓空。传统方式是人工调参让仿真贴近真实,费时费力。域随机化让仿真里出现“千奇百怪”的物体外观与物理属性,策略学会抓住物体本质特征,真机抓取成功率显著提升。

具体案例:某物流仓库的机械臂分拣系统,在仿真中对货物的颜色、尺寸、表面摩擦系数、传送带速度做随机化扰动,训练 5 万回合后部署到实机。真实场景中货物外形千差万别,该策略的抓取成功率从固定环境训练的 61% 提升到 93%,且对从未见过的新包装也能稳定抓取。

场景二:自动驾驶感知与决策

阶段:感知模型训练与泛化评估

解决的问题:自动驾驶感知模型大量依赖仿真生成的训练数据,但仿真画面与真实街景存在明显“视觉域差距”。域随机化对天气、光照、路面纹理、相机曝光参数进行随机扰动,让模型不再依赖某一种特定画风,从而在真实行车视频上保持稳定检测。

具体案例:某自动驾驶团队在仿真环境中随机化路面材质(柏油/水泥/湿滑)、时间段光照(黄昏/正午/夜间)和相机镜头畸变,训练目标检测模型。在真实测试集上的 mAP 从 0.68 提升到 0.81,夜间和雨天场景的提升尤为明显。

Python 演示

python69 行
# -*- coding: utf-8 -*-"""域随机化迷你演示:网格世界Q-learning,对比固定环境与随机化环境训练"""import randomimport numpy as np GRID = 5GOAL = (4, 4)WALL_NUM = 3 def make_env(randomize=False):    """生成环境。randomize=True 时每次重新随机摆放墙的位置(模拟域随机化)"""    if not randomize:        return {(1, 1), (2, 3), (3, 1)}    walls = set()    while len(walls) < WALL_NUM:        w = (random.randint(0, GRID - 1), random.randint(0, GRID - 1))        if w != (0, 0) and w != GOAL and w not in walls:            walls.add(w)    return walls def step(state, action, walls):    """执行一步动作,返回新状态、奖励、是否结束"""    dr, dc = [(-1, 0), (1, 0), (0, -1), (0, 1)][action]    r, c = state    ns = (min(max(r + dr, 0), GRID - 1), min(max(c + dc, 0), GRID - 1))    if ns in walls:        ns = state    reward = 1.0 if ns == GOAL else -0.01    return ns, reward, ns == GOAL def train(randomize, episodes=1000):    """Q-learning 训练。randomize 控制是否启用域随机化"""    q = np.zeros((GRID, GRID, 4))    lr, gamma, eps = 0.1, 0.95, 0.4    for ep in range(episodes):        walls = make_env(randomize)          # 核心:每回合重新采样环境        state, done = (0, 0), False        while not done:            r, c = state            if random.random() < eps:                a = random.randint(0, 3)            else:                a = int(np.argmax(q[r, c]))            ns, rew, done = step(state, a, walls)            nr, nc = ns            q[r, c, a] += lr * (rew + gamma * float(np.max(q[nr, nc])) - q[r, c, a])            state = ns        eps = max(0.05, eps * 0.995)    return q def evaluate(q, rounds=200):    """在固定真实环境中测试成功率"""    ok = 0    walls = make_env(randomize=False)    for _ in range(rounds):        state = (0, 0)        for _ in range(200):            r, c = state            state, rew, done = step(state, int(np.argmax(q[r, c])), walls)            if done:                ok += 1                break    return ok / rounds if __name__ == "__main__":    q_fixed = train(randomize=False)    q_rand = train(randomize=True)    print("固定环境训练  成功率: %.1f%%" % (100 * evaluate(q_fixed)))    print("域随机化训练  成功率: %.1f%%" % (100 * evaluate(q_rand)))
目的:在一个 5×5 网格世界中,用 Q-learning 训练 agent 从起点走到终点。对比“固定环境训练”和“域随机化训练”(每回合随机摆放墙的位置),观察二者在固定真实环境中的成功率差异。
  1. walls = make_env(randomize)每回合重新采样环境参数(墙的位置),这正是域随机化在代码层面的落点。
  2. if random.random() < eps: a = random.randint(0, 3)用 epsilon-greedy 策略平衡探索与利用,前期多探索。
  3. q[r, c, a] += lr * (rew + gamma * float(np.max(q[nr, nc])) - q[r, c, a])Q-learning 的核心更新式:用当前奖励加上未来最大 Q 值去逼近真实价值。
  4. walls = make_env(randomize=False)评估时使用固定的真实环境,模拟“真机部署”后的考核。

常见误区

误区仿真环境是免费的,随机化范围开得越大,见过的环境越多,泛化能力一定越强,所以直接把所有参数拉到极限。

正解过度随机化会让任务变得无法学习,训练信号被大量无效回合淹没,策略可能根本学不会,或者学到的全是“和稀泥”的保守行为。正确的做法是采用课程式随机化:从较小的范围起步,逐步扩大,找到“最难但还能学会”的临界窗口。就像让学徒先在普通厨房练颠锅,再逐步把厨房变乱,而不是第一天就扔进太空舱。

为何常见:人们容易把随机化强度等同于泛化能力,忽视了“可学习性”的约束。新闻里夸张的“随机化奇迹”更强化了这个误解。

误区既然要做域随机化,就把能想到的参数全列进清单——颜色、纹理、重力、温度、湿度、时间步长,全都随机化,越多越稳。

正解随机化不敏感的参数只会浪费算力和样本,甚至引入无意义的噪声干扰训练。正确做法是先做灵敏度分析,用“回报对参数偏导数的绝对值”筛选出真正影响任务成败的关键参数,再有针对性地随机化。随机化“对的参数”比随机化“多的参数”重要得多。

为何常见:因为域随机化的思想听起来就是“多样性”,初学者容易把“多样性”误当成“全面性”,忽略了信号与噪声的区分。

误区仿真测试成功率已经 95% 了,直接部署到真实机器人上应该也能跑得不错,真机测试太贵,省了吧。

正解仿真表现和真实表现之间永远存在域差距。仿真里 95% 的成功率,可能因为视觉渲染太理想、物理引擎太干净,到真机直接掉到 30%。必须用“真实环境评测 + 泛化差距度量”双重验证:算一下真实回报与仿真回报的差值,并做鲁棒性分析,看策略在随机化强度逐渐加大时何时崩溃。

为何常见:仿真数据零成本、随时可复现,真机实验昂贵且随机,人会自然倾向于只相信眼前漂亮的仿真曲线。

误区训练开始前把随机化范围设好,然后整个训练过程完全不动,认为这样才是公平对照实验。

正解固定范围的随机化常常导致训练前期太难、后期又不够丰富。工程上普遍采用随机化调度(课程式随机化):范围随训练进度线性扩展,先窄后宽;训练中期还可以根据实时训练曲线动态回调范围,实现自适应调整。这样既保证了基本功,又逐步逼近真实世界的多样性。

为何常见:把参数看成静态配置而非动态策略,是传统工程思维在强化学习项目中的惯性残留。

误区域随机化能凭空让策略泛化到真实世界,所以完全不需要采集真实数据,仿真训练搞定一切。

正解域随机化能显著缩小域差距,但无法消除它。真实世界总有一些仿真永远模拟不准的“长尾细节”,比如线缆的柔性变形、极端光照下的眩光。成熟的工程实践是“域随机化 + 少量真实数据微调”:先用随机化训练出一个基础策略,再采集少量真实数据做微调或适配,两者结合才是最优解。

为何常见:域随机化的宣传效果过于“神奇”,让人忽略了它本质上仍是“基于仿真分布的拟合”,而仿真分布永远只是真实分布的一个近似。

面试题

Q1. 域随机化的核心目标是什么?

单选题 · easy

  • A.让仿真环境更逼真
  • B.提升策略在真实环境的泛化能力← 正确答案
  • C.减少神经网络参数量
  • D.加快仿真渲染速度

答案:B。域随机化的目标是通过让仿真环境变得多样,缩小仿真与真实的域差距,从而提升策略迁移到真实环境后的表现。让仿真更逼真是另一种路线;减少参数、加快渲染都与域随机化目标无关。就像让学徒在多变厨房练习是为了真后厨掌勺,而不是把练习厨房装修得更豪华。

Q2. 仿真环境与真实环境的性能差距通常被称为什么?

单选题 · easy

  • A.泛化误差
  • B.梯度消失
  • C.域差距← 正确答案
  • D.过拟合

答案:C。仿真与真实之间因视觉、物理、动态参数不一致导致的表现差异称为域差距(domain gap),对应公式中 J_sim 与 J_real 的差。泛化误差是机器学习通用概念,梯度消失是训练问题,过拟合是模型拟合训练集过深的问题,均与本概念不直接对应。

Q3. 在网格世界例子中,每回合重新随机摆放墙的位置属于什么操作?

单选题 · easy

  • A.数据增强
  • B.超参数调优
  • C.域随机化中的环境参数采样← 正确答案
  • D.模型正则化

答案:C。每回合重新摆放墙的位置,本质上是改变仿真环境的布局参数,让 agent 见过多种环境变体,这正是域随机化的核心操作——从随机化分布中采样一组环境配置。数据增强作用于训练样本,正则化作用于模型权重,超参数调优针对学习率等,均不匹配。

Q4. 随机化范围设定中,“课程式随机化”指的是什么?

单选题 · mid

  • A.把所有参数一次性随机到最大范围
  • B.只随机化视觉参数不随机化物理参数
  • C.训练过程中随机化范围由窄到宽逐步扩展← 正确答案
  • D.每轮训练随机切换不同算法

答案:C。课程式随机化模仿人类学习“先易后难”的节奏,训练初期用小范围随机化让策略掌握基本功,随着训练推进逐步扩大范围到预设最大值。一次性拉满容易导致训练不收敛;只随机化视觉参数是参数选择问题;切换算法与课程式无关。

Q5. 如何判断一个随机化参数的“灵敏度”高低?

单选题 · mid

  • A.看参数数值的大小
  • B.看期望回报对该参数的偏导数绝对值← 正确答案
  • C.看参数在代码中出现的次数
  • D.看参数是否容易设置默认值

答案:B。灵敏度度量的是“这个参数动一下,策略回报会被影响多少”,即期望回报对参数的偏导数绝对值。参数数值大小、代码出现次数与它对任务成败的影响无关。灵敏度高的参数才值得优先纳入随机化清单,就像颠锅比灯光颜色更影响做菜成败。

Q6. 过度随机化的典型信号不包括以下哪项?

单选题 · mid

  • A.训练曲线长时间不收敛
  • B.随机化引入的回报方差占比过大
  • C.策略在未随机化的标准环境下表现正常← 正确答案
  • D.关键任务特征被随机化参数淹没

答案:C。过度随机化时,训练不收敛、方差膨胀、关键特征丢失都会出现。而“策略在标准环境下表现正常”恰恰说明随机化还处于健康状态——基本功没有被破坏。如果连标准环境表现都退化,说明随机化已经严重过头。这道题要选的是“不属于”过度随机化信号的选项。

Q7. 在域随机化中,ξ 通常表示什么?

单选题 · easy

  • A.神经网络的权重
  • B.环境随机化参数向量← 正确答案
  • C.学习率
  • D.奖励折扣因子

答案:B。ξ 表示从随机化分布中采样的环境参数向量,可以是光照、摩擦、质量等参数的组合。网络权重是 θ,学习率和折扣因子分别是学习算法超参数。类比来说,ξ 就是“这一回合厨房怎么布置”的配方单。

Q8. 域随机化中常见的参数类别包括哪些?

多选题 · mid

  • A.视觉参数(纹理、光照)← 正确答案
  • B.物理参数(摩擦、质量)← 正确答案
  • C.动态参数(力矩、延迟)← 正确答案
  • D.编译器优化选项

答案:ABC。域随机化关注影响任务执行的感知与控制参数:视觉参数决定机器人看到什么,物理参数决定手感,动态参数决定响应。编译器优化选项不影响仿真环境的物理或视觉特性,不属于域随机化的参数类别,选了就错。

Q9. 以下哪些做法能有效评估域随机化策略的泛化性?

多选题 · hard

  • A.在多种未见过的环境配置下测成功率← 正确答案
  • B.度量真实与仿真的域差距← 正确答案
  • C.在真实机器人上做实测← 正确答案
  • D.只观察训练 loss 是否下降

答案:ABC。泛化评估必须覆盖三个层面:多环境配置下的表现、仿真与真实的域差距、真实机器人实测。训练 loss 下降只能说明模型在仿真里拟合得好,不能证明泛化能力。这就像考察厨师是否出师,要让他做陌生菜单、在陌生厨房表现,而不是只看他在练习厨房里练的次数。

Q10. 以下哪些策略有助于避免过度随机化?

多选题 · extreme

  • A.使用课程式随机化逐步扩大范围← 正确答案
  • B.按灵敏度筛选关键参数← 正确答案
  • C.监控回报方差,超标即回调范围← 正确答案
  • D.把所有参数范围设为物理极限

答案:ABC。避免过度随机化的核心是“可控与平衡”:课程式让范围渐进式扩大;灵敏度筛选保证只随机化对任务真正重要的参数;方差监控能实时发现随机化噪声淹没训练信号的苗头。把参数设为物理极限恰恰是过度随机化的来源之一,不选 D。