资讯动态

从能量守恒到Hamiltonian神经网络:让深度学习真正理解物理规律

发布时间:2026/10/17 8:58:39 来源:尧图企业网站定制
两年前我训练过一个预测双摆运动的神经网络短期轨迹拟合得很漂亮可一外推就彻底失控甚至出现类似“永动机”的能量持续增长。那时候我突然意识到神经网络擅长记住数据中的统计规律却完全不理解数据背后那条物理守恒的底线。后来我陆续试过物理信息网络、Hamiltonian 架构、可逆网络等一系列新架构才慢慢摸清怎么让模型在结构层面“内置”守恒律。这篇博文就把这条路线完整拆开讲为什么传统网络学不会守恒物理约束有哪三种注入方式Hamiltonian 架构到底改了什么以及实测中我踩过的伪物理陷阱。1. 网络为什么“学不会”守恒从一次翻车的双摆实验说起先讲清楚一个反直觉的事实神经网络不是“学不会”守恒律而是从设计目标上就根本不关心守恒律。多数回归网络优化的只是“预测误差最小”它没有动力去保证长时间演化的一致性。1.1 那次实验短期惊艳长期崩坏我当时的做法很朴素用 MLP 拟合双摆系统的状态转移输入是(t)时刻的位置和速度输出是(tdt)时刻的位置和速度。训练集覆盖了中低能量区间测试集上前几百步误差确实不大看起来“学得很准”。问题出在长期仿真。把网络输出的状态不断迭代回喂给它自己大概几百步之后轨迹开始出现明显漂移再往后系统“自发”获得了能量摆动幅度越来越大直到完全乱掉。我还专门画过能量曲线那条线几乎是线性往上爬的——从物理上说这就是系统在凭空产生能量。一开始我怀疑是数据量不够把训练集扩了十倍效果只是把崩溃点往后推了几百步本质问题没解决。加大数据解决不了结构层面的缺陷这个结论后来反复被验证。1.2 根因神经网络只是统计插值器不是物理仿真器传统监督学习本质上是在做高维函数插值。对于一个双摆系统训练数据分布在一个特定的能量流形上网络只要能拟合这个流形附近的状态转移就够了。问题是网络不知道“能量是守恒的”这条硬约束它只是把输入批量映射到输出映射关系里的微小系统性偏差会在递归迭代中被不断放大。这个现象可以用数值分析里的“误差累积”来理解单步误差哪怕只有千分之一经过一千步递归就可能变成百分之几十。普通 MLP 的单步误差在各处表现不一致有些区域往正方向偏有些区域往负方向偏叠加起来就形成能量漂移。而真实物理系统之所以稳定是因为系统本身有一套守恒量把动力学限制在低维流形上数值方法只要不破坏这套结构长期预测就不会失控。所以问题的本质不是“精度不够”而是模型结构里缺少物理约束。这也引出后面几种主流解法。2. 物理约束进入网络的三种路线软惩罚、数据改造、硬编码想让神经网络尊重物理定律业界大致走三条路在损失函数里加物理残差、在训练数据里做物理一致化改造、在网络结构里强制满足物理结构。三条路各有代价我逐个说透。2.1 软约束路线PINN 把方程写进损失函数物理信息神经网络PINN的思路最直白既然网络输出应当满足某个偏微分方程那就把方程残差直接加到损失函数里让优化器同时最小化数据误差和物理误差。比如一维热传导方程网络输出 u(x,t)除了要拟合观测数据还要求 ∂u/∂t - α ∂²u/∂x² 的残差尽量小。训练时在求解域里随机采样一堆配点对这些配点计算偏导并加入损失。这套路对流体、热传导、电磁场这类连续介质问题很好用因为方程解析形式明确不需要改写网络结构。但软约束有个致命缺点物理损失和数据损失是两股互相拉扯的力权重怎么调是个玄学。权重太小物理约束形同虚设权重太大网络优先级变成“满足方程”而不是“拟合数据”甚至可能收敛到一个满足方程但与真实数据完全无关的平凡解。我在某流体模拟项目上把物理损失权重从 0.01 调到 100试了十几组才勉强找到稳定区间。2.2 数据改造路线用物理一致的样本“骗”网络第二种思路是在数据处理阶段做手脚只保留物理一致的轨迹、对数据做镜像翻转或时间反演增强、或者用数值积分器生成满足守恒的训练样本。这个方法实现成本最低很多做机器人控制的团队都这么干在仿真环境里用高精度求解器生成轨迹保证训练数据本身能量守恒。但数据改造治标不治本。网络只是见过更多“看起来物理正确”的样本它依然不知道样本背后的规律。一旦测试工况稍微偏离训练分布比如换个初始高度、增加一个外力扰动模型立刻露馅。它的泛化能力不会超过数据覆盖范围本质上还是在插值。2.3 硬编码路线让网络结构本身就守恒前两条路线都是在“外部”施加约束第三条路线直接在网络结构里植入物理结构模型输出的中间量就是能量函数或哈密顿量动力学由这个量通过特定方程生成。这就是 Hamiltonian 神经网络HNN的核心思路。网络不再直接预测下一个状态而是学习一个标量能量函数再用哈密顿方程推导出状态导数。只要网络学到的能量函数是合理的那么系统动力学天然满足能量守恒。这是结构性的保证不是靠训练时外加权重拉出来的。2.4 三条路线对比速览我整理了一张表按实际工程选型时最关心的维度做对比对比维度PINN 软约束数据改造HNN 硬编码物理约束强度软可被损失权重冲淡更软取决于数据质量硬结构层面保证实现成本中需要写方程残差低只需改数据管线中高需要改网络结构适用场景连续介质/含源项方程快速验证、机器人模仿学习保守机械系统、无耗散动力学典型局限权重敏感、易收敛平凡解泛化能力受数据分布限制只适用于可写成哈密顿形式的系统长期预测稳定性一般差好这三条路线不是互斥的工业级方案经常组合使用。但如果你问我哪个方向最接近“让网络真正理解物理”我的答案是硬编码路线——它把物理定律写进了网络的创造过程而不是事后惩罚。3. Hamiltonian 神经网络的内部拆解能量函数就是网络本身HNN 这个名字听起来唬人拆开看其实特别清爽。核心思想一句话与其学习状态到状态的映射不如学习一个标量哈密顿量再用它的梯度驱动状态演化。3.1 HNN 的数学逻辑先学 H再让 H 驱动演化对坐标 q 和动量 p 组成的系统哈密顿量 H(q,p) 表示系统总能量。动力学方程变为dq/dt ∂H/∂pdp/dt -∂H/∂q注意这里有个巧妙的地方H 是时间不变的。沿着真实轨迹对 H 求导根据链式法则和上面两个方程dH/dt ∂H/∂q · dq/dt ∂H/∂p · dp/dt ∂H/∂q · ∂H/∂p - ∂H/∂p · ∂H/∂q 0。也就是说只要网络输出的 H 是光滑函数动力学天然满足能量守恒。对比传统 MLP它直接输出 (dq/dt, dp/dt)这个输出向量不需要满足任何约束而 HNN 输出的梯度向量是从同一个标量函数派生出来的这个派生过程自动把“无旋性”约束进去。同样的数据量HNN 学到的动力学被压缩到更低维的流形上泛化自然更好。3.2 一段 40 行代码说清 HNN 的实现骨架理论再好也要落地我用 PyTorch 写一个极简的 HNN 骨架。完整工程还得加数据处理和调参但核心逻辑就这么多import torch import torch.nn as nn class HNN(nn.Module): def __init__(self, dim): super().__init__() self.net nn.Sequential( nn.Linear(dim, 128), nn.Tanh(), nn.Linear(128, 128), nn.Tanh(), nn.Linear(128, 1), ) def forward(self, qp): # qp: (batch, dim)dim 是坐标和动量拼接后的维度 return self.net(qp).squeeze(-1) def hnn_derivative(model, qp): # 关键对输入求梯度得到哈密顿方程右端 qp qp.clone().requires_grad_(True) H model(qp).sum() grad torch.autograd.grad(H, qp, create_graphTrue)[0] q, p qp.chunk(2, dim-1) # 按 dq/dt dH/dpdp/dt -dH/dq 组装 dq grad[:, p.size(1):] dp -grad[:, :q.size(1)] return torch.cat([dq, dp], dim-1) def leapfrog_step(model, qp, dt): # 辛积分器先半步更新再全步更新再半步更新 g1 hnn_derivative(model, qp) mid qp g1 * dt / 2.0 g2 hnn_derivative(model, mid) return qp g2 * dt训练时用真实轨迹相邻两帧做数值差分得到目标导数和hnn_derivative的输出算 MSE。训练过程中create_graphTrue必须保留因为损失对输入求导后又参与反向传播二阶导是计算图的一部分我去掉这个参数后训练直接报错或者干脆学不收敛。3.3 辛积分器被很多人忽略的守恒半壁江山HNN 在结构上保证了“能量函数守恒”但离散时间推进同样关键。如果你用普通欧拉法去推 HNN 的轨迹能量仍会漂移——因为模型本身没问题是数值积分器破坏了守恒性质。普通欧拉法的误差是 O(dt)每步都会给系统注入或抽走微小能量长期累积后守恒就崩了。辛积分器最常用的是 leapfrog / Verlet 法是专门为哈密顿系统设计的它保持相空间体积不变误差以振荡形式存在能量在平均值附近小幅波动而不会单调漂移。这就是上面代码里我坚持写 leapfrog 函数的原因。实际操作中还有个细节HNN 预测导数时网络输出如果带高频噪声训练不足或过拟合即使辛积分器也会把这些噪声放大。所以在数据预处理阶段对状态轨迹先做平滑滤波比在训练后期调各种权重有用得多。4. 实测掉过的三个“伪物理”陷阱结构对、原理对不代表训练一定能成功。我在从单摆做到二体问题的过程中被三个坑反复折磨过。写出来给你省点时间。4.1 陷阱一模型守恒但积分器不守恒第一次在二体系统上测试 HNN我把训练好的模型接到普通四阶 Runge-Kutta 积分器上做长期预测结果能量还是在缓慢爬升。当时一度怀疑 HNN 理论有问题后来才反应过来RK4 不是辛积分器它的局部误差虽然小但在长时间尺度上仍然会引入能量漂移。这个问题的排查方法其实很直白把相同初始状态分别用 leapfrog 和 RK4 推进画能量曲线。leapfrog 的能量曲线是一条在零附近窄幅振荡的带子RK4 则是缓慢但持续的偏移。两者对比一眼就能看出来。后来我所有的 HNN 推理管线都统一用 leapfrog再没遇到能量漂移的问题。选模型架构时一定要连积分器一起选——守恒是模型和求解器共同承担的。4.2 陷阱二学到“假的守恒量”HNN 只保证“它学到的 H 是守恒的”但不保证这个 H 就是真实物理系统的哈密顿量。如果训练数据太单一网络可能学到某个退化的守恒量。举个例子某次我在单摆数据集上训练数据里的初始状态全是从最低点以不同速度出发的。这种设置下角动量天然为零网络很容易学到“一切状态都在某个超平面上演化”的退化解把角动量当作核心依赖项之一。测试时一旦换个初始角度轨迹马上出错。修复方法有两个一是保证训练集覆盖不同初始条件下的多样化轨迹二是做数据增强——把轨迹在相空间里旋转、镜像、时间反演后加入训练集。物理系统本身具有对称性这些增强不会引入伪样本还能帮网络排除掉假的守恒量。4.3 陷阱三哈密顿量的不可辨识问题哈密顿量 H 加上任意常数 C 之后动力学方程完全不变因为导数对常数敏感度为零。这意味着网络学到的 H 的绝对值没有物理意义只有相对变化才可信。这带来一个实际困扰训练过程中能量曲线看起来“偏了”——初始状态的能量是 1.0网络预测出来却是 3.5。这不一定表示模型错了可能只是网络整体抬升了一个常数偏移。看到这种情况先别急着调参直接看能量差值的轨迹如果差分稳定说明模型学对了常数偏移不影响动力学。如果应用场景偏偏需要绝对能量值比如机器人能量评估就得在训练时额外加一个监督项让网络在某几个状态处的 H 输出对齐真实能量值。这个做法能打破不可辨识性但会稍微增加训练难度。5. 怎么证明模型真的“懂”了物理评价指标与对比实验训练完模型最难回答的问题是它到底是背下了数据还是真的掌握了物理规律我总结出三个不太容易被“刷分”的验证维度并且在模拟项目X的测试集上跑了一组对比实验。5.1 三个我常用的验证维度第一个是能量漂移曲线。把训练好的模型从训练集未出现过的初始状态出发预测 5000 步画出 (E(t)-E(0))/E(0) 随时间变化的曲线。真实物理系统这条线应该贴在零附近传统 MLP 通常表现为单调漂移HNN 表现为围绕零的窄幅振荡。第二个是长期轨迹重合度。用模型预测未来一段长时间的状态序列同时用高精度数值积分器生成“真值”轨迹。看两者在状态空间的偏离如何增长。如果增长速度是接近线性的说明模型把物理结构学进去了如果是指数增长基本就是插值硬撑。第三个是扰动恢复测试。给初始状态加一个随机扰动再用模型推进。物理系统的能量守恒意味着扰动后系统仍然在同一条等能面上运动不会跑到别处去。HNN 结构天然保证这一点传统 MLP 没有这种约束扰动后轨迹往往直接漂到其他能量面。5.2 一组有代表性的对比结果模拟项目X实测我在一个标准二体问题测试集上做过对比三种模型用完全相同的数据和训练轮次传统 MLP、PINN 软约束、HNN 硬编码。都用 5000 步长期预测结果如下指标传统 MLPPINN 软约束HNN 硬编码单步预测误差MSE8.2e-46.1e-45.3e-45000步能量漂移量0.3170.0420.0008测试集外推误差能量翻倍工况完全发散发散保持流形训练收敛速度相同精度所需epoch快慢权重调参耗时中等传统 MLP 短期预测误差看起来不大但长期预测完全不可用PINN 比纯 MLP 好能量漂移降了一个量级但外推依然不行HNN 的能量漂移基本在机器精度附近外推时仍然守得住能量流形。PINN“部分有用、外推崩溃”这个现象尤其值得注意它对分布内的数据确实能改善预测但因为物理约束只是损失项里的一个软目标一旦测试点离开训练数据覆盖区网络还是会回归到纯插值行为。这也是为什么我越来越倾向于把物理约束直接做成结构——软约束再好训练完也可能被遗忘。6. 从单摆到流体不同守恒体系下的架构选型聊到这里可能有人会问HNN 那么香是不是所有物理学习问题都能套实话实说不是。不同物理体系适合不同的架构选错了就是事倍功半。6.1 机械系统HNN 与坐标系的坑对多体机械系统弹簧摆、双摆、机械臂、卫星编队哈密顿量通常能写出来HNN 是最自然的选择。但有一个隐蔽的坑坐标和动量的选择直接影响网络学习难度。我试过直接用笛卡尔坐标加动量训练 HNN效果很一般换成极坐标或广义坐标之后训练速度明显上升。原因是物理系统的内在对称性在某些坐标系下更“容易表达”网络学起来更省力。如果你有拉格朗日或哈密顿力学的背景先花时间做坐标变换比盲目调网络宽度有效得多。如果系统有摩擦或外部驱动力H 不守恒HNN 的守恒假设就不成立了。这时候常见做法是把系统拆成“保守部分 耗散部分”保守部分用 HNN耗散部分额外用一个网络去拟合两个网络并联输出。这个方法我用在带阻尼的单摆上效果比单网络硬学整条动力学轨迹好很多。6.2 连续介质与流体PINN 是更顺手的工具流体、热传导、电磁场这类分布参数系统状态量是空间和时间的连续函数哈密顿量形式往往很复杂甚至写不出来。这时候硬套 HNN 反而尴尬PINN 的灵活优势就体现出来了方程残差可以直接写成损失项不需要改动网络结构。我在一个二维不可压缩流体模拟上试过 PINN关键是把连续性方程 ∇·u0 作为强约束加进损失可以在没有压力数据的情况下让网络学到速度场满足无散度条件。但需要注意配点采样策略在边界层和涡旋附近要加密采样均匀采样会把残差平均掉导致局部物理严重失真。PINN 的收敛稳定性对初始化和权重比例敏感实操时建议先用小网络在小区域上跑通再逐步放大别一上来就上大模型。6.3 分子动力学可逆结构解决长程仿真分子动力学要求长时间稳定仿真且满足时间反演对称性从状态 A 走一步到 B再走一步应当能回到 A。传统 MLP 几乎做不到精确可逆HNN 从理论上支持但在高维原子体系里直接学全局哈密顿量计算量太大。工程上更常用的是可逆残差网络。残差块的输出是 x f(x)只要保证 f 的雅可比有界网络就能保持可逆性。配合容量足够大的结构可以做到几千步仿真后能量仍然不漂移。代价是网络宽度受限表达能力不如同尺寸的非可逆网络但物理一致性带来的长期稳定性收益远大于那点表达力损失。6.4 选型速查表物理体系首选架构备选架构必须注意的约束守恒机械系统HNN 硬编码LNN 拉格朗日网络辛积分器 广义坐标含阻尼/外力系统HNN 耗散修正网络PINN 软约束先分离保守部分流体/热传导/电磁PINN 软约束神经算子 PDE 正则边界加密采样方程形式要准确分子动力学可逆残差网络HNN 低维坐标降维可逆性 时间反演对称未知物理的系统先探索性 PINN数据改造兜底别指望硬编码未知定律做选型的时候我个人的习惯是先想清楚一个问题这个系统的守恒量是什么我能不能写出来能写出来优先考虑硬编码路线写不出来且系统确实复杂再退化到软约束。物理先验不是越强越好是要和已知信息匹配——把未知的东西硬编码进结构只会让网络学不到正确的动力学。最后再分享一个实用技巧新架构落地的第一步永远先在简谐振子上验证完整管线。简谐振子有解析解随机初始化也能迅速判断代码、积分器、损失函数是否自洽。把管线在简单系统上跑通一次再上双摆、二体、流体这些复杂场景排查问题的时间能省下一大半。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