想象你拥有一台魔法烤箱。你把面粉、黄油、温度和时间这些“旋钮”调好,按下启动键,烤箱会按照一套固定的物理过程——加热、膨胀、上色——烤出一盘饼干。这就像传统物理仿真:给定初始条件,一步步推算出未来的状态。但魔法烤箱还有一个隐藏功能:它烤完饼干后会告诉你,“这次火候偏了,上火高了 3 度;如果上温调低 2 度、多烤 30 秒,饼干会更完美”。这种“告诉你每个旋钮该往哪个方向调、调多少”的能力,就是梯度。 可微物理模拟要做的,就是把物理引擎从“只会烤饼干的普通烤箱”升级成“知道怎么调整烤法的魔法烤箱”。它仍然严格遵循物理规律推演世界,但在每一步推演中,都会额外记录“输出对输入有多么敏感”。有了这些敏感度信息,AI 就能像熟练的面点师一样,顺着梯度方向一次次微调旋钮,直到烤出理想效果——而不是像新手那样盲目试错。这就是梯度驱动的仿真:不是碰运气,而是“知道方向地修正”。

岗位关联

这篇文章能帮你理解:机器人为什么能在仿真里快速学会抓取?自动驾驶为什么能用“预测的未来”做规划?可微模拟正是连接世界模型、机器人学习和物理仿真的核心桥梁。

目录
  1. 可视化演示
  2. 核心概念:会告密的魔法烤箱
  3. 梯度与优化:顺着“下降方向”调火候
  4. 自动微分:烤箱里的“感应器链路”
  5. 引擎微分:直接烧进物理引擎里的“感应器”
  6. 技术挑战:粘在烤箱底部的面团
  7. 世界模型:学会“预知”未来的烤箱
  8. 机器人学习:教机器人“厨师”上手
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示可微物理模拟的核心机制,通过基础/核心/应用/扩展四种模式展示关键概念与交互流程。

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

可微物理模拟:可微模拟 1. 可微模拟的核心思想与梯度 2. 自动微分在物理引擎中的实 核心机制可视化 可微物理模拟整体架构与关键组件

核心概念:会告密的魔法烤箱

普通烤箱只会闷头工作——你设定好温度和时长,它就按部就班地加热,最后端出一盘饼干,至于“这次为什么烤糊了”,它闭口不谈。传统物理模拟就是这台普通烤箱:你把物体的初始位置、速度、外力输入进去,它就一步一个脚印地推演出物体的运动轨迹,但不会告诉你“如果当初初速度大一点会怎样”。而可微物理模拟,是那台会告密的魔法烤箱——它不但推演未来,还会在每个环节悄悄记录“结果对输入的敏感度”,并在最后向你汇报:这个旋钮该往左拧 2 度。

物理模拟的本质,是用微分方程描述物体的运动规律。牛顿告诉我们,力等于质量乘以加速度;从加速度出发,速度会变化,位置会跟着变化。计算机无法直接处理连续的时间,于是把时间切成一小段一小段的“时间步”,每一步都算一次“当前速度怎么变、位置怎么变”。这个循环往复的推演过程,就叫前向仿真。

最常见的推演方式叫欧拉法。在每一个时间步里,先用当前加速度更新速度,再用当前速度更新位置,就像用一串连续的“快照”拼出完整的运动电影:

vt+1=vt+atΔt,xt+1=xt+vtΔt\displaystyle \boldsymbol{v}_{t+1} = \boldsymbol{v}_t + \boldsymbol{a}_t \Delta t, \qquad \boldsymbol{x}_{t+1} = \boldsymbol{x}_t + \boldsymbol{v}_t \Delta t

1. 速度更新:新速度等于旧速度加上“加速度乘以时间步”,相当于烤箱里火候每秒钟让面团升温多少度。

vt+1=vt+atΔt\displaystyle \boldsymbol{v}_{t+1} = \boldsymbol{v}_t + \boldsymbol{a}_t \Delta t

2. 位置更新:新位置等于旧位置加上“旧速度乘以时间步”,相当于温度累积后,面团逐渐膨胀、位置移动。

xt+1=xt+vtΔt\displaystyle \boldsymbol{x}_{t+1} = \boldsymbol{x}_t + \boldsymbol{v}_t \Delta t

3. 时间步:Δt 是连续时间被切成的每一小段,切得越细,仿真越精确,但计算量也越大。

