学习
训练流行的ML模型
模型可以是MLatom自带的,也可以是第三方接口到流行的ML模型类型:
输入参数
createMLmodel
训练一个ML模型
XYZfile=[XYZ坐标输入文件]
无默认文件名
使用文件中提供的分子XYZ坐标数据集进行训练。坐标的单位是任意的,但是MLatom中的许多模拟需要以Å为单位。
Yfile=[带参考值的输入文件]
和/或YgradXYZfile=[带XYZ梯度参考值的输入文件]
可仅选择
Yfile
或同时选择两个参数。无默认文件名。
Yfile
通常是能量,如果打算使用该模型进行进一步的模拟,建议单位使用Hartree。YgradXYZfile
通常是能量梯度,其单位推荐使用Hartree/Å。 请注意,梯度是负的力,应使用适当的符号。 另外,请注意可以提供稀疏梯度,对于没有梯度的几何构型,YgradXYZfile
文件应该包含“0”,后跟空白行(参阅相关 教程)。
MLmodelOut=[带有训练后的模型的输出文件]
无默认文件名
将模型储存至用户定义的文件。如果存在同名文件,MLatom不会覆盖同名文件,而是终止运行。
MLmodelType=[支持的ML模型类型]
KREG
[默认];可用的模型类型及相应程序(MLatomF是本地程序):
+-------------+----------------+ | MLmodelType | default MLprog | +-------------+----------------+ | KREG | MLatomF | +-------------+----------------+ | sGDML | sGDML | +-------------+----------- ----+ | GAP-SOAP | GAP | +-------------+----------------+ | PhysNet | PhysNet | +-------------+----------------+ | DeepPot-SE | DeePMD-kit | +-------------+----------------+ | ANI | TorchANI | +-------------+----------------+
使用本地实现无需使用此参数。对于第三方模型,用户应提供
MLmodelType
和/或MLprog
参数(参阅 安装说明 )。注意,如需使用KRR-CM模型,必须手动选择描述符和算法细节。
MLprog=[支持的ML程序]
推荐使用
MLmodelType
而非此参数。默认支持的接口和测试过的ML模型类型:
+------------+----------------------+ | MLprog | MLmodelType | +------------+----------------------+ | MLatomF | KREG [default] | | | see | | | MLatom.py KRR help | +------------+----------------------+ | sGDML | sGDML [default] | | | GDML | +------------+----------------------+ | GAP | GAP-SOAP | +------------+----------------------+ | PhysNet | PhysNet | +------------+----------------------+ | DeePMD-kit | DeepPot-SE [default] | | | DPMD | +------------+----------------------+ | TorchANI | ANI [default] | +------------+----------------------+
使用本地实现无需使用此参数。对于第三方模型,用户应提供
MLmodelType
和/或MLprog
参数(参阅 安装说明 )。注意,如需使用KRR-CM模型,必须手动选择描述符和算法细节。
eqXYZfileIn=[平衡构型的XYZ坐标文件]
可选的。
默认情况下,尝试读取
eq.xyz
文件,如果没找到则使用数据集中能量最小的结构。仅可用于KREG模型来构建RE描述符
附加输出参数
YestFile=[Y估计值的输出文件]
这个参数是可选的,无默认值。
使用训练好的模型对整个数据集来预测Y值,并将其保存到请求的文件中。如果存在同名文件,MLatom不会覆盖同名文件,而是终止运行。
YgradXYZestFile=[估算的XYZ梯度文件]
这个参数是可选的,无默认值。
只能与XYZfile选项一起使用。 使用训练好的模型计算整个数据集的XYZ一阶导数,并将它们保存到请求的文件中。如果存在同名文件,MLatom不会覆盖同名文件,而是终止运行。
YgradEstFile=[估算的梯度输出文件]
这个参数是可选的,无默认值。
只能与XfileIN选项一起使用。 使用训练好的模型计算整个数据集的一阶导数,并将其保存到请求的文件中。如果存在同名文件,MLatom不会覆盖同名文件,而是终止运行。
备注
使用第三方程序进行计算也可能产生额外的输出文件。
TorchANI接口的附加选项
参数及其默认值:
|
批量大小 |
|
最大时间 |
|
触发提前停止的学习率 |
|
力权重 |
|
径向截止半径 |
|
角截止半径 |
|
径向部分的径向平滑度 |
|
径向部分的径向位移 |
|
角平滑度 |
|
角位移 |
|
角度部分的径向平滑度 |
|
角度部分的径向位移 |
|
第1层神经元数 |
|
第2层神经元数 |
|
第3层神经元数 |
|
第1层的激活函数 |
|
第2层的激活函数 |
|
第3层的激活函数 |
sGDML的附加选项
参数及其默认值:
|
使用GDML而非sGDML |
|
沿对称自由度压缩核矩阵 |
|
不预测能量 |
|
在核中包含能量约束 |
|
设置超参数sigma,详见sgdml create -h。 |
PhysNet的附加选项
参数及其默认值:
|
输入特征的数目 |
|
径向基函数的个数 |
|
堆叠模块的数量 |
|
细化各原子的残差模块数目 |
|
细化原消息的残差模块数目 |
|
输出模块中的残差模块数目 |
|
神经网络中交互的截止半径 |
|
随机种子 |
|
起始学习率 |
|
衰减步数 |
|
学习率的衰减率 |
|
训练批量大小 |
|
验证批量大小 |
|
力权重 |
|
汇总间隔 |
|
验证间隔 |
|
模型保存间隔 |
GAP和QUIP的附加选项
gapfit.xxx=x
xxx可以是gap_fit的任意选项(例如default_sigma
)。 注意,不需要设置at_file
和gp_file
.gapfit.gap.xxx=x
xxx可以是gap的任意选项。
参数及其默认值:
|
能量、力、维里和黑塞的超参数sigma |
|
测定e0的方法 |
|
描述符类型 |
|
角度基函数的最大数目 |
|
径向基函数的最大数目 |
|
原子密度Gaussian拖尾的超参数 |
|
内核敏感度的超参数 |
|
局部环境的截止半径 |
|
截止过渡宽度 |
|
核缩放的超参数delta |
DeePMD-kit的附加选项
deepmd.xxx.xxx=X
指定DeePMD的参数,遵循DeePMD的json输入文件的结构。
例如
deepmd.training.stop_batch=N
等价于
{
...
"training": {
...
"stop_batch": N
...
}
...
}
在DeePMD-kit的json输入文件中。此外, deepmd.input=S
选项将输入的json文件 S
作为一个模板。最终的输入文件将在此基础上生成 deepmd.xxx.xxx=X
选项(如果有的话)。请查看默认模板文件 bin/interfaces/DeePMDkit/template.json
的默认值。
示例
请参阅训练KREG模型的 教程
这里我们展示了如何在乙醇的势能面上训练ANI模型(仅训练能量)。 ethanol_geometries.xyz
, ethanol_energies.txt
在MLatom中,除KREG模型外,其他种类的模型都需要指定MLmodelType。其输入很简单:
createMLmodel # Specify the task for MLatom
MLmodelType=ANI # Specify the model type
XYZfile=ethanol_geometries.xyz # File with XYZ geometries
Yfile=ethanol_energies.txt # File with reference energies
训练通用ML模型
MLatom可以为任何具有输入向量X和参考标签Y的通用数据集训练核脊回归(KRR)模型,支持多种核函数。但使用MLatom中可用的 流行ML模型 更方便。
所需参数
以下是必需的参数,但通常需要更多的选项,例如,选择分子描述符和算法超参数,如下所示。
createMLmodel
训练一个ML模型
目前仅支持KRR模型。
XYZfile=[带XYZ坐标的输入文件]
或XfileIn=[带输入向量X的输入文件]
这两个选项只能选择其中一个。
无默认文件名。
XYZfile
:在带有许多分子的数据集上进行训练,这些分子的XYZ坐标提供在文件中。坐标的单位可以是任意的,但是MLatom中的许多模拟需要以Å为单位。XfileIn
:在具有许多输入向量(文本文件中每行为一个输入向量)的数据集上进行训练,这些输入向量通常是分子描述符。
Yfile=[带参考值的输入文件]
和/或YgradXYZfile=[带XYZ梯度参考值的输入文件]
可仅选择其中一个或同时选择两个参数。
无默认文件名。
Yfile
通常是能量,如果打算使用该模型进行进一步的模拟,建议单位使用Hartree。YgradXYZfile
通常是能量梯度,其单位推荐使用Hartree/Å。 请注意,梯度是负的力,应使用适当的符号。 另外,请注意可以提供稀疏梯度,对于没有梯度的几何构型,YgradXYZfile
文件应该包含“0”,后跟空白行(参阅相关 教程)。
MLmodelOut=[带有训练后的模型的输出文件]
无默认文件名
将模型保存到用户定义的文件中,通常使用
.unf
扩展名。如果该文件已经存在,MLatom不会覆盖文件,而是直接终止。
分子描述符参数
如果用户只提供带有 XYZfile
参数的XYZ文件,则需要首先将XYZ坐标转换为分子描述符。
molDescriptor=[分子描述符]
molDescrType=[分子描述符的类型]
unsorted
[RE的默认值]sorted
[CM的默认值]permuted
(可选,RE和CM均可用)unsorted
描述符是原始的描述符,但它们不能保证同核原子的排列不变性。sorted
描述符确保排列不变性,通常用于CM描述符(其中CM按其规范排序)。在正则描述符的情况下,排序是由核排斥完成的。它可以用于 基于结构的采样 ,但在插值中引入了不连续性,不应用于模拟。相关选项:XYZsortedFileOut
,permInvGroups
,permInvNuclei
。请参见 相关教程 。permuted
使用用户定义原子的排列来扩充描述符。相关参数:permInvKernel
,permInvGroups
,permInvNuclei
。请参见 相关教程 。
XYZsortedFileOut=[带有有序XYZ坐标的输出文件]
可选的。
仅可与
molDescriptor=RE molDescrType=sorted
一起使用。按核斥力对选定的原子进行排序后,保存带有XYZ坐标的文件。按核斥力对选定的原子进行分类并打印。
permInvNuclei=[置换不变的原子核]
可选的。
应与
molDescrType=permuted
(通常还有permInvKernel
)一起使用例如,
permInvNuclei=2-3.5-6
会改变原子2,3和6,7的排列。请参见 相关教程 。
permInvGroups=[置换不变群]
可选的。
应与
molDescrType=permuted
(通常还有permInvKernel
)一起使用例如,对于水二聚体
permInvGroups=1,2,3-4,5,6
通过翻转二聚体中的单体产生排列原子指数。
附加输出参数
YestFile=[Y估计值的输出文件]
这个参数是可选的,无默认值。
使用训练好的模型对整个数据集来预测Y值,并将其保存到请求的文件中。如果存在同名文件,MLatom不会覆盖同名文件,而是终止运行。
YgradXYZestFile=[估算的XYZ梯度文件]
这个参数是可选的,无默认值。
只能与XYZfile选项一起使用。 使用训练好的模型计算整个数据集的XYZ一阶导数,并将它们保存到请求的文件中。如果存在同名文件,MLatom不会覆盖同名文件,而是终止运行。
YgradEstFile=[估算的梯度输出文件]
这个参数是可选的,无默认值。
只能与XfileIN选项一起使用。 使用训练好的模型计算整个数据集的一阶导数,并将其保存到请求的文件中。如果存在同名文件,MLatom不会覆盖同名文件,而是终止运行。
示例
在这里,我们展示了如何用核脊回归训练一个简单的 H2 解离曲线模型。
下载 R_20.dat
文件,文件包含 H2 分子核间距(单位为Å)对应的20个点。
下载20点以上的Full CI能量文件 E_FCI_20.dat
(用aug-cc-pV6Z基组计算,单位为Hartree)。
使用上述数据(训练集)训练(选项 createMLmodel
)ML模型并将其储存至一个文件中(选项 MLmodelOut=mlmod_E_FCI_20_overfit.unf
),使用以下命令使其进行核脊回归拟合,高斯核函数和超参数 σ=10-11 和 λ=0 :
mlatom createMLmodel MLmodelOut=mlmod_E_FCI_20_overfit.unf XfileIn=R_20.dat Yfile=E_FCI_20.dat kernel=Gaussian sigma=0.00000000001 lambda=0.0 sampling=none > create_E_FCI_20_overfit.out
在输出文件 create_E_FCI_20_overfit.out
中可以看到,对于训练集来说,创建的ML模型的误差基本上为零。选项 sampling=none
确保训练点的顺序与原始数据集中的顺序保持一致(对于创建这个ML模型并不重要,但之后会很有用)。你可以使用已创建的ML模型(选项 useMLmodel
MLmodelIn
)计算其训练集的能量,并保存到 E_ML_20_overfit.dat
文件中:
mlatom useMLmodel MLmodelIn=mlmod_E_FCI_20_overfit.unf XfileIn=R_20.dat YestFile=E_ML_20_overfit.dat debug > use_E_FCI_20_overfit.out
现在你可以将参考FCI值与ML预测值进行比较,可以看到它们是相同的。选项 debug
还将回归系数alpha的值打印到输出文件 use_E_FCI_20_overfit.out
。你可以将它们与参考FCI能量进行比较,对比将会发现它们完全相同(它们与训练点的顺序相同)。
现在尝试用ML模型根据任何其他核间距来计算训练集中没有的能量,可以看到预测结果为零。这是由于超参数的选择,机器学习模型过拟合,不能很好地泛化到新的情况。因此,强烈建议对超参数进行优化。
超参数优化
尽管许多模型可能已经具有合理的超参数,并且/或默认情况下会优化其超参数,但通常情况下,优化超参数是很有必要的。下面描述了两种主要不同的使用MLatom优化超参数的方法:
KRR模型(包括KREG和KRR-CM)的网格搜索
使用hyperopt进行优化。网格搜索适用于少量超参数(一个或两个),且非常稳健;使用hyperopt进行优化不能保证找到良好的超参数,但更加灵活。
参数
优化目标是最小化验证误差。为此,训练数据集必须分成子训练集和验证集。
minimizeError=[要最小化的验证误差的类型]
RMSE
[默认]MAE
Nsubtrain=[子训练点的数量或训练点的一小部分]
默认是训练集的80%。如果参数是一个小于1的十进制数,那么它被认为是训练集的一小部分。
可以使用
sampling
参数使用 常见的采样方法 进行采样。默认是随机采样。
Nvalidate=[验证点的数量或训练点的一小部分]
默认情况下是训练集减去子训练点后的剩余点。如果参数是一个小于1的十进制数,那么它被认为是训练集的一小部分。
可以使用
sampling
参数使用 常见的采样方法 进行采样。默认是随机采样。
CVopt
可选的。
相关选项
NcvOptFolds
N倍交叉验证误差。默认情况下,使用5次交叉验证。
NcvOptFolds=[CV的折叠数]
5
[默认]只可与
CVopt
一起使用。若该值等于数据点的数量,将使用留一法进行交叉验证。
交叉验证只能使用随机抽样或不进行抽样。
LOOopt
可选的。
留一法交叉验证。
只能使用随机抽样或不进行抽样。
iCVoptPrefOut=[带有CVopt索引的文件前缀]
可选的。
无默认前缀。
文件名将包含要求的前缀。
Nuse=[要使用的数据集文件的第N个条目]
100% [默认];
可选的。
有时,只使用数据集的一部分进行测试是有用的。
核脊回归模型的网格搜索
在对数网格上执行网格搜索。在第一次迭代中找到最佳参数后,MLatom可以执行更多次对数网格搜索的迭代。这个选项仅用于KRR的λ和/或σ超参数。
lgOptDepth=[对数搜索的深度]
3
[默认]通常,深度为1或2就足够了,且速度更快。选择深度为3则更保险。
NlgLambda=[对数网格(以2为底)上的点数:对λ进行优化]
6
[默认]与 核脊回归 和
lambda=opt
参数一起使用
lgLambdaL=[对λ进行对数网格优化时的最低log2 λ值]
-35.0
[默认]与 核脊回归 和
lambda=opt
参数一起使用
lgLambdaH=[对λ进行对数网格优化时的最高log2 λ值]
-6.0
[默认]与 核脊回归 和
lambda=opt
参数一起使用
NlgSigma=[对σ进行优化时的对数网格(以2为底)上的点数]
6
[默认]与 核脊回归 和
sigma=opt
参数一起使用。
lgSigmaL=[对σ进行对数网格优化时的最低log2 σ值]
6.0
[默认为kernel=Gaussian
和kernel=Matern
];5.0
[默认为kernel=Laplacian
和kernel=exponential
]与 核脊回归 和
sigma=opt
参数一起使用。
lgSigmaH=[对σ进行对数网格优化时的最高log2 σ值]
9.0
[默认为kernel=Gaussian
和kernel=Matern
];12.0
[默认为kernel=Laplacian
和kernel=exponential
]
on-the-fly
默认不使用。
可选的。
验证时核矩阵元素的即时计算,默认情况下为false,这些元素会被存储以加快计算速度
使用hyperopt进行优化
使用hyperopt进行优化需要 安装 hyperopt 软件包。该软件包使用基于贝叶斯方法的树结构帕尔森估计器(TPE)提供了对优化问题的一般解决方案。
[要优化的超参数的参数名称,例如,sigma]=hyperopt.uniform(lb,ub)
或[要优化的超参数的参数名称,例如,sigma]=hyperopt.loguniform(lb,ub)
或[要优化的超参数的参数名称,例如,sigma]=hyperopt.qunifrom(lb,ub,q)
无默认值
下界
lb
,上界ub
。hyperopt.uniform(lb,ub)
:线性搜索空间。hyperopt.loguniform(lb,ub)
:对数搜索空间,以2为底。hyperopt.qunifrom(lb,ub,q)
:离散线性空间,被q
舍入。
hyperopt.max_evals=[最大尝试次数]
8
[默认]通常需要进行几百甚至几千次评估。
hyperopt.losstype=[多个参考性质的损失类型]
geomean
[默认]weighted
(和hyperopt.w_grad
一起使用)geomean
使用不同性质(通常是能量和力)损失的几何平均值。weighted
目前只需要定义力的权重(负XYZ梯度)
hyperopt.w_grad=[XYZ梯度的权重]
0.1
[默认]应当与
hyperopt.losstype=weighted
一起使用。
hyperopt.points_to_evaluate=[xx,xx,...],[xx,xx,...],...
可选的,无默认值。
在自动搜索之前指定初始猜测,每个方括号内的点应按顺序包含要优化的所有值。这些计算不计入 max_evals。
示例
两个经典例子:
mlatom createMLmodel XYZfile=CH3Cl.xyz Yfile=en.dat MLmodelOut=CH3Cl.unf sigma=opt kernel=Matern
mlatom estAccMLmodel XYZfile=CH3Cl.xyz Yfile=en.dat sigma=hyperopt.loguniform(4,20)
评估ML模型:
MLatom可以评估ML模型,即估计其泛化误差。为此,总数据集应分为训练集和测试集。ML模型可以像往常一样进行训练(使用 通用模型 或 流行模型),也可以提供 MLmodelIn
参数。如果对模型进行了训练,用户可以选择训练模型所需的参数。以下提供了该功能的参数。
此外,MLatom可以计算学习曲线(测试误差与训练集的数量)。
参数
estAccMLmodel
必选
请求在测试集上估计泛化误差。此参数不能与
createMLmodel
或useMLmodel
一起使用。ML模型可以像通常一样训练,使用 通用模型 或 流行模型 。或者可以使用MLmodelIn
参数提供ML模型。
Ntrain=[子训练点的数量,或训练点的一小部分]
默认为总数据集的80%。如果参数是小于1的小数,则被视为总数据集的一小部分。
可以使用
sampling
参数使用 常见的采样方法 进行采样。默认是随机采样。
Ntest=[验证点的数量,或训练点的一小部分]
默认情况下,总数据集减去训练点后的剩余点。如果参数是小于1的小数,则被视为总数据集的一小部分。
可以使用
sampling
参数使用 常见的采样方法 进行采样。默认是随机采样。
CVtest
可选的。
相关的选项
NcvOptFolds
N倍交叉验证误差。默认情况下,使用5次交叉验证。
NcvTestFolds=[CV的折叠数]
5
[默认]只可与
CVopt
一起使用。若该值等于数据点的数量,将使用留一法进行交叉验证。交叉验证只能使用随机抽样或不进行抽样。
LOOtest
可选的。
留一法交叉验证。只能使用随机抽样或不进行抽样。
learningCurve
应与
lcNtrains
参数一起使用生成学习曲线。此选项在
learningCurve
目录中生成以下输出文件:results.json
包含所有结果的JSON数据库文件lcy.csv
包含值的结果的CSV数据库文件lcygradxyz.csv
包含XYZ梯度结果的CSV数据库文件lctimetrain.csv
包含训练时间的CSV数据库文件lctimepredict.csv
包含预测时间的CSV数据库文件
lcNtrains=[N,N,N,...,N 训练集的大小]
如果使用
learningCurve
则需要使用此参数
lcNrepeats=[N,N,N,...,N 每个Ntrain的重复数]
或lcNrepeats=[N,N,N,...,N 所有Ntrains的重复数]
3
[默认]需要得到误差条
Nuse=[要使用的数据集文件的第N个条目]
100% [默认];
可选的。
有时,只使用数据集的一部分进行测试是有用的。
sampling=user-defined
可选的。
需要使用的参数有
iTrainIn
,iTestIn
和/或iCVtestPrefIn
iTrainIn=[带有训练点索引的文件]
可选的。
无默认文件名。
iTestIn=[带有测试点索引的文件]
可选的。
无默认文件名。
iCVtestPrefIn=[带有CVtest索引的文件前缀]
可选的。
无默认文件名。
MLmodelIn=[带有ML模型的文件]
可选的。
无默认文件名。
请求读取ML模型的文件
iTrainOut=[带有训练点索引的文件]
可选的。
无默认文件名。
为训练集生成索引。
iTestOut=[带有测试点索引的文件]
可选的。
无默认文件名。
为测试集生成索引。
iSubtrainOut=[带有子训练点索引的文件]
可选的。
无默认文件名。
生成子训练集的索引。
iValidateOut=[带有验证点索引的文件]
可选的。
无默认文件名。
为验证集生成索引。
iCVtestPrefOut=[带有CVtest索引的文件前缀]
可选的。
无默认文件名。
文件名将包含要求的前缀。
示例
简单示例:
mlatom estAccMLmodel XYZfile=CH3Cl.xyz Yfile=en.dat sigma=opt lambda=opt
学习曲线的示例:
mlatom learningCurve Yfile=y.dat XYZfile=xyz.dat kernel=Gaussian sigma=opt lambda=opt lcNtrains=100,250,500,1000,2500,5000,10000 lcNrepeats=64,32,16,8,4,2,1
使用此命令, lcNtrains
中列出的训练集大小将分别重复测试64,32,16,8,4,2,1次。生成的所有数据(包括csv输出)将存储在当前目录下的learningCurve文件夹中。
Δ-learning
Δ-machine learning 可以与某个常用选项一起使用。下面介绍Δ-learning特有的一些参数。另请参阅 教程 。
|
必选。应当与 |
|
训练和预测都需要。 |
|
仅训练时需要。 |
|
预测时需要。 |
|
预测时需要。 |
|
可选的。 |
|
可选的。 |
|
可选的。 |
|
可选的。 |
示例
mlatom estAccMLmodel deltaLearn XfileIn=x.dat Yb=UHF.dat Yt=FCI.dat YestT=D-ML.dat YestFile=corr_ML.dat
自校正
此处 为自校正的描述。可以与某个常用选项一起使用。下面介绍自校正特有的参数。另请参阅 教程 。
|
必选。应当与 |
示例
mlatom estAccMLmodel selfCorrect XYZfile=xyz.dat Yfile=y.dat