论文:Attention is all you need
近两年,随着GPT3、GPT4等产品的大火,大模型浪潮开始席卷全球。但众多大模型的背后,都不离开Transformer的身影,可以说Transformer为大模型的诞生奠定了重要的基础。Transformer由Vaswani等人在2017年提出,其最初的应用任务是机器翻译,随后快速扩展到其他领域。如今,Transformer及其衍射架构在自然语言处理、计算机视觉和图表示学习等领域都占据着重要地位。本文接下来将对Transformer进行详细的剖析。
什么是Transformer?
原始的Transformer遵从经典的编码器-解码器 架构(具体参见下图),其编码器和解码器都由Transformer层堆叠而成。不同于传统的卷积神经网络和循环神经网络,Transformer是基于自注意力机制构建而成的,这使得它既能像卷积神经网络一样能够并行计算,也避免了传统循环神经网络在捕获长距离依赖上的不足。
自注意力机制
人在观察一张图像时往往能轻而易举的将注意力集中到途中的某些人或物上,这便是大脑的认知注意力。在神经网络中,人们仿照这种机制设计了类似的注意力机制,这种机制能够增强神经网络对输入数据中某些部分的权重,同时减小其他部分的权重,使得神经网络聚焦于数据中最重要的一小部分。
上述借用了维基百科关于自注意力的定义。
Transformer中的自注意力机制便是注意力机制中的一种变体,自注意力顾名思义就是自己关注自己,常用于捕获数据内的相关性。
给定输入 X ∈ R L × d X\in \mathbb{R}^{L\times d} X∈RL×d,其中 L L L代表输入序列的长度, d d d代表每个位置元素的嵌入向量的维度,自注意力机制首先利用三个映射矩阵 W Q ∈ R d × d k , W K ∈ R d × d k , W V ∈ R d × d v W_Q\in \mathbb{R}^{d \times d_k}, W_K \in \mathbb{R}^{d \times d_k}, W_V \in \mathbb{R}^{d \times d_v} WQ∈Rd×dk,WK∈Rd×dk,WV∈Rd×dv对输入进行映射分别得到查询 Q ∈ R L × d k Q \in \mathbb{R}^{L \times d_k} Q∈RL×dk(query)、键 K ∈ R L × d k K \in \mathbb{R}^{L \times d_k} K∈RL×dk(key)和值 V ∈ R L × d v V \in \mathbb{R}^{L \times d_v} V∈RL×dv(value)。然后,利用查询向量和键向量之间的缩放点积来计算输入序列中每个位置与整个序列中所有其他位置元素之间的相关性,并将其作为权重与值向量进行加权求和,用数学符号来表达即为:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \operatorname{Attention}(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V Attention(Q,K,V)=softmax(dk QKT)V
除以 d k \sqrt{d_k} dk 是保证查询和键点积后的结果仍然保持均值为0,方差为1,这有利于模型训练的稳定性。
作者将上述形式的注意力称之为缩放点积注意力(Scaled Dot-Product Attention)。
下图便展示了一个自注意力机制的示例,对于第一个词I
,其与整个序列[I, love, tennis]
经过计算得到的自注意力权重为[0.7, 0.2, 0.1]
,将该权重与每个词对应的值向量进行加权求和,即可得到I
所对应的输出向量。
解码器中的自注意力
Transformer解码器中自注意力的计算与上述计算过程类似,但是进行了一些额外的处理。
掩码注意力
Transformer在解码时,需要依据当前输入解码出下一个词。而原始的自注意力机制会计算整个输出上的注意力权重,为了避免未来的信息在当前解码步上泄露,Transformer设计了带掩码的自注意力机制。以下图为例,当解码词life
时,会将其未来的[is, short, eat desert, first]
掩去。也就是说,在计算完自注意力后,需要将注意力分数权重中与未来词之间的权重分数掩去。
交叉注意力
在Transformer解码器中,还存在一个**跨编码器解码器的注意力(cross attention)**计算步骤。该注意力在计算时,键和值都是编码器最终的输入,查询为解码器经过自注意力编码后的输出。通过跨编码器解码器注意力的计算,能够自动计算解码当前元素时,输入中哪些位置的元素对其最重要。
多头注意力机制
在单头注意力的基础上,Transformer进一步扩展为了多头注意力机制(Multi-head attention)。多头注意力机制允许模型同时关注来自不同表示子空间的信息,从而更好地捕捉序列中不同位置的相关性和重要性。
具体来说,多头注意力机制利用多个注意力头对每一层的输入进行多次上述的缩放点积注意力计算,每个注意力头的参数都是独立的。多头注意力机制的计算过程如下图所示,在各个注意力头的计算完成后,会将各个注意力头计算得到的结果进行拼接和线性映射以获取最终的输入。
位置编码
为了使得模型能够利用序列的顺序信息,Transformer设计了位置编码模块。作者采用了下列公式所示的位置编码:
P E ( p o s , 2 i ) = sin ( p o s / 1000 0 2 i / d model ) P E ( p o s , 2 i + 1 ) = cos ( p o s / 1000 0 2 i / d model ) \begin{aligned} P E_{(p o s, 2 i)} & =\sin \left(p o s / 10000^{2 i / d_{\text {model }}}\right) \\ P E_{(p o s, 2 i+1)} & =\cos \left(p o s / 10000^{2 i / d_{\text {model }}}\right) \end{aligned} PE(pos,2i)PE(pos,2i+1)=sin(pos/100002i/dmodel )=cos(pos/100002i/dmodel )
其中 i i i表示元素在序列中的位置索引, d model d_{\text{model}} dmodel与输入序列嵌入维度相同(方便往输入序列上直接加上位置信息)。
通过添加位置编码,每个位置都有一个唯一的位置编码,且相邻位置之间的位置编码之间有一定的关联性,能够帮助模型更好地理解序列中不同位置的顺序关系。
前馈神经网络
Transformer的编码器解码器中的每一层都包含一个前馈神经网络,其由两个线性变换和一个ReLU激活组成:
FFN ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2 \operatorname{FFN}(x)=\max \left(0, x W_1+b_1\right) W_2+b_2 FFN(x)=max(0,xW1+b1)W2+b2
前馈神经网络使得模型具有非线性映射的能力,能够拟合更复杂的函数。另外,从Transformer的总体架构可以看出,Transformer中还额外引入了残差连接的思想,这也是Transformer能够堆叠很多层的原因。
结语
本文详细介绍了Transformer的重要模块,对于Transformer,其后续的衍生架构主要是对其注意力机制或者位置编码进行各种创新,或者是融入其他神经网络架构(例如图神经网络)使其具备更强的建模能力。T
以上便是本文的全部内容,要是觉得不错可以点赞或关注一下。博主水平有限,要是有任何不不足指出,也欢迎批评指正。
本人将在后续持续更新大模型系列的经典论文和实战代码,要是对此感兴趣的可以关注一下本人的CSDN博客和微信公众号,敬请期待。