https://arxiv.org/abs/1706.03762
Attention is All You Need, Google Brain, CVPR 2017
是啥
该论文提出了一个简单的网络架构 Transformer,里面用 Self-attention & Muti-Head Attention 来代替以前的序列模型( 譬如 RNN 和 LSTM),在机器翻译任务上精度比之前的方法好,且设计的网络也比之前方法容易并行化,从而计算速度也快。
Transformer 后续则被很多学者应用视觉等其他领域上,也取得了很好的结果,是很值得熟读的一篇经典的文章,引用达到了7万多
缺点:Transformer 架构简单,对比 CNN(平移不变性,多尺度提取特征等特性),它的假设和预置信息是比较少的,因此需要大数据量才能学习到数据中的规则
一些后续的基于 Transformer 工作都是琢磨着如何加入 CNN 中的多尺度,平移不变等特性
网上关于 Transformer 的博文有很多,在本文底部的参考链接中可以看到,我在查阅了资料后,组织了一下语言来讲解一些这篇经典的文章
模型架构
模型图如下所示,为 Encoder-Decoder 架构,第一列为 Encoder,第二列为 Decoder
Input Embedding:
假设输入句子为 “Attention is all you need.”,里面包含了 5 个单词,每个单词用 512 维向量(又称为 Token)表示,那么输入的 shape 为 5x512
Output Embedding:
Decoder 输出的词再经过 Embedding 后即为 Output Embedding
Output Probabilities:
根据词典的大小,每个词对应的概率,每次取最大的概率对应的词拼接在一起则为翻译的结果
Encoder-Decoder
Encoder: 这里的 Nx 的意思是堆叠多少个这样组件,文中 N = 6,每个组件里包含两个子层(sub-layers),第一个子层为 Multi-head Self-attention,第二个子层为 position-wise fully connected feed-forward,两个子层都使用了残差连接来解决梯度消失的问题。
Decoder: Nx 的含义同上,与 Encoder 里的组件类似,不同的是 Decoder 除了 Encoder 的输出作为输入外,还有 Output Embedding 输入,它是 Decoder 的输出再进行词嵌入得到的,这里的 Masked 是用来屏蔽当前预测顺序之后的词,起到防止未来信息泄露的作用的。
啥是 Multi-head Self-attention
Multi-head 如上右图,h 即为多头(Multi)的数量,这里设计初衷是为了模拟卷积中多通道输出的效果,从而提高学习能力
Attention 中 Q, K, V 代表的是 Query,Key,Value,输出为 Output,它们都是向量。Output 是由 Value 加权求和得到如下图所示,权重的计算基于 Query 和 Key 之间的相似度,在具体实现中是 Q 和 K 做点乘后再 Softmax,如上左图
所谓的 Self 体现在 Query, Key, Value 三个向量是相等的,这样做优点是一层就可以看到整个句子,有助于高效学习 Token 之间的关系
为啥用的是 LayerNorm
这里不用 BtachNorm 的原因,因为针对序列输入的任务,输入的每个样本都是不定长的,从而导致在 BN 计算均值和方差的时候,波动会比较大,而 LN 是对单个样本计算均值和方差,相对来说就不存在这个问题
Position Encoding
在翻译句子时,词之间是有前后顺序的,顺序不同,意思也不同,为此,作者设计了 Position Embedding,让他能够在每个 Token 中加上位置信息,如下图所示
效果这块的话,在机器翻译这个任务上达到了 SOTA,这里不展开,具体的可以去看原文
参考链接
下面这篇文章写的很好,图文并茂
http://jalammar.github.io/illustrated-transformer
官方解读
https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html