文章目录
1.机器学习
1.机器学习
- 机器学习 :计算机从被标注的数据集出发,训练模型,预测数据的对应特征。
- 机器学习分类 :监督学习 、非监督学习 、强化学习
- 监督学习 :在监督学习中,提供给算法的包含所需解决方案的训练数据,成为标记或标签 。包括:分类、回归
- 非监督学习 :非监督学习的训练数据都是未经标记的 ,算法会在没有知道的情况下自动学习。包括:降维、聚类
- 强化学习 :强化学习是一个非常与众不同的算法,它的学习系统能够观测环境 ,做出选择 ,执行操作并获得回报,或者是以负面回报的形式获得惩罚。它必须自行学习什么事最好的策略,从而随着时间推移获得最大的回报。
2.数据集
- 训练集(Training set) :学习样本数据集,通过匹配一些参数来建立模型,主要用来训练模型。
- 验证集(Validation set) :对学习出来的模型进行验证,调整模型的参数,如在神经网络中选择隐藏单元数。验证集还能用来确定网络结构或者控制模型复杂程度的参数。
- 测试集(Test set) :在该数据集上测试训练好的模型的分辨能力。
3.误差评价
- 均方误差 (MSE)指的是每个样本的平均平方损失 。如何获得MSE?计算出所有样本的平方损失之和,然后除以样本数量:
M S E = 1 N ∑ ( x , y ) ∈ D ( y ^ − y ) 2 MSE=\frac{1}{N}\sum_{(x,y)\in D}(\hat{y}-y)^{2} MSE=N1(x,y)∈D∑(y^−y)2 - ( x , y ) (x,y) (x,y)指的是样本 ,其中 x x x指的是模型进行预测时使用的特征集, y y y指的是样本的标签。
- y ^ \hat{y} y^指的是从特征集x依据模型预测得到的函数值。
- D D D指的是包含多个有标签样本(即 ( x , y ) (x,y) (x,y))的数据集。
- N N N指的是 D D D中的样本数量
- 常用根均方差RMSE表示误差大小
4.损失函数
- 损失函数 是用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。
- 均方误差就是一种常用的损失函数------平方损失函数。
- 机器学习训练的目标:降低损失函数的值。
- 梯度下降法 : θ 1 = θ 0 − α ∇ J ( θ ) \theta ^{1}=\theta ^{0}-\alpha\nabla J(\theta) θ1=θ0−α∇J(θ),常用的降低损失函数值的方法之一。
- 学习速率 α \alpha α过小 :训练时间延长;学习速率 α \alpha α过大 :难以到达最小值。因而在训练过程中需要选取适当的学习速率,以高效地完成训练任务。
5.异常拟合
- 欠拟合(Underfitting):模型没有很好地捕捉到数据特征,不能够很好地拟合数据,对训练样本的一般性质尚未掌握。
- 过拟合(Overfitting):模型对训练样本学习过于精细,可能导致把一些训练样本自身的特性当做了所有潜在样本都有的一般性质,导致泛化能力下降。
2.机器学习势函数
1.机器学习势函数
- 机器学习势函数的基本要求 :
能量守恒(力是能量的偏导)+旋转平移置换不变 - 已有机器学习力场 类型
Gradient Doman Machine Learning Potentials
Gaussian Approximation Potentials
Neural Network Potentials - Code Package
sGDML ,SchNetPack ,AMP (Atomistic Machine-Learning Package),ænet (Atomic Energy NETwork),DeepMD-kit ,Dscribe ,n2p2 (neural network potential package),PROPhet (PROPerty Prophet),TensorMol ,QML ,RKHS Toolkit ,RuNNer ,LASP...
2.神经网络势函数:DPMD
- 体系能量表示成组成体系的每个原子能量之和:
E = ∑ i E i E= {\textstyle \sum_{i}^{}} E_{i} E=∑iEi - 每个原子能量由局域环境 (临近原子)所决定:
E i = E s ( i ) ( R i , { R j ∣ j ∈ N R C R ( i ) } ) E_{i}=E_{s(i)}(R_{i},\left \{ R_{j}|j\in N_{R_{C}R}(i)\right \}) Ei=Es(i)(Ri,{Rj∣j∈NRCR(i)}) - 通过神经网络训练具有旋转、平移、交换对称性的描述符
D i = D i ( R i , { R j ∣ j ∈ N R C R ( i ) } ) D_{i}=D_{i}(R_{i},\left \{ R_{j}|j\in N_{R_{C}R}(i)\right \}) Di=Di(Ri,{Rj∣j∈NRCR(i)}) - 神经网络拟合势函数:
E i = N S ( i ) ( D i ) E_{i}=N_{S(i)}(D_{i}) Ei=NS(i)(Di) - 损失函数由能量、原子受力和维里确定(dipole也可以拟合)
L ( p ϵ , p f , p ξ ) = p ϵ N Δ E 2 + p f 3 N ∑ i Δ F i ∣ 2 + p ξ 9 N ∣ ∣ Δ Ξ ∣ ∣ 2 L(p_{\epsilon},p_{f},p_{\xi})=\frac{p_{\epsilon}}{N}\Delta E^{2}+\frac{p_{f}}{3N}\sum_{i}^{} \Delta F_{i}|^{2}+\frac{p_{\xi}}{9N}||\Delta\Xi||^{2} L(pϵ,pf,pξ)=NpϵΔE2+3Npfi∑ΔFi∣2+9Npξ∣∣ΔΞ∣∣2通过调整 p ϵ p_{\epsilon} pϵ, p f p_{f} pf, p ξ p_{\xi} pξ等参数,调整模型向能量、力和维里的倾斜程度。
3.DPMD:构造描述符se_e2_a:
1.生成局域环境矩阵
- 建立一个坐标系,为截断半径 r c r_{c} rc内 的原子进行坐标变换
{ x j i , y j i , z j i } ⟶ { s ( r j i ) , x ^ j i , y ^ j i , z ^ j i } \left\{x_{ji},y_{ji},z_{ji}\right\}\longrightarrow \left\{s(r_{ji}),\hat{x}{ji},\hat{y}{ji},\hat{z}_{ji}\right\} {xji,yji,zji}⟶{s(rji),x^ji,y^ji,z^ji} - 对 r c − r c s r_{c}-r_{cs} rc−rcs之间的径向部分 进行处理,使函数平滑过渡到0,降低远距离原子的权重。(常用处理方式,同BP-NNP方法和Tersoff势)
s ( r j i ) = { 1 r j i , r j i < r c s 1 r j i { 1 2 c o s [ π ( r j i − r c s ) ( r c − r c s ) ] + 1 2 } , r c s < r j i < r c 0 , r j i > r c s(r_{ji})=\left\{\begin{matrix} \frac{1}{r_{ji}},\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad & r_{ji}<r_{cs}\quad \quad \\ \frac{1}{r_{ji}}\left\{\frac{1}{2}cos[\pi \frac{(r_{ji}-r_{cs})}{(r_{c}-r{cs})}]+\frac{1}{2} \right\}, & r_{cs}<r_{ji}<r_{c}\\ 0,\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad & r_{ji}>r_{c}\quad \quad \end{matrix}\right. s(rji)=⎩ ⎨ ⎧rji1,rji1{21cos[π(rc−rcs)(rji−rcs)]+21},0,rji<rcsrcs<rji<rcrji>rc
2.得到特征矩阵
- 通过神经网络将 S ( r j i ) S(r_{ji}) S(rji)转化为 G ( r j i ) G(r_{ji}) G(rji),得到嵌入矩阵 ( G i ) j k = ( G ( s ( r j i ) ) ) k (\mathcal{G}^{i}){jk}=(G(s(r{ji})))_{k} (Gi)jk=(G(s(rji)))k
- 构建特征矩阵(描述符) , D i = ( G i 1 ) T R ~ i ( R ~ i ) T G i 2 \mathcal{D}^{i}=(\mathcal{G}^{i1})^{T} \tilde{\mathcal{R}}^{i}(\tilde{\mathcal{R}}^{i})^{T}\mathcal{G}^{i2} Di=(Gi1)TR~i(R~i)TGi2
- D i \mathcal{D}^{i} Di具有旋转平移和置换不变性,DPMD的描述符是训练出来的,DeepMD-kit的Embedding Network在descriptor部分设置。
3.使用Deep-kit训练数据
1.准备训练数据
-
通过python脚本准备数据,支持VASP、CP2K、Gaussian等多种类别的输出文件。
-
以VASP 为例,可以把OUTCAR 处理成用于训练势函数的数据集
pythonimport dpdata from dpdata import LabeledSystem,MultiSystems # LabeledSystem方法将OUTCAR中的能量、力、维里等信息提取出来 # MultiSystems将含有原子数不同的数据处理后整合输出
利用MultiSystems.to_deepmd_raw 和MultiSysterms.to_deepmd_npy 输出成训练需要的文件(npy是训练需要的二进制文件 )。
检查生成文件中的数据:box.raw (盒子信息)、coord.raw (位置)、force.raw (受力)、energy.raw (能量)、viriral.raw (维里),以上每一帧DFT数据(一个离子步)对应其中一行;type.raw、type_map.raw 分别是原子按顺序对应的元素序号(数字表示)、体系中元素种类。
DeepMD-kit中数据的单位:Time(ps)、Length(Å)、Energy(eV)、Force(eV/Å)、Pressure(Bar)
如果有的OUTCAR中含有维里,有的没有,使用MultiSystems模块会报错,可以注释掉dpdata/systems.py中读取维里的代码。
2.获取DFT数据集
- 已有的DFT计算数据
- 运行短时间的AIMD(不同温度)
- 进行结构优化计算
- 创造缺陷,形变后跑AIMD和结构优化
- 使用dpgen探索构型空间
- 保证DFT计算数据的一致性和正确性,例如K点取点、XC、基组选取、自旋设置等
- DFTD3校正、LDA+U都会改变能量,应保持计算体系一致
- 可以尝试删除明显不合理的数据,比如把力大于某阈值的数据剔除:读取force.raw,把过大的力的行删除,并删除其他文件中对应行,然后用dpdata读取raw文件夹,生成新的npy文件即可。
3.运行命令
python
dp -h # dp命令说明
dp train -h # 训练命令说明
dp train input.json # 普通训练
dp train -r model.ckpt input.json # 重启训练
dp train -i model.ckpt input.json # 在训练记录的基础上进行新训练
dp train -f compressed_model input.json # 在压缩模型基础上训练
nohup dp train input.json 1>out1 2>out2 & # 后台输出
dp freeze -o modelname.pd # 输出模型,pd文件
dp compress -i model.pb -o compressed_model.pd -s 0.001 # 模型压缩
# 可在压缩模型的基础进行二次训练,时间大幅减少:短时间训练后压缩继续训练
# 模型过大时,需调整-s后的步长参数
dp test -m model.pb -s system -d detailfile # 使用输出的detail里的DPMD和DFT分析训练结果
注意:
1.不同原子数 的结构可以一起训练
2.GPU版 本比CPU版本快3-7倍
3.模型压缩后再训练,CPU版本加速非常明显
参考文献:Unke O T, Chmiela S, Sauceda H E, et al. Machine learning force fields[J]. Chemical Reviews, 2021, 121(16): 10142-10186.