图解Transformer

图解Transformer

  在上一篇文章中我们一起讨论了现代深度学习模型中无处不在的一种方法——注意力。注意力能够提高神经机器翻译应用程序的性能。 在这篇文章中,我们将一起学习Transformer模型,它使用注意力来提升其训练速度。Transformer模型在特定任务中的表现优于谷歌神经机器翻译模型。不过,Transformer最大的亮点在于并行化。事实上,谷歌云推荐使用Transformer作为参考模型来使用他们的云端TPU产品。接下来,我们试着把这个模型拆开来,看看它的功能是怎么实现的。
  Attention is All You Need一文中首次提出了Transformer模型,我们在TensorFlow中可以使用Tensor2Tensor包实现该模型。哈佛大学的NLP小组发布了该论文的PyTorch实现方法。在这篇文章中,我们将试图把模型简化,逐一介绍核心概念,希望能让没有深入了解的人更容易理解该模型。

上帝视角

  我们先把模型看成一个黑盒子。 在机器翻译应用中,它将对一种语言的句子进行处理,并输出该句话的另一种语言的翻译结果。
the_transformer_3
  打开这个黑盒模型,我们便可以看到一个编码组件,一个解码组件,以及它们之间的联系。
The_transformer_encoders_decoders
  编码组件包含几个堆叠的编码器(论文中堆叠了六个编码器——数字6并没有什么神奇的地方,大家完全可以尝试其他的堆叠方式)。解码组件则是堆叠相同数量的解码器。
The_transformer_encoder_decoder_stack
  编码器的结构都是相同的(但它们不共享权重)。每个编码器都可被分解成两个子层:

Transformer_encoder
  编码器的输入数据首先会流经一个自注意力层——这个层可以帮助编码器在编码一个特定的词时,还能观察输入句子中的其他词。我们将在后面的文章中仔细研究自注意力。
  自注意力层的输出被输入到前馈神经网络中。在整个网络架构中,作者设计了完全相同的前馈网络。
  解码器也有这两层,但在这两层之间有一个注意力层,帮助解码器关注输入句子的相关部分(类似于seq2seq模型中注意力的作用)。
Transformer_decoder

可视化张量

  现在我们已经看到了模型的主要组成部分,让我们开始看看各种向量/张量是如何在这些组成部分之间流动的,从而将训练好的模型的输入变成了输出。
  与其它NLP应用中的情况一样,我们首先使用embedding算法将每个输入的单词变成一个向量。
embeddings
  每个单词都被嵌入到一个大小为512的向量中。本文中,我们将用这些简单的盒子来表示这些向量。
  词的向量化仅仅发生在最底层的编码器的输入时,这样每个编码器的都会接收到一个列表(每个元素都是512维的词向量),只不过其他编码器的输入是前个编码器的输出。列表的尺寸是可以设置的超参,通常是训练集的最长句子的长度。
  在我们对输入序列进行词嵌入处理之后,每一个单词都流经编码器的两层。
encoder_with_tensors
  这里能看到Transformer的一个关键特性,每个位置的词仅仅流过它自己的编码器路径。在self-attention层中,这些路径两两之间是相互依赖的。前馈网络层则没有这些依赖性,但这些路径在流经前馈网络时可以并行执行。
  接下来,我们将把这个例子换成一个更短的句子,我们来看看在编码器的每个子层中发生了什么。

我们一起看看编码器

  正如我们之前提到的,编码器接收一个向量组成的列表作为输入。它对这个列表进行处理,将这些向量传入 "自注意力 "层,然后进入前馈神经网络,再向上输出到下一个编码器。
encoder_with_tensors_2
  每个位置的单词都经过了一个自注意层。 然后,它们各自通过一个完全相同的前馈神经网络。

从宏观角度研究自注意力机制

  不要认为“自注意力”是一个尽人皆知的概念,我在阅读Attention is All You Need这篇论文之前就从没有接触过这一概念。让我们来提炼一下它的工作原理。比如我们要翻译下面这个句子:

The animal didn't cross the street because it was too tired

  句中的“it”指代什么呢?它是指代道路还是动物呢?这对于人类来说是一个很简单的问题,但是对于算法却较为困难。
  当模型对“it”这个单词进行处理时,自注意力会将该单词指向“animal”。
  当模型处理每个位置的词时,自注意力允许模型将句子的其他位置信息作辅助线索来更好地编码当前词。如果你对RNN比较熟悉,可以试想RNN是如何利用隐藏状态将以前处理过的词/向量与当前正在处理的词/向量结合起来的。
transformer_self-attention_visualization
  当我们在5号编码器(最顶端的编码器)中对"it"这个词进行编码时,部分注意力机制在关注"the animal",并将其表示合并到“it”的编码中。
  一定要查看Tensor2Tensor notebook,在该笔记中你可以加载一个Transformer模型,并使用这个交互式可视化方法来查看。

从微观角度研究自注意力机制

  我们先来看如何用向量来计算自注意力,然后再看它在实践中使用矩阵的实现方式。
  计算自注意力的第一步是从编码器的每个输入向量(在本例中是指每个单词的embedding)中创建三个向量。 所以对于每一个词,我们都会创建一个Query向量,一个Key向量和一个Value向量。这些向量是由我们在训练过程中训练的三个矩阵乘以embedding创建的。
  需要注意的是这三个向量(64维)比embedding向量以及编码器的输入/输出向量(512维)的维度低,并不是必须要小的,而是为了让多头attention的计算更稳定。
transformer_self-attention_visualization
  将 X 1 X_1 X1 与权重矩阵 W Q W^Q WQ 相乘便可得到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值