Δt→0\displaystyle \Delta t \to 0

可微模拟的魔法,就在于它把“烤箱告密”这一能力直接写进了物理推演里。前向仿真每走一步,它都记住这一步的输入输出关系;等整段轨迹推演完毕,它就能反向追查出“当初哪个旋钮影响最大”。这样一来,控制物体的任务就变成了“顺着烤箱给的方向调整旋钮”——这不就是 AI 最擅长的优化吗?烤箱从闷头干活的工具,变成了一个能提供方向感的智能教练。

梯度与优化:顺着“下降方向”调火候

光有魔法烤箱还不够,你还需要一个“饼干评委”。每次烤完,评委尝一口,打出一个分数:离完美饼干越远,分数越低。在可微模拟里,这个评委叫损失函数。它衡量的是“当前仿真结果”与“理想目标”之间的差距——比如炮弹落点离目标的距离、机器人与指定高度的偏差。损失越小,说明当前参数越接近理想状态。

有了分数,还要知道“怎么调才能涨分”。魔法烤箱的感应器此刻开始工作:它把每个旋钮微调一点点,观察饼干评分是变好还是变坏,从而算出“每个旋钮对分数的敏感度”。这个敏感度向量就叫梯度。梯度有一个重要性质:它指向损失函数上升最快的方向。所以我们想降低损失,就要沿着梯度的反方向走——这就是梯度下降法。

梯度下降的整个流程,就像面点师傅调整配方:尝一口饼干(算损失),感知哪里不对(算梯度),沿着“减少问题”的方向修改配方(更新参数),再烤、再尝、再调。

θk+1=θk−η∇θL(θk)\displaystyle \boldsymbol{\theta}_{k+1} = \boldsymbol{\theta}_k - \eta \nabla_{\boldsymbol{\theta}} L(\boldsymbol{\theta}_k)

1. 参数向量:θ 表示烤箱上所有旋钮的集合,比如发射角度、初速度、关节力矩。

θk\displaystyle \boldsymbol{\theta}_k

2. 损失梯度:∇L 是损失对每个旋钮的偏导数组成的向量,代表每个旋钮对评分的影响方向和大小。

∇θL(θk)\displaystyle \nabla_{\boldsymbol{\theta}} L(\boldsymbol{\theta}_k)

3. 学习率:η 是每次调整的步幅,步幅太大容易一步跨过最优配方,太小则收敛缓慢。

η>0\displaystyle \eta > 0

4. 迭代更新:新参数 = 旧参数 − 学习率 × 梯度,沿负梯度方向走一小步,让损失逐步下降。

θk+1=θk−η∇θL(θk)\displaystyle \boldsymbol{\theta}_{k+1} = \boldsymbol{\theta}_k - \eta \nabla_{\boldsymbol{\theta}} L(\boldsymbol{\theta}_k)

在整个过程中,反向传播扮演着“感应器网络”的角色。评委的评分从“饼干”这一端出发,沿着烤箱内部的所有传动链条一路逆推,经过每一层环节,最终把“每个旋钮该往哪调”的指令传递到起点。魔法烤箱的本质不是烤得更快,而是它拥有一张完整的“敏感度地图”——这正是梯度驱动的核心:永远知道下一步该往哪走。

自动微分:烤箱里的“感应器链路”

魔法烤箱能告诉你旋钮怎么调,靠的是烤箱内部密密麻麻的感应器链路。从火管到面糊,从面糊到饼干,每个环节都装有传感器:火管温度变化 1 度,面糊升温多少;面糊升温 1 度,饼干颜色变化多少。这些“环节之间的敏感度”环环相扣,最终累积成“旋钮对饼干评分”的总敏感度。自动微分,就是把这条感应器链路自动搭建起来的技术。

在数学上,这条链路就是链式法则:复合函数的导数,等于每一层导数的乘积。如果物理仿真被拆成 N 个连续的步骤,每一步都可以看作一个函数,那么损失对初始参数的梯度,就等于沿链路逐个相乘每一步的局部导数。

xˉN=∂L∂xN,xˉt=(∂xt+1∂xt) ⁣⊤xˉt+1\displaystyle \bar{\boldsymbol{x}}_N = \frac{\partial L}{\partial \boldsymbol{x}_N}, \qquad \bar{\boldsymbol{x}}_t = \left( \frac{\partial \boldsymbol{x}_{t+1}}{\partial \boldsymbol{x}_t} \right)^{\!\top} \bar{\boldsymbol{x}}_{t+1}

