可微仿真完全入门:梯度、损失函数、域随机化、端到端——这些名词到底在说什么?
本文目标:让完全没有机器学习或数值优化背景的读者,从零开始理解”可微仿真”相关的核心名词。
无人机仿真就是用计算机模拟无人机的飞行——给定一组参数(质量、推力系数等),计算机算出无人机怎么飞。
一、从一道最简单的数学题说起
想象你要解一个问题:
找一个数 ,使得 。
很简单, 或 ,心算就行。
现在换个问题:
找一个数 ,使得 。
你还能心算吗?不能了。你需要试:
- 试 :(太小了)
- 试 :(太大了)
介于 和 之间。
再试 :(还是小了点)
再试 …… 这就是手动调参。
而”可微”给了你一个捷径:它告诉你,如果你在 时答案是 ,下一步该往哪个方向走、走多快,而不需要一遍遍地瞎试。
“梯度”就是方向标 + 步长尺。
二、什么叫”可微”?—— 为什么这个性质这么重要
2.1 直观概念
一句话:一个函数如果”可微”,意思是它的输出对输入的变化是平滑的——你稍微动一下输入,输出也会稍微动一下,而且你知道输出会往哪个方向动。
类比:开汽车的方向盘。
- 💡 可微 = 方向盘是线性连接的。你往右打 1 度,车轮转 1 度,方向平滑改变。你知道”多打一点方向,车就多转一点”。
- 💀 不可微 = 方向盘是坏的。你拧半天没反应,突然拧到一个角度,车猛甩过去。你不知道”拧多少会转多少”。
2.2 数学定义(公式版,但附白话翻译)
定义:
如果函数 在点 处有导数 ,则称 在 处可微。
导数的定义为:
白话翻译:
把 变一点点( 是一个极小的变化),看 变化了多少。如果 的变化量和 的比值趋近于一个固定的数,那这个数就是导数。导数越大,输入的小变化对输出的影响就越大。
2.3 历史
“可微”和”导数”的概念由牛顿(1643-1727)和莱布尼茨(1646-1716)在 17 世纪末独立创立,是微积分的核心。牛顿用它描述天体运动(月亮绕地球转的速度),莱布尼茨发明了今天我们还在用的微分符号 。
2.4 为什么要关心”可微”
在仿真中”可微”的区别:
1 | 传统仿真(不可微): |
核心差别:传统仿真是一维的(输入→输出),可微仿真在输出结果的同时,还告诉你了各输入参数对输出结果的影响程度。
三、梯度:不是魔法,就是一个方向箭头
3.1 概念
梯度是一个向量,它指出”往哪个方向调整参数,能让结果改变得最快”。
3.2 定义
对于一个有多个输入、一个输出的函数 ,梯度记为:
其中 叫”偏导数”,意思是”只改变 这一个参数,其他参数固定,看 怎么变”。
3.3 历史
“梯度”一词来自19世纪数学家麦克斯韦(1831-1879)在电磁场理论中的工作。后来被用于优化问题——柯西(1789-1857)在1847年提出了”最速下降法”,就是用梯度来找函数的最小值。
3.4 手算例子
假设你的函数是 ,在点 处求梯度:
什么意思?在 这个点,沿着 的方向走,函数值上升最快。反过来,沿着 的方向走,函数值下降最快。
3.5 在仿真中的应用
回到你的无人机场景:
1 | 可微仿真给出梯度: |
告诉你一个好消息和一个坏消息。你不关心正负号的来龙去脉,你只需要知道哪个参数往哪个方向调。 这就是梯度做的事。
四、损失函数:就是”差距”的量化
4.1 概念
损失函数衡量”仿真结果和期望结果之间的差距”。
- 损失函数值 = 0 → 完美,仿真和期望完全一致
- 损失函数值 = 500 → 差得很远
4.2 定义
最常用的损失函数是均方误差(Mean Squared Error, MSE):
其中 是仿真第 个时间步的值, 是真实飞行第 个时间步的值。
4.3 历史
损失函数的概念可以追溯到高斯(1777-1855)和勒让德(1752-1833)在19世纪初发展的最小二乘法——他们用它来根据天文观测数据推算行星轨道。现代机器学习中,”损失函数”成为训练所有模型的核心工具,是反向传播算法(1986年,Rumelhart、Hinton、Williams)的基础。
4.4 手算例子
你有一段真实飞行的轨迹记录:
1 | 真实位置: 0m, 1m, 2m, 3m, 4m (1秒一个点) |
计算损失:
1 | 第1秒:(1 - 1.1)² = 0.01 |
损失 = 0.235。这个数字告诉你:你的仿真器和真实飞行偏差挺大的(平均位置偏差约 米)。
你的目标就是让这个损失值降到 0——也就是”最小化损失函数”。
4.5 在你的项目中的意义
| 场景 | 损失函数衡量什么 | 目标 |
|---|---|---|
| 参数辨识 | 仿真轨迹 vs ULog 实飞轨迹 | 找到让损失最小的 C_T、C_D |
| 制导律整定 | 拦截脱靶量(距离目标最近时有多远) | 找到让脱靶量最小的 PN 增益 N |
| 域随机化 | 在最差参数组合下的脱靶量 | 找到即使参数偏差大也能拦截的参数 |
五、梯度下降:自动调参的核心引擎
5.1 概念
梯度下降就是:沿着梯度的反方向(因为梯度指向上升最快的方向,我们要下降)一步一步调整参数,使损失函数越来越小。
5.2 定义
参数更新公式:
其中 (读作”eta”)叫学习率,就是”每一步走多大”。
5.3 手算例子
还是之前的函数 ,在 处:
- 梯度:
- 学习率
更新:
等价于:
- 第 1 步:
- 第 2 步:
- 第 3 步:
- ……
- 最终趋近于 0(最小值)
和手动调参的对比:
| 方法 | 操作 | 示例 |
|---|---|---|
| 手动调参 | 猜→试→再看结果→再猜 | 调 C_T:0.11→0.12(不行)→0.10→0.09(不行)→0.13(好像行了?) |
| 梯度下降 | 自动算方向,一次到位 | 梯度说:C_T 应增大 0.003 → 一次收敛 |
手动调参每次改完要重新跑一遍仿真(几分钟甚至几小时)。梯度下降告诉你方向,一次计算就够了。
六、域随机化:不猜了,直接让参数变起来
6.1 概念
既然你不知道真实的物理参数是多少,那别猜一个值,而是让参数在一定范围内随机变化。
6.2 定义
域随机化将动力学参数 视为随机变量,而不是固定值:
即每个参数在最小值到最大值之间均匀随机取值。
6.3 历史
域随机化在 2017 年由 OpenAI 的团队在论文《Generalizing from Simulation to Real World with Domain Randomization》(arXiv:1710.06457)中系统提出。他们发现,只要在仿真中把参数随机范围设置得足够宽,仿真中训练的模型可以直接用在真实机器人上,不需要任何微调。后来被广泛应用于无人机、机械臂、自动驾驶等领域的 Sim-to-Real 迁移。
6.4 手算例子
传统参数辨识:
1 | 你认为 C_T = 0.11 → 只使用这个值 → 真机是 0.13 → 失控 |
域随机化:
1 | C_T 随机范围 [0.08, 0.16] |
真机上的 C_T 只要落在这个范围内,算法就自然有效。
6.5 在模块化制导中的应用
对于典型的高速无人机截击仿真场景:
1 | 不用改 PN/EPN 的公式,只需在确定 N(导航增益)时: |
七、端到端:把整个流程变成一个黑箱
7.1 概念
端到端就是:放弃”感知模块→规划模块→控制模块”的分步设计,改为输入传感器数据,直接输出电机指令。
7.2 与传统模块化的对比
1 | 传统模块化(你现在的方式): |
7.3 历史
“端到端”在自动驾驶领域的里程碑是 NVIDIA 的 DAVE-2 系统(2016 年,Bojarski 等人),用单个神经网络直接从摄像头图像输出方向盘角度。在四旋翼领域,2026 年上海交大的 E2E-Fly(arXiv:2604.12916)首次实现了从仿真训练到真机飞行的零样本迁移。可微仿真是实现这一目标的关键——因为只有可微,梯度才能从最终的电机指令一路反向传播到神经网络的每个参数。
7.4 端到端 vs 非端到端(对你的意义)
你现在用 PN/EPN 制导 + PID 控制,属于”非端到端”方案。这不代表它不好——恰恰相反,它有明确的物理可解释性和可靠性。
端到端适合的是:
- 感知环节太复杂,传统方法搞不定(比如视觉避障)
- 传统模块之间信息损耗严重
而你的截击仿真场景:目标位置已知(雷达/外部传感),制导有成熟公式,非端到端是正确选择。
关键洞察:可微仿真对非端到端方案的价值不在于”替换制导律”,而在于更高效地确定制导律参数。
八、这些概念如何连起来?
8.1 一张图看完整流程
1 | 你有的:ULog 真实飞行数据 |
8.2 和你已有工作的关系
| 你已经在做的 | 可微仿真带来的改进 |
|---|---|
| 参辨识模块的 ULog 参数辨识 | 从遗传算法(1000 代)→ 梯度下降(50 步),速度快 20 倍 |
| 手动调 PN 增益 N | 梯度直接告诉你 N 该增加还是减少 |
| 6DOF 拦截测试 | 域随机化帮你找到”参数偏差 30% 也能命中”的鲁棒参数 |
8.3 不改变的部分
- 你的 PN/EPN 制导算法不变
- 你的 PID 增益不变
- 你的部署代码(飞控参数)不变
- 你的物理理解不变
改变的只是”参数怎么算出来的”。
九、核心公式速查卡
| 公式 | 含义 | 在本文中的角色 |
|---|---|---|
| 导数定义 | 可微的基础 | |
| 梯度 = 所有偏导数的向量 | 告诉你怎么调参数 | |
| 均方误差损失函数 | 量化”差距” | |
| 梯度下降更新公式 | 自动调参引擎 | |
| 域随机化 | 不猜一个值,让参数随机变 |
十、总结
- 可微 = 输入的小变化会导致输出平滑变化,你知道变化的”方向”
- 梯度 = 告诉你每个参数对结果有多大影响、往哪调
- 损失函数 = 一个数字,衡量仿真和真实的差距,0 表示完美
- 梯度下降 = 沿着梯度反方向一步步走,自动把损失降到最小
- 域随机化 = 不猜精确值,让参数在范围里随机跳,找”不挑环境”的解
- 端到端 = 输入原始数据(如摄像头画面),直接输出控制指令,跳过中间模块
这些概念并不是端到端学习的专利。它们本质上是一种”带方向感的计算”。对传统制导算法来说,它们提供的价值是更高效、更系统化的参数整定——让手动的”猜→试→再猜”变成自动化的”计算→更新→收敛”。
参考文献
- Bojarski, M., et al. (2016). End to End Learning for Self-Driving Cars. arXiv:1604.07316.
- OpenAI. (2017). Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World. arXiv:1710.06457.
- Tobin, J., et al. (2017). Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World. IEEE/RSJ IROS 2017.
- Rumelhart, D. E., Hinton, G. E., & Williams, R. J. (1986). Learning representations by back-propagating errors. Nature, 323(6088), 533-536.
- Howell, T. A., et al. (2022). Dojo: A Differentiable Physics Engine for Robotics. arXiv:2203.00806.
- E2E-Fly (arXiv:2604.12916) — 端到端四旋翼自主飞行系统。