====== Parameter details ====== 本节介绍了所有模型中可由用户定义的参数,可以分为必要参数和高级参数两类。必要参数需要用户指定,高级参数采用了默认值,用户可以在 json 文件中根据需求手动修改。在下面的参数中,“相对路径(relative path)” 表示相对于当前工作目录的路径,而 “绝对路径(absolute path)” 表示从根目录开始的文件或目录的完整路径。 ===== 必要参数 ===== 对于任何模型,以下参数需要用户输入。 **model_type** 该参数用于指定用于训练的模型类型。您可以使用**LINEAR**模型,**NN**模型,或者**DP**模型。 **atom_type** 该参数用于设置训练体系的元素类型。用户可以按照任意顺序指定元素的原子序数。例如,对于单元素系统如铜,可以设置为 [29],而对于多元素系统如 CH4,则可以设置为 [1, 6]。 **max_neigh_num** 最大邻居数,其默认值为**100**。然而,对于某些系统来说,这个值可能不足以容纳所有的邻居,导致特征生成失败。在这种情况下,将会弹出以下警告信息: Error! maxNeighborNum too small 在这种情况下,调大该值。 **train_movement_file** 该参数用于指定**训练**任务的 MOVEMENT 文件所在的路径。您可以使用相对路径或绝对路径。 **test_movement_file** 该参数用于指定**测试**任务的 MOVEMENT 文件所在的路径。您可以使用相对路径或绝对路径。它应该与**model_load_file**参数一同指定。 **model_load_file** 该参数用于指定用于**测试**任务的模型所在的路径。它应该与**test_movement_file**参数一同指定。 ===== 高级参数 ===== 用户只需要设置必要参数即可完成模型的训练、测试和相关分子动力学过程。相应的高级参数,如模型超参数和优化器超参数,将被设置为默认值。这些高级参数也可以在 json 文件中进行设置。 **train_valid_ratio** 该参数指定训练集与验证集的比例。例如,0.8 表示将 MOVEMENT 中前 80% 的 images 作为训练集,剩余的 20% 作为验证集。默认值为 ''%%0.8%%''。 **recover_train** 该参数用于从中断的 DP 或 NN 训练任务中恢复训练。默认值为 ''%%false%%''。 **work_dir** 该参数用于设置执行训练、测试和其他任务的工作目录。它可以设置为绝对路径或相对路径。默认值是相对路径''%%./work_dir%%''。 **reserve_work_dir** 该参数用于指定在任务执行完成后是否保留工作目录 **work_dir**。默认值为 False,意味着在执行完成后该目录将被删除。 ==== model 参数 ==== 该参数用于指定模型的参数,包括**描述符(descriptor)** 和 **拟合网络(fitting_net)** 两个部分。对于线性模型,则不需要指定拟合网络和优化器。 === Linear model === Linear 模型的完整参数设置如下: "model": { "descriptor": { "Rmax": 6.0, "Rmin": 0.5, "feature_type": [3,4] } } **Rmax** 特征的最大截断半径。默认值为 $6.0 \text{\AA}$。 **Rmin** 特征的最小截断半径。默认值为 $0.5 \text{\AA}$。 **feature_type** 该参数用于特征类型,与**NN 模型**中的设置相同。支持的选项有[1, 2]、[3, 4]、[5]、[6]、[7]和[8]。默认值为[3, 4],即 2-b 和 3-b 高斯特征。有关不同特征类型的更详细信息,请参考[[Appendix-1|附录]]。 === NN model === NN 模型的完整参数设置如下: "model": { "descriptor": { "Rmax": 6.0, "Rmin": 0.5, "feature_type": [3,4] }, "fitting_net": { "network_size": [15,15,1] } } **Rmax** 特征的最大截断半径。默认值为 $6.0 \text{\AA}$。 **Rmin** 特征的最小截断半径。默认值为 $0.5 \text{\AA}$。 **feature_type** 该参数用于特征类型。支持的选项有[1, 2]、[3, 4]、[5]、[6]、[7]和[8]。默认值为[3, 4],即 2-b 和 3-b 高斯特征。有关不同特征类型的更详细信息,请参考[[Appendix-1|附录]]。 **network_size** 该参数用于拟合网络(fitting_net)的结构。默认值为[15, 15, 1],其结构如下所示: 输入层(输入数据维度)➡ 隐藏层 1(15 个神经元)➡ 隐藏层 2(15 个神经元)➡ 输出层(1 个神经元) === DP model === DP 模型的完整参数设置如下: "model": { "descriptor": { "Rmax": 6.0, "Rmin": 0.5, "M2": 16, "network_size": [25,25,25] }, "fitting_net": { "network_size": [50,50,50,1] } } **Rmax** DP 模型中平滑函数的最大截断半径。默认值为 $6.0 \text{\AA}$。 **Rmin** DP 模型中平滑函数的最小截断半径。默认值为 $0.5 \text{\AA}$。 **M2** 该参数用于 DP 模型中的网络,确定嵌入网络的输出大小和拟合网络的输入大小。在示例中,嵌入网络的输出大小为(25 X 16),拟合网络的输入大小为(25 X 16 = 400)。默认值为 16。 **network_size** 该参数用于嵌入网络(embedding_net)和拟合网络(fitting_net)的结构。默认值分别为[25, 25, 25]和[50, 50, 50, 1]。对应的网络结构如下所示: 嵌入网络的结构: 输入层(输入数据维度)➡ 隐藏层 1(25 个神经元)➡ 隐藏层 2(25 个神经元)➡ 输出层 3(25 个神经元) 拟合网络的结构: 输入层(M2 X 25)➡ 隐藏层 1(50 个神经元)➡ 隐藏层 2(50 个神经元)➡ 隐藏层 3(50 个神经元)➡ 输出层(1 个神经元) ==== optimizer 优化器 ==== 可用于训练 DP 或 NN 模型的优化器,有**KF(Kalman Filter)优化器**和**ADAM 优化器**。 === KF optimizer === KF 优化器的完整参数设置如下: "optimizer": { "optimizer": "LKF", "epochs": 30, "batch_size": 1, "print_freq": 10, "block_size": 5120, "kalman_lambda": 0.98, "kalman_nue": 0.9987, "train_energy": true, "train_force": true, "train_ei": false, "train_virial": false, "train_egroup": false, "pre_fac_force": 2.0, "pre_fac_etot": 1.0, "pre_fac_ei": 1.0, "pre_fac_virial": 1.0, "pre_fac_egroup": 0.1 } **optimizer** 该参数用于指定优化器名称,可用选项有**LKF**或**GKF**。关于优化器的详细信息[[https://doi.org/10.1609/aaai.v37i7.25957|参考文章]],其中提供了有关优化器实现和特性的更深入的细节说明。 **epochs** 该参数用于指定训练的轮数(epochs)。在机器学习中,一个 epoch 指的是整个训练数据集通过神经网络的完整传递,包括前向传播和反向传播。在每个 epoch 中,训练数据集分为多个 **小批量(mini-batches)** 样本,之后把每个批次输入到神经网络,进行前向传播、损失计算和参数更新的反向传播过程。训练的轮数决定了整个训练数据集在训练过程中被处理的次数。默认值为 30。 通常需要通过调试和评估训练过程来选择适当的训练轮数。如果训练轮数过小,模型可能无法充分学习数据集的模式和特征,导致欠拟合。另一方面,如果训练轮数过大,模型可能会过拟合训练数据,在新数据上的泛化性能下降。 **batch_size** 批大小(batch size)参数确定了在每个 epoch 的训练过程中,每个小批量(mini-batch)中包含的训练样本数量。默认值为 1。 **print_freq** 该参数用于指定没经过多少个**小批量**迭代之后打印一次训练误差。默认值为 10。 **block_size** 该参数是**LKF 优化器**的超参数,用于指定协方差矩阵 P 的块大小。较大的块大小会增加内存和 GPU 内存的消耗,导致训练速度较慢,而较小的块大小会影响收敛速度和准确性。默认值为 5120,如果是在 A100、H100 等高端显卡上,建议设置为 10240。 **kalman_lambda** 该参数是**LKF 和 GKF 优化器**的超参数,称为记忆因子(memory factor)。它决定了对先前数据的权重或关注程度。值越大,越重视先前的数据。默认值为 0.98。 **kalman_nue** 该参数是**LKF 和 GKF 优化器**的超参数,kalman_nue 是遗忘率(forgetting rate),描述了 kalman_lambda 变化的速率。默认值为 0.9987。 **train_energy** 该参数用于指定是否训练 total energy,默认值为 true。 **train_force** 该参数用于指定是否训练 force,默认值为 true。 **train_ei** 该参数用于指定是否训练 atomic energy,默认值为 false。 **train_virial** 该参数用于指定是否训练 virial,默认值为 false。 **train_egroup** 该参数用于指定是否训练 energy group,默认值为 false。 **pre_fac_etot** 该参数用于指定 total energy 对损失函数的权重或贡献。默认值为 1.0。 **pre_fac_force** 该参数用于指定 force 对损失函数的权重或贡献。默认值为 2.0。 **pre_fac_ei** 该参数用于指定 atomic energy 对损失函数的权重或贡献。默认值为 1.0。 **pre_fac_virial** 该参数用于指定 virial 对损失函数的权重或贡献。默认值为 1.0。 **pre_fac_egroup** 该参数用于指定 energy group 对损失函数的权重或贡献。默认值为 0.1。 === ADAM optimizer === ADAM 优化器的完整参数设置如下: "optimizer": { "optimizer": "ADAM", "epochs": 30, "batch_size": 1, "print_freq": 10, "learning_rate": 0.001, "stop_lr": 3.51e-08, "stop_step": 1000000, "decay_step": 5000, "train_energy": true, "train_force": true, "train_ei": false, "train_virial": false, "train_egroup": false, "start_pre_fac_force": 1000, "start_pre_fac_etot": 0.02, "start_pre_fac_ei": 0.1, "start_pre_fac_virial": 50.0, "start_pre_fac_egroup": 0.02, "end_pre_fac_force": 1.0, "end_pre_fac_etot": 1.0, "end_pre_fac_ei": 2.0, "end_pre_fac_virial": 1.0, "end_pre_fac_egroup": 1.0 } **optimizer**, **epochs**, **batch_size**, **print_freq**, **train_energy**, **train_force**, **train_ei**, **train_virial**, **train_egroup**. 这些参数与 KF 优化器中的参数功能相同。 **learning_rate** 该参数是 Adam 优化器的初始学习率。默认值为 0.001。 **stop_lr** 该参数是指停止学习率,表示当学习率降到该值时训练过程将停止。默认值为 3.51e-08。 **stop_step** 该参数是指停止步数(stopping step),表示当达到该步数时训练过程将停止。默认值为 1000000。 **decay_step** 该参数表示衰减步数(decay step),它指定了学习率衰减的间隔。在每个衰减步数之后,学习率会根据一定的衰减率进行更新。默认值为 5000。 **learning_rate**, **stop_lr**, **stop_step**, **decay_step** 这四个变量用于更新学习率,其计算过程如下所示,可以使用以下的 Python 代码或数学公式表示: decay_rate = np.exp(np.log(stop_lr/learning_rate) / (stop_step/decay_step)) real_lr = learning_rate * np.power(decay_rate, (iter_num//decay_step)) 首先计算衰减率(decay_rate): $$ \text{decay\_rate} = \exp\left(\frac{\log(\text{stop\_lr}/\text{start\_lr})}{\text{stop\_step}/\text{decay\_step}}\right) $$ 更新学习率 learning rate: $$ \text{real\_lr} = \text{start\_lr} \cdot \left(\mathrm{decay\_rate}\right)^{\left(\left\lfloor\frac{\text{iter\_num}}{\text{decay\_step}}\right\rfloor\right)} $$ 其中,iter_num 代表训练过程中的迭代次数。 **start_pre_fac_force** 训练开始时 force 损失的 prefactor,应大于或等于 0。默认值为 1000。 **start_pre_fac_etot** 训练开始时 total energy 损失的 prefactor,应大于或等于 0。默认值为 0.02。 **start_pre_fac_ei** 训练开始时 atomic energy 损失的 prefactor,应大于或等于 0。默认值为 0.1。 **start_pre_fac_virial** 训练开始时 virial 损失的 prefactor,应大于或等于 0。默认值为 50.0。 **start_pre_fac_egroup** 训练开始时 egroup 损失的 prefactor,应大于或等于 0。默认值为 0.02。 **end_pre_fac_force** 训练结束时 force 损失的 prefactor,应大于或等于 0。默认值为 1.0。 **end_pre_fac_etot** 训练结束时 total energy 损失的 prefactor,应大于或等于 0。默认值为 1.0。 **end_pre_fac_ei** 训练结束时 atomic energy 损失的 prefactor,应大于或等于 0。默认值为 2.0。 **end_pre_fac_virial** 训练结束时 virial 损失的 prefactor,应大于或等于 0。默认值为 1.0。 **end_pre_fac_egroup** 训练结束时 egroup 损失的 prefactor,应大于或等于 0。默认值为 1.0。