1. 梯度种子:从损失函数对末端状态求偏导开始,相当于饼干评委给出的初始评分信号。

xˉN=∂L∂xN\displaystyle \bar{\boldsymbol{x}}_N = \frac{\partial L}{\partial \boldsymbol{x}_N}

2. 反向递推:把后一步的伴随量乘上当前步雅可比矩阵的转置,传回前一步,就是感应器把误差从饼干端传回火管端。

xˉt=(∂xt+1∂xt) ⁣⊤xˉt+1\displaystyle \bar{\boldsymbol{x}}_t = \left( \frac{\partial \boldsymbol{x}_{t+1}}{\partial \boldsymbol{x}_t} \right)^{\!\top} \bar{\boldsymbol{x}}_{t+1}

3. 参数梯度汇总:把所有时间步上的伴随量各自对参数求偏导后加总,得到每个旋钮的总调整方向。

∂L∂θ=∑t=1Nxˉt∂xt∂θ\displaystyle \frac{\partial L}{\partial \boldsymbol{\theta}} = \sum_{t=1}^{N} \bar{\boldsymbol{x}}_t \frac{\partial \boldsymbol{x}_t}{\partial \boldsymbol{\theta}}

自动微分有两种常见的“布线路由”:前向模式从旋钮出发向饼干方向逐层传播敏感度,适合“参数少、输出多”的场景;逆向模式从饼干出发向旋钮方向反向传播误差,适合“参数多、输出少”的场景。物理模拟恰好属于后者——我们通常只有一两个损失值,却有成百上千个待调参数。因此,逆向模式成为可微物理引擎的主流选择,这也是深度学习里“反向传播”这一概念在物理世界中的延伸。

引擎微分:直接烧进物理引擎里的“感应器”

给普通烤箱外面贴一张“温度对照表”,不叫魔法;真正的魔法,是烤箱内部的每一根导管、每一个齿轮都天生自带刻度传感器。可微物理引擎一样的道理——不是在外面包一层自动微分工具,而是把引擎内部的每一个核心算子都改造成“可微的”:积分器、力计算、约束求解器,全部支持前向计算和反向求导两条通路。

物理引擎里的每一帧推演,通常包含这样几个环节:根据当前位置和速度计算各种力,用力的总和更新速度,再用更新后的速度更新位置。如果物体间存在接触,还要额外求解接触约束力,防止物体互相穿透。以常用的半隐式欧拉法为例,带接触力的速度更新可以写成:

vt+1=vt+M−1(ft+Jc⊤λt)Δt,xt+1=xt+vt+1Δt\displaystyle \boldsymbol{v}_{t+1} = \boldsymbol{v}_t + M^{-1}\left( \boldsymbol{f}_t + J_c^{\top} \boldsymbol{\lambda}_t \right) \Delta t, \qquad \boldsymbol{x}_{t+1} = \boldsymbol{x}_t + \boldsymbol{v}_{t+1} \Delta t

1. 质量矩阵:M 对角线上是每个物体的质量,M⁻¹ 表示“质量越大,同样的力带来的速度变化越小”,相当于烤箱里厚重的锅体更难升温。

M−1\displaystyle M^{-1}

2. 外力:f 是重力、电机推力等外部施加的力,相当于烤箱的火源功率。

ft\displaystyle \boldsymbol{f}_t

3. 接触约束力:Jᵀλ 是阻止物体互相穿透的约束反作用力,相当于模具挡住面团不让它乱跑的阻力。

Jc⊤λt\displaystyle J_c^{\top} \boldsymbol{\lambda}_t

4. 半隐式更新:先用更新后的速度 vₜ₊₁ 计算新位置,隐式地耦合了速度与位置,显著提升数值稳定性。

xt+1=xt+vt+1Δt\displaystyle \boldsymbol{x}_{t+1} = \boldsymbol{x}_t + \boldsymbol{v}_{t+1} \Delta t

把所有这些算子放进一张可微计算图之后,整个引擎就像一座内部布满传感器的烤箱。你在起点设置参数,引擎向前推演未来;推演结束,一个反向调用就把梯度传回每一个环节——包括质量、刚度、甚至接触点的位置。这正是 Brax、DiffTaichi、Mujoco(mujoco-mjx)等可微物理引擎在做的事:让物理定律本身成为可优化的“配方”。

