|
本帖最后由 sky 于 2022-10-9 13:13 编辑
帖子中一些代码无法正常展示,请参考原帖子:https://github.com/Angel-Jia/dp- ... _introduction.ipynb
这是一个面向非计算机专业同学的机器学习教程,将介绍一些使用deepmd-kit(分子动力学计算)、deepks(量化计算)等软件时可能用到的深度学习知识。在这个教程中你将学到如何训练神经网络来拟合一个简单的函数。神经网络模型的训练无需使用显卡,在个人笔记本电脑上花费几十秒就能完成训练(支持windows/linux/mac os系统)。
运行教程中的代码需要安装pytorch(cpu版本),matplotlib(用于画图)和jupyter notebook,建议安装Anaconda来运行本教程,安装方法网上可以搜到。安装好相关环境之后,可以使用下面的命令安装pytorch、matplotlib和jupyter notebook
- # conda安装
- conda install pytorch -c pytorch
- conda install matplotlib jupyter notebook
- # 或者pip安装(与conda安装只能二选一)
- pip install pytorch
- pip install matplotlib jupyter notebook
复制代码
理论上神经网络可以拟合任意函数,这里将给出一个神经网络拟合cos函数的例子:,首先用python写一个cos函数:
- import math
- def func(x):
- return math.cos(x)
复制代码 上面的func函数接受一个输入x,输出cos(x)。接下来利用func函数生成一批数据
- # 先定义x的区间为0-4和6-8,然后在这两个区间上随机生成500个数据
- intervals = [[0, 4], [6, 8]]
- data_num = 500
复制代码 因为有取整操作,只产生了499个数据,但这对后面的操作不会有影响。
(因为涉及一些公式,这里无法显示,因此以图片形式展示)
Deepmd-kit中用到的神经网络,以及该网络可以调节的参数跟下面这个神经网络模型几乎完全一样:
接下来还要实现一套训练代码。
训练过程简单来说就是有n个标注好的训练数据,即n个x值和n个y_label值,每个x, y_label都有y_label = func(x). 将n个x输入模型,得到模型输出的n个y_model_output,然后求y_label和y_model_output的平方差,就能得到误差loss。利用求导公式可以将误差传递回模型中让模型学习,从而让模型的输出越来越接近y_label。
训练大概十几秒就能完成。训练过程中应该观察到loss值快速下降。 接下来对训练的结果进行可视化,首先来看看训练数据的样子
- import matplotlib.pyplot as plt
- plt.scatter(x_list, y_list)
复制代码
上图就是训练数据,可以看到我们实现的func,也就是cos在指定区间[0,4]和[6,8]上的样子。
接下来再次在[0, 8]范围内随机生成100个x值作为神经网络的输入,看看神经网络的输出跟函数func的输出有什么区别。
上图中蓝色的圆点是定义的函数func也就是cos的值,而红色的x点为模型的输出。可以看到在[0, 4]和[6, 8]区间上,模型的输出结果和func的输出非常吻合,而在[4, 6]区间上,尽管红色和蓝色的值非常接近,但偏差明显比[0, 4]和[6, 8]区间大。
建议尝试将func中的函数替换成其它函数,并改变训练的参数,如生成的数据量,模型的width和depth,训练的步数等来观察训练的情况,目标是使得loss尽可能地低。在训练时有这么几个问题需要注意:
1. batch_size代表每次迭代用多少个数据来训练,一般来说这个值越大,训练出来的模型效果越好。但在实践中batch_size越大,消耗的内存/显存越多,甚至会导致内存溢出错误(OOM,out of memory)。
2. 一般来说func越复杂,需要的神经网络越大(width和depth都需要加大),需要的数据也越多。自己训练时,width设置为2~40,depth设置为2~4已经足够用了。
3. 如果loss降不下去,一般首先考虑的是增加训练步数和数据量,调节loss策略,再考虑加大模型;
4. 实践中会将数据集分成训练集+测试集(上面的代码中没有实现),当训练集和测试集上的loss都不再下降时,认为模型训练已经完成;在这个教程中可以认为当训练集的loss不再降低时,训练完成;
理论上神经网络可以逼近任意函数,例如图片分类(输入一张图片,输出图片类别),物体检测(输入一张图片,输出图片物体的类别和位置),自然语言处理(输入一句话,输出针对这句话的回答)等等。只需要将这些输入转换为矩阵,输入模型得到结果,再转换为人类可以理解的输出即可。
在量子化学计算和分子动力学模拟中,很自然就可以想到用神经网络来逼近复杂的势能面,代替第一性原理计算。Deepmd-kit的输入为原子的坐标和元素种类,输出为体系的energy,每个原子的受力force和体系的virial force。其计算速度是第一性原理计算的1000倍以上,更重要的是Deepmd-kit的计算时间跟体系原子数成正比,而传统的第一性原理计算如DFT,其消耗的时间与体系原子数的三次方成正比,因此使用Deepmd-kit可以完成上亿原子的动力学模拟,而这么大的体系使用DFT甚至连算单点能都做不到。
此外,在上面的实验中可以观察到一个现象:模型在数据集的覆盖范围[0, 4]和[6, 8]区间上表现很好,而在没有覆盖到的区间如[4, 6]上表现就会下降。因此在训练模型时,一个重要的问题是如何产生一个分布足够均匀的数据集,使得模型在待研究的区间上都能保持良好的精度。Deepmd-kit有一个配套的生产数据的工具叫dpgen,可以自动地寻找模型没有覆盖到的区间来生成标注数据。之后的教程中将会介绍这些工具的原理和使用方法:
deepmd-kit项目: https://github.com/deepmodeling/deepmd-kit
dpgen项目: https://github.com/deepmodeling/dpgen
|
评分 Rate
-
查看全部评分 View all ratings
|