查看原文
其他

DP还能干这个?——transfer learning应用之D3修正

王亦楠 深度势能 2022-09-11



最近,一些DP使用者们遇到了这样的问题:生成了一堆数据集训练了DP势,结果因为数据精度不高导致模型表现不佳,或者开始选错了赝势导致无法应用于某些特定问题。重做一轮DPGEN开销过大,承担不起,那有没有什么好方法把已有的DP模型“转移”到另一个势能面上呢?

本文将为大家介绍,DP的transfer learning功能,以D3修正为例。当然D3修正可以通过其它方法实现,文章后面也会进行简单介绍。大家可以根据自己的需求,设定transfer learning的场景。


DPGEN v0.8.0之后的版本加入了simplify功能,该功能实现过程描述如下,也可对照笔者文末提供的参考文献帮助理解。基于通常DPGEN流程生成了4个DP模型,以及DFT数据集,从DFT数据集中随机挑选构型进行relable。


注意,此时relabel设置的参数与生成前序DFT数据集的参数不一样。这样我们得到了一个新的DFT数据集。基于新的数据集,对旧的DP模型进行init-model,embedding-net不训练,fitting-net固定内3层网络,只训练最外层。当然可以不止训练最外层,笔者的例子中训练最外层和次外层效果相差不大,所以只训练了最外层。大家可以针对自己的例子进行测试,确定训练策略。这样得到的4个新模型再对随机挑选的构型做dptest,得到model_deviation,根据自己设计的trust_lo/hi选取构型进行DFT relabel,进一步扩充数据集。基于以上的流程多次迭代,最终使原DP模型 transfer到新的势能面上,完成transfer learning。


Simplify 的脚本例子如下,和 DPGEN 的差不多:

{    "type_map":    [ "Ag", "Au" ],    "mass_map":    [ 108, 196.967 ],    "init_data_prefix": "",    "init_data_sys":  [],    "pick_data":  "/Ag-Au/simp/collect",  
  • 这里需要使用 dp collect 功能将原DFT数据集整理至一个文件夹中

   "sys_batch_size":  "auto",
   "training_iter0_model_path":  "/Ag-Au/final/00.train/00[0-3]",
  • 指定原DP模型

   "training_init_model":    true,
  • Transfer learning 是基于原DP模型的 init-model

   "numb_models":  4,    "train_param":  "input.json",    "default_training_param" : {        "_comment": " model parameters",    "model": {            "type_map":     ["Ag", "Au"],            "descriptor" :{        "type":             "se_a",        "sel":              [150,150],        "rcut_smth":        2.00,        "rcut":             6.00,        "neuron":           [25, 50, 100],        "trainable":      false,
  • Embedding net 不训练

   "resnet_dt":        false,    "axis_neuron":      12,    "seed":             0,                "_comment":         " that's all"            },            "fitting_net" : {    "neuron":           [240, 240, 240],    "resnet_dt":        true,    "trainable":      [false, false, false, true],
  • Fitting net 只训练最外层

   "seed":             1,    "_comment":         " that's all"            },            "_comment":     " that's all"  },
 "learning_rate" :{            "type":         "exp",            "start_lr":     0.001,            "stop_lr":      3.51e-8,            "decay_steps":  2000,            "_comment":     "that's all"  },
 "loss" :{            "start_pref_e": 100,            "limit_pref_e": 100,            "start_pref_f": 1,            "limit_pref_f": 1,            "start_pref_v": 0.9,            "limit_pref_v": 1.0,            "_comment":     " that's all"  },
 "_comment": " traing controls",  "training" : {            "systems":      [],            "set_prefix":   "set",            "stop_batch":   400000,            "batch_size":   2,
           "seed":         1,
           "_comment": " display and restart",            "_comment": " frequencies counted in batch",            "disp_file":    "lcurve.out",            "disp_freq":    2000,            "numb_test":    2,            "save_freq":    2000,            "save_ckpt":    "model.ckpt",            "load_ckpt":    "model.ckpt",            "disp_training":true,            "time_training":true,            "profiling":    false,            "profiling_file":"timeline.json",            "_comment":     "that's all"},  "_comment":         "that's all"},"fp_style": "vasp","fp_skip_bad_box":  "length_ratio:5;height_ratio:5","shuffle_poscar":  false,"fp_task_max":  100,
  • 每轮最多 relabel 100 个 DFT 数据

"fp_task_min":  0,
  • 这样设置保证第一轮随机选出的所有 DFT 数据都可以送去 relabel

   "fp_pp_path":  "vasp_input",    "fp_pp_files":  ["POTCAR_Ag", "POTCAR_Au"],    "fp_incar":         "vasp_input/INCAR",
   "use_clusters": false,    "labeled": false,    "init_pick_number":100,    "iter_pick_number":100,    "e_trust_lo":1e10,    "e_trust_hi":1e10,    "f_trust_lo":0.20,    "f_trust_hi":100.00,
  • 所有高于f_trust_lo的构型都会被选为候选构型。因为构型都是从数据集中选择的,认为这些构型都是合理的,所以不进行剔除bad box或者原子过近等各种不合理构型的设置。

   "_comment": " that's all "}


笔者的例子是Ag-Au合金的,原本的DP模型和数据集基于PBE生成,应用中发现D3修正可以更好地描述合金基本性质以及表面性质,所以想将模型 transfer 到D3修正的势能面上。文章中采用了 transfer learning 的方式实现,relabel 的数据仅占原数据集的0.6%,transfer learning 仅进行了 4 个 iter 便收敛了。


然而,D3 修正很便宜,给出原子坐标和盒子的信息就可以实现。有一些代码可以做到,比如:

https://chemie.uni-bonn.de/pctc/mulliken-center/software/dft-d3/get-the-current-version-of-dft-d3

https://github.com/MMunibas/PhysNet/blob/master/neural_network/grimme_d3/grimme_d3.py

https://github.com/loriab/dftd3

https://github.com/dftbplus/dftd3-lib


笔者在文中采用了最后一个网址提供的脚本,对所有数据进行了 D3 relabel,确实很快。基于 D3 修正的 DFT 数据集重新训练了一版DP模型,经过测试发现,对Au的fcc和hcp的相对稳定性预测有问题,以及文中的例子,Au (111) 表面重构的计算不准确。这里可能有些tricky的问题存在,需要进一步研究探索。


想做 D3 修正的胖友们,可以 transfer learning 和 D3 relabel 两种方案都尝试下,以及活用 init-model,选择最适合自己的解决办法。希望大家都能得到自己想要的DP势!


参考文献

Transfer learning 在Ag-Au体系中的实现:

YiNan Wang et al 2022 Modelling Simul. Mater. Sci. Eng. 30 025003

D3修正:

Grimme S, Antony J, Ehrlich S and Krieg H 2010 J. Chem. Phys. 132 154104


- End -


(如需转载图文请与公众号后台联系)

-----------------------------------------------

推荐阅读

DP-GEN:Deep Potential GENerator 基于同步学习的深度势能生成器

 DP-GEN教程视频回顾



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存