技术挑战:粘在烤箱底部的面团

魔法烤箱也有失灵的时刻。最典型的情形,是面团粘在烤箱底部——你明明把旋钮调对了方向,感应器却突然“失聪”,报不出任何有效的调整建议。在物理仿真中,这个“粘底的面团”就是物体之间的接触与碰撞。

想象一个球碰到墙壁的瞬间:碰撞前一毫秒,球还在高速向左运动;碰撞后一毫秒,球突然以几乎相同的速度向右反弹。速度在这一瞬间发生了跳变,不再连续。而梯度存在的数学前提,恰恰是“函数光滑连续”。一旦物理状态发生跳变,损失函数对参数的导数要么不存在,要么像断崖一样指向完全错误的方位。

这个无情的数学约束,在物理上被写成一组互补条件:两个物体之间要么存在间隙、互不接触,要么紧密贴合、产生接触力,但不能同时既穿透对方又没有接触力。

g(x)≥0,λ≥0,g(x)⋅λ=0\displaystyle g(\boldsymbol{x}) \geq 0, \qquad \boldsymbol{\lambda} \geq 0, \qquad g(\boldsymbol{x}) \cdot \boldsymbol{\lambda} = 0

1. 间隙约束:g(x) 表示两个物体表面之间的最小距离,必须大于等于 0,即不允许穿透。

g(x)≥0\displaystyle g(\boldsymbol{x}) \geq 0

2. 接触力非负:λ 是接触产生的反作用力,只能朝着“推开”的方向,不能像胶水一样“拉住”物体。

λ≥0\displaystyle \boldsymbol{\lambda} \geq 0

3. 互补条件:g 与 λ 的乘积必须为零——要么有间隙没接触力,要么贴在一起才有接触力,二者取其一。

g(x)⋅λ=0\displaystyle g(\boldsymbol{x}) \cdot \boldsymbol{\lambda} = 0

除了接触不连续,可微物理引擎还要面对数值刚性和内存开销两大难题。刚体系统往往存在极快的高频振动,显式欧拉法需要极小的步长才能稳定,否则数值会“爆掉”;而反推梯度时,每一步的中间状态都要保留在内存里,模拟数千个时间步后,内存占用相当可观。工程师们靠平滑接触模型、隐式积分器、以及邻接方法等技巧来绕过这些障碍——就像给烤箱增加防粘涂层、升级温控芯片,让“告密”功能在极端条件下依然可用。

世界模型:学会“预知”未来的烤箱

见多识广的老面点师,只需要扫一眼面粉的吸水性、空气的湿度,就能预判这一炉饼干大概会是什么口感。这种“看到开头就知道结尾”的能力,在 AI 领域被称为世界模型。可微物理模拟,正是构建世界模型的一块坚实基座:它本身就蕴含了“世界如何演变”的知识,只要把仿真参数校准到与真实环境一致,它就能对未来状态做出预测。

世界模型的训练目标很朴素:让“预测出来的下一步状态”尽量接近“真实观测到的下一步状态”。想象烤箱每次烤完饼干,都把“预测的饼干样子”和“实际烤出的饼干样子”放在一起比对,误差越大,说明模型对世界的理解越差。这个比对过程被形式化为预测误差的平方和:

L(ϕ)=∑t∥s^t+1−st+1∥2\displaystyle \mathcal{L}(\phi) = \sum_{t} \left\| \hat{\boldsymbol{s}}_{t+1} - \boldsymbol{s}_{t+1} \right\|^2

1. 预测状态:ŝₜ₊₁ 是世界模型根据当前状态推演出来的“下一步将会怎样”,相当于烤箱的预判。

s^t+1\displaystyle \hat{\boldsymbol{s}}_{t+1}

2. 真实状态:sₜ₊₁ 是真实环境观测到的状态,比如真实饼干的样子,是训练信号的金标准。

st+1\displaystyle \boldsymbol{s}_{t+1}

3. 误差平方:‖·‖² 对预测偏差取平方,放大明显错误,同时保证误差始终为正。

∥s^t+1−st+1∥2\displaystyle \left\| \hat{\boldsymbol{s}}_{t+1} - \boldsymbol{s}_{t+1} \right\|^2

4. 求和累积:把所有时间步的误差加总,形成总的训练目标。

