Transformer 是一个基于自注意力的序列到序列模型,与基于循环神经网络的序列到序列模型不同,其可以能够并行计算。
一、序列到序列模型
序列到序列模型输入和输出都是一个序列,输入与输出序列长度之间的关系有两种情况。第一种情况下,输入跟输出的长度一样;第二种情况下,机器决定输出的长度。
1.一些常见的例子
语音识别 :输入是声音信号,输出是语音识别的结果,即输入的这段声音信号所对应的文字。我们用圆圈来代表文字,输入跟输出的长度有一些关系,但没有绝对的关系,输入的声音信号的长度是 T,并无法根据 T 得到输出的长度 N。其实可以由机器自己决定输出的长度,由机器去听这段声音信号的内容,决定输出的语音识别结果。
机器翻译 :机器输入一个语言的句子,输出另外一个语言的句子。输入句子的长度是N,输出句子的长度是 N′。输入"机器学习"四个字,输出是两个英语的词汇:"machine learning"。N 跟 N′之间的关系由机器决定。
语音翻译 : 对机器说一句话,比如"machine learning",机器直接把听到的英语的声音信号翻译成中文。
语音合成
输入文字、输出声音信号就是语音合成(Text-To-Speech,TTS)。现在还没有真的做端到端(end-to-end)的模型,以闽南语的语音合成为例,其使用的模型还是分成两阶,首先模型会先把白话文的文字转成闽南语的拼音,再把闽南语的拼音转成声音信号。从闽南语的拼音转成声音信号这一段是通过序列到序列模型实现的。
多标签分类
多标签分类(multi-label classification)任务也可以用序列到序列模型。多类的分类跟多
标签的分类是不一样的。如下图所示,在做文章分类的时候,同一篇文章可能属于多个类,
文章 1 属于类 1 和类 3,文章 3 属于类 3、9、17。
二、 Transformer结构
一般的序列到序列模型会分成编码器和解码器。编码器负责处理输入的序列,再把处理好的结果"丢"给解码器,由解码器决定要输出的序列。
序列到序列典型的模型就是 Transformer,其有一个编码器架构和一个解码器架构。
接下来分别介绍一下编码器和解码器。
1.编码器
如上图所示,编码器输入一排向量,输出另外一排向量。自注意力、循环神经网络、卷积神经网络都能输入一排向量,输出一排向量。Transformer的编码器使用的是自注意力,输入一排向量,输出另外一个同样长度的向量。
如上图所示,编码器里面会分成很多的块 (block),每一个块都是输入一排向量,输出一排向量。输入一排向量到第一个块,输出另外一排向量作为下一个块的输入,以此类推,最后一个块会输出最终的向量序列。
Transformer 的编码器的每个块并不是神经网络的一层,每个块的结构如下图所示
在每个块里面,输入一排向量后做自注意力,考虑整个序列的信息,输出另外一排向量。接下来这排向量会"丢"到全连接网络网络里面,输出另外一排向量,这一排向量就是块的输出,事实上在原来的 Transformer 里面做的事情是更复杂的。
Transformer 里面加入了残差连接 (residual connection)的设计,如下图所示,
最左边的向量 b 输入到自注意力层后得到向量 a,输出向量 a 加上其输入向量 b 得到新的输出。
得到残差的结果以后,再做层归一化 (layer normalization)。层归一化输入一个向量,输出另外一个向量。层归一化会计算输入向量的平均值和标准差。(与批量归一化的区别:批量归一化是对不同样本不同特征的同一个维度去计算均值跟标准差,但层归一化是对同一个特征、同一个样本里面不同的维度去计算均值跟标准差,接着做个归一化。)
输入向量x,里面每一个维度减掉均值 m,再除以标准差 σ 以后得到 x′ 就是层归一化的输出
得到层归一化的输出以后,该输出才是全连接网络的输入。
输入到全连接网络,还有一个残差连接,把全连接网络的输入跟它的输出加起来得到新的输出。接着把残差的结果再做一次层归一化得到的输出才是 Transformer 编码器里面一个块的输出。
上图给出了 Transformer 的编码器结构,其中 N× 表示重复 N 次。首先,在输入的地方需要加上位置编码。如果只用自注意力,没有未知的信息,所以需要加上位置信息。多头自注意力就是自注意力的块。经过自注意力后,还要加上残差连接和层归一化。接下来还要经过全连接的前馈神经网络,接着再做一次残差连接和层归一化,这才是一个块的输出,这个块会重复 N 次。当然Transformer 的编码器其实不一定要这样设计,永远可以思考看看有没有更好的设计方式。