MACE偶极与极化率联合训练
训练AtomicDielectricMACE,正确设置标量向量张量读出,读取完整极化率并做旋转测试。
阅读本篇目录
极化率描述偶极对弱电场的响应,具有方向性。本例用H₂O真实CP2K线性响应标签训练 AtomicDielectricMACE,同时预测偶极向量和分子极化率3×3张量。名称中的Dielectric不意味着直接得到宏观材料介电常数。
1 下载并先看结果#
下载本组完整输入、真实DFT标签、三个教学模型、轨迹和绘图脚本。
python3 -m zipfile -e mace-response-practical-wave315-*.zip .
cd mace-response-practical
bash run.sh
bash run.sh从保存的数值生成results/figures/下五张图,不重复DFT、训练或MD。以下Python操作在mace/0.3.16环境中执行;推断、训练与动力学请在已分配的计算资源内运行,登录节点用于编辑和提交。
module purge
module load mace/0.3.16
bash run.sh evaluate
python - <<'PYCODE'
import numpy as np
d = np.load('results/test/PREDICTIONS.npz')
print(d['geometry_ids'])
print(d['dielectric_polarizability_A3'])
PYCODE
2 极化率标签是什么#
每个构型的REF_polarizability是完整3×3、单位ų,REF_dipole是三个分量、单位e·Å。数据源与有限场差分见标签教程。训练保留原生张量的微小数值不对称;模型表征为对称二阶张量,对比时仍使用未修改的原始标签。
构型5(0.96 Å、104°)的真实DFT参考张量约为:
alpha [A^3] =
1.1893882635 2.98e-9 -4.29e-10
2.996e-9 0.6920594778 4.762e-9
-5.831e-10 -4.622e-10 0.9767916923
这里是孤立分子的电子静态极化率。不能直接把这些ų数字当成无量纲介电常数,也不能仅用三个对角训练后声称已验证所有旋转方向。
3 完整YAML与提交命令#
train_file: ../../data/train.xyz
valid_file: ../../data/valid.xyz
energy_key: REF_energy
forces_key: REF_forces
dipole_key: REF_dipole
polarizability_key: REF_polarizability
charges_key: REF_charges
total_charge_key: REF_total_charge
E0s: average
batch_size: 5
valid_batch_size: 3
max_num_epochs: 200
default_dtype: float64
seed: 20261108
ema: true
ema_decay: 0.99
swa: false
num_workers: 0
device: cuda
log_dir: logs
model_dir: models
checkpoints_dir: checkpoints
results_dir: results
lr: 0.005
weight_decay: 5.0e-10
config_type_weights: '{''Water'':1.0}'
r_max: 4.0
hidden_irreps: 16x0e+16x1o+16x2e
MLP_irreps: 16x0e+16x1o+16x2e
num_interactions: 2
correlation: 2
max_ell: 2
max_L: 2
clip_grad: 10.0
patience: 200
scheduler_patience: 30
eval_interval: 1
save_cpu: true
compute_stress: false
name: water-dielectric
model: AtomicDielectricMACE
loss: dipole_polar
error_table: DipolePolarRMSE
dipole_weight: 100.0
polarizability_weight: 100.0
energy_weight: 1.0
forces_weight: 10.0
compute_polarizability: true
compute_atomic_dipole: true
num_radial_basis: 8
num_cutoff_basis: 5
MLP_irreps: 16x0e+16x1o+16x2e同时提供标量、偶极向量和二阶张量表示;不要直接复用纯偶极的16x1o读出。loss: dipole_polar和compute_polarizability: true与训练模型类型配套。
sbatch train.slurm dielectric
# 完成后
ls work/train/dielectric/models
实际训练在P100完成200轮,用10个训练、3个验证构型;3个独立测试始终未传入训练。train.slurm调用的原生命令仍是mace_run_train --config train.yml。
4 用正确的计算器读取完整张量#
python - <<'PYCODE'
import numpy as np
from ase.io import read
from mace.calculators import MACECalculator
a = read('qualified/data/test.xyz', index=0)
for key in list(a.info):
if key.startswith('REF_'): del a.info[key]
for key in list(a.arrays):
if key.startswith('REF_'): del a.arrays[key]
a.set_initial_charges(np.zeros(len(a)))
a.calc = MACECalculator(model_paths='models/dielectric.model',
model_type='DipolePolarizabilityMACE', device='cpu', default_dtype='float64')
print('mu [e A]:', a.get_dipole_moment())
alpha = np.asarray(a.calc.get_property('polarizability', a)).reshape(3, 3)
print('alpha [A^3]:', alpha)
print('isotropic alpha [A^3]:', np.trace(alpha) / 3)
PYCODE
np.trace(alpha)/3给分子取向平均的各向同性极化率;它不是所有方向分量相同的证明。原生mace_eval_configs主要面向标准能量/力导出,本组属性使用带明确model_type的ASE接口,输出脚本也完整包含在附件。
5 实际独立测试结果#

| 独立测试量 | 本例数值 |
|---|---|
| 整分子偶极向量RMSE | 0.02028352057 Debye |
| 完整张量相对Frobenius误差 | 1.0735711403% |
张量误差按全部3个测试构型、全部9个分量计算norm(pred-reference)/norm(reference);图中对角仅便于阅读,原始NPZ保留全部分量。没有通过能量平移、张量重标定或测试集调参修改结果。
刚体旋转R应满足alpha_new=R@alpha_old@R.T,总偶极则满足mu_new=R@mu_old。附件实际逐构型检查完整旋转张量、平移不变性和正特征值。CPU/P100极化率最大绝对差约4.44×10⁻¹⁶ ų。
这个模型没有能量与力,不能直接做MD。若要估计IR或Raman,需要另外有可靠的运动轨迹、足够采样和相应相关函数;本例的静态标签与短时接口示例不能代替光谱计算。