Transformer架构学习初篇

170 阅读5分钟

前言

最近恰好有空,所以就科学上网学习了一篇著名的论文《Attention Is All You Need》打算写下篇学习笔记提升自己对Transformer的理解。
原文链接:Attention Is All You Need

Abstract(摘要)

首先就提出了sequence transduction models(序列转导模型),即处理序列数据的模型。序列数据有着顺序关系的数据,每个元素的顺序对于数据的整体含义非常重要。在我们中文的世界里,正着说和反着说差异非常大。像一些文本翻译、文本生成、语言转文字就是一些很典型的序列转导任务。

那么在之前是如何处理如此转导任务的呢?

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks that include an encoder and a decoder.The best performing models also connect the encoder and decoder through an attention mechanism。
主流的转导任务模型是基于复杂循环(RNN)或者卷积神经网络(CNN),通常还包含了一个编码器和解码器。表现最好的模型还通过编码器和解码器连接起来。

接下来就是提出了新的神经网络结构

We propose a new simple network architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence and convolutions entirely.
我们提出了一个新的神经网络结构,叫做Transformer。它仅基于注意力机制,丢弃了复杂循环(RNN)和卷积神经网络(CNN)。

补充知识

在之前学习机器学习的时候,我们最先接触的神经网络就是Feedforward Neural Network(前馈神经网络,FNN) image.png 为什么FNN不适合做序列转导任务? 我们向输入层提供数据(我是一个地球人)

  • 第一步就是要分词(Tokenization),把句子分成多个tokens ["我","是","一个","地球人"]
  • 第二步就是要词向量嵌入(Embedding),把上面的词转换成机器可以理解的向量
  • 第三步就是合并词向量,如果每次我们提供的数据是不一样的,想得到的不一样的输出。可是FNN能够接受的输入却是一个固定长度的向量,那么该怎么办呢?有两个解决办法。
    • 把每个第一个位置的数据平均起来得到一个平均的向量,正好可以输入进入输入层。但是改变了原向量可能会完全丢失词语的顺序。
    • 另一个方式就是把做一个简单的拼接,但是FNN需要固定纬度的输入,如果每次都是不同长度的句子都进行拼接,我们可能需要一个非常非常长的输入层来接收不同长度的句子,不够长度还需要补0。这样处理的效率也是非常低下的。拼接向量的话,模型还是把数据当作一个整体的数据进行处理,也无法理解所谓时间上的词语先后顺序关系。

所以为了解决以上问题,人们就提出了循环神经网络(RNN)。它可以建模词序,把词语的输入顺序建模起来。它也可以建模上下文依赖,通过记忆机制把上下文记住,不会出现输入后面忘记前面的情况。它还可以支持不定长的输入,无需固定输入的长度。

image.png 在这个U中,前一个时刻计算后的结果会被当作时刻2的输入的一部分,一直循环结束。

RNN的思想就是想要模仿人类说话的过程,在第一个时刻只输入第一个token"我",第二个时刻输入第二个token"是",依次输入token进入。

image.png 在每个中间的单元中,都是计算单元并且完全一样,而且矩阵也是完全一样的。我们只是把它按照时间的纬度展开。

虽然RNN解决了FNN的一些固有问题,在处理时序性问题时非常好用。但是RNN也有些很明显的缺陷,当输入输出不等长的情况下该怎么办?

所以,就有了后来的编码器-解码器结构。我们可以理解成它把RNN的上半部分和下半部分拆开来了。编码器只负责处理输入,得到一个最终编码结构。然后解码器拿着编码结果进行解码输出最终的结果。

image.png

编码器-解码器也有另一个版本,在每次解码前都传递一个上下文向量C image.png

但是,编码器-解码器也是有问题的。当需要模型处理长序列的时候容易出现遗忘的问题,因为在最终编码得到的结果里最近上一次编码的关系更亲近,离最先编码的关系更稀疏。远距离依赖信息在传递过程就容易被稀疏,导致了模型对长距离依赖关系的建模能力减弱。还有模型对不同时间步输入对当前时刻输出的重要性有问题,简单的说就是所有时间步的输入在计算当前时刻都被同等对待了,忽略了不同时间步对当前输出的重要性影响。所以,Attention Mechanism(注意力机制)就来解决这个问题。注意力机制在Transformer之前就已经有了,Transformer创新性的提出了一个自注意力机制。

基础版的注意力机制就是由编码器-解码器结构第二个版本衍生出来的,让每次传入的上下文向量C不一样即可,就解决了上面的问题。

我们还有个额外的问题没有考虑,就是串行化计算。我们回顾一下计算的过程,每次后面的结果是不是都要依赖于前面的结果计算完成,那么这样是不是要让后面的计算一直等着前面的计算,就算我们GPU再强,它也必须一步一步的去等待前面的计算处理完成,这样就没有办法充分的利用GPU超强计算能力。我们就要提高并行计算能力。

小结一下

以上内容就是Transformer架构学习的第一部分内容,我们先稍作休息,敬请期待下一章节的更新吧!