Datawhale AI夏令营-AI+物质科学Task3 学习笔记

Task3 学习笔记

Task2最后的滑铁卢

在上一次的记录中,我将epochs从50增加到70,发现Loss率又有了下降。因此,我当时认为epochs=70时可以取得更好的成绩。

然而,现实却狠狠打了我的脸。

看到了吗?看到了吗?这就是过拟合!说不定50就已经过拟合了,只是70轮更加的明显而已。

行了,对于Layer的调试先停一停,现在我们得先研究一下过拟合了。

对过拟合的复盘

过拟合绝非毫无征兆,因此我先对从50到70的额外过程进行了复盘。

为什么当时选择的70?

其实70是我当时根据在28轮时的Loss,然后根据当时邻近几轮的Loss减少率推出的70。但是,实际上从50到70轮时,每一轮的Loss改善已经平均只有0.009,连0.001都没到了。估计就是这新增的20轮让模型最终产生了过拟合。因此,对于新一轮的调参,除了追求Loss最终的结果,也必须关注Loss具体改善的过程

来自Transformer的助攻

通过对RNN的使用,大家的反应都不好,至少和传统的机器学习相比,差太远了。能够达到原有分数的50%都已经是很认真的调参尝试了。

可是这不对啊,循环神经网络的序列到序列建模方法,不正是为像SMILES表达式这样的线性结构准备的吗,到底是哪里出了问题呢?

其实中,这就是RNN的固有缺点——在建模文本长程依赖方面都存在一定的局限性。

特别的,由于所有的前文信息都蕴含在一个隐向量里面,这会导致随着序列长度的增加,编码在隐藏状态中的序列早期的上下文信息被逐渐遗忘。

但是对于化学,如果Cu被全部遗忘那倒还好,如果根据序列顺序只遗忘了一个C......无敌了,我用铜炼出了铀。

所以,RNN在词汇中的具体应用大致如下:

 

那此时一定会有人问:“将SMILES表达式转化成的Morganfingerprint说长其实也只有几千个1和0,如果我囤积足够多的显卡和内存,同样可以运用线性代数中矩阵分割的方法将所有的信息全部利用起来。”

的确,可以通过足够的资源整理出一个足够容纳所有信息并不会遗忘的长序列。这样我们生成的结果同样会很合理。

那么,代价是什么呢?

首先,这个改进手段很费钱,其次,目前化学不只是化合物——人们通过各种手段生成新的化合物,其中不乏我们这几天一直在研究的催化剂和反应条件。然后我们就会发现催化剂和反应条件是决定产率的关键

但是,我们在RNN的输入中,所有的催化剂和反应条件和化合物是同样的地位,在计算机的眼中,它们都是统一的比特流。

这样是不行的,我们本来SMILES就已经丢失了化合物的空间信息,现在还把催化剂和反应条件的地位也丢了,无外乎训练结果这么差。

尽管理论上通过调参可以弥补缺陷,但是为了让计算机理解这些重要地位,我们需要更多的数据,但是官方只有两万条

实际上,对于正经的AI4Chemistry,训练数据没有50000+条都不好意思拿出来Battle。

可见,为了我们能够仅使用两万条数据就可以让模型自己知道部分要素的重要地位,我们需要自行引导模型的注意力

所以,Transformer诞生了。

Transformer不止是注意力

  1. Transformer完全通过注意力机制完成对序列的全局依赖的建模。从一开始就会确定部分参数的重要地位。

  2. 并且,这是一种可以高并行的结构,大大增加了计算效率

首先,Transformer需要对于全局完成一次大规模的建模,这本身将会带来一定的时间损耗,如果这个时间损耗过高,那研究Transformer将毫无作用——至少也得等到硬件算力发展之后再说。

然后,正因为是高并行的结构,所以就和之前的机器学习的向量化处理一样,我们的老朋友——Python的Numpy库又将会在这里大放异彩。于是,Transformer得到正式落地。

Transformer的革命性结构

 

上面的图是一幅使用Transformer进行机器翻译的过程。通过这个过程,我们得到了如下的结构解析:

1. 嵌入层 (embedding layer)

将token转化为向量表示。模型认识的只是向量,所以需要将每个切分好的token转化为向量。

这个过程中,与RNN不同的是,我们在Transformer的嵌入层,会在词嵌入中加入位置编码(Positional Encoding)。

为什么需要位置编码?

之前已经有所提及,首先模型只认识”这是一个向量“,然后,注意力机制对于计算机就是表明要它对于某一位置的元素赋予不同的权重,因此,这样的方法于底层返回的应该是一个指针,而这个指针又应该能从数据结构体的指针的映射或者偏移得到。

