学习

训练通用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=[分子描述符]

    • RE [默认] ( 与平衡相关 )

      CM ( 库仑矩阵 )

      ID (逆核间距)

    • RE 描述符非常适合于单分子PES的精确描述。

      CM 是一种流行(但有些过时)的描述符,原则上也可以应用于不同的分子。在MLatom中,使用了 完整的CM (矢量化),而不是原文中使用的特征值。

      ID 是一种流行的反核间距描述符,用于许多ML模型,适用于单分子PES,类似于RE描述符。

  • 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优化超参数的方法:

  1. KRR模型(包括KREG和KRR-CM)的网格搜索

  2. 使用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=Gaussiankernel=Matern];

      5.0 [默认为 kernel=Laplaciankernel=exponential]

    • 核脊回归sigma=opt 参数一起使用。

  • lgSigmaH=[对σ进行对数网格优化时的最高log2 σ值]

    • 9.0 [默认为 kernel=Gaussiankernel=Matern];

      12.0 [默认为 kernel=Laplaciankernel=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

    • 必选

    • 请求在测试集上估计泛化误差。此参数不能与 createMLmodeluseMLmodel 一起使用。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

    • 可选的。

      需要使用的参数有 iTrainIniTestIn 和/或 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特有的一些参数。另请参阅 教程

deltaLearn

必选。应当与 createMLmodel useMLmodel MLmodelIn estAccMLmodel 中的某一个一起使用

Yb=[用基线方法获得的数据文件]

训练和预测都需要。

Yt=[用目标方法获得的数据文件]

仅训练时需要。

YestT=[目标方法的ML估计文件]

预测时需要。

YestFile=[ML对基线方法的校正文件]

预测时需要。

YgradXYZb=[基线XYZ梯度的文件]

可选的。

YgradXYZt=[目标XYZ梯度的文件]

可选的。

YgradXYZestT=[目标XYZ梯度的ML估计文件]

可选的。

YgradXYZestFile=[ML对基线XYZ梯度的校正文件]

可选的。

示例

mlatom estAccMLmodel deltaLearn XfileIn=x.dat Yb=UHF.dat Yt=FCI.dat YestT=D-ML.dat YestFile=corr_ML.dat

自校正

此处 为自校正的描述。可以与某个常用选项一起使用。下面介绍自校正特有的参数。另请参阅 教程

selfCorrect

必选。应当与 createMLmodel useMLmodel MLmodelIn estAccMLmodel 中的某一个一起使用

示例

mlatom estAccMLmodel selfCorrect XYZfile=xyz.dat Yfile=y.dat