用于分子和晶体机器学习的材料图神经网络。
项目描述
目录
介绍
本存储库代表了材料虚拟实验室(Materials Virtual Lab)在开发用于材料科学机器学习的图网络所付出的努力。这是一个正在进行中的项目,我们迄今为止开发的模型仅基于我们的最佳努力。我们欢迎任何人在我们的代码和数据的基础上构建和测试模型,所有这些代码和数据都是公开可用的。欢迎提出任何评论或建议(请在Github Issues页面发布。)
我们的预训练MEGNet模型用于晶体性质预测的Web应用可在http://megnet.crystals.ai找到。教程请访问此存储库中的notebooks
。我们还在nanoHUB上建立了一个在线模拟工具和教程讲座(https://nanohub.org/resources/megnet)。
注意:现在可用的MEGNet的DGL实现(DGL implementation of MEGNet)。对于试图构建自己的MEGNet模型的用户,强烈建议您检查这个版本,这可能在未来的工作中更容易使用和扩展。
MEGNet框架
材料图网络(MatErials Graph Network,MEGNet)是DeepMind的图网络[1]在材料科学中通用机器学习的一种实现。我们已经证明了它在分子和晶体广泛性质预测中实现非常低的预测误差的成功(参见"Graph Networks as a Universal Machine Learning Framework for Molecules and Crystals"[2])。新版本包括了我们对多保真材料性质建模的最新工作(参见"Learning properties of ordered and disordered materials from multi-fidelity data"[3])。
简而言之,图1展示了图网络的顺序更新步骤,其中通过使用彼此的信息来更新键、原子和全局状态属性,从而生成输出图。
图2显示了MEGNet的整体示意图。每个图网络模块前面都由两个多层感知器(在Keras术语中称为Dense层)组成,构成一个MEGNet块。多个MEGNet块可以堆叠,允许信息在更大的空间距离上流动。所需的块数量取决于预测目标性质所需的相互作用范围。在最后一步,使用set2set
将输出映射到标量/向量性质。
安装
MEGNet可以通过pip安装最新稳定版本
pip install megnet
对于最新开发版本,请克隆此存储库并使用以下命令安装:
python setup.py develop
使用
我们当前的实现支持满足不同需求和深度学习经验的用户的各种用例。请访问notebooks目录以获取更多详细代码示例的Jupyter笔记本。
使用预构建模型
在我们的工作中,我们为QM9数据集和材料项目数据集构建了MEGNet模型。这些模型作为序列化的HDF5+JSON文件提供。仅对使用这些模型进行预测感兴趣的用户可以通过方便的MEGNetModel.from_file
方法快速加载和使用它们。这些模型存储在本存储库的mvl_models
文件夹中。以下模型可用
- QM9分子数据
- HOMO:最高占据分子轨道能量
- LUMO:最低未占据分子轨道能量
- Gap:能隙
- ZPVE:零点振动能量
- µ:偶极矩
- α:各向同性极化率
- <R2>:电子空间范围
- U0:0 K时的内能
- U:298 K时的内能
- H:298 K时的焓
- G:298 K时的吉布斯自由能
- Cv:298 K时的热容
- ω1:最高振动频率。
- 材料项目数据
- 从元素形成的能量
- 带隙
- 体积模量的对数(K)
- 剪切模量的对数(G)
各种模型的MAE如下所示
QM9 MEGNet-Simple模型的性能
属性 | 单位 | MAE |
---|---|---|
HOMO | eV | 0.043 |
LUMO | eV | 0.044 |
能隙 | eV | 0.066 |
ZPVE | meV | 1.43 |
µ | 德拜 | 0.05 |
α | 波尔^3 | 0.081 |
<R2> | 波尔^2 | 0.302 |
U0 | eV | 0.012 |
U | eV | 0.013 |
H | eV | 0.012 |
G | eV | 0.012 |
Cv | cal/(molK) | 0.029 |
ω1 | cm^-1 | 1.18 |
MP-2018.6.1的性能
属性 | 单位 | MAE |
---|---|---|
Ef | eV/atom | 0.028 |
Eg | eV | 0.33 |
K_VRH | log10(GPa) | 0.050 |
G_VRH | log10(GPa) | 0.079 |
MP-2019.4.1的性能
属性 | 单位 | MAE |
---|---|---|
Ef | eV/atom | 0.026 |
Efermi | eV | 0.288 |
随着在
以下是一个晶体模型使用的示例
from megnet.utils.models import load_model
from pymatgen.core import Structure, Lattice
# load a model in megnet.utils.models.AVAILABLE_MODELS
model = load_model("logK_MP_2018")
# We can construct a structure using pymatgen
structure = Structure(Lattice.cubic(3.167),
['Mo', 'Mo'], [[0, 0, 0], [0.5, 0.5, 0.5]])
# Use the model to predict bulk modulus K. Note that the model is trained on
# log10 K. So a conversion is necessary.
predicted_K = 10 ** model.predict_structure(structure).ravel()[0]
print(f'The predicted K for {structure.composition.reduced_formula} is {predicted_K:.0f} GPa.')
完整示例在notebooks/crystal_example.ipynb中。
对于分子模型,我们有一个示例在notebooks/qm9_pretrained.ipynb中。我们支持直接从pymatgen分子对象进行预测。通过几行额外的代码,模型可以从分子的SMILES
表示进行预测,如示例所示。使用pymatgen加载xyz
分子文件并使用模型预测性质也非常简单。然而,通常不推荐用户使用qm9
分子模型对qm9
数据集之外的分子进行预测,因为训练数据的覆盖范围有限。
以下是一个预测smiles表示的“HOMO”的示例
from megnet.utils.molecule import get_pmg_mol_from_smiles
from megnet.models import MEGNetModel
# same model API for molecule and crystals, you can also use the load_model method
# as in previous example
model = MEGNetModel.from_file('mvl_models/qm9-2018.6.1/HOMO.hdf5')
# Need to convert SMILES into pymatgen Molecule
mol = get_pmg_mol_from_smiles("C")
model.predict_structure(mol)
从结构中训练新的MEGNetModel
对于希望从一组具有相应属性的晶体结构中构建新模型的用户,有一个方便的MEGNetModel
类来设置和训练模型。默认情况下,MEGNet块的数目为3,原子序数Z用作唯一的节点特征(带有嵌入)。
from megnet.models import MEGNetModel
from megnet.data.crystal import CrystalGraph
import numpy as np
nfeat_bond = 10
r_cutoff = 5
gaussian_centers = np.linspace(0, r_cutoff + 1, nfeat_bond)
gaussian_width = 0.5
graph_converter = CrystalGraph(cutoff=r_cutoff)
model = MEGNetModel(graph_converter=graph_converter, centers=gaussian_centers, width=gaussian_width)
# Model training
# Here, `structures` is a list of pymatgen Structure objects.
# `targets` is a corresponding list of properties.
model.train(structures, targets, epochs=10)
# Predict the property of a new structure
pred_target = model.predict_structure(new_structure)
请注意,对于现实模型,可以将nfeat_bond
设置为100,将epochs
设置为1000。在某些情况下,训练池中的一些结构可能无效(包含孤立原子),然后需要使用仅对有效图进行训练的train_from_graphs
方法。
按照前面的示例,
model = MEGNetModel(graph_converter=graph_converter, centers=gaussian_centers, width=gaussian_width)
graphs_valid = []
targets_valid = []
structures_invalid = []
for s, p in zip(structures, targets):
try:
graph = model.graph_converter.convert(s)
graphs_valid.append(graph)
targets_valid.append(p)
except:
structures_invalid.append(s)
# train the model using valid graphs and targets
model.train_from_graphs(graphs_valid, targets_valid)
有关模型细节和基准测试,请参阅"Graph Networks as a Universal Machine Learning Framework for Molecules and Crystals"[2]
训练多保真图神经网络
请参阅multifidelity
文件夹中的具体示例。
预训练的元素嵌入
我们工作的一个关键发现是,从训练形成的能量模型中得到的元素嵌入编码了有用的化学信息,这些信息可以转移到学习开发具有更小数据集(例如,弹性常数、带隙)的模型,具有更好的收敛性和更低的误差。这些嵌入在开发其他ML模型和应用中也可能很有用。这些嵌入已通过以下代码提供
from megnet.data.crystal import get_elemental_embeddings
el_embeddings = get_elemental_embeddings()
使用形成能量到其他模型进行迁移学习的示例,请查看notebooks/transfer_learning.ipynb。
定制的图神经网络模型
对于熟悉深度学习、Keras并希望构建基于图网络的定制的用户,以下示例概述了如何从MEGNetLayer
构建定制的模型,这本质上是我们的图网络神经网络实现
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from megnet.layers import MEGNetLayer, Set2Set
n_atom_feature= 20
n_bond_feature = 10
n_global_feature = 2
# Define model inputs
int32 = 'int32'
x1 = Input(shape=(None, n_atom_feature)) # atom feature placeholder
x2 = Input(shape=(None, n_bond_feature)) # bond feature placeholder
x3 = Input(shape=(None, n_global_feature)) # global feature placeholder
x4 = Input(shape=(None,), dtype=int32) # bond index1 placeholder
x5 = Input(shape=(None,), dtype=int32) # bond index2 placeholder
x6 = Input(shape=(None,), dtype=int32) # atom_ind placeholder
x7 = Input(shape=(None,), dtype=int32) # bond_ind placeholder
xs = [x1, x2, x3, x4, x5, x6, x7]
# Pass the inputs to the MEGNetLayer layer
# Here the list are the hidden units + the output unit,
# you can have others like [n1] or [n1, n2, n3 ...] if you want.
out = MEGNetLayer([32, 16], [32, 16], [32, 16], pool_method='mean', activation='relu')(xs)
# the output is a tuple of new graphs V, E and u
# Since u is a per-structure quantity,
# we can directly use it to predict per-structure property
out = Dense(1)(out[2])
# Set up the model and compile it!
model = Model(inputs=xs, outputs=out)
model.compile(loss='mse', optimizer='adam')
通过不到20行代码,您就可以构建一个用于材料性质预测的图网络模型!
实现细节
图神经网络[1]是图神经网络的一个超类。与传统的基于图的神经网络相比,有一些创新。
- 全局状态属性被添加到节点/边图表示中。这些特性作为一个通道,用于结构无关的特性,如温度、压力等,并且作为一个信息交换占位符,便于在不同空间域之间传递信息。
- 更新函数涉及所有三个信息层(即节点、键和状态信息)之间的消息交换。因此,这是一个高度通用的模型。
MEGNet
模型实现了两个主要组件:(a)图网络
层和(b)set2set
层。[4]这些层基于keras API,因此与其他keras模块兼容。
不同的晶体/分子有不同的原子数量。因此,在不填充结构以使其原子数量统一的情况下,无法使用数据批次。MEGNet
采取不同的方法。我们不是制作结构批次,而是将许多结构组装成一个巨大的结构,这个结构有一个向量输出,每个条目是相应结构的目标值。因此,批次编号始终为1。
假设一个结构有N个原子和M个键,一个结构图表示为V
(节点/顶点,表示原子)、E
(边,表示键)和u
(全局状态向量)。V
是一个N*Nv矩阵。E
由一个M*Nm矩阵组成,用于键属性和索引对(rk,sk)表示每个键连接的原子。u
是一个长度为Nu的向量。我们将rk和sk矢量化以形成index1
和index2
,它们都是长度为M的向量。总之,图是一个数据结构,具有V
(N*Nv)、E
(M*Nm)、u
(Nu)、index1
(M)和index2
(M)。
然后我们将几个结构组合在一起。对于V
,我们直接追加所有结构的原子属性,形成一个矩阵(1*N'*Nv),其中N' > N。为了表示每个原子属性向量的归属,我们使用一个atom_ind
向量。例如,如果N'=5
,前3个原子属于第一个结构,其余属于第二个结构,那么我们的atom_ind
向量将是[0, 0, 0, 1, 1]
。对于键属性,我们执行相同的追加方法,并使用bond_ind
向量来指示键的归属。对于index1
和index2
,我们需要移动整数值。例如,如果index1
和index2
对于结构1是[0, 0, 1, 1]
和[1, 1, 0, 0]
,对于结构2也是[0, 0, 1, 1]
和[1, 1, 0, 0]
,则组装的索引是[0, 0, 1, 1, 2, 2, 3, 3]
和[1, 1, 0, 0, 3, 3, 2, 2]
。最后,u
扩展一个新维度以考虑结构数量,成为一个1*Ng*Nu张量,其中Ng是结构数量。1
被添加为所有输入的第一个维度,因为我们已将批次大小固定为1(一个巨大图)以符合keras输入要求。
总之,模型的输入是V
(1*N'*Nv)、E
(1*M'*Nm)、u
(1*Ng*Nu)、index1
(1*M')、index2
(1*M')、atom_ind
(1*N')和bond_ind
(1*M')。对于仅原子特征的Z,V
是一个(1*N')向量。
数据集
为了帮助他人重现(并改进)我们的结果,我们已通过figshare[5]提供了我们的MP-crystals-2018.6.1晶体数据集。MP-crystals-2018.6.1数据集包含2018年6月1日通过Materials Project和Python Materials Genomics (pymatgen)接口获取的69,640个晶体的DFT计算的能带隙。[6]晶体图使用4埃的半径截止值构建。使用此截止值,69,239个晶体不形成孤立原子,用于模型。5,830个结构具有弹性数据,没有计算警告,将用于弹性模型。
本研究中使用的分子数据集是经过Faber等人[7]处理的QM9数据集30。它包含了包含最多9个重原子的130,462个小有机分子的B3LYP/6-31G(2df,p)-级DFT计算结果。
计算需求
训练:请注意,与其他深度学习模型一样,训练MEGNet模型需要大量的计算资源,尤其是对于大数据集。在我们的工作中,我们使用专门的GPU资源来训练包含100,000个晶体/分子的MEGNet模型。建议您也这样做。
预测:一旦训练完成,使用MEGNet模型的预测相对便宜。例如,http://megnet.crystals.ai web应用运行在Heroku的单个爱好服务器上,可以在几秒钟内提供任何晶体的预测。
已知限制
孤立原子
错误。当在模型中使用给定的截止值(2018模型为4A,2019模型为5A)时,晶格结构中包含孤立原子,即没有邻近原子在截止值
的距离范围内。大多数情况下,我们可以简单地丢弃结构,因为我们发现这些结构往往具有高于 hull 的高能量(稳定性较低)。如果您认为这种错误是一个特定问题的关键问题,请随时给我们发电子邮件,我们将考虑发布一个具有增加截止值的新模型。
贡献者
- 来自材料虚拟实验室的Chi Chen是MEGNet的主要开发者。
- Shyue Ping Ong和材料虚拟实验室的其他成员为MEGNet及其应用的一般改进做出了贡献。
- Logan Ward做出了大量贡献,尤其是在MEGNet分子图部分的发展中。
参考文献
- Battaglia, P. W.;Hamrick, J. B.;Bapst, V.;Sanchez-Gonzalez, A.;Zambaldi, V.;Malinowski, M.;Tacchetti, A.;Raposo, D.;Santoro, A.;Faulkner, R.等。关系归纳偏差、深度学习和图网络。2018年,1-38页。arXiv:1806.01261
- Chen, C.;Ye, W.;Zuo, Y.;Zheng, C.;Ong, S. P. 作为分子和晶体的通用机器学习框架的图网络。化学材料2019年,31(9),3564-3572。doi:10.1021/acs.chemmater.9b01294
- Chen, C.;Zuo, Y.;Ye, W.;Li, X.G.;Ong, S. P. 从多保真数据中学习有序和无序材料的性质。自然计算科学2021年,1,46-53 doi:10.1038/s43588-020-00002-x。
- Vinyals, O.;Bengio, S.;Kudlur, M. 顺序很重要:集合的序列到序列。2015年,arXiv预印本。arXiv:1511.06391
- https://figshare.com/articles/Graphs_of_materials_project/7451351
- Ong, S. P.;Cholia, S.;Jain, A.;Brafman, M.;Gunter, D.;Ceder, G.;Persson, K. A. 材料应用编程接口(API):基于REpresentational State Transfer(REST)原则的简单、灵活且高效的API,用于基于材料数据。计算机材料科学2015年,97,209-215 DOI:10.1016/j.commatsci.2014.10.037。
- Faber, F. A.;Hutchison, L.;Huang, B.;Gilmer, J.;Schoenholz, S. S.;Dahl, G. E.;Vinyals, O.;Kearnes, S.;Riley, P. F.;von Lilienfeld, O. A. 分子机器学习模型的预测误差低于混合DFT误差。化学理论计算杂志2017年,13,5255-5264。DOI:10.1021/acs.jctc.7b00577。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。