Illustrated Guide to Transformers
-
- Attention Is All You Need - Step by Step Walkthrough
-
- 1. Input Embeddings
- 2. Positional Encoding
- 3. Encoder Layer
- 4. Multi-Headed Attention
- 5. the Residual Connections, Layer Normalization, and Feed Forward Network
- 6. Encoder Wrap-up
- 7. Decoder Layer
- 8. Decoder Input Embeddings & Positional Encoding
- 9. Decoders First Multi-Headed Attention
- 10. Decoder Second Multi-Headed Attention, and Point-wise Feed Forward Layer
- 11. Linear Classifier and Final Softmax for Output Probabilities
- And That's It!

Transformer让自然语言处理 (NLP) 世界大震动。Transformer模型打破了很多NLP领域的记录,并且继续推动着这个领域向前发展。Transormer可以在很多应用中发挥作用,比如机器翻译、聊天机器人、甚至让搜索引擎能更好地工作。
那么Transformer是怎么工作的?为什么它比之前的那些处理序列的模型(recurrent nerual networks, GRU, LSTM等)要好?你可能也听说过其他著名的Transformer模型,比如BERT, GPT, GPT2。在这片博文中,我们会专注于Transformer开始的地方——Attention is all you need。
本文翻译自 Illustrated Guide to Transformers - Step by Step Explanation,视频链接为On YouTube。
要想了解Transformer,我们必须先了解Attention Mechanism 注意力机制。attention机制让Transformer拥有极长期的记忆力。Transformers可以专注于之前产生的所有符号。
我们来看一个例子,使用Hugging Face’s Write With Transformer,可以做到用一个Transformer生成器来写一篇科幻短文。我们先给模型几句话作为输入,模型就会帮我们生成短文的剩余部分。
输入:“当外星人来到我们的星球”;
Transformer输出:“它们开始对地球进行殖民统治。有几个外星人开始借着少数的人类精英对大众进行铁腕控制,从而操纵人类社会。”
好吧,这个故事有一点黑暗,但是有趣的地方在于这是模型产生的故事。当模型一个字一个字地生成这篇文本时,模型可以专注于和被生成文字相关的那些文字。了解应该专注于哪种文字的能力,是在训练的时候通过反向传播学习得到的。
Recurrent neural networks (RNN)也能够考虑到之前的输入,但是注意力机制的强大之处在于它不受短期记忆的影响。RNN有一个小一点的窗口 (shorter window) ,它可以考虑窗口中的内容。然而,但故事逐渐变长,RNN就没办法访问到文本序列更早的内容了。虽然Gated Recurrent Units (GRU) 和 Long-short Term Memory (LSTM)中的窗口更大一些,但是RNN的问题同样存在。
理论上,对于注意力机制,如果给了充足的计算资源,那么他就有一个无限大的窗口,因此我们可以考虑整个文本内容来生成接下来的故事。
Attention Is All You Need - Step by Step Walkthrough
在 Attention is all you need 这篇论文中,坐着提出了一个新型的神经网络Transformers。它基于注意力机制,并且属于encoder-decoder结构。
站在一个较高的角度来讲,encoder 将输入的序列映射到一个抽象的连续数字的表示 (an abstract continuous representation),这个表示包括从输入序列学习到的的所有信息。然后decoder 将encoder生成的数字表示和之前生成的输出作为输入,一个一个地生成单个的输入。
我们来看一个例子吧。在这片博文中,我们会展示作为一个聊天机器人,Transformer是如何工作的。
输入:“Hi how are you”;
Transformer输出:“I am fine”
1. Input Embeddings
第一步是将输入投到一个word embedding层中。word embedding层可以理解为一个能获取每个单词的向量表示的查找表。神经网络是通过学习数字来进行工作的,所以每个单词必须用一个带有连续值的向量来表示。
2. Positional Encoding
下一步是将单词的位置信息添加到单词的向量表示中。
不像RNN,我们必须向Transformer encodera中添加一些关于位置的信息。论文的作者利用sin函数cos函数想出了一个办法。
在这里我们不会太深入关于positional encoding数学的细节。对于第奇数个输入向量,使用cos函数生成一个位置向量;对于第偶数个输入向量,使用sin函数生成一个位置向量。将生成的位置向量加在相对应的输入向量上。这样就成功地给予了每一个输入向量他们的位置信息。
3. Encoder Layer
现在该到encoder层了。它的工作是将所有的输入序列映射到一个抽象的连续数字向量表示中,这个向量表示包含学习到的关于整个序列的信息。
encoder层包括两个子模块,multi-headed attention以及一个fully connected network全连接网络。在每个子模块之后都有residual connections和一个layer normalization。
我们展开来说。首先看 multi-headed attention 模块。
4. Multi-Headed Attention
Multi-headed attention应用了一种特殊的注意力机制,叫做self-attention子注意力。self-attention能够让模型将输入的每一个单词和其他单词联系起来。
在我们的例子中,模型通过学习可以将"you"这个单词同"how"和"are"联系起来。模型也可以通过学习得出这个模式的单词结构可能往往是一个疑问句,所以可以相应地进行回答。
4.1 Query, Key, and Value Vectors
为了实现self-attention,我们将输入投入3个不同的全连接层,来产生这个输入向量对应的query向量,key向量和value向量。
这三种向量具体是干什么的呢?这里有一个很好的解释
query, key和value的概念是来自于搜索引擎的。比如,当你在YouTube上输入一个查询语句(query)来找某一个视频,搜索引擎会将你输入的查询语句(query)对应到一系列的关键词(key)上,比如视频题目、详情说明等。然后和你的查询语句最匹配的那个视频(value)就会被展示出来。
4.2 Dot Product of Query and Key
query和key向量会进行一个矩阵点乘操作,得到一个分数矩阵 (score matrix)。
这个分数矩阵会决定一个单词于其他每一个单词有多大的关联程度。因此每一个单词都会和其他每一个单词有一个分数值。分数值越高,表明这个单词应该投入更多的注意力在另一个单词上。
4.3 Scaling Down the Attention Scores
然后矩阵点乘所得的分数值会被除以query和key的维度的开方,从而达到按比例缩减的效果。
这样做是因为乘以一些值会有梯度爆炸的危险,为了寻求更稳定的梯度,需要将分数值按比例缩减。
4.4 Softmax of the Scaled Scores
然后,会对缩放后的分数值进行softmax处理来获得注意力权重。通过softmax后的分数都在0到1之间。
通过softmax处理,更高的分数能够被凸显出来,低的分数就被压制了。这样可以让模型更清楚应该将注意力放到哪个单词上。
4.5 Multiply Softmax Output with Value vector
接着,用注意力权重乘以value向量来获得output向量。更高的softmax分数可以让对应单词的value显得更重要,而更低的分数会使模型忽视那些不相关的单词。
然后将output投入到一个线性层中进行处理。
4.6 Computing Multi-headed Attention
要让子注意力机制成为multi-headed的注意力计算,在进行子注意力之前query, key和value应该被分成N个向量。被分开的向量分别进行子注意力的处理。每一个子注意力处理被称作一个head,每一个head会产生一个output向量。在被投入最终的线性层之前,每一个head产生的output向量会拼接成一个新的向量。理论上,每一个head能够学习到不同方面的信息,使得encoder模型有更多的表示能力。
总结一下multi-headed attention,它是Transformer网络中的一个模块,能够为输入的内容计算注意力权重 (attention weights) ,并且产生一个output向量,output向量能表示在序列中每一个单词应当对其他每个单词投入多少注意力。
5. the Residual Connections, Layer Normalization, and Feed Forward Network
multi-headed attention输出的output向量会加上原始的带位置信息的输入。这个过程叫做residual connection。
residual connection的输出会再经过一个layer normalization层标准化处理。
标准化后的残差输出被投入到一个pointwise feedforward network中进行下一步的处理。这个pointwise feedforward network是一对线性层中间夹着一个ReLU激活函数。它的输出会再次加上它的输入,并且进行标准化。
残差连接能够帮助模型进行训练,因为它能让梯度直接通过网络。层标准化是为了稳定网络从而大幅缩短所需的训练时间。pointwise feedforward layer是为了将注意力的输出投影到一个更丰富的表示上。
6. Encoder Wrap-up
以上就完成了encoder层的内容。所有的这些操作都是为了将输入编码成一个带有注意力信息的连续表示。这会帮助decoder专注于那些合适的单词。
encoder可以叠N层,每层都有机会学习到不同的注意力表示,也就有可能让Transformer网络有更大的能力。
7. Decoder Layer
decoder的任务使产生文本序列。decoder有和encoder相似的子层。他有两个Multi-head attention layers,一个pointwise feed-forward layer,还在每个子层之后有有残差连接和层标准化。decoder的每个multi-headed注意力层会负责不同的工作。
在decoder上方有一个线性层作为一个分类器,和一个缩放推主线来获取单词的概率。
decoder是auto-regressive自回归的。它以一个起始符号作为开始,然后将前面的输出内容和encoder的包含注意力信息的输出作为输入。当decoder生成一个终止符号,解码的过程终止。
我们现在一步步地来看decoder解码的过程吧。
8. Decoder Input Embeddings & Positional Encoding
decoder最开始的地方和encoder很像。输入的内容进入一个embedding layer和一个positional encoding layer。然后进入第一个multi-head注意力层,在这里会计算出decoder的输入的注意力分数。
9. Decoders First Multi-Headed Attention
这个multi-headed注意力层会有略微的不同。因为decoder是自回归的,它是一个单词一个单词地产生输出序列,所以不能让decoder考虑未来的符号。举个例子,当计算单词“am”的注意力分数时,不可能接触到“fine”,因为单词“fine”是一个接下来才能产生的未来的单词。“am”只能了解到他自己和之前产生的单词。这种情况对于其他单词也是一样的,只能专注于之前的单词。
需要一个办法来阻止计算关于未来的单词的注意力分数。这个办法叫做masking。这个mask会在计算softmax之前,进行缩放之后被加上。我们来看看它具体是怎么工作的吧。
Look-Ahead Mask
这个mask是一个矩阵,它和注意力分数矩阵同样大小,用0和负无穷填满。当把缩放了的注意力分数加上这个mask,得到了一个新的分数矩阵,它的右上三角都是负无穷。
为什么需要mask呢?当对mask操作之后的分数矩阵进行softmax处理,那些负无穷的数值被变成了0,也就是使那些未来的符号附上了0值得注意力分数。
比如在下面的图中,“am”的注意力分数在它自己和它之前的所有单词上都有特定的值,但是对于“fine”这个单词,注意力分数是0。这也就告诉了模型,不用在这些0注意力分数的单词上花心思。
masking是和之前讲到的multi-headed注意力层唯一一处不同的地方。现在的注意力层仍然有多个heads。
第一个mult-headed 注意力的输出是一个被掩码的输出向量,这个向量包含模型该怎样专注于decoder的输入。
10. Decoder Second Multi-Headed Attention, and Point-wise Feed Forward Layer
第二个multi-headed注意力层。encoder的输出会作为这一层的queries和keys,第一个注意力层的输出作为values。这个过程会将encoder的输入和decoder的输出匹配起来,让decoder决定更应该专注于decoder的哪个输入。第二个multi-headed注意力层的输出会进入一个pointwise feedforward层来进行更多的处理。
11. Linear Classifier and Final Softmax for Output Probabilities
最后的pointwise feedforward层的输出会进入最终的一个线性层,这个线性层会作为一个分类器。分类器的大小和类别数目一样多。比如说,10,000个单词有10,000个类别,那么分类器的输出大小应该是10,000。
接着,分类器的输出会投入到一个softmax层,产生0到1的概率值。我们取拥有最高概率值的哪个单词。
decoder拿到这个输出,将它添加到decoder输入的列表中,然后继续进行解码过程,知道一个终止符号生成。
decoder也可以叠N层,每一层将encoder的输出和之前decoder层的输出作为输入。通过叠加多个decoder层,模型可以学习专注于不同head的注意力组合,这也会让整个模型具有更大的潜力。
And That’s It!
以上就是整个Transformers的运行机制啦!Transformers利用注意力机制的力量去进行更好的预测。RNN想要取得同样的效果,但奈何它只有短期的记忆力。当想要生成或编码很长的序列的时候,Transformers会做得尤其好。Transformer架构的出现使得NLP领域能够有更多意想不到的成果产生。