李宏毅《机器学习》总结 - Transformer

前言

当时老师要求我做 transformer 和 self-attention 的 ppt,结果当时在训练 ACM 没大有时间,就弄了个质量不高的,不出意外的被喷了。。。现在回头看看当时做的整体没有大问题,但是由于知识没有连贯起来导致有些地方没有提到,也没有形成一个比较完整的架构。

Transformer 能做的任务是 seq2seq(即输出的长度不一定是输入的长度,而 self-attention 中输出长度等于输入长度),具体包含 encoder 和 decoder 两个部分
image

encoder

总的来说,包含 N 层,每层由一个 self-attention 和 一个 FC 组成:
image
在 encoder 中,self-attention 不是简单的得到 q,k,v,相乘并 softmax 得到 α,再和 v 做 weighted-sum,而是结合了 residual 和 normalization 的过程(简记为 add&norm)
具体地:
image
即:每一个向量先做 self-attention,再和原向量相加,这就是 residual 的过程,做 layer normalization(与 batch normalization 不同,BN 是对不同向量的同一个 feature 做 normalization,即“横着”,LN 是对一个向量的所有 feature 归一化,“竖着”),得到输出,再扔到 FC 中,做完 normalization 得到最终输出。这就是 "add&norm" 的含义。
至于为什么要做 residual,这其实是 resnet 的思想。大意就是更容易获得恒等变换,这样就避免了深层神经网络退化的问题。
image

另外,再简单介绍一下 encoder 和 decoder 都出现过的 embedding。主要分为两个部分:word embedding 和 positional encoding。
word embedding 就是将原本表示单词所用的 one-hot vector 转化为一个低维的向量,并且相似的词的距离应该较小。
在 RNN 中,由于顺序处理的关系,天然的考虑了句子中单词的顺序。而在 transformer 中,由于使用了 self-attention,并不能考虑单词的顺序,因此需要额外的对顺序进行考虑(实践中通常是加上代表顺序的向量),这就是positional encoding。通常可以直接套公式。

decoder

decoder 的整体结构:
image
可以简单描述一下流程,以声音转文字为例。encoder 读入一段声音讯号,经过 encoder 的处理得到相同长度的向量序列,在 decoder 的 cross attention 中发挥作用。首先输入 BOS,经过 decoder 之后得到一个分布,求出 cross entropy 的 argmax 为“机”。在输入“机”,经过相同操作得到“器”。以此类推。其中 decoder 的输入(即图中的“outputs”部分)是什么呢?一个比较直观的想法是将上一个位置的输出作为 decoder 的下一个输入。这样有个问题就是 error propagation(一步错、步步错),而且这是在训练,这样不利于训练。因此,可以采用 teacher forcing 的方法,直接把输入 right shifted 一下(相当于在声音讯号对应的正确的文字序列的最左边加上一个 BOS)

decoder 的运行示意图:
image
每一次,decoder 的输入是上一步的输出,每一步的输出是一个单字的 distribution,这个分布的 argmax 就是输出的字

回到第一个图中观察 decoder 的结构,发现如果盖住和 encoder 相连的部分的话,剩下的部分和 encoder 非常相似。唯一的区别在于原来多头注意力变成了 masked 了,这是因为 decoder 的输入只能看到前面的部分,不能看到后面的输出(这个过程是串行的)

如何判断输出的长度?在 distribution 中加一维 end,如果 end 的概率大就结束。

现在考虑之前被盖住的部分,也就是 decoder 接收 encoder 的输出的部分。会发现这里还是应用的 multi-head attention,只不过这里不是 self-attention,而是 cross attention。即,在普通的 self-attention 中,由向量序列中的 xi 经过矩阵乘法(这个矩阵也是待学习的参数)得到 qi,ki,vi,均为向量。接着当前的 qi 和全部的 kj 做点乘,得到 αi,j,和对应的 vj 做加权和再 softmax,得到一个分布。而在 cross attention 中,vi 仍然是由 decoder 的输出的向量序列中的 xi 产生的,而 qiki 则是由 encoder 的输出向量序列产生的。其余过程相近。

如何训练 decoder 呢?在训练集上,给出一段声音讯号,decoder 得到对应的翻译,和答案对应的翻译比对,decoder 每次得到的输出实际上是一个概率的分布,而答案的翻译是一个单字,是一个 one-hot vector(如果没有 word embedding 的话),分别做 cross entropy 并求和,要 minimize 这个和

一个训练方法是 teacher forcing,每次用正确答案当做输入(上面提到过,可以更充分的进行训练,避免了 error propagation 的问题)
image

beam search(未讲,待填)

posted @   SkyRainWind  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2023-01-31 AT dp 26 题 题解
点击右上角即可分享
微信分享提示