【Transformer】李宏毅2021/2022春机器学习课程笔记EP12(P49-P50)
从今天开始我将学习李宏毅教授的机器学习视频,下面是课程的连接(强推)李宏毅2021/2022春机器学习课程_哔哩哔哩_bilibili。一共有155个视频,争取都学习完成吧。
那么首先这门课程需要有一定的代码基础,简单学习一下Python的基本用法,还有里面的NumPy库等等的基本知识。再就是数学方面的基础啦,微积分、线性代数和概率论的基础都是听懂这门课必须的。
本节课介绍的是Transformer的内容。
Transformer其实就是Sequence to Sequence(以下简称Seq2Seq)。我们想让机器做到的就是,由机器自己去决定输出的长度。
比如在语音识别、机器翻译、语音翻译、聊天机器人和各种可以看作QA的问题都可以用到Seq2Seq。
但是有很多问题可以用Seq2Seq,但不见得是最好的。我们还是需要根据实际问题客制化各式各样的模型,这样子往往可以得到比单用Seq2Seq更好的结果。
还有一些问题中,可能输出都不是一个Sequence,我们依旧可以用Seq2Seq。比如在语法剖析的问题当中,就算输出是一个树状,我们可以把树形结构转化成一个Sequence,然后依旧可以用Seq2Seq硬解这个问题。
说了这么多Seq2Seq可以解决的情况,其实就是想说Seq2Seq是一个很强大的方法。就如同第一张图片里那样,对于一些问题,我们只要用Seq2Seq硬Train一发就可以解决了。
接下去我们就来介绍Seq2Seq的结构。
Seq2Seq中主要的就是有一个编码器(Encoder)和解码器(Decoder)。
我们先来介绍一些编码器。
编码器就是输入一排向量,然后输出一排向量。这样子的功能RNN和CNN都可以做到,实际上Transformer中的编码器就是上次说的Self-attention,如果你忘记了Self-attention,这里放一个传送门(【自注意力机制】李宏毅2021/2022春机器学习课程笔记EP11(P38-P39) – -TobyKSKGD的个人博客-)。
编码器里面也不止一个输入和输出,里面有很多个Block,每一个Block都是一个Self-attention在做操作。当然,实际上真正的Transformer里面用的不是简单的Self-attention。
Transformer里对Self-attention做了修改。
在一个Block里面,Self-attention层里面把输入和输出拼起来作为一个输入,这个输入叫做residual,然后还要对这个参数做一个归一化处理,这里的归一化处理和上一个EP中说的Batch Normalization不一样,这里用到的是更简单的Layer Norm。做法就在黑色框里面,m表示的是向量里元素的平均值,σ指的是向量里元素的标准差,然后归一化算对应的x‘i就可以了。经过Self-attention得到的结果,我们再进入全连接层,然后再做一次和之前一样的操作,最终得到的输出就是编码器里一个Block的输出。
上面这里的操作就对应的是Encoder图中箭头指的这些。
接着我们来说解码器。
解码器开始有一个向量,是一个表示句子开始的向量(BOS)用One-hot编码表示。
我们先来说解码器的输出。下图中经过解码器输出的向量的长度是我们整个模型可以识别的字数来决定的,比如在中文识别当中,常用字有三四千个,这个向量长度就为三四千。然后从Decoder输出来的向量先会通过一个softmax,然后得到向量里所有元素对应的分数,我们根据这个得分最高的作为我们的输出。
然后需要说的是,解码器中输出的向量是根据前面的全部输出和BOS当作输入得到的。比如上图中,我们根据BOS和“机”得到输出“器”,然后又根据BOS、“机”和“器”得到输出“学”,然后如上图这样一直以此类推。
解码器中把Self-attention修改为了Masked Self-attention。
和Self-attention不同的就是,因为解码器中的输入是有先后的,所有产生前面输出的时候不考虑整个Sequence,也就是说不能考虑后面的输入。
最后,因为我们需要让机器自己决定输出的长度,所以输出结束符也应该放在向量当中。这里就是,如果最终END符得到的分数最高,也就是输出了END符,我们就让解码器停止输出。
然后我们再来比较自回归(Autoregressive,以下简称AT)和非自回归(Non-autoregressive,以下简称NAT)的区别。
AT就是像刚才说的这样,根据前面所有的输出决定下一个输出,也就是一个一个输出的模型,Chat-GPT用的就是AT模型。
NAT就是和前面的AT反过来,一次性输出所有的输出。
那NAT是如何决定输出长度的呢?
一种方法是再另外训练应该预测器去决定输出的长度。
另外还有一种方法是先输出一个很长的序列,用END符终止,忽略END后面的输出。
NAT的优点是可以同时输出,计算速度快;并且NAT可以控制输出的长度,让我们可以自由变换输出的长度。
但是,目前NAT的效果一般不如AT。不过要是深入研究NAT,应该还是有发展前景的。
接着我们再来比较一些编码器和解码器的区别。
经过上图比较我们可以发现,编码器和解码器之间的差别其实就在Cross attention里面,然后可以看到这个Cross attention里的参数有两个来自编码器,一个来自解码器。Cross attention也是编码器和解码器连接起来的桥梁。
下面是Cross attention的运作过程。
Cross attention里做的就是,先把来自解码器的q和来自编码器的k相乘得到注意力分数α,然后用α乘上另一个来自编码器的v,最后全部加起来就得到了Cross attention的输出v。
在Cross attention当中,解码器每一层不一定都要看编码器最后一层的输出。
像下图这样还有很多的连接方式,这里不做阐述。
最后我们再来看看Transformer是怎么训练的。
我们把解码器输出经过softmax之后得到的带有每一个元素分数的向量做最小化交叉熵得到最终的输出,这里实际上用到的就是以前课中学过的分类问题。
然后在训练的时候,一般会给解码器看正确的答案,告诉机器什么情况下应该输出什么。(这里的这个做法其实有问题,后面会再解释)
自此,我们就讲完了整个Transformer的过程。
最后我们来说一些训练Seq2Seq类模型的tips,一共有五点。以下只是提到方法,不会对方法进行阐述。
第一点是Copy Mechanism。
在一些实际问题上,我们需要模型有输出的部分内容是输入的能力。比如在聊天机器人里面,需要对名字或者说它不理解的东西作为输出,再比如做摘要的模型中,我们也需要输出的部分内容是输入的能力。这里就需要Copy Mechanism的技术。
第二点是Guided Attention。
在某些任务中输入和输出是单调对齐的,比如语音识别、TTS等,这个时候我们就不想让attention乱动,我们就可以用Guided Attention技术,强迫attention有一个固定的样貌。
第三点是Beam Search。
在上面解码器根据向量中得分最高的元素作为输出,然后把这个输出当作下一个输入再得到下一个输出的环节中,可能会遇到上面这样的情况。上面红色路径只是一开始的分数好,绿色的路径一开始不好,但是接下去都是好的。这里Beam Search就可能可以帮助找到这个相对更好的绿色路径,注意这里只是可能。
第四点是Optimizing Evaluation Metrics。
就是在评估模型的时候,我们会把拿两个句子做比较才算出的BLEU score作为评估模型的指标。
第五点是Scheduled Sampling。
就是上面说训练模型的时候给解码器看都是正确的资料,但是这样在测试的时候一旦出错,就会一步错,步步错,因为解码器从来没有看过错的东西。所以这个时候,我们说训练的时候给解码器看一些错误的资料效果会更好。
以上就是对Transformer的讲解笔记。
评论