想象你是一位驾校教练。过去教车,学员只在一块平整的场地上、一个固定的好天气里练车。学员倒车入库练得滚瓜烂熟,可一上真实马路——刮风下雨、路面湿滑、车灯刺眼——就手足无措,连直线都开不稳。问题出在哪儿?训练场地和真实道路差得太远了。 强化学习训练机器人,会遭遇一模一样的困境:我们在仿真器里“练车”,希望机器人毕业后能开真实世界的“真车”。可仿真器里的物体质量、摩擦系数、光照纹理,和现实总有偏差——这个偏差,就是著名的“仿真到现实的鸿沟”(sim-to-real gap)。 Domain Randomization(域随机化)给出的答案很朴素:既然学员怕变化,那就让他在训练时把变化见个够。把仿真器的物理参数、视觉外观、环境布局每局随机变一变,学员在千变万化的“训练场”里学会不依赖任何特定条件去开车。毕业那天,无论真实世界把他抛进哪种路况,他都能稳稳接住。
学会域随机化,你就掌握了用低成本仿真数据训练出可零样本部署到真机的强化学习策略的能力,这是机器人领域最具落地价值的 sim-to-real 工程手段之一。
目录
可视化演示
展示仿真环境物理与视觉随机化、策略泛化迁移效果及渐进式随机化维度调度训练过程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
模式1:仿真环境随机化 物理参数随机:摩擦/质量/阻尼 视觉随机:光照/纹理/颜色 p_sim ≠ p_real → policy robust 多维随机化弥合仿真与真实差距。
核心原理:仿真与现实之间的鸿沟
想象驾校只有一辆车、一块场地、一种天气。学员每天重复同一套动作,练出来的不是“会开车”,而是“只会开这辆车、这条道、这种天”。机器人也一样——如果只在同一个仿真环境里训练,策略会把环境的所有细节(哪怕是不该记住的细节)当成理所当然:物体的质量是多少、光照从哪来、背景什么颜色,全被模型“背”了下来。一旦真机环境稍有不同,行为立即崩溃。
学科里把仿真与现实的差异称为 sim-to-real gap(仿真到现实鸿沟)。它不只是“画面像不像”的问题:仿真器中物体的质量、接触面的摩擦、相机的曝光、背景的纹理,每一个数值都可能和现实对不上。策略越是依赖这些具体数值,迁移时摔得越惨。域随机化的做法是:把仿真器看作一个参数可调的“驾校”,每个训练回合都从一组环境参数的分布 Ξ 中重新抽样,再让策略在这个“新驾校”里跑一遍。最终目标不再是“在某个固定环境里表现最好”,而是“在所有可能环境里的平均表现最好”。数学上,我们最大化:
就像驾校把场地、天气、车况全部随机化,学员练的不是“某条路怎么开”,而是“无论路怎么变都知道怎么开”。这正是随机化带来的策略泛化能力——把“背题”变成“会解题”,让策略可以零样本迁移到真实世界。
- 环境分布抽样训练开始时先从环境参数分布中抽取一组仿真参数,本回合就在这个“随机化驾校”里练车。
- 策略与环境互动在参数为 ξ 的环境里,策略输出动作并收集一整条状态-动作轨迹。
- 折扣累计回报把这一局每个时刻的即时奖励按折扣因子 γ 累加,越早的奖励越重要。
- 双重期望先对轨迹求期望(衡量单局好坏),再对所有随机环境求期望(衡量全局稳健性)。
- 最大化目标寻找使平均回报最大的策略参数 θ,这就是“在千变万化的驾校里毕业”的数学表达。
随机化维度:训练场上要变哪些条件
教练要改造驾校,第一个问题来了:到底随机哪些东西?总不能把太阳都随机掉。现实世界会变化的条件才值得随机,仿真环境里同样如此。可随机化的参数大致分成四类:物理参数(质量、摩擦系数、重力加速度)、视觉外观(纹理、光照、颜色、相机噪声)、动力学模型(执行器延迟、力矩限制、关节阻尼)、布局光照(物体初始位置、目标位姿、灯光明暗)。
为什么要分这么多维度?因为策略可能依赖其中任何一个。机械臂抓取时,如果物体颜色是固定的红色,策略可能偷偷学会“看到红色就抓”,而不是学会“看到物体就抓”。训练时把颜色随机化,等于逼着策略关注真正重要的特征——物体形状和位姿,而不是颜色这种表面线索。
实践中,每个维度 k 分别设定自己的随机范围,并在每个训练回合独立抽样。最常用的是均匀分布:
选维度的黄金法则是:只随机化“现实里确实会变、且策略可能依赖”的参数。就像驾校会变化天气、路面和车况,但不会去随机化座椅颜色——因为座椅颜色不影响开车,随机化它只会让学员分心。
- 参数编号把物理、视觉、动力学、布局等所有可随机化的参数排成序列,第 k 个参数记为 ξ_k。
- 区间定义每个参数设定自己的下限 a_k 和上限 b_k,例如机械臂连杆质量的取值范围。
- 独立抽样每个回合开始前,各维度分别从自己的区间中采样一次,互不干扰。
分布与范围:变化多少才合适
随机范围太小,等于只练了晴天,学员没见过雨雪;随机范围太大,练车场直接变成越野拉力赛道,学员连油门刹车都控制不了,更别提学会开车。范围的选择,是域随机化最核心的艺术。
首要原则是覆盖现实区间:真实世界参数的值(比如机械臂连杆的真实质量)必须落在随机区间内部。如果真实值在区间之外,策略在训练时从没见过这个取值,迁移必然会失败。就像教练布置的训练场地从来没下过雨,学员毕业后遇到雨天自然会慌。
当我们同时随机化 K 个参数,且各维度独立采样时,环境参数 ξ 的联合概率密度就是各维度密度的乘积:
范围不是越大越好。假设重力被随机到让机械臂根本抬不起来,任何策略都学不到可用技能。实践中的做法是:先给参数一个“略宽于现实”的区间,再根据训练效果微调。就像教练先打听清楚学员毕业后多半在什么路况开车,再有针对性地安排训练——变化要够多,但不能多到练不了车。
- 单维均匀密度在区间 [a_k, b_k] 内均匀分布的概率密度是区间长度的倒数。
- 联合分布乘积独立采样时,整组参数的联合概率密度等于所有维度密度的乘积,维度越多分布越“稀疏”。
- 覆盖约束真实世界的参数值必须落在随机区间内,这是零样本迁移成功的必要条件。
渐进式调度:从易到难的随机化课程
顶级驾校不会让学员第一天就上冰雪路面。课程表总是从晴天起步,学员熟练了再加难度,这就是课程学习(curriculum learning)的思想。域随机化同样需要这样的“课程表”——如果一开始就全面随机化,任务难度陡增,策略很可能什么都学不会。
手动设计课程很费力,于是研究者提出了自动域随机化(Automatic Domain Randomization,ADR)。ADR 不直接规定随机范围,而是把范围边界当成一个“自动调节的教练”:每隔一段时间,用当前策略在现有的随机分布上跑一批回合,统计成功率。成功率太高说明任务太简单,就把随机边界向外扩;成功率太低说明任务太难,就把边界收回来。数学上,边界 φ_k 的更新规则是:
ADR 的价值在于把“该练多难”这个超参数问题,变成了一个自动闭环:教练不再拍脑袋定课程,而是看学员表现动态调整。课程式训练由易到难、ADR 随能力自动加码,两者结合,让机器人在日渐复杂的随机化环境中稳步成长,最终毕业时面对任何真实路况都能从容应对。
- 成功率评估用当前策略在现有随机分布上评测,得到成功率 P_succ,这是教练“观察学员”的过程。
- 扩张触发当成功率高于预设上限 p_high,说明环境对策略来说太容易,边界向外扩张,增加难度。
- 收缩触发当成功率低于预设下限 p_low,说明环境太难,边界向内收缩,降低难度。
- 步长控制每次调整幅度 δ 很小,保证边界平滑变化,避免随机范围剧烈震荡。
组合域适应:稳健与对齐双管齐下
多练不同路况的学员已经很出色,但如果教练还能教他“看路标识别当前路况、再调整开法”,那就更稳了。域适应(Domain Adaptation,DA)做的正是这件“读路标”的事:它通过让仿真和真实图像的特征分布对齐,让模型学会“看懂现实到底长什么样”。
域随机化和域适应是两种互补的思路。域随机化让策略对参数不敏感——相当于“怎么颠簸都不会翻车”;域适应让仿真与真实的视觉特征对齐——相当于“能看懂现实世界的信息”。一个管“稳”,一个管“懂”,两者结合往往效果最佳。
实践中,我们会把两个目标放进同一个损失函数:任务损失负责把任务做好,域损失负责拉近仿真与真实的特征分布,λ 控制两者的平衡:
典型的混合训练流程是:先用域适应让仿真图像的风格对齐真实相机拍摄的风格,再在这个“风格已对齐”的仿真器上做域随机化。这样一个负责“看得懂”,一个负责“扛得住”,零样本迁移的成功率和稳定性都会显著提升。
- 任务损失策略在目标任务(如抓取成功、飞行不坠毁)上的主损失,是强化学习优化的核心目标。
- 域损失通过对抗或度量学习,让仿真和真实场景的特征分布尽量对齐。
- 权重系数λ 调节域损失的强度,λ 越大,模型越重视“仿真与真实的对齐”。
应用与局限:毕业学员的真实成绩
学员毕业了。最著名的“毕业生”是 OpenAI 的 Dactyl 机械手——它只在仿真器里接受域随机化训练(随机化物体表面摩擦、重量、相机视角等参数),零样本部署到真机,就学会了翻转魔方。类似的还有无人机在仿真里随机化风阻、光照和场地纹理后,直接穿越真实森林;移动机器人随机化地面摩擦和障碍物布局后,在办公室自由导航。
这些应用有一个共同特点:训练阶段穷尽一切能随机化的参数,部署阶段不做任何真机微调,直接 zero-shot 上线。迁移效果好不好,用一个简单指标衡量:
但域随机化不是银弹。它有两个明显的局限:一是训练成本——随机化范围越大、维度越多,需要采样的环境组合呈指数增长,训练时间成倍上升;二是仿真精度依赖——仿真器本身的建模误差(如接触形变、流体阻力)是参数随机化无法覆盖的,策略在“错的物理定律”里再鲁棒,迁移到现实依然会错。所以业界常说:域随机化是弥合仿真与现实差距的利器,但前提是你的仿真器“底子”不能太离谱——就像驾校的车可以旧,但刹车必须是真的。
- 试验次数在真实机器人上重复部署 N 次,每次任务配置略有差异。
- 成功指示函数第 n 次试验成功则计 1,失败则计 0。
- 平均成功率成功次数除以总次数,得到零样本迁移成功率。
AI 应用场景
机械臂灵巧抓取
阶段:仿真训练与 sim-to-real 零样本部署
解决的问题:真实机械臂试错成本极高——抓空一次可能损坏工件甚至伤人,传统方法需要在真机上做大量标注和微调。域随机化让机械臂在仿真里随机化物体位姿、表面摩擦、光照和相机参数,练出“无论物体怎么摆都能抓”的鲁棒策略,然后零样本部署到真机。
具体案例:OpenAI 的 Dactyl 机械手在仿真器里随机化魔方的摩擦系数、物体重量、相机视角等参数,训练出相当于“人类手部几十年的练习量”,零样本部署后成功完成单手翻转魔方,成为域随机化最经典的里程碑案例。
无人机高速穿越飞行
阶段:端到端视觉策略训练与真机部署
解决的问题:无人机试飞坠毁成本高、风险大,且真实飞行场地难以大规模采集数据。在仿真中随机化风阻、光照强度、树叶纹理密度和相机曝光参数,让视觉策略学会在千变万化的场景中飞得稳,直接迁移到真实森林完成高速穿越。
具体案例:苏黎世联邦理工学院(ETH Zurich)的无人机项目,在仿真器中随机化环境纹理、光照方向、空气动力学参数,训练出的策略无需任何真机数据即可在真实森林中完成高速避障穿越,飞行速度接近专业人类飞手。
移动机器人导航与操作
阶段:策略泛化训练与多场景部署
解决的问题:移动机器人部署场景多样,地面摩擦、障碍物布局、传感器噪声各不相同。域随机化让导航策略在仿真中见过足够多的“路况组合”,从而在办公室、仓库、走廊等不同真实场景间自由迁移,减少逐场地调试成本。
具体案例:仓库物流机器人通过在仿真中随机化地面摩擦系数、货架位置和传感器噪声,训练出的导航策略能够零样本适应不同仓库布局,只需一次部署即可在不同库区之间切换工作。
Python 演示
"""域随机化演示:在随机化的仿真环境里训练一个单关节机械臂策略,对比"固定仿真环境训练"与"域随机化训练"迁移到真实环境的成功率。"""import mathimport random class ArmEnv(object): """单关节机械臂:状态为角度 angle 与角速度 vel,动作为力矩 u。""" def __init__(self, goal, gravity=9.8, friction=0.1, dt=0.05): self.goal = goal self.gravity = gravity self.friction = friction self.dt = dt self.angle = 0.0 self.vel = 0.0 def reset(self, angle=0.0): self.angle = angle self.vel = 0.0 return self.angle def step(self, u): acc = u - self.gravity * math.sin(self.angle) - self.friction * self.vel self.vel += acc * self.dt self.angle += self.vel * self.dt err = abs(self.angle - self.goal) done = err < 0.08 return self.angle, self.vel, -err, done def roll_out(policy, env, max_steps=200): """用线性策略 u = k1 * (goal - angle) - k2 * vel 跑一个回合。""" k1, k2 = policy env.reset(angle=random.uniform(-0.3, 0.3)) total = 0.0 for _ in range(max_steps): u = k1 * (env.goal - env.angle) - k2 * env.vel _, _, r, done = env.step(u) total += r if done: break return total def train(env_factory, rounds=40, trials=12): """爬山随机搜索:每轮扰动策略参数,用多个随机环境评估平均回报。""" best = [2.5, 1.0] best_score = float('-inf') for _ in range(rounds): cand = [ best[0] + random.uniform(-0.8, 0.8), best[1] + random.uniform(-0.6, 0.6), ] score = sum(roll_out(cand, env_factory()) for __ in range(trials)) / trials if score > best_score: best, best_score = cand, score return best def main(): random.seed(7) real = lambda: ArmEnv(goal=1.0, gravity=9.8, friction=0.1) sim_fixed = lambda: ArmEnv(goal=0.8, gravity=9.8, friction=0.1) sim_dr = lambda: ArmEnv( goal=random.uniform(-1.5, 1.5), gravity=random.uniform(5.0, 15.0), friction=random.uniform(0.0, 0.5), ) fixed_policy = train(sim_fixed) dr_policy = train(sim_dr) print('固定仿真参数策略: k1=%.2f, k2=%.2f' % (fixed_policy[0], fixed_policy[1])) print('域随机化策略 : k1=%.2f, k2=%.2f' % (dr_policy[0], dr_policy[1])) for name, policy in [('固定仿真参数', fixed_policy), ('域随机化', dr_policy)]: scores = [roll_out(policy, real()) for _ in range(30)] ok = sum(1 for s in scores if s > -15.0) print('%s -> 真实环境成功率 %d/30, 平均回报 %.2f' % (name, ok, sum(scores) / len(scores))) if __name__ == '__main__': main()
acc = u - self.gravity * math.sin(self.angle) - self.friction * self.vel简化机械臂动力学,重力项和摩擦项正是代码中可随机化的物理参数,模拟“仿真驾校里重力可变、路面摩擦可变”。env.reset(angle=random.uniform(-0.3, 0.3))初始角度每次随机,策略不能依赖固定起点,对应布局随机化。u = k1 * (env.goal - env.angle) - k2 * env.vel线性策略,就是一个学出来的“PD 控制器”,k1 决定纠偏力度,k2 决定阻尼大小。score = sum(roll_out(cand, env_factory()) for __ in range(trials)) / trials在多个随机环境里各跑一局,取平均回报作为评估指标,对应“在所有驾校的平均表现”。sim_dr = lambda: ArmEnv(goal=random.uniform(-1.5, 1.5),域随机化环境工厂:目标角度、重力、摩擦全部随机,让策略见多识广。real = lambda: ArmEnv(goal=1.0, gravity=9.8, friction=0.1)“真实环境”参数固定,仿真默认参数与它刻意存在偏差,模拟 sim-to-real gap。ok = sum(1 for s in scores if s > -15.0)用平均回报阈值统计真实环境成功率,衡量零样本迁移效果。
常见误区
误区既然目标是让策略不依赖环境参数,那随机范围直接拉满不就行了?重力随机到 1 到 100,摩擦随机到 0 到 1,策略总能在某个值上表现好吧?
正解随机范围过大会让任务本身变得几乎不可解。比如重力被随机到极大值时,机械臂根本抬不起来,任何策略都无法完成任务,训练只会浪费算力。正确的做法是“覆盖现实区间即可”——真实世界参数落在区间内,同时任务在所有采样值上仍然可解。就像驾校会增加雨天训练,但不会把练车场变成泥石流。
为何常见:人们容易把“变化多”等同于“泛化强”,忽略了任务可解性这个前提——范围再大,学不会就等于零。
误区训练时随机化效果好,那部署时也在真实环境里随机化各种参数,岂不是更保险?给机器人随机加负载、随机改目标位置,测试结果才可靠。
正解真实世界的参数是客观存在的,部署时无法“随机化”——物体质量是多少就是多少,你不能像仿真器一样凭空改变它。域随机化只是训练阶段的技巧,目的是让策略在“某个真实固定值”上也表现好。测试时加随机化属于“鲁棒性评测”,它验证的是策略抗干扰能力,和域随机化本身是两个概念。
为何常见:把训练分布与测试分布混为一谈,误以为随机化可以贯穿训练和部署全程。
误区只要随机化做得足够全面,覆盖了所有参数,仿真和现实就没有区别了,策略可以放心迁移。
正解仿真器本身是物理模型的近似,存在随机化无法覆盖的系统性误差,比如接触形变、流体湍流、传感器非线性。假如仿真器的接触模型本身就是错的,随机化只会让你在“错误的物理定律”里练得越来越熟练。域随机化弥合的是“参数不确定”的差距,弥合不了“模型错误”的差距——后者需要更精确的仿真器或域适应、真机微调来补救。
为何常见:把参数不确定性当成了仿真与现实差距的唯一来源,忽略了建模误差这一更根本的问题。
误区既然随机化效果好,那就把仿真器里能调的参数全部打开随机化,调用参数越多越全面,策略越不可能过拟合。
正解只应随机化“现实里确实会变、且策略能观测到其影响”的参数。如果随机化一个策略根本观察不到的参数,只会白白增加学习难度而没有任何收益;如果随机化一个现实里恒定不变的参数,等于把学员训练成适应一个根本不存在的世界。选择随机化维度要基于对真实任务的物理分析,而不是盲目堆数量。
为何常见:忽略了“可观测性”与“任务相关性”——随机化的目的不是让环境丰富,而是让策略学会忽略无关细节、抓住稳定规律。
面试题
Q1. Domain Randomization 的核心思想是什么?
- A.在训练时随机化环境参数← 正确答案
- B.提高仿真器渲染的分辨率
- C.增加真实世界的测试次数
- D.用真实数据替换仿真数据
答案:A。域随机化正是通过在训练阶段随机化环境参数(如质量、摩擦、光照),让策略见多识广、不依赖特定参数值。B 是渲染优化,C 是测试策略,D 是用真机数据微调,它们都不是域随机化的核心思想。
Q2. 以下哪一项属于物理参数随机化?
- A.改变光照角度和阴影效果
- B.改变物体的表面纹理图案
- C.改变物体的质量摩擦系数← 正确答案
- D.改变相机的位置与视角
答案:C。质量与摩擦系数属于物理参数,直接影响动力学仿真。光照、纹理属于视觉外观维度;相机位置属于布局维度。就像驾校里“换轮胎摩擦力和载重”是物理层面的变化,而“开灯或关灯”是视觉层面的变化。
Q3. 域随机化能提升策略迁移能力的原因有哪些?
- A.策略不再依赖精确的仿真参数← 正确答案
- B.策略见过更多样的状态分布← 正确答案
- C.仿真引擎的计算精度得到提升
- D.策略学会适应参数的不确定性← 正确答案
答案:ABD。域随机化让策略在参数扰动下学会稳健行为(A 对),广泛采样的环境带来了更丰富的状态分布(B 对),策略被迫适应参数不确定性(D 对)。C 错在把训练技巧当成了仿真引擎的改进——域随机化不改变引擎精度。
Q4. "sim-to-real gap" 指的是什么?
- A.仿真场景与真实场景的差别← 正确答案
- B.机器人硬件成本上的差距
- C.训练时间与部署时间的差异
- D.算法理论与代码实现的差距
答案:A。sim-to-real gap 即“仿真到现实的鸿沟”,指仿真环境与真实环境之间在物理、视觉、动力学等方面的系统性差异,正是域随机化试图弥合的对象。其他选项描述的差距与这一概念无关。
Q5. 在自动域随机化(ADR)中,随机边界扩张的触发条件是什么?
- A.当前策略成功率高于设定阈值← 正确答案
- B.训练步数超过预设的上限值
- C.仿真器的渲染速度达标要求
- D.目标函数值下降到较低水平
答案:A。ADR 的规则是“表现好就加难度”:当策略在现有随机分布上的成功率高于 p_high 时,边界向外扩张。B 是时间条件,C 是工程性能,D 是优化收敛信号,都与 ADR 的难度自适应逻辑无关。
Q6. 关于渐进式调度与自动域随机化,下列说法正确的是?
- A.ADR 根据成功概率自动调节边界← 正确答案
- B.渐进式调度的策略固定不改变
- C.课程学习从简单任务逐步过渡← 正确答案
- D.随机化范围始终保持固定不变
答案:AC。ADR 正是以成功率为反馈自动扩张/收缩随机边界(A 对);课程学习强调先易后难逐步过渡(C 对)。B 错,渐进式调度的策略始终在训练更新;D 错,ADR 的随机范围是动态变化的。
Q7. 关于域随机化与域适应的组合方式,正确的是?
- A.两种方法互斥只能任选其一
- B.特征对齐叠加随机化训练更稳← 正确答案
- C.域随机化不需要仿真器来支撑
- D.域适应只能用于真实环境训练
答案:B。域适应负责让仿真与真实特征分布对齐(“看得懂”),域随机化负责让策略对参数稳健(“扛得住”),两者互补叠加效果最好。A 错在把互补关系当成互斥关系;C 错误,域随机化必须依赖仿真器;D 错误,域适应主要工作在仿真侧。
Q8. 随机化范围的设定应遵循什么原则?
- A.随机范围越大策略泛化能力越强
- B.随机范围需要覆盖真实参数区间← 正确答案
- C.随机范围应与训练时间成正比
- D.随机范围越小训练收敛速度越快
答案:B。覆盖现实是首要原则:真实参数值必须落在随机区间内,否则策略从未练过该区域,迁移必败。A 是常见误区,范围过大会导致任务不可解;C、D 将范围与训练时间、收敛速度直接挂钩,缺乏依据。
Q9. 过度随机化的主要风险是什么?
- A.仿真画面的渲染质量明显下降
- B.策略难以学到稳定可用的技能← 正确答案
- C.策略网络的参数量大幅增加
- D.真实环境本身的复杂度随之上升
答案:B。随机范围过大可能让大量采样环境下的任务几乎不可解(如重力极大导致机械臂抬不起来),策略在这些环境中得不到有效学习信号,整体学不到可用技能。A 是渲染问题,C 是模型结构问题,D 混淆了仿真与真实。
Q10. 域随机化的典型应用场景包括哪些?
- A.机械臂的零样本抓取任务部署← 正确答案
- B.无人机在复杂环境中的飞行控制← 正确答案
- C.提升仿真器画面的渲染流畅度
- D.移动机器人在室内外场景导航← 正确答案
答案:ABD。机械臂抓取(如 Dactyl 翻魔方)、无人机穿越飞行、移动机器人导航都是域随机化的经典落地场景——它们都需要把仿真训练的策略零样本迁移到真实环境。C 是图形学性能优化,与域随机化无关。