赞
踩
这一篇主要讲解谷歌发表的Attention Is All You Need。这篇论文提出了驰名的一种注意力机制 —— self-attention 模块,并进一步提出了 Transformer 架构,从而将以往用的计算代价较大的RNN替换掉了。目前,nlp任务中效果非常好的BERT模型就是大量应用了Transformer架构的Encoder。
下边是一个很好的使用Transformer进行机器翻译任务的例子。在预测过程中,编码阶段,输入的“I arrived at the”中的每个单词都会计算与所有单词的注意力权重,并加权求和得出新的自己的表示,逐层编码。解码阶段,输入由encoder出来的所有单词的表示和上一个位置输出的embedding,经过类似的注意力操作得到这一个位置的输出,是一种随着预测位置移动的迭代过程。
戳我看例子
对照着以上例子,看下边的Transfomer总体框架图。左边为编码器,右边为解码器。编码器和解码器中都包含了Positional Encoding模块,Multi-Head Attention模块,Feed-Forward模块。下一章节会对此着重讲解。
定义一下符号。
编码器对于训练阶段和测试阶段是一样的编码过程,而解码器的流程则有所不同,因此先讲解一下解码器的训练和测试。
在测试阶段,由于没有groundtruth,所以我们需要从零开始不断迭代一个词一个词地生成。具体操作如下:
因此可以看到,解码器在训练时直接从target_length->target_length,而测试时则是从1->1 2->2 3->3 … target_length->target_length的过程,最后预测的是每次迭代中最后一个预测的token串联起来。
Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,所以文章中作者提出两种Positional Encoding的方法,将encoding后的数据与embedding数据求和,加入了相对位置信息。
Multi-Head Attention其实就是多个Self-Attention结构的结合。因此,首先我们需要着重学习论文的重点Self-Attention。
从一个比较知名的例子讲起。
假如我们要翻译一个词组Thinking Machines,其中Thinking的输入的embedding vector用x1表示,Machines的embedding vector用x2表示。当我们处理Thinking这个词时,我们需要计算句子中所有词与它的Attention Score,这就像将当前词作为搜索的query,去和句子中所有词(包含该词本身)的key去匹配(点乘),看看相关度有多高。相关度进行尺度缩放与softmax归一化可以得到注意力权重,注意力与相应的value加权求和就得到新的表达。
如果将输入的所有向量合并为矩阵形式,则所有query, key, value向量也可以合并为矩阵形式表示
则上述操作可简化为矩阵形式
这就是著名的注意力公式:
基于上边的Self-Attention, 我们进一步拓展,对输入序列使用不同的Q,K,V进行多次以上操作,而后拼接起来,再转换成最终的表示。这样每个head可以学习到在不同表示空间中的特征。
可视化如下:
在训练过程的解码器中,需要对输入的注意力矩阵(即上边QK经过softmax的矩阵)进行masked操作,从而不给模型看见未来信息,解决了信息泄露问题。举例来说,对于目标序列(I have a dream),I作为第一个单词,只能有和自身的attention。have作为第二个单词,有和I, have 两个attention。 a 作为第三个单词,有和I,have,a 前面三个单词的attention。到了最后一个单词dream的时候,才有对整个句子4个单词的attention。
其它操作和上述的Multi-Head Attention一致。
在解码器的第二层attention里,需要整合encoder的输入序列和decoder的目标序列的信息,算出相互之间的注意力。与Multi-Head Attention的不同点在于,Encoder-Decoder Multi-Head Attention的Q矩阵来自decoder,而K和V来自encoder。其实也很好理解,就是注意力矩阵是由来自解码器的Query和来自编码器的Key之间计算得来,其它操作都相同。
这个就很简单了,就是简单的映射层。
这个其实也是普通的映射层,它将每一个目标序列的token由emb_dim映射到vocab_size,因此就可得到各个token,串成目标序列了。
不得不说,这确实是一篇很经典的论文,将seq2seq模型推到了一个新高度,避免了RNN的大量计算代价,从此用CNN操作序列信号就有很好的效果了。另外,Self-Attention还跨界在cv行业也有了非常多的研究。可以说cv和nlp是同源的,只需要将图像的长宽拉成一列(空间信息)类比成序列信号的序列,图像的通道类比成序列信号的embedding即可。因此,Self-Attention模块的输入在nlp上是time × embedding,在cv上是spatial × channel。此外,当下横扫nlp的BERT模型也是基于Transfomer的encoder,这也表明这个模型的重要性了。
https://medium.com/dissecting-bert/dissecting-bert-appendix-the-decoder-3b86f66b0e5f
https://zhuanlan.zhihu.com/p/80986272
https://zhuanlan.zhihu.com/p/44121378
https://zhuanlan.zhihu.com/p/39034683
https://zhuanlan.zhihu.com/p/47282410
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。