查看原文
其他

【综述专栏】用放大镜看Transformer——总体和各个模块的结构到底是什么样的

在科学研究中,从方法论上来讲,都应“先见森林,再见树木”。当前,人工智能学术研究方兴未艾,技术迅猛发展,可谓万木争荣,日新月异。对于AI从业者来说,在广袤的知识森林中,系统梳理脉络,才能更好地把握趋势。为此,我们精选国内外优秀的综述文章,开辟“综述专栏”,敬请关注。

作者:知乎—李鹏宇

地址:https://www.zhihu.com/people/py-li-34

摘要:Transformer是一种经典的基于神经网络的机器翻译模型,催生了BERT、GPT等大幅推进NLP领域发展的重要模型。本文首先对Transformer的发展史进行了简单回顾,然后概括地展示其总体结构,接着对transformer全身上下的结构进行了细致的介绍,最后回过头来分析了transformer的特色。

01

引言
从上世纪中叶开始,人类开始尝试让机器学习自己的语言,并希望有一天机器能与人类进行自然的对话。之后的70年时间里,人们用各种各样的语言模型,包括规则、统计、神经网络等,来完成翻译、问答等等任务。
最近几年,一些喜欢看动画片的人,提出了一个用于做机器翻译的深度学习模型结构,即transformer,将机器翻译提升到了一个新的境界。在transformer的基础上,另外一些人提出了BERT、GPT2.0这样的语言模型,使机器对自然文本的理解能力达到了前所未有的高度,也使机器翻译、问答、命名实体识别等等下游任务的效果有了较大提升。可以说,transformer是最近几年基于深度学习的自然语言处理方法的重要基础。
Transformer是什么,结构如何,为什么效果好呢?


02

Transformer简介
“transformer”的本意是“变形金刚”,如图2-1。Ashish Vaswani等人(2017)在《Attention Is All You Need》中提出了一个崭新的机器翻译模型结构,名字叫“Transformer”。”Transformer”这个名字强调翻译是将一种语言文本变换为另一种语言文本的活动,也会让人联想到变形金刚、蹭了一波流量。
图2‑1 transformers的代表性形象——擎天柱

2.1 Transformer出现的背景

Transformer是凭空出现的吗?不是。它是在一些列条件成熟的情况下,才出现的。
注意力机制的发展,及其在自然语言处理领域的广泛应用。注意力机制的基本原理可以参考【综述专栏】注意力机制到底是什么——基于常识的基本结构介绍
训练语料,尤其是生语料规模的急速扩大,要求语言模型的训练速度有所提升。
语言模型需要提升推理速度,以满足日益增加的用户需求。

2.2 Transformer的总体结构

如图2-2,是Vaswani的《Attention is all you need》中给出的,Transformer的结构示意图。Vaswani等人的读者都是机器学习领域的从业者,因此他们在论文中对Transformer的介绍相对比较概括,就像这幅图一样。对我来说,在比较充分地了解了各个子模块的结构之后,才逐渐看明白了transformer的总体结构。
图2‑2 《Attention is all you need》所示Transformer结构示意图
Transformer的结构比较复杂,很难一下子理解,因此我采用了迂回战术,从各个侧面、各个模块出发了解这个模型。


03

从思想出发理解transformer
Transformer的关键结构有3个方面:(1)总的来说,transformer是一种encoder-decoder结构;(2)其中的encoder和decoder都采用了类似RNN的时间循环结构;(3)为了让模型可以刻画序列数据的时空关系,配置了位置编码机制。为了本节分别对时间循环结构和encoder-decoder结构进行介绍,然后引出transformer的基本框架,最终展示transformer的结构细节。

3.1 基于递归结构实现序列建模

RNN在时间维度上的递归结构,模仿了人类在处理文本等序列数据时“综合考虑”的策略,处理每一个元素时,会考虑关于序列的已有信息。Transformer也吸收了这个思想,如图3-1和图3-2。
图 3‑1 Transformer的时间递归结构
图 3‑2 Transformer递归结构的简单表示

3.2 基于encoder-decoder结构实现特征提取

