本文主要针对NLP任务中经典的Transformer模型的来源、用途、网络结构进行了详细描述,对后续NLP研究、注意力机制理解、大模型研究有一定帮助。
在上一篇《Text-to-SQL小白入门(一)》中,我们介绍了Text-to-SQL研究的定义、意义、研究方法以及未来展望,其中在介绍研究方法时,多次提到了Seq2Seq框架以及相应的Encoder-Decoder方法。而今天提到的模型Transformer,是人工智能领域,尤其是NLP领域和CV领域的杰出代表,也是目前最先进的模型之一!
在步入正式学习前,我们先对Seq2Seq方法、Encoder-Decoder方法、Transformer模型做一个简单的区分。
Transformer模型来源于2017年NIPS(CCF-A)谷歌团队发表的论文《Attention Is All You Need》。目前最火的大模型,比如BERT、GPT系列等都离不开Transformer模型。目前改论文的谷歌学术的被引用次数已经达到84986,如图1所示,这个数据已经可以载入史册了!
图1 论文Attention Is All You Need谷歌学术引用数
插个题外话,Transformer的作者谷歌8子,已经全部离职,arxiv上v6版本也删除了划掉了所有作者的谷歌邮箱,如图2所示。(今年8月初又重新更新了v7版本)
图2 论文Attention Is All You Need作者名单
Transformer也是【变形金刚】的英语,台大李宏毅老师也喜欢用变形金刚举例子)
Transformer是一种非常流行的神经网络结构,已经被用于多种自然语言处理任务的大规模预训练模型,如语言模型、机器翻译、文本摘要、问答系统等。
Transformer的主要优点是其并行计算能力,能够处理长文本,同时通过自我注意力机制可以有效地捕捉上下文信息。
在前面的概述中,已经简单介绍了Transformer可以在多个场景广泛应用,接下来举几个例子,更直观感受一下。
比如生成任务中,图片生成自动描述,就是序列关系1 vs N,如图3所示。
图3 图像生成文本描述例子
比如分类任务中,序列关系为N vs 1,以文本情感分类sentimental analysis为例。
比如有序列标注任务,比如文本词性标注syntactic parsing
图4 文本词性标注例子
语音识别Speech Recognition任务输入输出如图5所示:
图5 语音识别例子
机器翻译Machine Translation任务的输入输出如图6所示:
图6 机器翻译例子
语音翻译Speech Translation任务的输入输出入图7所示:
(这个任务也可以用语音识别+机器翻译结合来完成,但是有的语言没有文字,就很难办,但是Transformer模型直接从语音到文字翻译是可以胜任的)
图7 语言翻译例子
话不多说,直接上Transformer结构“世界名画”,如图8所示,核心部分主要可以分为Embedding、Positional Encoding、Encoder、Decoder,接下来就分别介绍一下。
图8 transformer结构
在这里,我们把Input -> Input Embedding -> Positional Encoding 当作输入部分,这部分处理完后,会作为Encoder编码器的输入,如图9所示。
图9 Transformer结构中Encoder和输入部分
在Transformer论文中,作者以机器翻译这个领域为切入点来介绍模型,所以该模型在论文里面的输入输出就对应前面提到的序列关系N vs M。
输入文本信息后,怎么才能让模型获取这个输入呢?所以需要对文本进行编码,让模型可以读取输入。模型读取的一般是向量,所以需要让文本转化为向量,这就是Input Embedding做的事情。
更学术一点的话语是,文本是一种非结构化的数据信息,是不可以直接被计算的。我们需要将这些非结构化的信息转化为结构化的信息,也就是这里的Input embedding。
常用的方法主要用one-hot编码(翻译为独热编码,看起来怪怪的)、整数编码、word embedding(词嵌入)。
用通俗的话来解释就是:把每一个单词都用某个位为1,其余位全是0的二进制向量来表示,比如如图10所示。
图10 one-hot 和 word embedding编码
one-hot编码优点:
缺点也很明显,在实际情况中,文本中很可能出现成千上万个不同的词,这时候向量就会非常长。其中99%以上都是 0。
通俗解释:把每一个单词都用1个整数来表示,跟one-hot有点类似。
优点:
缺点:
前面铺垫了这么多,前面两种方式都无法表达语义关系,那么词嵌入方法就肯定可以了。
word embedding 是文本表示的一类方法。跟 one-hot 编码和整数编码的目的一样。同时词嵌入并不特指某个具体的算法,跟上面2种方式相比,这种方法有几个明显的优势:
图11 word embedding 示例
word embedding主流的方法有word2vec 和 GloVe。
需要明白为什么有这个positional embedding的存在?
因为在transformer机构中,输入是并行处理的,这样计算效率更高了,但是忽略了文字的先后顺序的重要性。
论文中公式如图12所示,偶数(2i)位置用sin表示,奇数(2i+1)位置用cos表示。
图12 位置编码公示
举个例子,比如“我爱你”中的“爱”这个字, 位置编码可以大概写成[sin,cos,sin,cos...,cos],对应总共512维情况,如图13所示。
图 13 位置编码举例
把word embedding 和 positional embedding之后的输入加起来,作为编码器Encoder最终的输入,如图14所示。
图14 输入编码后相加
这里有个拓展,就是为什么位置编码是有效的?参考图15
本质上还是数学:三角函数的性质+线性代数
更通俗的解释就是: 对于后续某一个位置比如pos+k位置,都可以被前面pos位置和k位置线性组合,这样就说明了相关位置信息
图15 推理位置编码有效
终于,终于,终于到了论文最核心的部分了
论文里面提到的是“We propose a new simple network architecture, the Transformer”,感觉一点也不simple啊
我们先明确一件事情,就是Encoder编码器做了一件什么事情?输入输出的边界是什么?简化版本如图16所示。
图16 Encoder编码器输入输出示意图
Transformer里面最核心的部分是基本注意力机制的,论文标题也直接是Attention is all you need,那么我们需要了解一下什么注意力机制?
注意力机制(Attention Mechanism)的研究最早受到了人类视觉系统研究的启发。由于人类视网膜不同部位的信息处理能力不同,人们会选择性关注所有信息中的部分信息,同时忽略掉其他信息。为了高效利用视觉信息,人类需要选择视觉区域中的某个部分重点关注,比如图17所示,颜色越深,代表越关注。
比如人们在用电脑观看视频时,会重点关注电脑屏幕上的内容,选择性忽略电脑背景和鼠标键盘等等。
图17 注意力机制可视化
在深度学习领域,注意力机制的本质在于模拟人类视觉效果,关注重要特征,丢弃用处不大的特征。注意力机制在许多任务上取得了巨大的成功,除了在自然语言处理NLP任务应用外,还在计算机视觉CV任务广泛应用(比如图像分类、目标检测、语义分割、视频理解、图像生成、三维视觉、多模态任务和自监督学习等)。
前面介绍了基本的注意力机制原理,那么回到论文中,Transformer中的注意力机制是什么样子的?
确实挺“简单”的,计算注意力权重就只有一个公式罢了,理解起来还是需要花点时间。
要理解Transformer中的Multi-Head Attention(图18),需要先了解(单头)自注意力机制,也就是论文提到的注意力计算公式Attention(Q,K,V)。
图18 Multi-Head Attention 示例
因为输入其实都只有1个,但是在Multi-Head Attention模块前其实有3个输入,代表Q、K、V,这三个向量都是来源于相同的输入编码,所以是自注意力机制。
Q,K,V是什么?
我们需要知道Q,K,V代表的都是向量,比如Q是一系列[q1,q2,q3,....]集合,K是一系列[k1,k2,k3,...]集合,V是一系列[v1,v2,v3,...]集合。
Q,K,V从哪里来?
Q,K,V是向量乘法得到的,如图19所示。
图19 Q、K、V来源
Q,K,V怎么用?
用法其实就是图20Attention计算公式,主要分为4步。
图20 Attention计算公式
可以举个例子,来说明一下各个参数的计算过程,如图21所示。假设输入仍然是两个单词,编码后得到[x1,x2],通过前面Q、K、V来源,我们得到了[q1,q2];[k1,k2];[v1,v2]
图21 Attention计算举例
在实际的计算过程中,用的都是矩阵乘法,所以是并行计算的,所以Transformer计算效率高,如图22所示。
图22 Attention计算并行计算示例
前面提到了单头自注意力机制,这是构成多头注意力机制的基础,论文中使用的是Multi-Head Attention,这里的注意力就是Self-Attention。
为什么需要多头注意力机制?因为卷积操作可以输出多通道,不同的通道可以代表的特征信息,Transformer也借鉴了这个思路,这里的head就有点类似于卷积操作中的channel通道。
多头注意力公式,如图23所示。
图23 多头注意力机制计算公式
同样的,举个例子,我们假设有2个head的情况,输入仍然是两个单词编码,这里假设为[a1,a2],然后经过和共享参数相乘得到Q、K、V,经过head 划分以及计算注意力,最终得到值[b1,b2]
图24 多头注意力机制计算b1_1
图25 多头注意力机制计算b1_2
图26 多头注意力机制计算b1
我们可以发现的是,在论文的Encoder部分中如图27所示,还有一个Add & Norm,这里的Add代表的就是残差,Norm代表的是Layer Normalization。
图27 Transformer中残差和归一化
残差网络的概念来源于CV大佬何恺明2015年提出的ResNet,《Deep Residual Learning for Image Recognition》,谷歌学术引用目前176823!!!目前这个backbone仍然是CV届主流的架构之一。
再提一句,凯明大神将于2024年加入MIT,回归学术界~
残差的概念很简单,就是把原始的输入也加入到了经过注意力机制的输出后面,如图28,这就是ResNet中的残差结构,多了一条shortcut分支,也就是等值变换identity。
图28 残差结构示意图
同样的,在我们的Encoder结构中,加上残差结构后的输入输出如下所示。
为什么需要残差结构?
原论文中有详细解释,主要是为了解决层数过多时的梯度消失的现象。
也可以通过数学上的链式求导法则来证明。AI离不开数学!
可能会遇到一个区分Batch Normalization vs Layer Normalization,也就是BN vs LN
举个例子,如图29所示,这里假设的是二维输入【实际上文本输入是三维的】,假如前面9个文本都是有5个单词构成,第10个文本有20个单词。如果是做BN的话,会默认所有样本的相同位置的字都是有相似的含义的,比如“我”、“今”、“生”、...、“这”都是属于样本的第1个位置,显然他们含义不一样。LN的处理就是默认一个样本里面假设他们的语义信息是有相关性的,所以用来计算均值和方差。
图29 BN和LN示例
直接上公式,如图30所示,其实就是两个全连接层FC(或者叫只有一个隐藏层的MLP)
图30 FFN公式计算示例
不过值得注意的是,Encoder会堆叠N次,论文中N取值为6(Decoder也是堆叠6次),如图31所示。
图31 Encoder堆叠次数
在解码器部分,主要结构和Encoder结构有点类似,如图32所示,不同点主要是:
图32 Encoder和 Decoder部分对比
首先Decoder中的输入部分,首先是来源于output编码后的向量,比如在机器翻译任务中的话,input是“hello world”,output对应的ground truth就是“你好世界”。比如在语音翻译任务中,input是“机器学习”的语音,output对应的ground truth就是“机器学习”文本。
现在把output输入到Masked Multi-Head Attention模块中,跟Multi-Head Attention计算类似,唯一的不同是在计算当前单词的时候,会遮挡住当前单词以及当前单词后续的词(会加入2个特殊符号,一个是BEGIN开始符号,一个END结束符号)。
举个例子,比如是正常的Self-Attention时候,如图33所示。
图33 正常的Self-Attention示例
如果是Masked Self-Attention时,如图34所示。
图34 Masked Self-Attention示例
更全面的展示,和上面的举例子对应起来就是如图35所示。
图35 Masked Self-Attention示例
为什么需要mask ?
其实这个跟预测输出的时候,我不能把输出值告诉你有点像,只能通过模型来预测。比如我想要知道这个语音对应的翻译是“机”,我不能把文字“机”也直接输送到模型里面。
Decoder解码器中的多头注意力机制的QKV来源于Encoder编码器和Decoder解码器,编码器提供K和V,解码器提供Q,如图36所示。
图36 Cross Attention示例
终于终于来到了输出部分
这里主要是一个线性层+softmax,如图37所示。
s
图37 output 示例
Text-to-SQL小白入门(一) - 知乎
https://arxiv.org/pdf/1706.03762.pdf
3.多头注意力机制详解_哔哩哔哩_bilibili
12.【李宏毅机器学习2021】Transformer (上)_哔哩哔哩_bilibili
Transformer论文逐段精读【论文精读】_哔哩哔哩_bilibili
Transformer中Self-Attention以及Multi-Head Attention详解_哔哩哔哩_bilibili
参考了很多B站大佬视频,强推
讲的有不对的地方,请批评指正,感谢