计算化学公社

标题: DScribe中SOAP描述符参数选取问题 [打印本页]

作者
Author:
Jiang127127    时间: 2025-11-25 17:24
标题: DScribe中SOAP描述符参数选取问题
在阅读On representing chemical environments这篇构建SOAP描述符的文献后,还是对SOAP参数选取存有疑惑,阅读文献发现球谐函数最大阶数选取6一般就够用了,越大的话扰动越大,效果不一定好,但还是不明白这两个参数应该如何选取,请各位老师指导帮助 (, 下载次数 Times of downloads: 0)

作者
Author:
LPOwenChan    时间: 2025-11-27 00:43
      从线性代数的理论角度来说,使用更多相互正交的的球谐函数和径向函数是一定可以更好地对体系进行描述的。但是从计算与数值的角度来说,计算量的增加是绝对的,同时基函数取得太多很有可能导致相互之间的线性相关性增加,从而使得数值计算不太稳定。基函数数量的选取可能和体系的对称性有较大关系。就我个人的使用经验而言,之前尝试在简单的NLO晶体上使用SOAP Descriptor,在n_max=4和l_max=4上得到的基函数与更多基函数在坐标扰动重构误差上相差不大(重构误差的代码量和计算量我感觉比单纯算SOAP大得多得多),在NLO的体系中可能n_max=4和l_max=4就可以得到不错的展开结果了(但是我并没有进入descriptor的训练过程,因此不太好说过度的基函数展开会在训练过程中引入何种问题)。
      但是假如我遇到了一个对称性不高的体系或者是分子体系,我倾向于选择拉高这两个参数以便把所有原子特征都尽量保留,至于拉高到多少就需要做重构测试。如果你的体系也有周期性的话,我觉得试试Sine Matrix和MBTR也不错,至少体感上比高阶展开的的SOAP算得更快。
作者
Author:
Jiang127127    时间: 2025-11-27 09:47
LPOwenChan 发表于 2025-11-27 00:43
从线性代数的理论角度来说,使用更多相互正交的的球谐函数和径向函数是一定可以更好地对体系进行描述 ...

好滴,谢谢指导和帮助
作者
Author:
Jiang127127    时间: 2025-11-27 10:05
在阅读10.1021/acs.chemrev.1c00022 综述中,学习到对于这两个参数选取的知识:
1. n_max、l_max 越大 → 描述能力越强
                                      计算成本会变大
2. l_max对精度的提升远小于n_max
建议n_max>l_max,在相同计算成本下能得到更好的精度
3. (n_max,l_max)
   低精度参数-(6,2)
   高精度参数-(12,6)
综上,我觉得可以先猜测一个适合自己体系的参数,然后后续再去调优,筛选出更好的参数
作者
Author:
Jiang127127    时间: 2025-11-28 17:04
LPOwenChan 发表于 2025-11-27 00:43
从线性代数的理论角度来说,使用更多相互正交的的球谐函数和径向函数是一定可以更好地对体系进行描述 ...

你好,请问对于您提到的MBTR很感兴趣,我去查看了DScribe手册里面查到了,但对于其中的初始参数选取不是很明白,查阅文献也并没有发现参数选取方法,请问您对于MBTR描述符,是怎么选取的参数呀?
作者
Author:
LPOwenChan    时间: 2025-11-29 16:49
本帖最后由 LPOwenChan 于 2025-11-29 17:07 编辑
Jiang127127 发表于 2025-11-28 17:04
你好,请问对于您提到的MBTR很感兴趣,我去查看了DScribe手册里面查到了,但对于其中的初始参数选取不是 ...

    其实在Tutorial里已经写的比较清楚了,针对自己的体系试试看参数组合就应该可以得到合适的参数了,我简单叙述一下里面涉及的参数:
- geometry    对g_k几何函数的阶数取向,一般可以是g_1, g_2, g_3和g_4(n体相互作用),分别代表原子计数、键长(倒易空间距离)、键角(键角余弦)和二面角;由于我之前研究的是晶体,所以我一般会用atom +  inverse distance可以得到不错效果,对于晶体是完全足够的,如果体系足够小甚至可以尝试继续映射键角或二面角;
- grid    这个参数需要谨慎设置,最好体系中最短的键和最长的键(或是最小的角度和最大的角度)都能被包含在min和max之间,需要注意的是这里的min和max是定义在倒易空间的,所以min * 最大键长(键角)= 1,max * 最小键长(键角)= 1;n用于控制输出特征长张量的长度,对于稍复杂的体系可能至少需要100维输出;sigma展宽主要决定特征捕捉的灵敏度,比如我想处理0.2 - 3.3的区间(对应实空间0.33埃-5埃键长),我可以设置sigma = 0.1,捕捉大部分细节(因为键长变化不会过于剧烈,可能在体系中所有可能键的键长都在1.25 - 1.75埃之间);假如我想处理0 - 180的角度(就是实空间的0 - 180度),我就设置sigma = 1,捕捉几乎所有角度细节(体系中键角变化可能是相当剧烈的,完全有可能有30 - 180度的角度分布);
- weighting    千万不要使用unity权重,完全捕捉不到长程作用!一般设置指数衰减权重exp就可以了,在我之前的体系中,为了捕捉可能的跨晶胞作用,我会设置1.5的scale,同时把降低threshold到5e-2;个人认为对于相对小的体系可以适当缩小scale和threshold,当然也可以直接使用r_cut,后者会直接截断exp函数;

- species    研究的原子,体系里有什么原子就以列表形式全写进去;
- periodic    体系有周期性就开,没有就不开;
- normalization    这个参数对于分子体系并没有什么影响,但是如果是研究周期性体系的强度性质(如密度、熔点或电学、光学、磁学等性质)则必须是l2 normalization;
       其他的参数,包括normalize_gaussians, sparse, dtype只影响数值结果,并不影响MBTR结果的唯一性.
       另外值得说的是,MBTR的输出其实是可以叠加的,Tutorial里只写了单一的MBTR,如下:

  1. mbtr = MBTR(
  2.     species=["H", "O"],
  3.     geometry={"function": "inverse_distance"},
  4.     grid={"min": 0, "max": 1, "n": 100, "sigma": 0.1},
  5.     weighting={"function": "exp", "scale": 0.5, "threshold": 1e-3},
  6.     periodic=False,
  7.     normalization="l2",
  8. )
复制代码
    但其实是可以同时输出不同作用的特征张量的,给出我之前使用的一个简单例子:
  1. mbtr = MBTR(
  2.     species=["Co", "C", "H", "O"],
  3.     k1={
  4.         "geometry": {"function": "atomic_number"},
  5.         "grid": {"min": 0, "max": 50, "n": 100, "sigma": 0.5},
  6.    },
  7.     k2={
  8.         "geometry": {"function": "inverse_distance"},
  9.         "grid": {"min": 0.25, "max": 3.0, "n": 200, "sigma": 0.05},
  10.         "weighting": {"function": "exp", "scale": 1.2, "threshold": 1e-2},
  11.     },
  12.      periodic=True,
  13.      normalization="l2",
  14.      dtype="float32",
  15.      sparse=True
  16. )
复制代码









欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3