本文主要用于记录谷歌发表于2017年的一篇论文(引用量接近上千)。该论文提出的Transformer模型也是近年来被广泛应用的。本笔记主要为方便初学者快速入门,以及自我回顾。
论文链接:https://arxiv.org/pdf/1706.03762.pdf
Github: https://github.com/tensorflow/tensor2tensor
基本目录如下:
- 摘要
- 核心思想
- 总结
------------------第一菇 - 摘要------------------
1.1 论文摘要
现今几乎所有主流的翻译模型都是建立在复杂循环或卷积seq2seq框架基础上的,而其中表现最好的模型是基于注意力机制实现的。本论文提出了一种新的神经网络结构,Transformer,仅仅依赖于注意力机制,摈弃了传统循环或卷积网络。这个新的网络结构,刷爆了各大翻译任务,同时创造了多项新的记录(英-德的翻译任务,相比之前的最好记录提高了2个BLEU值)。而且,该模型的训练耗时短,并且对大数据或者有限数据集均有良好表现。
------------------第二菇 - 核心思想------------------
2.1 论文模型结构
作者在开头还是吐槽了很多传统模型的弊端,尤其是计算速度慢(主要是序列模型无法进行并行计算的缘故)。然后说自己的Transformer模型有多牛x,完美避开了那些复杂的神经网络模型,只用了注意力机制,不仅大大加快了模型的训练速度,还保证了质量。然后在背景介绍里抛出了一个新的概念self-attention(我还专门去搜了一下相关文献,但反正我是没搜到其他地方有用到哈哈,应该谷歌家是第一个提出这么玩注意力机制的)。话不多说,我就带着大家一起来看看这个Transformer到底是个什么东西。(多图预警!)
首先直接看原论文的模型架构图肯定是一脸懵逼,这都啥玩意?反正我第一眼看过去都是个新概念。。。想必很多初学者也是跟我一样,所以我们还是先从更高的视角来解析Transformer模型。我从网上盗了几张模型架构图【1】,方便大家理解。
2.1.1 Transformer架构在哪里?(图片来源)
Figure 1.png这张图的结构就非常清晰,就说明了一件事情!谷歌团队真的就只用了Transformer来做翻译orz!大家没有看错,这不是简化图,这就是整个模型的全部,只有一个Transformer😁!
2.1.2 Transformer里面是什么?(图片来源)
Figure 2.png又是一张结构非常清晰的图,说明了2个事情。第一件事,Transformer结构的基本组成仍旧是seq2seq那一套(参考我另一篇笔记)。第二件事,每一个ENCODERS和DECODERS部分都由6(原论文的N=6)个小的并且相同的ENCODER和DECODER组成。
2.1.3 ENCODER和DECODER内部结构是什么?(图片来源)
Figure 3.png每一个ENCODER内部又分为两层,第一层为self-attention,第二层为全连接层()。DECODER层与ENCODER层相似,但是中间多了一层Attention,其功能原理与普通的注意力机制相似(参考我另一篇笔记)
2.1.4 self-attention是如何运行的?(图片来源)
在原论文里,作者很霸气的丢出了一个公式,
要直接去理解这个公式,对矩阵运算不是非常熟练的同学可能有点困难,因此,我们还是先拆分去考量一个单词向量的计算过程,再回过头来理解这个矩阵的运算。如下图,是进行运算的第一步,
Figure 4.png对于每一个单词向量(Embedding后的),我们都会计算出3个不同的向量,名为query, keys, values。这些向量都是我们通过模型参数计算得出来的。相比于词向量的纬度(论文中为512),这些向量的纬度会小一点(为64),当然这些向量的纬度肯定都是超参数,是可以调整的。至于这三个向量的具体含义,只能让大家从后续的计算过程中自行体会来,我也会穿插讲一下自己的理解。
self-attention的第二步是对每一个词进行打分(dot products of the query with all keys)其实就是把当前位置q的向量与所有位置的k向量进行点积相乘,然后再除以(原论文是8,据说是可以让训练收敛的更平稳),最后再做一层softmax操作,每一个词就会得到一个对当前位置的打分,显然,当前词应该会对当前位置有最高的权重。(总感觉看到了一丝rnn的意思,考虑所有的输入序列,对当前预测结果的影响)
self-attention的最后一步,也是很简单了,就是把权重与每一个位置的v向量加权求和,最后得到的z向量就是我们要送入到下一层前馈神经网络的。上述过程的计算示意图如下,
Figure 5.png至此,每一个词向量的计算过程已经描述清楚了,矩阵的运算想必也是很好理解了。首先,我们计算Q,K,V三个矩阵,再根据上述的运算过程,简化为矩阵的运算就如下图,
Figure 6.png至此,对原论文中的公式就剖析完毕了(当然也是整个self-attention)的核心。
2.1.5 Multi-Head attention是如何运行的?(图片来源)
这里Multi-Head其实没有那么神秘,简单说就是把上述的过程,重复进行几次(原论文中取值为8)最后再把结果连接起来。而重复进行的运算中,唯一不同的就是初始Q,K,V矩阵的生成,他们分别由不同的参数矩阵计算得出,示意图如下,
Figure 7.png这样做的好处主要有以下2点。1)扩大了模型的视野,让模型在计算当前位置信息时,能关注到更多其他不同位置的信息。(若是单一模型,很可能永远被当前词所决定)。2)增加了模型的语意表达能力,因为所有的Q,K,V三个矩阵的生成都是互不干扰的,可能会有更多语意层面的表达。
当生成完多个输出矩阵以后,我们会拼接所有的结果,然后与一个权重矩阵相乘(随模型训练的),得到一个最终的self-attention层的输出,因此,总结一下,self-attention的整个计算过程如下示意图,
Figure 8.png2.1.6 什么是Positional Encoding? (图片来源)
Positional Encoding的引入是为了考量输入序列中的顺序问题,他的作用就是为模型注入一些当前词的绝对位置或相对位置信息。该向量是由特定的模式生成的,论文中也有公式(大概是用正弦或余弦计算得出的),然后将该向量与词向量想加,构造出整个模型的输入向量。(貌似代码的实现与论文中的公式有出入,有兴趣的同学可以深入调研一下,我其实也没太想明白这块的输入具体在什么地方起到作用)。依旧再放一张图,方便大家的理解,
Figure 9.png2.1.7 Residuals和Layer-Normalization的引入(图片来源)
每一个Encoder内部,每一层都会有一个残参连接,并且带有一个层-归一化操作。这倒没什么好展开讲的,直接上图(一个Encoder的内部结构图),一目了然,
Figure 10.png2.1.8 encoder-decoder attention(图片来源)
Decoder的结构跟Encoder其实差不多,只不过,Decoder多了一层注意力机制(是真正的注意力机制orz,跟seq2seq那一套的注意力机制类似,不熟的参考我上一篇论文笔记)。我们来做一个对应关系,其实大家应该就懂了,seq2seq中的输出隐状态,其实就是这边上一层的Q矩阵输出,而源输入的隐状态,就对应这边Encoder出来的K,V矩阵。原理几乎是一模一样的,下面上一张图,大家就能理解了,
Figure 11.png不过还是要再多说一句,Decoder与Encoder的结构还是略微的不同,主要体现在Decoder层的self-attention层会有一个mask,会把当前位置之后的所有值都置为(-inf)意为他们对当前预测词不应该起作用。
说到这里,除了最后一层,最常规的softmax层,来预测当前输出词的最大概率,其他的模型结构应该是梳理清晰了,这个时候再回头看,原论文中的图,应该就清晰多了。
Figure 12.png2.2 Transformer架构的好处
原论文中,独辟蹊径的开了一章,就叫"Why Self-Attention"。重点讨论了一下自己的这一套self-attention在提取特征上与RNN, CNN的对照。主要分三个层面的讨论,1)每一层的空间复杂度。2)并行计算的可能性。3)解决长时依赖问题的最长路径。具体的对照大家可以看论文原文。这里我就聊一下自己的理解。其实本质上来看,整一套Transformer的架构并没有标题取的那么神乎其神(Attention is All You Need)哈哈,让我一度以为,注意力框架真的能自成一套,但其实本质还是绕不过特征提取的阶段。真正涉及注意力机制的,做法其实也还是一样的。
2.3 论文实验结果分析
论文作者把自己提出的整套框架实现了一遍,这里就不具体展现了。有兴趣的读者可以自行研读。值得一提的是,谷歌有开源的tensor2tensor,有空还是可以读一遍源码,或者工业界的小伙伴,可以学一波应用。
------------------第三菇 - 总结------------------
到这里,整篇论文的核心思想及其创新点已经说清楚了。本论文主要集中在于阐述Transformer架构,并且解释了自己为什么要使用这一套架构的原因(坊间谣言,对了对标FB的convseq2seq)。
简单总结一下本文就是先罗列了一下该论文的摘要,再具体介绍了一下Transformer架构,主要是盗用了很多一个外国小哥博客的图(他的可视化Transformer,真的能让人快速入门,感恩),最后也谈了一点自己对Transformer架构的理解,总的来说,谷歌这篇还是划时代的产物。希望大家读完本文后能进一步加深对该论文的理解。有说的不对的地方也请大家指出,多多交流,大家一起进步~😁
参考文献:
【1】https://jalammar.github.io/illustrated-transformer/
网友评论