∑t∥⋅∥2\displaystyle \sum_{t} \left\| \cdot \right\|^2

有了能“预知未来”的世界模型,AI 就能在行动之前先在脑中推演一遍多个备选方案,选出后果最好的那一个再执行——这就是模型预测控制的思想。在自动驾驶中,世界模型预测未来几秒内周围车辆的状态,规划器据此选择最安全的轨迹;在视频生成里,世界模型判断“这个画面接下来会怎么演变”,生成连贯的未来帧。可微模拟赋予世界模型的不只是预测能力,还有“预测错了知道该改哪里”的梯度信号,让模型能够持续自我修正。

机器人学习:教机器人“厨师”上手

假设你要把面点老师的毕生经验传给一个新厨师学徒——但学徒每次撒糖都手抖、煎蛋总糊锅。与其让学徒在真实厨房里摔碎一百个盘子,不如先给他一台魔法烤箱:烤箱会告诉他“糖多了 5 克”“火大了 10 度”,学徒在仿真里快速练习,等手法熟练后再进真实厨房。这正是可微模拟在机器人学习中的核心价值。

机器人的控制问题,通常被表述为一个轨迹优化问题:给定要完成的动作,寻找一条最优的控制指令序列,让整条轨迹的代价总和最小。在可微模拟器里,这条“寻优之路”可以完全由梯度驱动——每一步指令该往哪调,都是直接算出来的,而不是靠随机碰运气:

min⁡u0:T∑t=0Tc(xt,ut)s.t.xt+1=F(xt,ut)\displaystyle \min_{\boldsymbol{u}_{0:T}} \sum_{t=0}^{T} c\left( \boldsymbol{x}_t, \boldsymbol{u}_t \right) \quad \text{s.t.} \quad \boldsymbol{x}_{t+1} = F(\boldsymbol{x}_t, \boldsymbol{u}_t)

1. 控制序列:u₀₋ᵀ 是每个时刻要发给机器人的指令,比如关节的力矩、电机的电压,也就是学徒每个瞬间该用多大力。

u0:T\displaystyle \boldsymbol{u}_{0:T}

2. 代价函数:c(x, u) 对“当前状态与目标的偏差”“能耗”等因素计费,偏差越大付得越多。

c(xt,ut)\displaystyle c\left( \boldsymbol{x}_t, \boldsymbol{u}_t \right)

3. 动力学约束:xₜ₊₁ = F(xₜ, uₜ) 要求状态演化严格遵守可微物理模拟器给出的物理规律,不能让机器人“瞬移”。

xt+1=F(xt,ut)\displaystyle \boldsymbol{x}_{t+1} = F(\boldsymbol{x}_t, \boldsymbol{u}_t)

4. 最小化:对总代价求最小,得到的最优控制序列就是机器人要执行的动作方案。

min⁡u0:T∑t=0Tc(⋅)\displaystyle \min_{\boldsymbol{u}_{0:T}} \sum_{t=0}^{T} c(\cdot)

更进一步,可微模拟还能与策略网络结合:让一个神经网络直接输出控制指令,而模拟器负责提供梯度来训练这个网络,形成“策略学习—仿真验证—梯度回传”的闭环。然而仿真毕竟是仿真,从魔法烤箱走向真实厨房,中间还横亘着一道“仿真到现实”的鸿沟——摩擦系数、电机延迟、传感器噪声都不可能完美建模。工程师们通过域随机化(给仿真参数随机加扰动)、系统辨识(用真实数据校准仿真)、在线自适应等方法,让学徒把烤箱里学到的本领稳稳地迁移到真锅真灶上。

AI 应用场景

机器人灵巧手抓取策略优化

阶段:策略学习 / 轨迹优化

解决的问题:传统强化学习让机械臂学习抓取,需要数百万次试错,真实机器人的每一次试错都伴随着磨损和时间成本,而抓取失败还可能损坏物体。可微模拟器让“抓取失败”的误差通过梯度直接回传到关节控制量上,几十轮迭代就能找到更优的抓取姿态,把从“盲试”变成“定向修正”。

具体案例:研究者用可微手部模型在仿真中优化金属球、积木等物体的抓取力矩与手指姿态,损失函数定义为“物体最终位姿与目标位姿的偏差”。梯度反向穿过接触点,告诉每根手指该往哪个方向施加多大力度。优化好的策略再迁移到 Shadow 灵巧手等真实硬件上,所需的真实样本量大幅减少。

