学习分子动力学

_images/4D.png

分子总是在运动,这种运动可以用 MD 模拟,但需要很多步骤来评估,而且速度很慢。我们可以用 机器学习势 来加速这个过程,更快地计算力。然而,机器学习势仍然不能解决动力学的基本问题:它是迭代的,步骤不能并行化,计算质量取决于时间步长,轨迹是离散的而不是光滑的。

正因如此,我们于 2022年3月 提出了一种新概念,即通过 4D时空原子人工智能模型 (简称4D模型)直接学习动力学的新概念。这一构想看似简单,实现起来并不容易:我们预测核坐标是时间的连续函数!由于不同时间步长的预测无需按顺序计算,因此我们可以并行处理这些预测。轨迹也可以获得任意高分辨率。

GICnet

我们成功地完成了一项艰巨的任务,即创建一个深度学习模型来学习动态并快速预测轨迹。这个模型被称为GICnet,并于2023年在 JPCL上发表 。实际上,GICnet模型是四维时空中分子和化学反应的分析表示!

令人惊讶的是,我们的模型可以学习不同复杂分子的动力学,甚至可以学习偶氮苯的顺反异构化动力学。使用GICnet可以比使用机器学习势更快地获得轨迹。

详情请参阅我们的论文(如果您使用GICnet,请同时引用):

  • Fuchun Ge, Lina Zhang, Yi-Fan Hou, Yuxinxin Chen, Arif Ullah, Pavlo O. Dral*. Four-dimensional-spacetime atomistic artificial intelligence models. J. Phys. Chem. Lett. 2023, 14, 7732–7743. DOI: 10.1021/acs.jpclett.3c01592.

备注

在本教程中,我们只讨论Python API。对于输入文件/命令行使用,只有特定版本的MLatom支持GICnet,可以在 GitHub 中找到。

现在,让我们进入在MLatom中使用GICnet的说明部分。

预备条件

  • MLatom 3.8.0 或者更新版本

  • tensorflow v2.17.0 (对其他版本不作保证)

训练GICnet模型

这里我们选用乙醇分子。

首先,我们需要生成一些轨迹作为训练数据。请查阅本 教程 在MLatom中运行MD。

from mlatom.GICnet import GICnet
mol = ml.molecule.from_smiles_string('CCO')
molDB = ml.generate_initial_conditions(
    molecule = mol,
    generation_method = 'random',
    initial_temperature = 300,
    number_of_initial_conditions = 8
)
ani = ml.models.methods('ANI-1ccx',tree_node=False)
trajs = [
    ml.md(
        model=ani,
        molecule=mol,
        time_step=0.05,
        ensemble='NVE',
        maximum_propagation_time=10000,
    ).molecular_trajectory
]

然后,我们可以使用这些轨迹来训练GICnet模型:

model = GICnet(
    model_file='GICnet',            # the name of the model file (it's a folder)
    hyperparameters={
        'ICidx': 'ethanol.ic',      # a file that contains the definition of the internal coordinates for ethanol
        'tc': 10.0,                 # the time cutoff
        'batchSize3D': 1024,        # the batch size for the built-in MLP model
        'batchSize4D': 1024,        # the batch size for the 4D model
        'maxEpoch3D': 1024,         # the maximum number of epochs of MLP model training
        'maxEpoch4D': 1024,         # the maximum number of epochs of 4D model training
    }
)

model.train(trajs)

由于GICnet使用内部坐标来描述分子,因此我们需要提供坐标系统的定义。更多的细节可以在我们的论文中找到,这里是乙醇的一个例子,其定义保存在文件 ethanol.ic 中:

1   0  -1  -2
2   1   0  -1
3   1   2   0
4   1   2   3
5   1   2   3
6   2   1   3
7   2   1   3
8   2   1   3
9   3   1   2

训练数据将实时打印在stdout中;

... ...
----------------------------------------------------
epoch 5          1/1             t_epoch:        0.1
validate:  0.000650
best:      0.000650
----------------------------------------------------
epoch 6          1/1             t_epoch:        0.1
validate:  0.000599
best:      0.000599
----------------------------------------------------
... ...
----------------------------------------------------
epoch 1          1/1             t_epoch:        1.9
           D          A          DA         Ep/Ek
train:     0.045998   0.049149   0.036743   0.005203
  d/dt     0.009045   0.009566   0.008752   0.000000
                                 Loss       0.842420
validate:  0.031084   0.024374   0.019558   0.001658
  d/dt     0.013125   0.010855   0.009795   0.000000
                                 Loss       0.821911
best:      0.031084   0.024374   0.019558   0.001658
  d/dt     0.013125   0.010855   0.009795   0.000000
                                 Loss       0.821911
----------------------------------------------------
epoch 2          1/1             t_epoch:        2.0
           D          A          DA         Ep/Ek
train:     0.036901   0.049857   0.033790   0.005391
  d/dt     0.008148   0.008873   0.008209   0.000000
                                 Loss       0.781977
validate:  0.034426   0.029851   0.021169   0.003375
  d/dt     0.012806   0.009719   0.007115   0.000000
                                 Loss       0.752215
best:      0.034426   0.029851   0.021169   0.003375
  d/dt     0.012806   0.009719   0.007115   0.000000
                                 Loss       0.752215
----------------------------------------------------
... ...

用GICnet模型传播轨迹

一旦你有了一个GICnet模型,你就可以用它以闪电般的速度传播动力学轨迹。

from mlatom.GICnet import GICnet
mol=ml.molecule.from_smiles_string('CCO')
mol= ml.generate_initial_conditions(molecule = mol,
                                    generation_method = 'random',
                                    initial_temperature=300)[0]

model = GICnet(model_file='GICnet')

# options are similar to normal MD
dyn = model.propagate(molecule=mol,
                      maximum_propagation_time=20000, # fs
                      time_step=0.1 # fs
                      )

我们极力推荐训练多个模型,并通过它们的集成传播动力学轨迹,以提高预测的稳定性:

model = GICnet(model_file=['GICnet_0',
                            'GICnet_1',
                            'GICnet_2',
                            'GICnet_3'])

dyn = model.propagate(molecule=mol,
                      maximum_propagation_time=20000,
                      time_step=0.1)