ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

等变神经网络遇上经典密度泛函:三维密度场预测与可迁移建模实践

等变神经网络遇上经典密度泛函:三维密度场预测与可迁移建模实践 在接触“机器学习 分子模拟”这类交叉方向时很多同学都卡在同一个地方一边是经典密度泛函理论Classical Density Functional Theory, cDFT里连续的密度场、外势场、自由能泛函这些抽象概念另一边是图神经网络、旋转等变、E(3)群这些 ML 术语。两者单独看都容易理解一旦把它们组合在一起中文资料就变得非常零散。要么通篇讲量子 DFT要么把神经网络模型当作黑盒只给一个 MAE 很低的结论却不说“三维”“等变”“可迁移”这三个词究竟在物理和代码层面意味着什么。本文尝试把这条线完整串起来。内容会覆盖经典 DFT 是怎样一个物理问题、为什么传统的解析泛函很难迁移到复杂外势、等变神经网络在该问题中扮演什么角色以及从数据生成、模型结构到等变性验证的工程实现思路。适合有 PyTorch 基础、想入门计算模拟与机器学习交叉课题的开发者如果你本身做 DFT 或分子模拟想了解如何把密度泛函问题交给等变网络去逼近也能从中找到一条可落地的路径。1. 背景与核心概念1.1 经典密度泛函是什么经典密度泛函理论的研究对象不是电子而是原子、分子或胶体粒子。它的基本观点是一个非均匀流体的热力学性质完全由单粒子密度分布 ρ(r) 决定。这里的 ρ(r) 是一个三维空间中的标量场表示在位置 r 处单位体积内出现粒子的概率密度。对于处于外势场 V_ext(r)比如狭缝壁面、纳米孔道、电极表面等中的流体系统的巨势可以写作Ω[ρ] F[ρ] ∫ ρ(r) [V_ext(r) - μ] d³r其中 μ 是化学势F[ρ] 是系统的 Helmholtz 自由能泛函。在平衡状态下密度分布满足欧拉-拉格朗日方程δF[ρ] / δρ(r) μ - V_ext(r)只要给定 F[ρ] 的表达式就可以通过求解这个方程获得体系在任意外势下的平衡密度分布。这就是经典 DFT 的求解框架。看到这里熟悉电子结构计算的读者可能会觉得它和 Kohn-Sham DFT 很像。但两者有本质差异。量子 DFT 处理的是电子波函数与交换关联泛函计算量往往集中在薛定谔方程而经典 DFT 处理的是粒子的经典空间分布不需要求解高维波函数却能描述润湿、毛细凝聚、界面吸附、受限流体中的分层结构等现象。在实际工程中流体在纳米孔中的吸附等温线、界面张力、溶剂化力都可以通过经典 DFT 计算。1.2 经典 DFT 的难点在于“超额自由能泛函”经典的 Helmholtz 自由能一般拆成理想气体项和超额项两部分F[ρ] F_id[ρ] F_ex[ρ]理想气体部分是精确已知的困难全部集中在超额自由能泛函 F_ex[ρ] 上。F_ex[ρ] 本质上是粒子间相互作用对自由能的贡献它必须显式地把密度场 ρ(r) 映射成一个标量自由能而且要做到底函数性质良好、能给出稳定的导函数。长期以来人们通过统计力学推导获得了很多近似泛函。比如硬球流体领域比较成熟的 Fundamental Measure TheoryFMT以及工程中经常使用的 White Bear 泛函、Modified Benedict-Webb-Rubin 泛函等。这些解析泛函在对应理论体系的描述上是有效的但应用范围比较有限。以常见的狭缝孔吸附计算为例体系从硬 sphere 狭缝换成有一定粗糙度或化学修饰的复杂孔壁时FMT 类泛函仍然能处理简单几何一旦出现复杂的分子形状、长程各向异性相互作用、多组分竞争吸附解析泛函的推导周期会变得非常长很多时候甚至无法得到一个“既稳定又精确”的封闭表达式。这时候自然会产生一个想法能不能用大量参考数据去训练一个神经网络让它代替 F_ex[ρ] 完成从密度场到自由能的映射如果模型能在旋转、平移之后保持物理结果一致并且跨外势场、跨温度、跨密度区间使用时仍然可靠那它就成为“一个可迁移的三维经典密度泛函”。1.3 为什么模型结构必须要“等变”把 F[ρ] 当作简单函数来拟合会遇到一个基础性问题三维空间中的预测结果必须尊重物理对称性。如果一个流体系统整体绕空间中任意轴旋转或者在空间中整体平移它的物理性质不应该改变。换言之当输入密度场发生旋转时模型输出的自由能应该完全不变输出密度场时则应该跟着坐标一起旋转。这种性质就是 E(3) 等变性。E(3) 指三维欧几里得群包含旋转、平移和镜像操作。严格来说普通三维旋转群是 SO(3)加上镜像后变成 O(3)再加上平移就是 E(3)。在分子模拟中我们常说的“旋转等变”通常指在 SO(3)/E(3) 变换下特征或输出按照已知的不可约表示规律变化。如果模型结构本身不编码这种对称性解决办法只能是对训练数据做随机旋转增强。但数据增强只是“见过更多姿态”并不能保证网络在任意姿态下都严格满足对称性。模型可能会用一些隐式的姿态捷径把某个朝向的输入记住导致在旋转到训练集覆盖不足的角度时出现明显误差。等变网络则通过约束网络内部的卷积核、消息传递权重和聚合函数把对称性直接写进模型架构中。这样即使某些角度从未出现在训练集里网络也会因为内建对称性而给出物理上自洽的结果。对于 cDFT 这个问题等变还有另一层含义密度场本身是一个随空间位置变化的标量场自由能是整个系统的标量属性。当外势场旋转时密度场会等变而积分后的自由能必须保持严格不变。这种层级化的对称性传递用普通 CNN 很难同时保证。1.4 “可迁移”如何理解经典 DFT 的应用者最关心的问题是模型能不能在“没训练过的外势、温度、尺寸”下继续给出合理结果。如果训练数据中全部是 1 nm 狭缝测试时却放进一个 3 nm 的圆柱孔模型表现就会大幅下降反过来如果训练数据的压力区间很窄模型的等温线外推也会不可靠。可迁移性并非网络天然具有的性质。它需要用合理的物理归纳偏置去换取。具体到工程实现上有三类做法训练数据覆盖尽可能宽的外势场、孔宽、温度和密度区间模型输入使用具有物理含义的局域描述符而不是使用手工二维图像的绝对坐标在损失函数中加入热力学一致性约束使模型预测结果不偏离已知的求和规则或密度边界条件。把可迁移性、等变性和三维经典 DFT 放在一起看本质上是在构建一个满足物理对称性的函数逼近器并用足够的参考数据让该逼近器在不同边界条件下保持正确。2. 问题形式化如何把经典 DFT 变成机器学习任务2.1 预测的目标是什么要训练一个机器学习模型替代经典 DFT首先得确定输入与输出。最常见的目标是直接学习“外势场 → 平衡密度场”的映射输入三维外势场 V_ext(r)外加温度或化学势等标量条件 输出三维平衡密度场 ρ(r)只要模型能够准确预测平衡密度就可以进一步通过后处理得到吸附量、密度剖面、界面张力等宏观性质。这种做法的好处是目标明确、数据容易从蒙特卡洛模拟或参考 DFT 求解器获得属于典型的监督学习任务。另一种更接近理论本身的方案是让网络学习超额自由能泛函 F_ex[ρ]。网络输入是任意一个密度场不一定是平衡密度场输出是一个标量自由能。得到 F_ex 的可微表达式后可以用自动微分计算 δF_ex/δρ(r)再结合理想气体项求解平衡方程。这样做更符合原始 DFT 框架对数据生成方式也要求更高因为训练时要有一组“任意密度 → 自由能”的标签这些标签往往需要热力学积分等复杂手段才能获取落地成本较高。从工程入门的视角建议先以“预测平衡密度分布”作为第一个跑通的任务。等数据生成、旋转等变性检查、迁移验证这套完整 pipeline 建立起来之后再考虑学习超额自由能泛函。2.2 密度场的两种表示方式三维密度场在计算机里不能直接当作连续函数处理工程上常见两种离散化表示。第一种是体素网格表示。把模拟盒子均匀剖分成 Nx × Ny × Nz 个格子每个格子记录该位置的密度值和外势值。这种表示可以直接套用 3D CNN写法直观而且能复用 GPU 上的卷积算子。但严格的旋转等变性在规则体素网格上比较难实现因为网格轴和外势方向的耦合关系会引入坐标轴偏好。如果只要求近似旋转等变可以给训练数据加多个旋转角度增强这是简单场景下的快捷方案。另一种是点云表示。把每个有物理意义的采样点坐标显式保留点的属性用特征向量表达。旋转整个系统时点坐标随之旋转与点位置绑定在一起的物理量不变。点云配合图神经网络或等变消息传递网络能天然处理非规则边界条件模拟盒子也不需要一定是正方体。缺点是需要额外处理邻域查询和消息传递工程复杂度更高。对于三维受限流体这类涉及复杂几何边界的问题点云表示往往更自然。因为外势场通常由边界形状决定边界形状不是规则立方体时点云式采样可以让模型把更多分辨率放在界面附近。2.3 输入规模与会话成本的预估一个普通的三维 DFT 模拟盒子如果取 64 × 64 × 64 的网格就有 262144 个网格点。如果目标是对每个网格点都输出密度值模型输出维度会达到 26 万以上。在 MLP 中直接输出这么高维的向量并不现实所以实际模型需要利用卷积或消息传递来共享权重。等变网络在点云上的计算量通常由点的数量和每个点邻居数量决定。比如每个点取 16 到 32 个邻居点通过局部邻域描述三维结构计算成本比全连接层低得多。还可以通过“只在局部高密度区域或靠近外势壁面的区域加密采样”的方式让整个问题的规模控制在 GPU 可接受的范围内。3. 环境准备与版本说明3.1 主要依赖本文涉及的实验环境以 Python 为主建议在 Linux 服务器或带有 NVIDIA GPU 的机器上运行。下面列出核心依赖Python 3.9 或更高版本PyTorch 2.xe3nn用于构建 E(3) 等变张量积层einops 或 torch_scatter用于批处理和点云聚合NumPy、SciPy用于数据预处理和旋转矩阵生成h5py 或 pytables用于保存大规模密度场数据。因为人工智能相关库的版本更新速度很快本文不会把代码绑定到某个不可变的固定版本。示例代码以 e3nn 0.5.x 系列接口为参考如果你安装的是更新版本个别模块的命名或调用参数可能略有变化建议以官方文档为准。3.2 安装命令参考在虚拟环境中安装conda create -n cdft python3.10 -y conda activate cdft conda install pytorch torchvision pytorch-cuda11.8 -c pytorch -c nvidia pip install e3nn einops h5py安装完 e3nn 后可以快速验证是否可用import torch from e3nn import o3 irreps o3.Irreps(4x0e 2x1e 1x2e) print(irreps) print(irreps.dim)如果打印出总共 4 6 5 15 个分量说明基础环境没有问题。3.3 硬件配置建议三维密度场的训练通常比普通图像分类任务更耗费显存尤其是点云消息传递会保存大量中间张量。建议至少使用 16 GB 显存。如果只有普通办公 GPU可以先用较小的网格分辨率比如 32 × 32 × 32 或更少点位的点云数据把整条代码链路跑通后再扩大数据规模。4. 核心建模等变网络如何编码三维密度场4.1 等变网络中的 Irreps 概念在学习等变网络代码之前需要先过一遍 e3nn 的核心抽象不可约表示irreps。对于旋转群 SO(3)向量空间可以分解为一系列不可约表示的直和每个不可约表示由阶数 l 决定l 0 对应标量l 1 对应三维向量l 2 对应五维张量以此类推。e3nn 使用一个简洁的字符串来描述这种结构。4x0e表示 4 个偶数标量通道2x1o表示 2 个奇偶校验的三维向量通道1x2e表示 1 个跃迁阶为 2 的偶数通道。物理上密度场是一个标量场所以初始输入通常是 0e 通道而坐标差对应的方向向量属于 1o 通道。等变网络的关键操作是张量积。两个不同阶的不可约表示通过张量积耦合后会按照 CG 系数重新组合成多个更高阶的输出。用一句话解释普通神经网络用矩阵乘法混合通道等变张量积用受群论约束的特定线性组合混合通道从而保证旋转对称性。4.2 以点云形式输入外势场我们采用这样的建模设定体系中的任意一点都能获得该点所处的外势值。要预测的是同一点的平衡密度值。因此网络输出是节点级标量场不涉及复杂的多层输出头。输入特征包含两部分节点特征该点的外势值和若干物理量比如到最近壁面的距离边特征当前点与邻居点之间的三维向量用于构造球谐函数。消息传递时每条边上的三维向量会先转换成球谐函数 Y_l(r_ij)再通过张量积与节点特征耦合。这样网络对三维空间方向的建模是旋转等变的。4.3 一个等变层的最小骨架下面的代码给出一个简化的等变消息传递层骨架。它不是某个完整论文的完整复现目的是演示 e3nn 中球谐构造、张量积和线性映射组合的基本结构。真正使用时需要配合邻域查询和消息聚合。import torch import torch.nn as nn from e3nn import o3 from e3nn.math import soft_one_hot_linears class EquivariantMessageLayer(nn.Module): def __init__(self, irreps_node, irreps_edge, irreps_out): super().__init__() # 输入节点特征与边上球谐特征的张量积 self.tp o3.FullyConnectedTensorProduct( irreps_in1irreps_node, irreps_in2irreps_edge, irreps_outirreps_out, shared_weightsTrue, ) def forward(self, node_feat, edge_sh, edge_attrs): # edge_attrs 可用来控制边距离对输出强度的影响 message self.tp(node_feat, edge_sh) return message在这个骨架中edge_sh是通过球谐函数得到的高阶角向特征。如果输入点云的邻域中有方向向量旋转整个坐标系时方向向量会相应旋转球谐特征也随之改变而经过完整张量积之后最终节点特征中的 0e 标量部分保持旋转不变1o 向量部分则按照向量规律协变从而整体满足等变约束。4.4 构造球谐函数边的步骤构造球谐边特征的代码大致如下仍然以接口示意为主from e3nn import o3 def build_edge_sh(edge_vector, max_l3): edge_unit edge_vector / edge_vector.norm(dim-1, keepdimTrue).clamp_min(1e-8) irreps_sh o3.Irreps.spherical_harmonics(max_l) sh o3.SphericalHarmonics(irreps_sh, normalizeTrue, normalizationcomponent) return sh(edge_unit)这段代码中max_l3表示使用到 p 轨道l1、d 轨道l2、f 轨道l3的球谐特征。球的阶数越高模型对方向细节的分辨能力越强同时特征维度和计算量也会增加。在实际项目中一个完整的等变网络由若干层这样的消息传递层堆叠而成。每一层的节点特征经过张量积、聚合、归一化和激活函数后进入下一层。由于特征本身包含不同阶的分量激活函数不能像普通 MLP 那样直接作用在张量上需要对每个阶使用基于范数的激活也就是 e3nn 中常见的 NormActivation 模块。4.5 预测密度并保证非负经典 DFT 中的密度分布必须是非负的。如果网络最后一层直接输出标量模型可能在某些空间位置预测出负密度这在物理上是不可接受的。常见的处理方式是在最后一层把标量输出做一次激活import torch.nn as nn class DensityHead(nn.Module): def __init__(self, irreps_in): super().__init__() self.linear o3.Linear(irreps_in, 1x0e) self.softplus nn.Softplus() def forward(self, x): scalar self.linear(x) return self.softplus(scalar)Softplus的输出恒大于零适合作为密度输出层。如果使用指数激活要注意数值稳定性防止输出过大。4.6 旋转等变性自检代码无论是自己实现的网络还是参考开源模型改造来的网络都应该有一个独立于训练过程的等变性测试。下面的代码使用一个旋转矩阵把点云坐标整体旋转再比较旋转前后的节点预测值。import torch def rotation_matrix_around_axis(axis, angle): axis axis / torch.linalg.norm(axis) x, y, z axis c torch.cos(angle) s torch.sin(angle) C 1 - c R torch.tensor([ [x*x*C c, x*y*C - z*s, x*z*C y*s], [y*x*C z*s, y*y*C c, y*z*C - x*s], [z*x*C - y*s, z*y*C x*s, z*z*C c] ]) return R def equivariance_check(model, pos, node_feat, edge_index, batch): model.eval() with torch.no_grad(): density_before model(pos, node_feat, edge_index, batch) axis torch.tensor([0.1, 0.7, 0.2]) R rotation_matrix_around_axis(axis, angletorch.tensor(1.23)).to(pos.device) rotated_pos torch.einsum(ij,nj-ni, R, pos) density_after model(rotated_pos, node_feat, edge_index, batch) max_error torch.max(torch.abs(density_before - density_after)) mean_error torch.mean(torch.abs(density_before - density_after)) return mean_error.item(), max_error.item(), density_before这段代码的前提是模型输出的是与点绑定的标量值而不是坐标空间中的密度网格值。对于逐点预测模型旋转后节点顺序不变、节点绑定的节点特征不变只是坐标旋转了因此预测密度在理想情况下应与旋转前完全一致。如果输出误差接近零说明模型具备旋转不变性测试通过的基本条件。如果模型输出的是整个系统的自由能则更简单直接比较旋转前后网络的标量输出是否一致。如果输出的是未经后处理的空间密度网格则还需要考虑网格坐标变换与插值代码会复杂得多。5. 训练数据生成与预处理5.1 使用参考 DFT 还是分子模拟训练数据质量决定了模型的最终上限。等变网络结构能保证对称性却无法自动修正错误的标签数据。对于经典 DFT 任务比较理想的标签来源有两类。第一类是参考求解器。如果你的研究体系已经有成熟的解析泛函比如硬球流体使用 FMT那么可以通过自洽求解生成大量“外势 → 平衡密度”样本。这种数据没有统计噪声边界条件清晰适合作为模型的预训练数据。第二类是分子模拟。对于含有真实分子间作用力的体系可以使用巨正则蒙特卡洛GCMC模拟得到体系在不同化学势、不同外势下的平衡密度剖面。GCMC 的优点是模型不会继承解析近似泛函的偏差但它计算量明显更大而且需要处理热涨落噪声在界面附近需要进行系综平均才能得到足够平滑的密度剖面。5.2 数据多样性设计为了让模型具备“可迁移”能力数据生成时不能只使用单一几何结构。推荐的做法是设计一组可控的参数化外势场改变壁面宽度或孔隙尺寸改变外势场的粗糙度例如加入正弦起伏、周期波纹改变体相化学势或温度改变流体粒子间相互作用参数。每个参数组合采样一至多个模拟帧。不要把同一模拟的多个高相关帧同时放入训练集和测试集否则会造成数据泄漏导致测试结果虚高。更严格的划分方式是按“外势参数 状态点”为单元划分训练集、验证集和测试集让同一几何构型的所有样本要么全在训练集要么全在测试集。5.3 点云化与邻域特征用点云表示三维结构时可以把模拟盒子中的网格点当作点云节点。靠近壁面的区域密度变化剧烈采样点需要密集一些远离壁面的体相区域密度变化平缓可以适当稀疏。实际项目里可以采用均匀网格加边界加密的策略。每个点需要保存的属性包括三维坐标、外势值、是否位于边界附近等。邻居点可以用 K 近邻或半径球查询获得。为了保证旋转等变性测试时可以无缝旋转邻域关系不应该依赖绝对坐标轴而是基于点之间的距离计算。这样整体旋转后邻域关系始终保持一致。5.4 数据标准化网络训练前需要对外势值和密度值做标准化处理。外势的绝对值在不同条件下可能相差很大直接送入网络会导致梯度更新不稳定。常见的做法是记录训练集的均值与标准差然后做归一化mean_v train_v mean_v torch.mean(train_x[potential]) std_v torch.std(train_x[potential]) x_input (potential - mean_v) / (std_v 1e-8)密度值则可以根据参考 DFT 解的范围缩放到 0 到 1 区间或者直接使用物理单位让 Softplus 输出接近标签尺度。不要忘记在数据处理脚本中独立保存标准化参数推理阶段加载模型时也要加载同一组参数。6. 训练与验证设计6.1 损失函数最基本的损失是密度场的均方误差loss_mse torch.mean((pred_density - target_density) ** 2)但仅使用 MSE 可能导致密度剖面整体平滑界面处的尖锐峰被平均掉。可以加入局部梯度项或界面权重让网络更关注密度变化剧烈的区域edge_weight 1.0 100.0 * (target_density 0.5).float() loss_total torch.mean(edge_weight * (pred_density - target_density) ** 2)另一种可选约束是体系总粒子数守恒。密度场在空间中的积分应该等于体系总粒子数如果训练过程中发现总粒子数误差过大可以考虑在损失函数中加入积分误差项pred_total torch.sum(pred_density * cell_volume) / batch_size target_total torch.sum(target_density * cell_volume) / batch_size loss_conserve (pred_total - target_total) ** 2 loss loss_mse 0.01 * loss_conserve实际系数需要根据标签尺度与噪声水平调整不能照抄。6.2 评估指标仅看训练集损失不足以保证模型质量。建议在每个 epoch 后计算以下指标测试集 RMSE反映整体预测误差界面附近 RMSE只统计外势梯度较大区域的预测误差总粒子数相对误差反映热力学积分约束是否成立等变残差随机旋转测试集后模型输出的误差。如果等变残差明显大于测试集 RMSE说明网络或预处理流程中存在坐标轴泄漏需要检查输入特征中是否包含了未归一化的绝对坐标。6.3 训练循环示意一个最小可用的训练循环如下省略邻域构建和批处理细节model EquivariantDFTNet(...) optimizer torch.optim.AdamW(model.parameters(), lr1e-3) scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max200) for epoch in range(200): model.train() total_loss 0.0 for batch in train_loader: optimizer.zero_grad() pred model(batch) loss compute_loss(pred, batch.y, batch) loss.backward() optimizer.step() total_loss loss.item() scheduler.step() print(fepoch {epoch:03d} loss {total_loss / len(train_loader):.6f})关键点是训练节点特征中的外势值会随状态点变化但归一化参数必须固定来自训练集不能每次在完整数据集上重新计算标准化参数否则会因为验证集信息混入训练过程而高估模型表现。6.4 可迁移性测试必须单独设计一个好的可迁移性测试应该模拟真实使用时的“分布外”情况。具体可以拆分几条测试路径。第一条是“状态点外推”训练时温度覆盖 100 K 到 300 K测试时使用 350 K 和 450 K看模型的密度剖面是否出现非物理振荡。第二条是“几何外推”训练时外势为平面狭缝测试时换成圆柱形孔道或者在狭缝中放入一个球形障碍物。这种情况下模型没有见过类似几何如果仍然能获得合理吸附等温线说明模型的局域描述符没有过拟合到特定孔的对称性上。第三条是“密度区间外推”训练集只包含低密度气相样本测试时预测高密度液相吸附。由于液相密度峰很高模型可能因为 Softplus 输出饱和而偏低测试结果能暴露网络容量或激活函数选择是否合理。7. 常见问题与排查思路训练三维经典 DFT 模型时会频繁遇到一些看起来奇怪的现象。下面以表格形式汇总常见的八类问题。问题现象可能原因解决思路训练 loss 不下降外势未归一化梯度被极个别样本主导对外势和密度做标准化检查输入尺度输出出现负密度输出层没有做非负约束最后一层改用 Softplus 或指数激活旋转网格后预测误差很大模型依赖了绝对坐标或原始网格轴影响卷积核改用点云等变网络禁止在输入中包含绝对坐标编码密度剖面整体偏平MSE 在界面区域权重太低加入界面区域权重或梯度损失总粒子数偏差大模型只学了局部密度没有约束全局积分加入总粒子数损失项训练集好、测试集差很多训练/测试划分时模拟帧发生了数据泄漏按外部参数单元划分数据而不是逐帧随机划分等变残差远大于测试误差数据预处理存在轴泄漏或模型包含非等变层对边向量、球谐构造、消息聚合做逐层调试显存不足邻居点数或批大小过大降低邻居数量、使用混合精度、减小批大小当等变残差不合格时一个高效的排查方法是把网络拆开单独测试线性层、球谐层、消息传递层。在 e3nn 中可以先固定所有节点特征与边向量对输入坐标施加旋转观察球谐特征的模长是否不变。如果球谐特征模长变化多半是因为边向量没有在旋转前归一化或构造方式有误。另一个常被忽略的问题是 batch 处理。点云中每个模拟盒子节点数可能不同很多代码会使用 batch 索引区分不同样本。如果旋转测试只旋转了坐标却没有同步调整 batch 中点的排序或邻接关系结果必然不对。常见的做法是在旋转前保存一份原始邻接关系或在预处理时确认邻接关系基于距离计算与坐标轴方向无关。8. 最佳实践与工程建议8.1 先做好理想体系再扩大数据量三维经典 DFT 数据集生成成本很高不建议一上来就盲目生成几百万条随机样本。更务实的路径是从一个解析 DFT 可以精确求解的硬球流体体系出发生成少量数据训练一个很小的等变网络先验证三点模型能够收敛生成的密度剖面与参考解趋势一致旋转测试通过。确认这三条成立后再逐步扩大外势几何的复杂度加入温度、化学势等状态点变化最后才考虑使用 GCMC 模拟数据。8.2 把理想气体项从神经网络里剥离如果目标是学习自由能泛函尽量不要把已知的理想气体贡献交给网络去黑箱拟合。机器学习方法适合学习的是难以解析推导的 F_ex[ρ]而 F_id[ρ] 部分使用解析公式即可。这样做有两个好处第一模型不用浪费参数去学习一个已知函数第二预测结果在低密度极限条件下会自动接近理想气体行为有助于提升可迁移性。8.3 用局部密度描述符提高样本效率经典 DFT 中外势对局部密度的影响具有一定截断范围。模型处理点云时应控制邻居搜索半径在物理相关长度内比如粒子直径的 2 到 5 倍。过大的邻居范围会引入大量无关信息降低模型在不同盒子尺寸之间的迁移能力过小的邻居范围又会让模型无法感知长程吸附作用。建议将邻域半径作为超参数在验证集上做小范围扫描。8.4 物理约束是网络结构之外的第二道保险等变性属于结构约束非负密度属于输出层约束。除此之外还可以利用解析关系设计辅助损失。例如对于硬壁面附近的密度接触点密度与外势场、化学势存在近似关系如果训练集中包含这种数据可以在损失中加入一个软约束项。这类约束不应过强主要作用是引导梯度进入正确的物理区域防止模型在早期学会非物理的局部关系。8.5 保存完整推理元数据把模型部署给其他同事使用时不能只保存一个权重文件。至少需要保存以下信息特征标准化参数均值、标准差邻居搜索半径密度输出激活方式训练时覆盖的温度、化学势范围等变测试时的旋转角度与误差。这些元数据可以直接写进配置文件中。只要配置文件与权重一起归档就能避免后期使用时“同一份权重在不同预处理下结果不一致”的问题。9. 下一步的实践路线对于想要动手上手的读者建议按以下顺序推进第一步用参考 DFT 或蒙特卡洛数据构造一个简单的三维硬球受限流体数据集外势只包含平面壁或球形腔网格控制在 32 或 64 个点。第二步用 e3nn 搭建一个最小的逐点预测等变模型并先完成旋转自检代码。不要急着追求高精度先把“旋转后预测一致”这件事做好。第三步观察不同外势几何下的密度剖面误差然后逐渐加入界面权重损失与总粒子数守恒项。第四步把训练好的模型放到一个完全陌生的外势上例如把平面狭缝换成波纹表面用测试结果评估真实可迁移性。等变学习与经典密度泛函的结合点本质上不是某个特定网络结构而是一套“把物理对称性编码进模型 把物理约束放进训练目标 用分布外测试检验可靠性”的方法论。希望这篇文章能帮你把三步串成一条可实践的技术路线。若有任何细节问题欢迎在评论区一起讨论后续我也会继续分享更多关于等变网络和三维密度泛函建模的调试笔记。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进