我们可以把原始数据喂到模型1,得到的输出记为feature1;然后把feature1喂到模型2,得到的输出记为feature2。从直觉的角度看,模型1对数据进行了一定程度的抽象,而模型2进行了更高程度的抽象。多层神经网络就是这种结构的具体实现,实践中的表现还不错。
一些人设计了这样一种2层模型:(1)各层可以是任意结构的模型;(2)原始数据、feature1、feature2的结构和含义根据场景定义。这种结构的模型被称为”encoder-decoder模型”,模型1叫做encoder,模型2叫做decoder。一般来说,encoder和decoder可以采用全连接神经网络、RNN等模型。
图 3-3 encoder-decoder模型的基本结构
在机器翻译场景里,机器学习模型的输入和输出都是序列,因此可以用RNN作为encoder和decoder,如图3-4。得益于RNN对序列数据中时空关系的刻画能力,这种模型可以非常好的对语言进行建模。
而在Transformer中, encoder和decoder采用的是一种基于注意力机制的模型,没有天然的序列数据建模能力——Ashish Vaswani等人借鉴RNN的做法,对模型进行了一定的改造,为transformer添加了这种能力。
图 3-4 一个基于RNN的encoder-decoder模型

3.3 transformer如何让模型知道序列元素的顺序——位置编码机制

后面会提到,transformer所依赖的多头注意力模块没有时间循环机制,因此无法对序列中元素的“顺序”进行刻画。“顺序”是序列数据中非常重要的一种信息,是元素之间依赖关系的主要表现。比如“我是中国人”这句话,如果修改为“中国人是我”,就不符合事实、成为一个不合法的句子。
transformer设置了一种机制,用来向序列数据添加位置信息,进而让transformer学到“顺序”。这种机制被称为“位置编码”(position encoding),做法也非常简单:用正弦、余弦函数生成沿时间轴变化的波形,然后把这种波形叠加到transformer的输入中。正余弦波在不同的位置取值大小不同,可以用来表示序列中两个元素的相对位置。“叠加”的具体操作比较直白,就是把序列数据和与之同形状的位置编码数据,加起来。
本文作者对位置编码机制演化的过程不太了解,这里直接展示机器翻译场景里,transformer的位置编码数据计算方案。记某个汉字在源文本中的位置(序号)是pos。
字向量偶数维度上,要叠加的位置编码取值为:
式中,  是字向量的维度大小;10000的含义本文作者还没有确定。
字向量技术维度上,要叠加的位置编码取值为:
由于这种位置编码机制没有参数,计算速度非常快。另外,效果也是不错的。

3.4 Transformer的时间循环是如何实现的

Transformer的时间循环机制被部署在了decoder中,如图3-5。解码器把上一时刻的输出引入到当前输出的计算中,进而实现对历史信息的刻画。看起来很简单的结构,就可以用来实现序列数据建模。
图 3-5 Transformer的解码器具有时间循环结构

3.5 Transformer的encoder结构长什么样

Transformer的编码器不是特别复杂,如图3-6。编码器的结构主要有3个元素:(1)多头注意力;(2)残差连接;(3)全连接层。当然,虚线内的部分可以搞多层堆叠,以获得更强的学习能力。
图 3-6 编码器的微观结构

3.5.1 多头注意力

“多头注意力”(multi-head)指的是“多个注意力模块构成的大模块”,相当于卷积神经网络中采用多个卷积核构成一层。多头注意力是在scaled dot-product attetion的基础上发展而来的,因此这里首先介绍祖先,然后介绍多头注意力。

3.5.1.1 scaled dot-product attetion

多头(自)注意力是注意力机制的一种实现形式,是对scaled dot-product attetion的一种扩展。如图3-7,是scaled dot-product attetion的结构。由于Transformer是用来做机器翻译的,采这里用了自注意力形式,即K=V。在encoder中,K和V是(经过位置编码的)字向量,而Q是本模块上一时间步的输出。scaled dot-product attetion的符号形式为:
式中,  是缩放因子,可以硬编码,也可以基于特定的规则计算得到。
图 3-7 Scaled Dot-Product Attention的结构

3.5.1.2 多头注意力的结构

为了让注意力模块具有更强的学习能力,Vaswani对Scaled Dot-Product Attention进行了扩展,推出了多头注意力结构,如图3-8。多头注意力模块里包含了多个Scaled Dot-Product Attention(不共享参数);每个Scaled Dot-Product Attention的输入,都是经过线性变换的QKV;各个Scaled Dot-Product Attention的输出经过拼接和线性变换,就成为多头注意力的输出。Transformer中,
图 3-8 多头注意力的结构