自动驾驶轨迹预测与规划

阶段:世界模型 / 规划控制

解决的问题:传统规划依赖手写规则和大量人工标注轨迹,难以覆盖复杂交互场景。可微交通模拟器把车辆动力学与交互规则写成可微算子,让预测误差通过梯度回传给神经网络权重和场景参数,模型能自动学习“刁钻”的驾驶博弈。

具体案例:Waymo 的研究团队用大规模可微交通模拟器训练轨迹预测模型:输入真实路测片段的初始状态,模拟器推演未来数秒的交通流,损失函数为预测轨迹与真实轨迹的均方误差。通过反向传播,模型不断修正对其他车辆行为的“预判能力”,规划器则利用这些预判在仿真中反复演练避让策略。

流体与材料参数反演设计

阶段:参数反演 / 设计优化

解决的问题:传统 CFD(计算流体力学)仿真单次动辄数小时,靠人工试错调整喷嘴形状效率极低。可微流体模拟让“出口喷射不均匀”的损失函数直接对几何参数求梯度,一次反向计算就能给出每个设计参数应该往哪个方向修改。

具体案例:研究团队用可微流体求解器设计 3D 打印喷嘴的内腔形状:把仿真中出流速度的均匀度定义为损失,对锥角、内壁弧度等参数做梯度下降,迭代数百步后得到最优几何构型,再打印实物验证。由于仿真中的梯度路径与真实物理高度一致,实验测量结果与仿真预测偏差很小。

Python 演示

python44 行
import torch torch.manual_seed(42) # 目标位置(归一化坐标:烤箱里的"完美饼干位置")target = torch.tensor([0.62, 0.55]) # 可学习参数:发射方向与初速度(相当于烤箱旋钮)theta = torch.tensor(0.5, requires_grad=True)   # 发射角,弧度speed = torch.tensor(0.55, requires_grad=True)  # 初速度大小 G = 0.5      # 归一化重力加速度T_HIT = 1.2  # 评估时刻(秒)DT = 0.02    # 仿真时间步长 def simulate(theta, speed):    """前向仿真:用欧拉法积分弹道轨迹,返回 T_HIT 时刻的位置"""    vx = torch.cos(theta) * speed    vy = torch.sin(theta) * speed    t = 0.0    x = torch.tensor(0.12)  # 发射点横坐标    y = torch.tensor(0.88)  # 发射点纵坐标    while t < T_HIT:        vy = vy - G * DT     # 重力改变速度        x = x + vx * DT      # 速度推动位置前进        y = y + vy * DT        t += DT        if y.item() <= 0.0:  # 落地则提前终止            break    return x, y optimizer = torch.optim.SGD([theta, speed], lr=0.05) for it in range(100):    optimizer.zero_grad()    x, y = simulate(theta, speed)    loss = (x - target[0]) ** 2 + (y - target[1]) ** 2    loss.backward()    optimizer.step()    if it % 20 == 0:        print(f"iter {it:3d} | loss {loss.item():.4f} | pos ({x.item():.3f}, {y.item():.3f})") print(f"最终位置 ({x.item():.3f}, {y.item():.3f}), 目标 ({target[0].item():.3f}, {target[1].item():.3f})")print(f"发射参数: theta={theta.item():.3f} rad, speed={speed.item():.3f}")
目的:演示可微物理模拟的完整闭环——物理仿真作为可微计算图的一部分,让梯度直接驱动发射参数收敛,最终炮弹在指定时刻精确抵达目标点。
  1. theta = torch.tensor(0.5, requires_grad=True)把发射角声明为“可学习旋钮”,打开梯度追踪开关。
  2. while t < T_HIT:仿真主循环:每个时间步都在推演物理状态,相当于烤箱的计时器滴答作响。
  3. vy = vy - G * DT重力每步改变速度,这是“力改变运动”这一物理定律的离散化。
  4. x = x + vx * DT速度推动位置前进,标准的欧拉积分,简单但清楚地呈现了前向仿真。
  5. loss = (x - target[0]) ** 2 + (y - target[1]) ** 2损失函数 = 预测落点与目标点的距离平方,饼干评委打分。
  6. loss.backward()触发自动微分,反向计算出两个旋钮各自的梯度,相当于烤箱感应器汇报调整方向。
  7. optimizer.step()沿负梯度方向拧动旋钮,完成一次参数更新。

