参考

台大李宏毅:机器学习2021

Transformer的直观理解

transformer模型pytorch TensorFlow_相似度

Transformer本质上是一个seq2seq的模型,最早由《attention is all you need》提出,实际上是由编码和解码结构共同组成。广义上来说所有应用了self-attention的模型均可以称之为transformer,狭义上来说,Transformer是指该论文中提出的模型,如下图所示。

transformer模型pytorch TensorFlow_相似度_02


如图所示,左边部分可以看出编码器组(Encoders),右边部分可以看成解码器组(Decoders)多个编码和解码器的叠加(×N)共同构成了Transformer。

Tranformer中的细节讨论

这一部分主要探讨《attention is all you need》这篇文章中提出的Transformer结构中重要的细节,帮助读者理解。

Positional Encoding
按照从左读到右,从下往上读的方式,最先看到的是位置编码(Positional Encoding)。熟悉self-attention计算过程之后,很容易发现将有序的序列输入self-attention后会丢失位置信息。例如,在计算α12的时候会发现,α12=α21,因此向量1与2的先后顺序在计算注意力的时候没有被考虑进来。而在很多时候位置信息对于序列处理都非常重要,我们使用位置编码。位置编码的方式非常多,最简单的就是在输入的时候,对每个输入向量a加上一个一个位置向量e来实现。所以,input embeddings进入模型的第一步就是加上带有位置信息的位置编码。

Add & Norm

由于多头自注意力机制(Multi-head self-attention)在上篇文章已经提及。因此,这里我们不再赘述而是直接进入Add & Norm这一层。这一层实际上是分成两个步骤完成。第一步是Add,实际上是执行了类似残差连接(Residual Connection)的操作,即直接将attention layer的输入加到输出,借鉴了ResNet的优点。第二步是Norm,这里执行的是LN(Layer Normalization)。

transformer模型pytorch TensorFlow_相似度_03


如图所示,LN对每一个输入向量先计算该向量的均值和标准差,再根据均值和标准差对该向量进行归一化处理。LN相较BN(Batch Normalization)更加简单,因为BN是对不同向量每个维度算均值和标准差,而非像LN是对每个向量不同维度算均值和标准差。Cross attention

在介绍decoder结构的第一个关键步骤masked self-attention之前,我们先进入encoder与decoder的连接环节cross attention。

transformer模型pytorch TensorFlow_Cross_04


如图所示,Cross attention与self-attention不同的点在于,cross attention是用当前向量(Decoder产生的)去匹配(计算相似度)encoder的各种key。而非self-attention中,输入向量组自己的q去匹配自己的k。其他方面与self-attention是一致的,通过cross attention环节,我们就成功实现了encoder与decoder之间的交互。Masked self-attention

接下来,我们回到decoder部分的第一个重要细节Masked self-attention。其计算机制如下图所示:

transformer模型pytorch TensorFlow_Cross_05


由图,相比普通的self-attention,在解码的时候计算相似度时,我们只考虑之前的输入向量(这点类似RNN),相当于把后续的输入向量给遮住了。比如,在图中,计算b2的时候,我们只利用q2去查询k1与k2,而不去匹配k3与k4。只所以这样做是为了防止“穿越”。

因为在Decoder部分解码输出是串行产生输出结果的,并不像Encoder部分,我们已知输入,并且一次性全部输入Encoder。因此在考虑a2的时候并没有a3与a4,从而就无从考虑a3与a4,a3与a4也需要Decoder根据a1与a2共同预测。

后记

本篇博文旨在结合参考资料做一些整理,加入个人理解,方便初学者学习。