计算化学公社
标题:
简单神经网络教程
[打印本页]
作者Author:
sky
时间:
2022-10-8 20:03
标题:
简单神经网络教程
本帖最后由 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个数据,但这对后面的操作不会有影响。
(, 下载次数 Times of downloads: 24)
上传 Uploaded
点击下载Click to download
(因为涉及一些公式,这里无法显示,因此以图片形式展示)
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)
复制代码
(, 下载次数 Times of downloads: 23)
上传 Uploaded
点击下载Click to download
上图就是训练数据,可以看到我们实现的func,也就是cos在指定区间[0,4]和[6,8]上的样子。
接下来再次在[0, 8]范围内随机生成100个x值作为神经网络的输入,看看神经网络的输出跟函数func的输出有什么区别。
#这里无法正常显示代码,请参考原帖子
复制代码
(, 下载次数 Times of downloads: 22)
上传 Uploaded
点击下载Click to download
上图中蓝色的圆点是定义的函数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
作者Author:
PESPES
时间:
2022-10-8 20:26
正想学习一下神经网络拟合势函数方面的知识,真是及时雨啊
作者Author:
lonemen
时间:
2022-10-8 23:11
谢谢!很好的学习资料。
作者Author:
brantgao
时间:
2022-10-17 20:37
好东西啊
作者Author:
星斗如盘
时间:
2022-11-2 17:15
这些代码要在哪里执行,如何逐步执行呢?
作者Author:
PESPES
时间:
2022-11-7 16:47
星斗如盘 发表于 2022-11-2 17:15
这些代码要在哪里执行,如何逐步执行呢?
请问你找到没有显示出来的代码了么?
作者Author:
sky
时间:
2022-11-7 21:33
PESPES 发表于 2022-11-7 16:47
请问你找到没有显示出来的代码了么?
文章第一行有链接:
https://github.com/Angel-Jia/dp- ... _introduction.ipynb
作者Author:
dlldwtz
时间:
2022-11-22 10:31
您好,我想请教一下,神经网络拟合函数时验证误差与训练误差的比值保持在多少以下比较合适呢?
作者Author:
nusiew
时间:
2023-12-12 10:37
请问 dpgen 自动寻找模型没有覆盖到的区间,来生成标注数据的原理是什呢?
欢迎光临 计算化学公社 (http://bbs.keinsci.com/)
Powered by Discuz! X3.3