—— 实际上,transformer使用的多头注意力计算方式,本身无法获取到序列中各个字符的位置信息,因此需要人为地维护一份位置信息。

不过,值得注意的是,向量可不一定是数组,但是如果仅仅只是相互映射又不符合注意力这一特征,因此,位置信息的计算同样也需要除了线性相加以外的公式。

 

上述方式编码有以下好处:

首先,正余弦函数的范围是在[-1, 1],导出的位置编码与原词嵌入相加不会使得结果偏离过远而破坏原有单词的语义信息。

其次,依据三角函数的基本性质,可以得知第pos+k个位置的编码是第pos个位置的编码的线性组合,这就意味着位置编码中蕴含着单词之间的距离信息。

2. 自注意力层 (self-attention layer)

在编码输入序列中每一个单词的表示的过程中使用查询/键/值三个元素计算每个位置的权重得分。而自注意力则是指查询/键/值三个元素均为序列本身的情况,为了防止过大的匹配分数在后续 Softmax 计算过程中导致的梯度爆炸以及收敛效率差的问题,这些得分会除放缩因子以稳定优化。放缩后的得分经过 Softmax 归一化为概率之后,与其他位置的值向量相乘来聚合希望关注的上下文信息,并最小化不相关信息的干扰。

 

如何使用Transformer?

通过上面的描述可知,Transformer也是一个经典的编码器-解码器模型(encoder-decoder model)。从基本架构图中也可以看到,编码器部分将输入转化为一个向量之后,再传递到了解码器部分。既然这样,我们完全可以把Transformer的Encoder和Decoder部分拆开,分别拿来使用。

最重要的是,既然Encoder部分输出的本身就是一个向量,那么只要模型学习得够好,那么这个向量就一定包含了重要的输入序列信息。因此,我们可以将这个代表输入序列的向量,再作为其他模型的输入(例如全连接网络等),从而进行我们想要的分类或者回归任务。这样可以大大减少工作量,毕竟我可不想在疯狂运行的计算机旁边老是守着。

夏令营最后的实践

在这次实践开始之前,助教们都注意到了大家深度学习分数偏低,因此召开了一次上分研讨会,在这里,大家讨论总结了一些经验教训。

关于epoch:epoch越大,训练得越久,一般而言模型得性能会更好。但是也有可能会出现过拟合现象。这可也太真实了。

所谓过拟合,就是模型过分学习了训练数据,导致泛化能力减弱的现象。一个极端的例子是:模型完全死记硬背记住了所有训练数据,因此在训练数据上的预测结果为满分。但是对于没在训练过程中见过的数据,却完全无能为力。

举个例子,就是我让模型计算一个回归直线方程,它为了拟合,给我整了个折线图。

调整模型大小:也即中间向量的维度、模型得层数、注意力头的个数。一般而言,模型越大学习能力越强,但是同样的也有可能出现过拟合。

我就先不说过不过拟合了,本次实践我的Layer就不敢超过10,为什么,这Transformer太吃显存了,超过10的时候,就是24G的显存都扛不住,服了!

数据:对数据做清洗,调整数据分布,做数据增广。对于SMILES一个可行的增广思路是:将一个SMILES换一种写法。

前面对SMILES中没提到:其实,对于某个分子的SMILES,可以有多种写法。这其实很好理解,我们知道SMILES是从某个原子开始,依次排列所有原子而得到的。那么选取的初始原子不同,SMILES就会不一样。所以,为了统一,人们在使用的时候往往会将SMILES做一个书写规范,这个过程叫做标准化(canonicalization)。官方给出的数据就是规范化后的。

就是,对两万条数据做处理,估计这样会很麻烦,化学式大都源自经验,要想写脚本还是要点功夫的。

采用学习率调度策略:在训练模型的过程中,我们发现往往约到后面,需要更小的学习率。例如下图:学习到后面,我们需要收敛的局部最小值点的两边都比较“窄”,如果现在学习率太大,那么在梯度下降的时候,就有可能翻过局部最小点了。因此需要调整学习率变小。在Pytorch中已经定义好了一些常用的学习率调度方法,比如说本次将会使用到的自适应梯度调整

从上图可知,在学习率将会随着epoch不断改变。

然后在本轮投入训练时我又遇到了同样的情况,连着10轮时我遇到的停滞远比RNN要更加强大。

 

三小玩意,这就根本没动弹过!说明在Transformer的领导下,这个过拟合的风险未免也太高了。我看着它,就好像看到了70轮的RNN,这太可怕了。

因此,得先对Layer和学习率进行调整。可以确定的是,默认的Layer=4未免还是有点欠拟合了,只要将它调整到5,我们就可以直接收获到肉眼可见的收益。

 

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值