照片:
Louis-Etienne Foy
on
Unsplash
你想要更好的材料吗?是的,我们想。我们希望有更好的电池,容量更大,寿命更长。或者,我们想要更好的太阳能电池板,有更高的能量生成率。或者,我们想要更好的半导体,减少焦耳热损失。所有这些性能限制都来自于组成它们的材料。因此,是的,我们确实想为任何产品提供更好的材料。
但是,我们怎样才能从几乎无限的现有材料中找到它们呢?一种方法是利用模拟数据库,如
材料项目
。这种类型的数据库一直在使用DFT计算汇编材料特性,这有利于缩小探索的范围。然而,一些特性的可预测性差是众所周知的,如带隙,所以我们不能接受它们的表面值。虽然,根据
晶体学开放数据库
,到目前为止,累积的晶体数量已经达到
476,995
个,因此,以实验的方式检查其性能是不可能的。啊,我希望有一个好的实验数据库和一个材料发现的搜索引擎!遗憾的是,并不存在。(至少在这个阶段。)是的,我们应该创造一种方法来利用从理论数据库到实验晶体结构数据库的知识。那么接下来,在机器学习的辅助下,让我们考虑一下有效探索所需材料的方法。
让我们考虑探索具有理想
带隙
的材料。当我们想要一个更好的半导体时,这个特征值是最基本的指导。根据产品的设计,带隙的理想值是不同的。因此,我们可以将半导体材料的发现问题简化为以下几点。
当我们设定E为带隙的理想值时,如何从晶体数据库中尽可能以最小的探索试验找到具有最接近带隙的晶体?
让我们把这个问题变得更加具体。我们澄清的事情有以下几点。
1.我们需要多精确地接近目标值?
2.哪个指标最合适?
3.我们如何构建数据集?
4.我们需要探索到什么程度?
首先,我们应该在0.01eV的误差内估计目标值。eV,电子伏特,是带隙的单位。带隙可以根据其制造方法或条件在这个范围内变化。因此,进一步追求可能是徒劳的。第二,当我们强调绝对值而不是比率时,我们可以采用MAE(平均绝对值)指标。顾名思义,这可以通过目标值和估计值之差的绝对值的平均值来获得。接下来,我们可以使用CIF(水晶信息文件)数据集。CIF是描述晶体结构的国际格式,它包含基本信息,但不是定量的。第三,我们可以使用材料项目数据库作为一个假的实验数据集。假设我们可以从假设的实验数据集中探索出带隙为E的材料。在这种情况下,我们可以应用同样的策略来有效地进行实际的实验。考虑到实际情况,我们可以调查科学论文来收集目标值的初步信息。比方说,这个数字大约是100。此外,我们可以通过考虑其他不理想的方面,如合成成本或反应性,来排除许多候选人。这样,我们就可以获得100个初步信息,并将探索对象缩小到6000个左右
。然后,我们可以将实验材料探索问题概念化如下。
当我们设定E为带隙的理想值时,如何利用这100条先验信息,以最小的探索试验从大约6000个候选者中尽可能地找到MAE小于0.01eV的晶体?
机器学习策略
贝叶斯优化
正如我们在谷歌搜索中很容易发现的,
贝叶斯优化
似乎是一个很好的有效探索。贝叶斯优化是一种算法,旨在以最小的试验探索更好的数据点。例如,谷歌大脑团队应用这种算法来
智能地优化巧克力饼干
的配方。总之,这似乎很实用,是的,我们应该把它应用于材料发现。但等等,我们需要
描述符
。换句话说,就是识别独特晶体的一组变量。谷歌团队使用了每个饼干烹饪程序的量化值,例如木薯淀粉的重量比。我们如何对晶体进行量化?
晶体图卷积神经网络
一个简单的方法是利用
预先训练好的水晶的深度学习模型
。
CGCNN
,即水晶图谱卷积神经网络,是材料科学领域的一个开创性的深度学习架构。在
作者的GitHub资源库
中
,
他们开放了预训练的模型,每个人都可以使用它们。当我们查看准备好的模型文件夹时,我们可以找到带隙模型(band-gap.pth.tar)。通过使用这个模型作为特征提取器,我们可以在自动驾驶中把CIF文件转换成128个定量描述符。
主成分分析
不幸的是,128个描述符对于贝叶斯优化来说太多。虽然有很多前沿的算法用于高维优化,但基本上,低维度的算法效果更好,不需要额外的努力。此外,这128个描述符只是为了定量地识别晶体,所以高维度基本上没有必要。因此,我们可以使用PCA,即主成分分析来降低维度。通过将128个维度减少到3个,我们可以设置更有效的探索空间。
Python库要求。
pymatgen
pytorch
scikit-learn
GPyOpt
数据集构建
我们将使用材料项目的API来构建数据集。首先,你需要在Materials Project上创建一个账户,然后获得API密钥。这可以按照
官方的指示
来完成。然后,我们将编译两个数据集,用于事先的信息和探索。你应该把
MY_API_KEY
改为你的密钥。
在这段代码中,我们搜索带隙在2.3和2.8之间的晶体,结果有6,749种材料。然后,它们被分为两个文件夹:"cif_prior "和 "cif_experiment",分别包含100和6649个CIF文件。此外,带隙的值以 "id_prop.csv "的形式存储在每个文件夹中。
medium.com/media/3d05f…
使用预先训练的CGCNN模型将CIF转换成128个描述符
你可以按照
这里的官方说明
git克隆CGCNN仓库。你需要复制
atom_init.json
到 "cif_prior "和 "cif_experiment "两个文件夹中。然后,你可以通过修改以下代码来创建特征提取代码
predict.py
.我创建了
extract_feature.py
基于predict.py中的
validate函数
。这段代码太长了,无法在这里写下来,所以我只展示修改过的部分。
首先,主函数的修改部分是像这样的最后一部分。
medium.com/media/5ac1a…
然后,修改验证函数的中间部分,像这样。
medium.com/media/ed6b1…
然后,你可以执行这个
extract_feature.py
并加上以下参数。
python3 extract_feature.py ./pre-trained/band-gap.pth.tar ./cif_experiment
因此,你可以得到128个描述符,如 cgcnn_features.csv.我们应该为 "cif_prior "和 "cif_experiment "都创建特征。并重命名为 cgcnn_features.csv 为 cgcnn_features_prior.csv 和 cgcnn_features_experiment.csv.
通过PCA将维度从128减少到3
我们将把128个特征转换为3维数据。同样地,对两个数据集执行两次代码,并将输出重命名为 cgcnn_pca.csv为 cgcnn_pca_prior.csv和 cgcnn_pca_experiment.csv.
medium.com/media/94c04…
贝叶斯优化
最后,我们将使用贝叶斯优化法探索更好的材料。实验设置将通过定义以下类实例来完成。
medium.com/media/eb394…
所有的准备工作都已经完成。接下来的代码将自动探索更好的材料。在这个设置中,目标带隙被设定为E=2.534[eV]。我们期望的材料应该在MAE误差0.01 eV以内,因此,目标范围将在2.524和2.544 eV之间。贝叶斯优化循环将按照_n_experiment_重复探索30次。所发现的材料和相应的值被存储在以下的自我实例中。
探索的带隙值;exp.expred_bandgaps
晶体名称;exp.crystals
累积损失曲线;结果
你可以通过添加基于这些实例和变量的代码自由地可视化或导出这些结果。
medium.com/media/40a19…
在我的设定中,在5次之内,贝叶斯优化法可以找到所需的材料。也就是说,这种方法在实际的材料探索方案中似乎很有用。享受材料探索的乐趣吧!
使用深图卷积网络和贝叶斯优化探索更好的材料》最初发表在《走向数据科学》杂志上,人们通过强调和回应这个故事继续对话。