0. 引言
Google的论文《Attention is all you need》一提出,为nlp的很多任务翻开了新的一页。无论是知乎还是博客上都有很多生动具体的见解,我这里会结合自己阅读论文以及代码实现,对Transformer的一些个人理解和个人思考。
先来看一下这篇论文的摘要:
![](https://i-blog.csdnimg.cn/blog_migrate/cae21451487586a155a082ac40c678da.png)
首先在性能上来看,他的提升真的很给力,进行了大幅度的提升,主要提升是在机器翻译任务上。
最明显的特点是区分CNN/RNN,在前向传播上只使用了Attetion机制来模拟语言模型的一种结构。
1. 传统的Seq2seq缺点
RNN网络存在很明显的缺点:
- 首先很难像CNN一样并行化处理,这样无法捕捉并行化特征。
- 其次很难想CNN一样做的很深,像CNN一样做很多层在RNN中实现效果不好。
- 长距离依赖问题一直没有得到很好的解决,很难建立指代信息。
![](https://i-blog.csdnimg.cn/blog_migrate/7676b91a1bb97bf54cb1b268b165769d.png)
2. Transformer的优点
我们首先开门见山,说一下Transfomer的优势:
- 高度并行化网络,训练速度提升
- 层次化信息的捕捉,编码段端或者解码端都可以做到六层,可以做到比较深。(残差网络)
- 上下文信息的丰富和引入(self-attention)
Transformer本质上还是一个seq2seq的模型,由encoder和decoder组成。encoder和decoder都是基于自注意力机制构成的结构(非RNN)。编码器和解码器都是一组编码组件和一组解码组件,原论文中所提出的具体数目是6个
![](https://i-blog.csdnimg.cn/blog_migrate/3425cdb5e3cacf8e65a8f98feddf5c59.png)
3. Transformer的流程
3.1 word embedding + position embedding
将每个输入的词汇转化成向量,也称为词嵌入/词向量(word embedding),嵌入仅发生在最底部的编码器中。Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,所以文章中作者提出两种Positional Encoding的方法,将encoding后的数据与embedding数据求和,加入了相对位置信息。
![](https://i-blog.csdnimg.cn/blog_migrate/e3c90ba37002401d9f21972d49ec3bd2.png)
3.2 Encoder (Multi-head self-attention + Feed Forward Neural Network)
对于每个编码器来说,他们的结构均相同(但它们不共享权重)。
每一层都分为两个子层:
编码器的输入首先流经自注意力层,该层可以编码出同一个句子中不同词语之间的关系。
自注意力层的输出之后便是一个简单的全连接神经网络
![](https://i-blog.csdnimg.cn/blog_migrate/ddba68fe5808583687e8e6a9a99fba7a.png)
Transformer的关键属性:每个位置的单词都流经编码器中自己的路径(计算无先后关系)。所以,运算速度比一般的循环神经网络(RNN)要快很多。
如何计算自注意力?对于每个单词,创建一个查询向量、键向量和一个值向量,称为 Q K V QKV QKV。
![](https://i-blog.csdnimg.cn/blog_migrate/5d29282a3d3ba773bb8297afd55b85d7.png)
如何计算自注意力?通过将q向量与各个单词的k向量的乘积来计算分数。分数越高,说明关系越密切。将分数缩小,然后通过 s o f t m a x softmax softmax计算对应概率。将每个 V V V向量乘以概率值加权求和,生成向量前馈到神经网络。
![](https://i-blog.csdnimg.cn/blog_migrate/ddba68fe5808583687e8e6a9a99fba7a.png)
(实际运算中,以矩阵形式运行,加快运算速度)。
![](https://i-blog.csdnimg.cn/blog_migrate/9aa376f6443116650a0734857eca8ef4.png)
多头机制:论文通过添加一种称为“多头”注意力的机制,进一步完善了自注意力层。扩展了模型专注于不同层面的能力。提供了多个“表示子空间”。在多头机制下,有多组查询/键/值权重矩阵(Transformer使用八个头,因此每个编码器/解码器最终得到八组)。
![](https://i-blog.csdnimg.cn/blog_migrate/2a48b5e8414650204adfc65f521d1358.png)
3.3 Decoder (Masked Multi-head attention + Encoder-decoder attention + Feed Forward Neural Network)
解码器:还有encoder和decoder之间的注意力层,来帮助解码器将注意力放在输入语句的相关部分上(类似于seq2seq模型中的注意力)。
为什么要加masked?因为transformer模型训练的时候,直接把ground truth整个序列作为decoder端的输入。
编码器,解码器如何协同工作?
编码器首先处理输入序列。顶部编码器的输出转换为注意力向量K和V的集合。每个解码器将在其“编码器-解码器注意”层中使用它们,这有助于解码器将注意力集中在输入序列中的适当位置。(解码器结构:自注意力+编码器-解码器注意+前馈层)
解码器中的自注意力层与编码器中的自注意力层的不同:掩码:在解码器中,仅允许自注意力层参与输出序列中的较早位置;“编码器-解码器注意”层的工作方式与多头自注意力类似,不同之处在于它从编码器的输出中获取键和值矩阵(context)
3.4 Linear & SoftMax
最终的线性层和Softmax层(词典大小的多分类)。
4 Self-ATT常见问题和BERT 常见问题
以后面试的时候会整理(WX收藏夹)