Transformer (变形金刚,大雾) 三部曲:RNN 的继
![](https://img.haomeiwen.com/i4787675/f582e164c9c85f29.jpg)
讲讲最近深度学习里面的后期之秀吧,Transformer(和变形金刚没有半毛钱关系)
话说自公元二零一三年,深度学习网络一枝独秀,自机器学习王国脱颖而出,带动了人工智能领域的发展。其中它最主要的两大家,卷积网络(CNN)和循环网络(RNN),因其独特的性质,分别在计算机视觉和自然语言处理领域得到广泛使用。
![](https://img.haomeiwen.com/i4787675/f78e8aaa693c3657.png)
然而这两大家却都还是上世纪就被提出来了,本世纪虽有创新,却也逃脱不了这两大家的干系。前有 RNN 的变种树状的递归网络 (Recursive Neural Network),后有卷积网络里的 ResNet,InceptNet 这些变种,外加对它们的一些训练技巧。
于是乎,说到学习深度学习,实际上主要就在学习 CNN 和 RNN。近来,Google 提出了一种新的架构 Transformer,彻底颠覆了过去的理念,没用到 CNN 和 RNN,主要是一种叫做 Attention (注意力)机制的结构组成。用更少的计算资源,取得了比过去的结构更好的结果。
![](https://img.haomeiwen.com/i4787675/db60c8ebd428834c.jpg)
提出 Transformer 的论文,Attention is All You Need (你只需要注意力就行) 也在去年被封 NLP 领域的年度最佳论文。于是 Transformer 一下子就火起来了,在很多任务有取代 RNN 的趋势。之前自己投的论文也被审稿人吐槽怎么不用 Transformer.
而本篇要介绍的就是 Transformer,还有之后比较成功的两个变体,Weighted Transformer 以及 Universal Transformer.
进入正题之前,先来介绍一下 RNN 序列到序列(seq2seq) 架构,以及注意力机制。这样更便于我们理解之后的 Transformer 如何取代它。
经典架构:RNN + Seq2Seq + Atten
之前 Twitter 上有人开过玩笑,深度学习使得 NLP 领域太过简单粗暴,无论什么问题用 seq2seq + atten 都能解决。这里说的 seq2seq 是 sequence to sequence 的简称,一般默认的结构是由 RNN 组成的编码器和解码器,再加上在之间的注意力机制 (atten)。
![](https://img.haomeiwen.com/i4787675/73ee92dd4c691538.png)
关于 RNN 的详细知识参考我之前的文章《吴教授的循环神经网络(RNN)课堂》,而关于 seq2seq 也可以参考《神经机器翻译概览:基准模型与改进(上)》。
首先需要知道,在没有注意力机制之前,用 seq2seq 架构翻译是这样的。先是编码器,按照顺序处理源句,得到一个描述(representation)向量,然后解码器利用这个描述,来翻译出整个句子。然而这导致了信息的大量丢失,特别是对一些长的句子,和有不同语序的语言对。比如下面这个。
![](https://img.haomeiwen.com/i4787675/8d5b0a9e48fe258d.png)
可以发现,要把 “like” 翻译成 “好き(suki)”,得经历很长的距离,这中间会混入噪音,还会丢失有用信息,所以很难翻译准确。
即使之后,加了部分注意力机制来辅助翻译,也会因为对关系的捕捉不足,而出现翻译失误。因为在这样的翻译任务中,需要发现的关系有三种:
-
源句内部的关系;
-
目标句内部的关系;
-
源句和目标句之间的关系。
而这样的 seq2seq,只在捕捉源句和目标句之间关系用注意力机制进行了捕捉,而源句内部和目标句内部还是在用 RNN,从一边到另一边这样捕捉关系(好一点的用双向 RNN),但这样并不够直接,特别是对一些距离远的关系捕捉很差。
除了对远距离关系难以学习的不足以外,RNN 还有一点不足,那就是训练慢。因为它默认是按时序来进行处理的,所以得一个个词从左到右看过去,这样导致 RNN 不能像 CNN 一样,充分利用 GPU 的并行运算优势。
值得一提的是,为了解决 RNN 的训练问题,Facebook 的研究人员有提出 CNN 的 seq2seq 架构,使得训练速度更快,但是性能并没有得到太大的提高。
Transformer:没错,你只需要注意力机制
因为这只是科普文,所以我会尽量用自己的理解来说,当然能读懂公式是最好的。
首先先说说自己对 Transformer 理解,我认为它最大的改进有如下几点:
-
提出用注意力机制来直接学习源语言内部关系和目标语言内部关系,而不是像之前用 RNN 来学;
-
对存在多种不同关系的假设,而提出多头 (Multi-head) 注意力机制,有点类似于 CNN 中多通道的概念;
-
对词语的位置,用了不同频率的 sin 和 cos 函数进行编码。
所以之后我也就围绕着这三点来讲,想了解更具体,还是去读论文和代码吧。
首先说说核心构件,多头注意力机制。先来看看注意力机制的基本组成,如下图。
![](https://img.haomeiwen.com/i4787675/d66fc604ed31eea8.png)
注意力机制的运算需要三部分,query,keys,values。一般来说 keys 和 values 相同,便于更广义上的理解分成两个。计算过程大概是这样:
-
先用 query 和所有的 keys 值相乘(也能用其他一些运算),于是每个 key 都能得到一个值;
-
上面得到的值可以看做是每个 key 的权重,为了使得权重加起来等于1,这里需要用 softmax 压一下得到注意力评分(attention score);
-
最后用评分和相对应的 value 值相乘,决定哪个 value 比较重要,再相加,就得到想要的注意力向量了。
论文中用到的注意力机制公式如下,Q,K,V 分别是 query,key,value 的矩阵,除以根号 d 是为了更好的数值运算:
![](https://img.haomeiwen.com/i4787675/e0daf4c774b7aaa1.png)
了解了一般的注意力机制,那么多头注意力机制就很好理解了。它相当于有多组这样的注意力机制,对 Q K V 之间的不同关系进行提取,最后再把得出的结果拼接起来。为了保证多样性,还给每组注意力机制增加了不同的线性变换层来先处理 Q K V。
![](https://img.haomeiwen.com/i4787675/334b625de9adf801.png)
公式表达:
![](https://img.haomeiwen.com/i4787675/391033e5b3bf034a.png)
之后来看看论文中 Transformer 的整体结构。
![](https://img.haomeiwen.com/i4787675/7c71894e8c49385d.png)
这张图,特别想直接摔电脑,但现在我们只需要看箭头和注意力机制模块就可以了。会发现,对应之前提到的三种关系:源句内部关系,目标句内部关系,源句和目标句之间关系,多头注意力机制也刚好有三个,分别学习这三种关系。
首先从中间把整张图切开,左边有输入 (input)的看做是 seq2seq 的编码器,而右边就是解码器了。
来看看编码器,非常简单。
![](https://img.haomeiwen.com/i4787675/29c4967d1d357d5b.png)
首先是输入源句,转换成向量,加入位置编码,然后利用多头注意力学习源句内部的关系,传入一个前向层(Feed Forward),这是为了让网络内的向量互动更多,学到更复杂的关系。其余一些跳跃的箭头,Add 和 Norm 什么的只是训练技巧。
之后看解码器:
![](https://img.haomeiwen.com/i4787675/10a0a987518dcba6.png)
比编码器要复杂些,但也就中间多了个注意力模块。我们输入目标句子,转化成向量,加入位置编码,然后用第一个多头注意力机制学习目标句内部之间的关系,之后将向量和编码器端传过来的向量一起传入第二个注意力机制,来学习目标句和源句之间的关系,再如编码器一样传入前向层。最后在一个线性变换之后,用 softmax 得出概率向量,并给出预测的值。
这就是最初的 Transformer 模型了,那它实际的表现呢。在机器翻译任务上,相比起之前的模型,它取得了更高的 BLEU 分数,同时却只用了更少的计算资源(英语法语任务差距达到几十倍)。
Weighted Transfomer: 加权就是加强,没错就是这样
在最初的 Transformer 后不久,最成功的 Transformer 的变种模型便是,Weighted(加权的) Transformer。
在整体上架构和上面提到的 Transformer 差不多,最主要的不同是对注意力机制的处理。在 Transformer 中,先通过多头注意力机制来学习多个不同方面特征,然后拼接起来传给一个线性层。
而 Weighted Transformer 则是通过两种权重值,并且将一些不同的线性层放入注意力机制中,使得各个头(head)更加多样,互动更加强。
两个权值分别是κ和α,κ 是在多头注意力机制后,对每个头进行权值加成,论文中称为 concatenate weight (拼接权重,但我并没发现有对多头进行拼接的操作,有懂的可以告诉我。) 而 α 是将 κ 加权处理后再经过一层前馈处理(就是上面的 Feed Forward,FFN)的值再次进行加权,最后将这些头直接加起来。
公式如下:
![](https://img.haomeiwen.com/i4787675/08af8b52ed6d3e62.png)
这篇论文中将这种注意力机制叫做,multi-branch attention (多支注意力机制)。值得注意的一点是,在 Weighted Transformer 中并不是三处都是用相同的多支注意力机制,在解码器捕捉目标语言内部关系的注意力机制就只用了普通的注意力机制,不知道是刻意为之还是什么。
![](https://img.haomeiwen.com/i4787675/7eb4b089741da904.png)
Universal Transformer: 通用 Transformer
最近 Transformer 又得到新的突破,在谷歌大脑实习的 Mostafa Dehghan 提出更强大的 Transformer 模型:Universal Transformer,比之前的 Weighted Transformer 更进一步。
首先是比起前两篇更加规范化了,模型里面的基本模块,主要由多头注意力机制和转换函数组成。这篇论文中最主要的 idea 是,Transformer 最主要是利用注意力机制通过查看相关信息,对每个位置词语的向量进行不停的精炼。论文中几个创新点是:
-
基本模块很简洁,多头注意力机制加转换函数,不停堆叠对词语向量进行精炼;
-
每一次精炼就是一个 step ,加上句子里的位置,就会产生一个二维的位置坐标,论文中对这个位置进行了向量化,并且加入了运算中(但是我并没有懂这样做的用途,因为使用的只有最后一层的);
-
假设一句话中每个词需要精炼的程度不一样,利用 Adaptive Computation Time 方法来使得对需要多次精炼的多次精炼,而对已经精炼足够多次的不予处理。
基本模块中的公式如下:
![](https://img.haomeiwen.com/i4787675/3a0b079b6574e7d2.png)
而其中 t 等于 0的时候,也就是 H_0 的时候表示的就是词向量,之后按照上面的公式计算。
在对二位坐标进行编码时,使用的是如下公式:
![](https://img.haomeiwen.com/i4787675/9066cf086a54685e.png)
关于 Adaptive Computation Time 可以读这篇论文《Adaptive computation time for recurrent neural networks》。
实验结果对比
关于这三个 Tranformer 模型,在英德翻译上的对比如下表:
![](https://img.haomeiwen.com/i4787675/82d6dac11d1ba93a.png)
可以看到这三个模型依次变得更强。当然 Universal Transformer 还有其他一些强处,比如说在之前的 Transformer 不擅长的一些任务上也取得了很好的成绩,具体查看论文。
结语
我相信,未来 Transformer 将会成为趋势,成为主流的模型,因为众多实验都证明了它的有效性。或许之后,RNN 会变得像 Sigmoid 激活函数一样,成为教科书上的“经典”,也或许 RNN 会得到改进在一些特定任务上取得到更好的应用吧。