我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。
已经有人记了笔记(很用心,强烈推荐):https://github.com/Sakura-gh/ML-notes
本节对应笔记:无
本节内容综述
- Transformer是一种 Seq2seq model with “Self-attention”,BERT就是基于这种技术;
- 一般想到处理序列,我们首先想到的就是RNN,但是RNN
Hard to parallel,需要按序列输入; - 于是有人提出,使用CNN来代替RNN,可以以一段作为输入,其输出是一段序列。此外,CNN
can parallel,几段序列可以一起输入。 - 但是 CNN 的每个filter只能接收小部分的信息,也存在局限性;于是提出了
Transformer。用self-attention取代RNN。 -
Attention is all you need.其运算见小细节。此外,还通过矩阵运算,进一步讲解如何做“平行化”运算(可以用GPU加速)。 - 接下来,讲解了 Multi-head Self-attention,见[小细节](#Multi-head Self-attention)
- 对于 self-attention 而言,其输入顺序并不重要。因此,如何把“顺序”考虑进去呢?原始论文提及了
Positional Encoding,人手动(不是靠学习得出)规定了一个 Positional Encoding ,参与运算。见小细节。 - Seq2seq with Attention,原来的RNN都可以用Self-Attention Layer 来替代。这里详细讲了 Transformer的模型具体细节。见小细节。
文章目录
小细节
Self-attention
如上图,在 self-attention layer 里,每一个 input 都乘上3个不同的 transformation (不同的 matrix),产生三个不同量:,和。
得到了,和后,就拿每个 query q 去对每个 key k 做 attention 。 如下图。
Scaled Dot-Product Attention:
如上图,接下来对 做 softmax 处理,得到 :
如上,再通过如下运算,可得到考虑了全局信息的序列(中的第一个元素)。
如果让只考虑前三个输入的影响,如何做呢?很简单,让其余的在运算时为0即可。
这些可以同时计算(Can be parallell computed)。
以下是矩阵部分。
如上,用大写符号、、、代表变量叠加后的矩阵。
如上,可以将这个过程并行,放在一个矩阵中。
如上,可以通过矩阵运算得到 的矩阵。
如上,再次进行矩阵运算,得到输出的序列。
因此,整个的 self-attention 就是一堆矩阵运算,可以用GPU来加速。
Multi-head Self-attention
如上,使用 2 个 head 进行举例。得到了两个 。
最后,可以再对两个 head 进行如上操作。
之所以用 Multi-head ,是希望每个 head 的关注点不同:有些看长时间的,有些看短期内的。
Positional Encoding
原论文中,介绍了将位置特征向量与相加。这是会有问题:为什么不是concat,而是相加?
李老师提供了一种讲法,先讲 concat ,最后达到了与原论文相同的效果(转化回原论文的式子)。
如上,轻易论证了二者相加与concat的同理性。
论文的是人手动设定的,长得样子如下。
Seq2seq with Attention
如上,谷歌做了一个动图:
- 首先是3层attention;
- 接下来是decoding,不止会考虑到input,还会考虑之前输出的部分。
如上,一个典型的 Transformer 。
如上:
- 处理前先加上位置编码;
- 首先进行注意力层的处理;
- 之后进行一个 Add ,就是将注意力层的输入加上对应的输出;
- 然后经过 Layer Normalization ;
- 右半部分中,输入为之前输出的值;
- 其中 Masked 表示:在做 self-attention 时,会将自己的内容 attend 到已经产生的序列上。
Result
如上,仅仅将句子中的 tired 改成 wide ,it就可以自动地改变其“理解”,从 animal 改为指向了 street 。
如上,Multi-head起到了关注点不同的效果。
如上,用维基百科作为输出(句子长度长达10e2到10e6),神经网络还能不混乱,足以见到 Transformer 之强。
Universal Transformer
在深度上,类似 RNN ,不断使用同一 transformer 。
此外,还有人做了在CV上的拓展。