3.5.2 全连接层

输入数据在经过多头注意力模块的加工后,会形成一个向量序列。这个序列中的每一个向量,会通过同一个全连接层——线性变换和relu激活函数。
需要注意的是,多头注意力模块输出的是全部输入序列的编码——对全连接层来说,这个序列的元素是独立的,因此这里可以用并行计算的方式提升模型的运行速度。

3.5.3 多层堆叠与残差连接

多头注意力层和全连接层可以合起来看做一种新型的神经网络结构(类似CNN、RNN),我们可以通过堆叠多层来实现深度神经网络,进而得到非常强的学习器。Transformer比较深,堆叠了6层。
当然,由于多层迭代结构会带来梯度消失或爆炸,深层网络的训练是比较困难的。为此,Transformer采用了残差连接。

3.6 Transformer的decoder结构长什么样

Transformer的decoder可以被看做是encoder的升级版。如图3-9,是decoder的结构。Transformer的encoder在处理序列数据时,主要依靠注意力机制来捕捉数据中的时空关联信息。Decoder则在encoder的基础上增加了时间循环机制,获得了更强的序列数据建模能力。
图 3-9 解码器的结构
图3-9的绿色部分和棕色部分结构基本相同——区别是,负责处理历史输出的绿色部分,为了避免模型在训练阶段把“未知”信息作为输入,添加了一个屏蔽模块。可以把绿色部分叫做历史信息处理模块;棕色部分叫做语义向量处理模块。当解码器运行到第i时间步时,第i个输出以及之后的输出还没有计算出来,因此不能作为历史信息处理模块的输入(否则会发生数据泄露)。在训练阶段,我们会将i时间步及以后的输出全部置零——看起来像“盖住”了这部分信息一样,因此这个操作被称为“maksed”。换句话说,当编码器运行到第i个时间步时,历史信息处理模块的输入是时间步i之前的输出序列。
接下来,把编码器的输出和历史信息处理模块的输出拼接起来,喂到与编码器同结构的下游模块中;最后,结果线性变换和softmax的就是英文单词的概率分布。
编码器也可以搞多层堆叠,以获得更强的学习能力。

3.7 回头看

Tansformer可以被看做是基于RNN的encoder-decoder的升级版:它把RNN的神经元替换为带有更多先验知识的注意力机制模块。另外,transformer还有几个特殊的地方:(1)Vaswani设计了位置编码机制,以让注意力机制具有快速刻画“顺序”的能力;(2)为了避免训练过程中发生数据泄露,transformer为decoder配置了mask,以屏蔽“未来的数据”;(3)transformer采用了残差连接,可以支撑深度模型的有效训练,进而提升了模型能力的上限;(4)多头注意力等部分可以并行计算,速度较快。


04

结语
我在之前两年的学习中,经常会有“急躁”的情况,即一看资料里一堆堆的预备知识就头疼、认为作者太啰嗦了。实际上,如果事先了解一些“形而上”的东西,比如简单的思想或方法,我们在学习和研究一些比较复杂的东西时会受到很多帮助。举例来说,如果在不理解BP神经网络的情况下,直接开干BERT,我很快会感受到强烈的挫败——看啥啥不会,就像个SB。
据我所知,任何领域里比较深入的知识,都是在一定的理论方法或技术的基础上发展而来的。一个知识点实际上需要若干其他知识点作为辅助,才能自证其合理性、发挥作用。对学习者来说,理解该知识点的任务,也需要在理解辅助知识点的基础上才能完成。比如我在学习transformer的时候,必须有神经网络、注意力机制、机器翻译、最优化等等方面的积累,才能比较顺利地理解其结构和内涵。
而大家在介绍transformer的时候,一般不会特意提到它的辅助知识点,导致初学者感觉没有方向。这时候,我们可以想办法往前追溯,先找到辅助知识点,搞明白,然后再看transformer。这样做的学习曲线会缓和很多——这是一种很有用的学习思想,适合大部分人使用。

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“综述专栏”历史文章


更多综述专栏文章,

请点击文章底部“阅读原文”查看



分享、点赞、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存