常见误区

误区我一直以为可微模拟就是让物理引擎的运算速度变快,这样 AI 训练就能加速,它跟普通模拟器没有本质区别,只是“快一点的烤箱”。

正解可微模拟的核心产出不是速度,而是“梯度”。普通模拟器只说“烤成这样了”,可微模拟器还会说“上温该调低 2 度”。速度提升是工程优化层面的锦上添花,而梯度输出是全新的信息通道——有了这个通道,AI 才能从盲目试错切换到定向修正。两者是不同维度的能力,不能混为一谈。

为何常见:初学者评价工具时总习惯先看性能数字,容易把“新式引擎”简单理解为“优化过的旧引擎”,忽略了可微性带来的质变。

误区既然可微模拟能提供梯度,那么任何物理控制任务,只要不断梯度下降,就一定能收敛到最优解。

正解梯度方法的前提是损失函数光滑连续。一旦碰到刚体碰撞、物体落进凹槽这类“面团粘底”场景,速度在碰撞瞬间跳变,损失函数出现“断崖”,梯度要么不存在,要么指向完全错误的方向。工程师通常用平滑接触模型、增加耗散项、或者让梯度与强化学习混合使用来绕过这一障碍,而不是单靠朴素梯度下降。

为何常见:教科书和演示视频展示的大多是光滑曲线的收敛过程,很少展示接触不连续带来的悬崖,容易让人高估梯度法的适用范围。

误区PyTorch 里已经有 autograd 了,把物理引擎里的算子全部用张量实现,不就能自动获得梯度吗?为什么要专门做“可微物理引擎”?

正解物理引擎内部有大量迭代求解器——比如求解接触力的雅可比迭代、高斯-赛德尔迭代——这些迭代通常会被提前截断以节省时间。截断会切断梯度的传播通路,直接套 autograd 得到的梯度往往偏差很大甚至为零。真正的可微引擎(如 Brax、DiffTaichi)必须把约束求解、线性求解器等重写成可微算子,才能保证梯度质量。

为何常见:习惯深度学习框架的人容易把自动微分看作“免费的午餐”,忽略了物理引擎内部非线性迭代器对梯度通路的破坏。

误区既然梯度优化在仿真里已经做得很完美,把训练好的策略直接部署到真实机器人上,应该也能表现一样好吧?

正解这是把“烤箱模拟”当成了“真实烤糊”。仿真中的摩擦系数、质量、传感器噪声都是模型近似,与真实世界存在系统偏差,即 sim-to-real gap。可微模拟让仿真内的学习更高效,但落地到真实硬件,还需要系统辨识、域随机化、在线自适应等手段去校准模型参数,缩小仿真与现实的差距。

为何常见:展示视频里“仿真即真”的流畅效果容易让人忽略背后隐藏的物理参数校准环节,误以为仿真模型可以完全替代真实数据。

面试题

Q1. 可微物理模拟最核心的产出是什么?

单选题 · easy

  • A.更精美的动画渲染画面
  • B.对输入参数的高质量梯度← 正确答案
  • C.完全代替真实世界的实验
  • D.更快的数值求解运行速度

答案:B。可微模拟的本质是“会告密的烤箱”——在推演世界的同时输出“输入参数对结果的影响方向和大小”,即梯度。A 是渲染目标,C 不现实,D 是性能优化,它们都不是“可微”二字的核心含义。

Q2. 反向传播计算梯度的显著优势是?

单选题 · easy

  • A.一次反向获得所有参数梯度← 正确答案
  • B.比数值差分结果更加粗糙
  • C.不需要构建任何计算图
  • D.只适用于单个参数的简单函数

答案:A。逆向模式(反向传播)把损失从末端逐层传回,一次反向遍历就能同时得到所有参数的梯度,属于感应器链路的整体汇报。B 说反了,反向传播通常比数值差分更精确;C 错误,反向传播必须依赖计算图;D 错误,它特别适合参数众多的场景。

Q3. 显式欧拉法相比隐式欧拉法的主要特点是?

单选题 · mid

  • A.数值稳定且支持大步长
  • B.实现简单但稳定性较差← 正确答案
  • C.需要反复求解非线性方程
  • D.误差随步长增大而消失

答案:B。显式欧拉直接用当前状态外推下一步,“看到什么算什么”,实现非常简单,但步长稍大就容易数值爆炸。C 描述的是隐式欧拉的特点,A 与 D 的说法都与显式欧拉的实际情况相反,因此选 B。

Q4. 刚体接触导致梯度失效的根本原因是?

单选题 · mid

  • A.接触力数值总是等于零
  • B.速度在碰撞瞬间发生跳变← 正确答案
  • C.物体质量会随碰撞改变
  • D.摩擦力大小无法被测量

答案:B。碰撞瞬间速度从“向左高速”跳变为“向右反弹”,状态变化不再连续,而梯度存在的数学前提恰恰是连续性。这就像面团粘底导致感应器失灵。A、C、D 都与物理事实不符,接触力不为零、质量守恒、摩擦力可测量。

Q5. 仿真到现实的域差距来源包括?

多选题 · mid

  • A.仿真材质参数不够准确← 正确答案
  • B.传感器噪声被建模忽略← 正确答案
  • C.真实世界完全符合牛顿力学
  • D.执行器响应存在时间延迟← 正确答案

答案:ABD。域差距源于仿真与真实之间的“信息差”:材质参数不准(摩擦力、刚度)、传感器噪声被简化掉、电机与液压执行器的延迟没建模,都会让仿真里的“烤箱”和真实厨房不一致。C 不是差距来源——真实世界本来就用牛顿力学描述,仿真模型反而可能偏离它。

Q6. 邻接方法(adjoint method)计算梯度的主要优势是?

单选题 · hard

  • A.可以完全消除所有数值误差
  • B.内存开销不随时间步数增长← 正确答案
  • C.不需要物理系统的初始状态
  • D.只适用于无约束的线性系统

答案:B。邻接方法通过反向求解一条伴随微分方程来得到梯度,不再需要把整个时间步序列都保存在内存里,因此内存开销与步数解耦。A 说“完全消除误差”过于绝对,C 错误(初值仍然需要),D 错误(可推广到非线性带约束系统)。

Q7. 世界模型训练中使用的主要监督信号是?

单选题 · hard

  • A.预测状态与真实状态的误差← 正确答案
  • B.物理模拟器的每帧渲染时长
  • C.训练数据集的样本总数量
  • D.显卡浮点运算峰值速度

答案:A。世界模型的训练目标就是“预判得准不准”:把模型预测的下一时刻状态与真实观测到的状态对比,误差作为梯度信号回传。这与老面点师“预判饼干口感”以实际出炉效果为检验标准同理。B、C、D 关注的是工程性能指标,与预测能力无关。

Q8. 可微物理模拟面临的主要挑战包括?

多选题 · mid

  • A.接触碰撞导致轨迹不连续← 正确答案
  • B.长时间模拟的内存开销大← 正确答案
  • C.完全无法利用显卡加速
  • D.不能与神经网络方法结合

答案:AB。接触碰撞让速度跳变、梯度失效,这是最核心的数学挑战;反向传播需要保留每一步的中间状态,长时间高分辨率模拟的内存占用惊人。C 错误——GPU 并行是物理引擎的标配能力;D 错误——可微模拟恰恰常与神经网络结合用于策略学习与世界模型。

Q9. 关于可微模拟的实现方式正确的是?

多选题 · hard

  • A.依赖链式法则逐层传播梯度← 正确答案
  • B.需要定义每个算子的反向规则← 正确答案
  • C.只能用于刚体碰撞的场景
  • D.必须手动推导全部梯度公式

答案:AB。可微模拟器的本质是把物理推演构建成计算图,用链式法则反向传播梯度,因此每个参与计算的算子(积分器、约束求解器)都要提供反向规则。C 错误——流体、软体、布料同样可微;D 错误——自动微分框架会帮我们自动组装这些规则,不需要每一步都手推。

Q10. 隐式欧拉法数值稳定的核心原因是?

单选题 · extreme

  • A.使用极小的时间步参数
  • B.求解包含当前状态的方程组← 正确答案
  • C.完全忽略物理定律的约束
  • D.只采用线性加速度的模型

答案:B。隐式欧拉在计算新状态时,需要求解一个包含“当前(下一时刻)状态”的方程组,相当于把未来的反馈提前纳入本步计算,从而抑制数值震荡。这正是它比显式欧拉更稳定的根源。A 说反了,显式才依赖小步长;C、D 都不是隐式欧拉的原理特征。