注意力机制
说到transformer就不得不提一下“注意力”的概念。
蒲公英书中提到“…人脑可以有意或无意地从这些大量输入信息中选择小部分的有用信息来重点处理,并忽略其他信息.这种能力就叫作注意力(Attention)”
注意力一般分为两种:
- 自上而下的有意识的注意力,称为聚焦式注意力(Focus Attention). 聚焦式注意力也常称为选择性注意力(Se-lective Attention).聚焦式注意力是指有预定目的、依赖任务的,主动有意识地聚焦于某一对象的注意力.
- 自下而上的无意识的注意力,称为基于显著性的注意力(Saliency-Based Attention).基于显著性的注意力是由外界刺激驱动的注意,不需要主动干预,也和任务无关.如果一个对象的刺激信息不同于其周围信息,一种无意识的“赢者通吃”(Winner-Take-All)或者门控(Gating)机制就可以把注意力转向这个对象.不管这些注意力是有意还是无意,大部分的人脑活动都需要依赖注意力,比如记忆信息、阅读或思考等.
通常说到的“注意力机制”指的是自上而下的聚焦式注意力。
设 X = [ x 1 , . . . , x N ] ∈ R D × N \mathbf{X}=[\boldsymbol{x}_1,...,\boldsymbol{x}_N] \in \mathbb{R}^{D \times N} X=[x1,...,xN]∈RD×N表示N组输入信息,其中D维向量 x n ∈ R D , n ∈ [ 1 , N ] \boldsymbol{x}_n \in \mathbb{R}^D,n\in[1,N] xn∈RD,n∈[1,N]表示一组输入信息。为了节省计算资源,不需要将所有信息都输入神经网络,只需要从 X \mathbf{X} X中选择一些和任务相关的信息。
注意力机制的计算可以分为两步:
- 首先,在所有输入信息上计算注意力分布;
- 然后,根据注意力分布来计算输入信息的加权平均.
注意力分布
为了从 N N N个输入向量 [ x 1 , . . . , x N ] [\boldsymbol{x}_1,...,\boldsymbol{x}_N] [x1,...,xN]中选择出和某个特定任务相关的信息,我们需要引入一个和任务相关的表示,称为查询向量(Query Vector),并通过一个打分函数来计算每个输入向量和查询向量之间的相关性.
给定一个和任务相关的查询向量 q \boldsymbol{q} q(查询向量 q \boldsymbol{q} q可以是动态生成的,也可以是可学习的参数).我们用注意力变量 z ∈ [ 1 , N ] z \in [1, N] z∈[1,N] 来表示被选择信息的索引位置,即 z = n z=n z=n表示选择了第 n n n个输入向量.为了方便计算,我们采用一种“软性”的信息选择机制.
所谓的“软性”(Soft)指的是注意力分布的连续性和可微性。这种机制允许模型在处理输入信息时,以概率分布的形式分配注意力权重,而不是选择单一的输入元素进行关注。
首先计算在给定
q
\boldsymbol{q}
q和
X
\mathbf{X}
X下,选择第
i
i
i个输入向量的概率
α
n
\alpha_n
αn,
α
n
=
p
(
z
=
n
∣
X
,
q
)
=
softmax
(
s
(
x
n
,
q
)
)
=
exp
(
s
(
x
n
,
q
)
)
∑
j
=
1
N
exp
(
s
(
x
j
,
q
)
)
\begin{aligned}\alpha_{n} & =p(z=n \mid \mathbf{X}, \boldsymbol{q})\\& =\operatorname{softmax}\left(s\left(\boldsymbol{x}_{n}, \boldsymbol{q}\right)\right)\\& =\frac{\exp \left(s\left(\boldsymbol{x}_{n}, \boldsymbol{q}\right)\right)}{\sum_{j=1}^{N} \exp \left(s\left(\boldsymbol{x}_{j},\boldsymbol{q}\right)\right)} \end{aligned}
αn=p(z=n∣X,q)=softmax(s(xn,q))=∑j=1Nexp(s(xj,q))exp(s(xn,q))
其中 α n \alpha_n αn称为注意力分布(Attention Distribution), s ( x , q ) s(\boldsymbol{x},\boldsymbol{q}) s(x,q)为注意力打分函数,可以使用以下几种方式来计算:
- 加性模型。 s ( x , q ) = υ ⊺ tanh ( W x + U q ) , s(\boldsymbol{x},\boldsymbol{q})=\boldsymbol{\upsilon}^\intercal\tanh(\boldsymbol{W}x+\boldsymbol{U}q), s(x,q)=υ⊺tanh(Wx+Uq),
- 点积模型。 s ( x , q ) = x ⊺ q , s(\boldsymbol{x},\boldsymbol{q})=\boldsymbol{x}^{\intercal} \boldsymbol{q}, s(x,q)=x⊺q,
- 缩放点积模型。 s ( x , q ) = x ⊺ q D , s(\boldsymbol{x},\boldsymbol{q})=\frac {\boldsymbol{x}^{\intercal} \boldsymbol{q}}{\sqrt{D}}, s(x,q)=Dx⊺q,
- 双线性模型。 s ( x , q ) = x ⊺ W q , s(\boldsymbol{x},\boldsymbol{q})=\boldsymbol{x}^{\intercal}\boldsymbol{W} \boldsymbol{q}, s(x,q)=x⊺Wq,
其中 W , U , v \boldsymbol{W},\boldsymbol{U},\boldsymbol{v} W,U,v为可学习参数, D D D为输入向量的维度。
理论上,加性模型和点积模型的复杂度差不多,但是点积模型在实现上可以更好地利用矩阵乘积,从而计算效率更高.
当输入向量的维度 D D D比较高时,点积模型的值通常有比较大的方差,从而导致 Softmax 函数的梯度会比较小.因此,缩放点积模型可以较好地解决这个问题.双线性模型是一种泛化的点积模型.假设公式 s ( x , q ) = x ⊺ W q s(\boldsymbol{x},\boldsymbol{q})=\boldsymbol{x}^{\intercal}\boldsymbol{W} \boldsymbol{q} s(x,q)=x⊺Wq中 W = U ⊺ V \boldsymbol{W}=\boldsymbol{U}^{\intercal}\boldsymbol{V} W=U⊺V,双线性模型可以写为 s ( x , q ) = x ⊺ U ⊺ V q = ( U x ) ⊺ ( V q ) s(\boldsymbol{x},\boldsymbol{q})=\boldsymbol{x}^\intercal\boldsymbol{U}^\intercal\boldsymbol{V}\boldsymbol{q}=(\boldsymbol{U}\boldsymbol{x})^\intercal(\boldsymbol{V}\boldsymbol{q}) s(x,q)=x⊺U⊺Vq=(Ux)⊺(Vq),即分别对 x \boldsymbol{x} x和 q \boldsymbol{q} q进行线性变换后计算点积.相比点积模型,双线性模型在计算相似度时引入了非对称性.
加权平均
注意力分布
α
n
\alpha_n
αn可以解释为在给定任务相关的查询
q
\boldsymbol{q}
q 时,第
n
n
n 个输入向量受关注的程度.我们采用一种“软性”的信息选择机制对输入信息进行汇总,即
att
(
X
,
q
)
=
∑
n
=
1
N
α
n
x
n
,
=
E
z
∼
p
(
z
∣
X
,
q
)
[
x
z
]
.
(2)
\begin{aligned} \operatorname{att}(X,\boldsymbol{q})& =\sum_{n=1}^N\alpha_n \boldsymbol{x}_n, \\ &=\mathbb{E}_{z\sim p(z|\mathbf{X},\boldsymbol{q})}[\boldsymbol{x}_z]. \end{aligned} \tag{2}
att(X,q)=n=1∑Nαnxn,=Ez∼p(z∣X,q)[xz].(2)
公式(2)称为软性注意力机制(Soft Attention Mechanism).图8.1a给出软性注意力机制的示例.
注意力机制的变体
除了上面介绍的基本模式外,注意力机制还存在一些变化的模型.
硬性注意力
公式(2)提到的注意力是软性注意力,其选择的信息是所有输入向量在注意力分布下的期望.此外,还有一种注意力是只关注某一个输入向量,叫作硬性注意力(Hard Attention).
硬性注意力有两种实现方式:
(1)一种是选取最高概率的一个输入向量,即
att
(
X
,
q
)
=
x
n
^
,
(3)
\operatorname{att}(\mathbf{X},\boldsymbol{q})=\boldsymbol{x}_{\hat{n}},\tag{3}
att(X,q)=xn^,(3)
(2)另一种硬性注意力可以通过在注意力分布式上随机采样的方式实现.
硬性注意力的一个缺点是基于最大采样或随机采样的方式来选择信息,使得最终的损失函数与注意力分布之间的函数关系不可导,无法使用反向传播算法进行训练.因此,硬性注意力通常需要使用强化学习来进行训练.为了使用反向传播算法,一般使用软性注意力来代替硬性注意力.
键值对注意力
更一般地,我们可以用键值对(key-value pair)格式来表示输入信息,其中“键”用来计算注意力分布 α n \alpha_n αn,“值”用来计算聚合信息.
用
(
K
,
V
)
=
[
(
k
1
,
v
1
)
,
⋯
,
(
k
N
,
v
N
)
]
(\boldsymbol{K},\boldsymbol{V})=[(\boldsymbol{k}_1,\boldsymbol{v}_1),\cdots,(\boldsymbol{k}_N,\boldsymbol{v}_N)]
(K,V)=[(k1,v1),⋯,(kN,vN)]表示
N
N
N 组输入信息,给定任务相关的查询向量
q
\boldsymbol{q}
q 时,注意力函数为
att
(
(
K
,
V
)
,
q
)
=
∑
n
=
1
N
α
n
v
n
,
=
∑
n
=
1
N
exp
(
s
(
k
n
,
q
)
)
∑
j
exp
(
s
(
k
j
,
q
)
)
υ
n
,
(4)
\begin{aligned} \operatorname{att}\left((\boldsymbol{K},\boldsymbol{V}),\boldsymbol{q}\right)& =\sum_{n=1}^N\alpha_n\boldsymbol{v}_n, \\ &=\sum_{n=1}^N\frac{\exp\left(s(\boldsymbol{k}_n,\boldsymbol{q})\right)}{\sum_j\exp\left(s(\boldsymbol{k}_j,\boldsymbol{q})\right)}\boldsymbol{\upsilon}_n, \end{aligned} \tag{4}
att((K,V),q)=n=1∑Nαnvn,=n=1∑N∑jexp(s(kj,q))exp(s(kn,q))υn,(4)
其中 s ( k n , q ) s(\boldsymbol{k}_n,\boldsymbol{q}) s(kn,q)为打分函数。
图8.1b给出键值对注意力机制的示例.当 K = V \boldsymbol{K}=\boldsymbol{V} K=V 时,键值对模式就等价于普通的注意力机制.
多头注意力
多头注意力(Multi-Head Attention)是利用多个查询
Q
=
[
q
1
,
⋯
,
q
M
]
\boldsymbol{Q}=[\boldsymbol{q}_{1},\cdots,\boldsymbol{q}_{M}]
Q=[q1,⋯,qM],来并行地从输入信息中选取多组信息.每个注意力关注输入信息的不同部分.
att
(
(
K
,
V
)
,
Q
)
=
att
(
(
K
,
V
)
,
q
1
)
⊕
⋯
⊕
att
(
(
K
,
V
)
,
q
M
)
,
(5)
\operatorname{att}\Bigl((\boldsymbol{K},\boldsymbol{V}),\mathbf{Q}\Bigr)=\operatorname{att}\Bigl((\boldsymbol{K},\boldsymbol{V}),\boldsymbol{q}_1\Bigr)\oplus\cdots\oplus\operatorname{att}\Bigl((\boldsymbol{K},\boldsymbol{V}),\boldsymbol{q}_M\Bigr), \tag{5}
att((K,V),Q)=att((K,V),q1)⊕⋯⊕att((K,V),qM),(5)
其中 ⊕ \oplus ⊕表示向量拼接.
什么是Multi-head Attention?
提出背景
Multi-head attention机制的提出是受到了卷积神经网络(CNN)中多通道(channel)概念的启发。在CNN中,每个通道可以捕捉到图像的不同特征信息,这样做增强了模型对图像细节的捕捉能力。类似地,在处理序列数据时,一个关键的想法是是否可以设计一种机制,像Self-attention那样,能够从不同维度和不同距离的token中提取丰富的信息。
Group 卷积简介
为了更好地理解Multi-head attention与CNN中技术的相似之处,首先介绍一下group卷积。Group卷积将输入特征的多个通道分成若干组,每组内的通道独立进行卷积操作,然后将这些卷积结果拼接(concatenate)起来。这种方法可以降低参数量,同时允许网络在不同的通道组内学习到不同的特征表示。
Multi-head Attention的实现
Multi-head attention的核心思想是将Self-attention的过程“复制”多次,每一份复制(即每一个“头”)都可以捕捉到输入序列中的不同特征信息。具体来说,它将输入的查询(Q)、键(K)和值(V)分割成多个小份,每个头对应一组小份的Q、K、V,独立进行Self-attention操作。这样,每个头可以关注到输入中的不同部分或以不同的方式理解输入之间的关系。最后,将所有头的输出结果拼接起来,再通过一个线性层进行整合,以获得最终的输出。
核心差异与相似性
与Self-attention相比,Multi-head attention的根本区别在于它通过并行地执行多个Self-attention操作,使模型能够在同一时间内从多个“视角”捕捉信息,从而更加全面地理解数据。与group卷积类似,Multi-head attention通过分组处理(每个头处理一部分信息)和结果拼接的方式来增强模型的表示能力。这种并行处理和综合各个头的信息的方法使得Multi-head attention特别适用于处理复杂的序列任务,如机器翻译、文本摘要等。
总结而言,Multi-head attention通过引入多个关注点(即头),使得模型能够同时从多个维度理解数据,增强了模型的表达能力和灵活性。这种机制的设计灵感来源于CNN的多通道处理方式,但在处理序列数据的上下文中进行了创新性的应用。
结构化注意力
在之前介绍中,我们假设所有的输入信息是同等重要的,是一种扁平(Flat)结构,注意力分布实际上是在所有输入信息上的多项分布.但如果输入信息本身具有层次(Hierarchical)结构,比如文本可以分为词、句子、段落、篇章等不同粒度的层次,我们可以使用层次化的注意力来进行更好的信息选择 [Yang et al.,2016].此外,还可以假设注意力为上下文相关的二项分布,用一种图模型来构建更复杂的结构化注意力分布 [Kim et al., 2017].
指针网络
注意力机制主要是用来做信息筛选,从输入信息中选取相关的信息.注意力机制可以分为两步:一是计算注意力分布 α \alpha α,二是根据 α \alpha α 来计算输入信息的加权平均.我们可以只利用注意力机制中的第一步,将注意力分布作为一个软性的指针(pointer)来指出相关信息的位置.
指针网络(Pointer Network)[Vinyals et al., 2015] 是一种序列到序列模型,输入是长度为 N N N 的向量序列 X = x 1 , . . . , x N \mathbf{X}=\boldsymbol{x}_1,...,\boldsymbol{x}_N X=x1,...,xN,输出是长度为 M M M 的下标序列 c 1 : M = c 1 , c 2 , ⋯ , c M , c m ∈ [ 1 , N ] , ∀ m . \boldsymbol{c}_{1:M}=c_{1},c_{2},\cdots,c_{M},c_{m}\in[1,N],\forall m. c1:M=c1,c2,⋯,cM,cm∈[1,N],∀m..
和一般的序列到序列任务不同,这里的输出序列是输入序列的下标(索引).比如输入一组乱序的数字,输出为按大小排序的输入数字序列的下标.比如输入为 20, 5, 10,输出为 1, 3, 2.
条件概率푝
p
(
c
1
:
M
∣
x
1
:
N
)
p(c_{1:M}|\boldsymbol{x}_{1:N})
p(c1:M∣x1:N) 可以写为
p
(
c
1
:
M
∣
x
1
:
N
)
=
∏
m
=
1
M
p
(
c
m
∣
c
1
:
(
m
−
1
)
,
x
1
:
N
)
≈
∏
m
=
1
M
p
(
c
m
∣
x
c
1
,
⋯
,
x
c
m
−
1
,
x
1
:
N
)
,
(6)
\begin{aligned} p(c_{1:M}|\boldsymbol{x}_{1:N})& =\prod_{m=1}^M p(c_m|c_{1:(m-1)},\boldsymbol{x}_{1:N}) \\ &\approx\prod_{m=1}^Mp(c_m| \boldsymbol{x}_{c_1},\cdots,\boldsymbol{x}_{c_{m-1}},\boldsymbol{x}_{1:N}), \end{aligned} \tag{6}
p(c1:M∣x1:N)=m=1∏Mp(cm∣c1:(m−1),x1:N)≈m=1∏Mp(cm∣xc1,⋯,xcm−1,x1:N),(6)
其中条件概率
p
(
c
m
∣
c
1
:
(
m
−
1
)
,
x
1
:
N
)
p(c_m|c_{1:(m-1)},\boldsymbol{x}_{1:N})
p(cm∣c1:(m−1),x1:N)可以通过注意力分布来计算。假设用一个循环神经网络对
x
c
1
,
⋯
,
x
c
m
−
1
,
x
1
:
N
\boldsymbol{x}_{c_1},\cdots,\boldsymbol{x}_{c_{m-1}},\boldsymbol{x}_{1:N}
xc1,⋯,xcm−1,x1:N进行编码得到向量
h
m
\boldsymbol{h}_m
hm,则
p
(
c
m
∣
c
1
:
(
m
−
1
)
,
x
1
:
N
)
=
s
o
f
t
m
a
x
(
s
m
,
n
)
,
(7)
p(c_m|c_{1:(m-1)},x_{1:N})=\mathrm{softmax}(s_{m,n}),\tag{7}
p(cm∣c1:(m−1),x1:N)=softmax(sm,n),(7)
其中
s
m
,
n
s_{m,n}
sm,n为在解码过程的第
m
m
m步时,
h
m
\boldsymbol{h}_m
hm对
h
n
\boldsymbol{h}_n
hn的未归一化的注意力分布,即
s
m
,
n
=
υ
⊺
tanh
(
W
x
n
+
U
h
m
)
,
∀
n
∈
[
1
,
N
]
,
(8)
s_{m,n}=\boldsymbol{\upsilon}^{\intercal}\tanh(\boldsymbol{W}\boldsymbol{x}_{n}+\boldsymbol{U}\boldsymbol{h}_{m}),\forall n\in[1,N],\tag{8}
sm,n=υ⊺tanh(Wxn+Uhm),∀n∈[1,N],(8)
其中 W , U , v \boldsymbol{W},\boldsymbol{U},\boldsymbol{v} W,U,v为可学习参数。
图8.2给出了指针网络的示例,其中 h 1 \boldsymbol{h}_1 h1, h 2 \boldsymbol{h}_2 h2, h 3 \boldsymbol{h}_3 h3 为输入数字 20, 5, 10 经过循环神经网络的隐状态, h 0 \boldsymbol{h}_0 h0 对应一个特殊字符 ‘<’.当输入 ‘>’ 时,网络一步一步输出三个输入数字从大到小排列的下标。
自注意力
为什么叫自注意力呢?
自注意力可以作为神经网络中的一层来使用,有效地建模长距离依赖问题.
不同的输入长度,其连接权重的大小也是不同的。这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(Self-Attention Model)。
为了提高模型能力,自注意力模型经常采用查询-键-值(Query-Key-Value,QKV)模式,其计算过程如图8.4所示,其中红色字母表示矩阵的维度。
假设输入序列为 X = [ x 1 , . . . , x N ] ∈ R D x × N \mathbf{X}=[\boldsymbol{x}_1,...,\boldsymbol{x}_N] \in \mathbb{R}^{D_x \times N} X=[x1,...,xN]∈RDx×N,输出序列为 H = [ h 1 , . . . , h N ] ∈ R D v × N \mathbf{H}=[\boldsymbol{h}_1,...,\boldsymbol{h}_N] \in \mathbb{R}^{D_v \times N} H=[h1,...,hN]∈RDv×N,自注意力模型的具体计算过程如下:
(1)对于每个输入 x i \boldsymbol{x}_i xi,我们首先将其线性映射到三个不同的空间,得到查询向量 q i ∈ R D k \boldsymbol{q}_i \in \mathbb{R}^{D_k} qi∈RDk、键向量 k i ∈ R D k \boldsymbol{k}_i \in \mathbb{R}^{D_k} ki∈RDk 和值向量 v i ∈ R D v \boldsymbol{v}_i \in \mathbb{R}^{D_v} vi∈RDv.(由于在自注意力模型中通常使用点积来计算注意力打分,这里查询向量和键向量的维度是相同的.)
对于整个输入序列
X
\mathbf{X}
X,线性映射过程可以简写为
Q
=
W
q
X
∈
R
D
k
×
N
,
K
=
W
k
X
∈
R
D
k
×
N
,
V
=
W
υ
X
∈
R
D
υ
×
N
,
(9)
\begin{aligned} \boldsymbol{Q}&=\boldsymbol{W}_q \boldsymbol{X}\in\mathbb{R}^{D_k\times N},\\ \boldsymbol{K}&=\boldsymbol{W}_k \boldsymbol{X}\in\mathbb{R}^{D_k\times N},\\ \boldsymbol{V}&=\boldsymbol{W}_\upsilon \boldsymbol{X} \in\mathbb{R}^{D_\upsilon\times N}, \end{aligned} \tag{9}
QKV=WqX∈RDk×N,=WkX∈RDk×N,=WυX∈RDυ×N,(9)
其中 W q ∈ R D k × D x , W k ∈ R D k × D x , W ν ∈ R D υ × D x \boldsymbol{W}_{q}\in\mathbb{R}^{D_{k}\times D_{x}},\boldsymbol{W}_{k}\in\mathbb{R}^{D_{k}\times D_{x}},\boldsymbol{W}_{\nu}\in\mathbb{R}^{D_{\upsilon}\times D_{x}} Wq∈RDk×Dx,Wk∈RDk×Dx,Wν∈RDυ×Dx分别为线性映射的参数矩阵 Q = [ q 1 , ⋯ , q N ] , K = [ k 1 , ⋯ , k N ] , V = [ v 1 , ⋯ , v N ] \boldsymbol{Q}=[\boldsymbol{q}_{1},\cdots , \boldsymbol{q}_{N}],\boldsymbol{K}=[\boldsymbol{k}_{1},\cdots,\boldsymbol{k}_{N}],\boldsymbol{V}=[\boldsymbol{v}_{1},\cdots,\boldsymbol{v}_{N}] Q=[q1,⋯,qN],K=[k1,⋯,kN],V=[v1,⋯,vN]分别是由查询向量、键向量和值向量构成的矩阵。
(2)对于每一个查询向量
q
n
∈
Q
\boldsymbol{q}_n \in \boldsymbol{Q}
qn∈Q,利用公式(4)的键值对注意力机制,可以得到输出向量
h
n
\boldsymbol{h}_n
hn,
h
n
=
att
(
(
K
,
V
)
,
q
n
)
=
∑
j
=
1
N
α
n
,
j
v
j
=
∑
j
=
1
N
softmax
(
s
(
k
j
,
q
n
)
)
v
j
(10)
\begin{align*} \boldsymbol{h}_n &= \operatorname{att}\Big((\boldsymbol{K},\boldsymbol{V}),\boldsymbol{q}_n \Big) \\ &=\sum_{j=1}^{N} \alpha_{n,j} \boldsymbol{v}_j \\ &= \sum_{j=1}^N \operatorname{softmax}(s(\boldsymbol{k}_j,\boldsymbol{q}_n))\boldsymbol{v}_j \end{align*} \tag{10}
hn=att((K,V),qn)=j=1∑Nαn,jvj=j=1∑Nsoftmax(s(kj,qn))vj(10)
其中 n , j ∈ [ 1 , N ] n,j \in[1,N] n,j∈[1,N]为输出和输入向量序列的位置, α n , j \alpha_{n,j} αn,j表示第 n n n个输出关注到第 j j j个输入的权重。
如果使用缩放点积来作为注意力打分函数,输出向量序列可以简写为 H = V s o f t m a x ( K ⊺ Q D k ) , \boldsymbol{H}=\boldsymbol{V}\mathrm{softmax}(\frac{\boldsymbol{K}^{\intercal}\boldsymbol{Q}}{\sqrt{D_{k}}}), H=Vsoftmax(DkK⊺Q),
其中 s o f t m a x ( ⋅ ) \mathrm{softmax}(\cdot) softmax(⋅)为按列进行归一化的函数。
图8.5给出全连接模型和自注意力模型的对比,其中实线表示可学习的权重,虚线表示动态生成的权重.由于自注意力模型的权重是动态生成的,因此可以处理变长的信息序列.
自注意力模型可以作为神经网络中的一层来使用,既可以用来替换卷积层和循环层 [Vaswani et al., 2017],也可以和它们一起交替使用(比如 X \mathbf{X} X 可以是卷积层或循环层的输出).自注意力模型计算的权重 α i , j \alpha_{i,j} αi,j 只依赖于 q i \boldsymbol{q}_i qi 和 k j \boldsymbol{k}_j kj 的相关性,而忽略了输入信息的位置信息.因此在单独使用时,自注意力模型一般需要加入位置编码信息来进行修正 [Vaswani et al., 2017].自注意力模型可以扩展为多头自注意力(Multi-Head Self-Attention)模型,在多个不同的投影空间中捕捉不同的交互信息
序列到序列模型
transformer是完全基于注意力机制的序列到序列学习模型。使用注意力实现编码、解码以及编码器和解码器之间的信息传递。
transformer主要使用以下技术:
- 基于注意力的编码、解码、编解码信息传递;
- 多头注意力;
- 前馈神经网络;
- 残差连接;
- 掩码自注意力;
- 位置编码;
- 层归一化。
Transformer模型主要特点
来自李航《机器学习方法》
Transformer的主要特点是:
- 使用注意力进行表示的生成,包括编码、解码以及编码器和解码器之间的信息传递;
- 用多头注意力增强表示能力;
- 用前馈神经网络进行非线性变换,以增强表示能力;
- 用残差连接增强表示能力;
- 解码器用掩码自注意力,以实现并行训练;
- 用位置编码表示序列的位置信息;
- 使用层归一化提高学习效率。
流程 todo
输入和输出都是表示向量,其维度是 d m d_m dm,这代表了某一个token。
1.嵌入层
编码器和解码器的输入层通过线性变换得到单词
x
t
\mathbf{x}_t
xt的嵌入向量表示
e
x
i
∈
R
D
e_{\mathbf{x}_i} \in \mathbb{R}^D
exi∈RD为,其计算为
e
x
i
=
E
[
i
d
x
]
e_{\mathbf{x}_i} = E[idx]
exi=E[idx]
其中
i
d
x
idx
idx 是词
x
i
\mathbf{x}_i
xi 在词汇表中的索引,
E
[
i
d
x
]
E[idx]
E[idx] 表示嵌入矩阵
E
E
E 中的第
i
d
x
idx
idx 行。
嵌入向量 e x i ∈ R D e_{\mathbf{x}_i} \in \mathbb{R}^D exi∈RD 的计算公式通常涉及到一个查找操作,在这个操作中,每个词汇 x i \mathbf{x}_i xi 通过一个预先定义的嵌入矩阵 E ∈ R V × D E \in \mathbb{R}^{V \times D} E∈RV×D 转换成一个 D D D-维的向量。这里, V V V是词汇表的大小, D D D 是嵌入向量的维度。嵌入矩阵 E E E 的每一行对应于词汇表中一个词的嵌入表示。词汇 x i \mathbf{x}_i xi 通常首先被转换为一个整数索引 i d x idx idx,该索引对应于词汇表中词的位置。然后,嵌入向量 e x i e_{\mathbf{x}_i} exi 就是嵌入矩阵 E E E 中索引为 i d x idx idx 的行。
为了具体化,如果我们考虑一个简单的例子,其中词汇表包含了“cat”、“dog”等词汇,且每个词汇被分配了一个唯一的索引(例如,“cat”=1,“dog”=2等)。假设我们有一个嵌入矩阵 E E E,其维度为 V × D V \times D V×D,其中 V V V 是词汇表的大小,(D) 是嵌入维度。对于词汇“cat”,其嵌入向量 e cat e_{\text{cat}} ecat 就是嵌入矩阵 E E E 中索引为1的行向量。
这种嵌入机制允许模型将离散的词汇符号转换为连续的向量空间中的点,这些点可以捕获词汇之间的语义和句法关系。嵌入矩阵 E E E 通常是在模型训练过程中学习得到的,允许模型自动地学习到词汇的有效表示。
编码器和解码器的输入层的每一个位置的输入向量计算如下:
对于一个输入序列
x
1
:
T
∈
R
D
×
T
\mathbf{x}_{1:T} \in \mathbb{R}^{D \times T}
x1:T∈RD×T,进行嵌入表示并添加位置编码表示位置信息,有
H
(
0
)
=
[
e
x
1
+
p
1
,
⋯
,
e
x
T
+
p
T
]
\mathbf{H}^{(0)}=[e_{\mathbf{x}_1}+p_1,\cdots,e_{\mathbf{x}_T}+p_T]
H(0)=[ex1+p1,⋯,exT+pT]
其中
e
x
i
∈
R
D
e_{\mathbf{x}_i} \in \mathbb{R}^D
exi∈RD为词
x
t
\mathbf{x}_t
xt的嵌入向量表示。
p
t
∈
R
D
p_t \in \mathbb{R}^D
pt∈RD为位置t的向量表示,即位置编码。
p
t
p_t
pt可以作为可学习的参数,也可以通过下面方式进行预定义
p
t
,
2
i
=
sin
(
t
/
1000
0
2
i
/
D
)
,
p
t
,
2
i
+
1
=
cos
(
t
/
1000
0
2
i
/
D
)
,
\begin{gathered} p_{t,2i} =\sin(t/10000^{2i/D}), \\ p_{t,2i+1} =\cos(t/10000^{2i/D}), \end{gathered}
pt,2i=sin(t/100002i/D),pt,2i+1=cos(t/100002i/D),
其中 p t , 2 i p_{t,2i} pt,2i 表示第 t t t个位置的编码向量的第 2 i 2i 2i维, D D D是编码向量的维度.
2.Transformer中对于每一个token的具体计算流程
- 编码器和解码器的每一层的每一个位置的前馈网络计算如下:
FFN
(
⋅
)
\operatorname{FFN}(\cdot)
FFN(⋅) 表示逐位置的前馈神经网络(Position-wiseFeed-Forward Network),是一个简单的两层网络.对于输入序列中每个位置上向量
z
∈
Z
(
l
)
\boldsymbol{z} \in \mathbf{Z}^{(l)}
z∈Z(l),
F
F
N
(
z
)
=
W
2
R
e
L
u
(
W
1
z
+
b
1
)
+
b
2
,
\mathrm{FFN}(\boldsymbol{z})=\boldsymbol{W}_2\mathrm{ReLu}(\boldsymbol{W}_1\boldsymbol{z}+\boldsymbol{b}_1)+\boldsymbol{b}_2,
FFN(z)=W2ReLu(W1z+b1)+b2,
其中
W
1
,
W
2
,
b
1
,
b
2
\boldsymbol{W}_1,\boldsymbol{W_2},\boldsymbol{b_1},\boldsymbol{b_2}
W1,W2,b1,b2为网络参数.
-
编码器和解码器的每一层的每一个位置的残差连接计算如下:
z + f ( z ) \boldsymbol{z}+f(\boldsymbol{z}) z+f(z)
其中 f ( z ) f(\boldsymbol{z}) f(z)是注意力函数或前馈网络函数。 -
编码器和解码器的每一层的每一个位置的层归一化函数计算如下:
norm ( z ) = γ z − μ ⋅ 1 σ 2 + ε + β ⋅ 1 \operatorname{norm}(\boldsymbol{z}) = \gamma \frac{\boldsymbol{z} - \mu\cdot \mathbf{1}}{\sqrt{\sigma^2 + \varepsilon}} + \beta \cdot \mathbf{1} norm(z)=γσ2+εz−μ⋅1+β⋅1
其中, μ \mu μ是均值, σ \sigma σ是方差, γ \gamma γ和 β \beta β是参数, ε \varepsilon ε是常量。
Transformer的编码器和解码器的每一层的所有位置的表示向量组成一个矩阵,用
H
\mathbf{H}
H表示。
那么,给定第
l
−
1
l-1
l−1层的隐状态
H
l
−
1
\mathbf{H}^{l-1}
Hl−1,第
l
l
l层的隐状态
H
(
l
)
\mathbf{H}^{(l)}
H(l)可以通过一个多头自注意力模块和一个非线性的前馈网络得到.每次计算都需要残差连接以及层归一化操作.具体计算为
Z
(
l
)
=
norm
(
H
(
l
−
1
)
+
Multi
H
e
a
d
(
H
(
l
−
1
)
)
)
,
H
(
l
)
=
norm
(
Z
(
l
)
+
FFN
(
Z
(
l
)
)
)
,
\begin{aligned} &\mathbf{Z}^{(l)}= \text{norm}\Big(\mathbf{H}^{(l-1)}+\text{Multi}\mathrm{Head}(\mathbf{H}^{(l-1)})\Big), \\ &\mathbf{H}^{(l)}= \text{norm}\Big(\mathbf{Z}^{(l)}+\text{FFN}(\mathbf{Z}^{(l)})\Big), \end{aligned}
Z(l)=norm(H(l−1)+MultiHead(H(l−1))),H(l)=norm(Z(l)+FFN(Z(l))),
其中多头自注意力计算由下列公式给出:
多头自注意力(Multi-HeadSelf-Attention),在多个不同的投影空间中捕捉不同的交互信息.假设在 M M M 个投影空间中分别应用自注意力模型,有
MultiHead ( Q , K , V ) = W o [ head 1 ; ⋯ ; head M ] , head m = self-att ( Q m , K m , V m ) , ∀ m ∈ { 1 , ⋯ , M } , Q m = W q m Q , K = W k m K , V = W v m V , \begin{aligned} \operatorname{MultiHead}(\mathbf{Q},\mathbf{K},\mathbf{V})&=\boldsymbol{W}_o[\operatorname{head}_1;\cdots;\operatorname{head}_M],\\ \operatorname{head}_m&=\operatorname{self-att}(\boldsymbol{Q}_m,\boldsymbol{K}_m,\boldsymbol{V}_m),\\ \forall m\in\{1,\cdots,M\},\quad \boldsymbol{Q}_m&=\boldsymbol{W}_q^m\boldsymbol{Q},\boldsymbol{K}=\boldsymbol{W}_k^m\boldsymbol{K},\boldsymbol{V}=\boldsymbol{W}_v^m\boldsymbol{V},\end{aligned} MultiHead(Q,K,V)headm∀m∈{1,⋯,M},Qm=Wo[head1;⋯;headM],=self-att(Qm,Km,Vm),=WqmQ,K=WkmK,V=WvmV,
其中 W o ∈ R D h × M d v \boldsymbol{W}_o \in \mathbb{R}^{D_h \times Md_v} Wo∈RDh×Mdv为输出投影矩阵, W q m ∈ R D k × D h \boldsymbol{W}_q^m \in \mathbb{R}^{D_k \times D_h} Wqm∈RDk×Dh, W k m ∈ R D k × D h \boldsymbol{W}_k^m \in \mathbb{R}^{D_k \times D_h} Wkm∈RDk×Dh, W q m ∈ R D v × D h \boldsymbol{W}_q^m \in \mathbb{R}^{D_v \times D_h} Wqm∈RDv×Dh, 为投影矩阵, m ∈ { 1 , . . . , M } m \in \{ 1,...,M\} m∈{1,...,M}.而自注意力模型 self-att \operatorname{self-att} self-att可以看作在一个线性投影空间中建立 H \mathbf{H} H(自注意力中 Q , K , V 均为 H \mathbf{Q},\mathbf{K},\mathbf{V}均为\mathbf{H} Q,K,V均为H)中不同向量之间的交互关系.其计算公式为
self-att ( Q , K , V ) = V softmax ( K ⊺ Q D k ) , Q = W q H , K = W k H , V = W υ H , \begin{aligned}\operatorname{self-att}(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V})&=\boldsymbol{V}\operatorname{softmax}\big(\frac{\boldsymbol{K}^\intercal\boldsymbol{Q}}{\sqrt{D_k}}\big),\\\boldsymbol{Q}&=\boldsymbol{W}_q\mathbf{H},\boldsymbol{K}=\boldsymbol{W}_k\mathbf{H},\boldsymbol{V}=\boldsymbol{W}_\upsilon\mathbf{H},\end{aligned} self-att(Q,K,V)Q=Vsoftmax(DkK⊺Q),=WqH,K=WkH,V=WυH,其中 D k D_k Dk是输入矩阵 Q \boldsymbol{Q} Q和 K \boldsymbol{K} K中列向量的维度, W q ∈ R D k × D h \boldsymbol{W}_q \in \mathbb{R}^{D_k \times D_h} Wq∈RDk×Dh, W k ∈ R D k × D h \boldsymbol{W}_k \in \mathbb{R}^{D_k \times D_h} Wk∈RDk×Dh, W v ∈ R D v × D h \boldsymbol{W}_v \in \mathbb{R}^{D_v \times D_h} Wv∈RDv×Dh为三个投影矩阵。
编码器
Transformer模型 [Vaswani et al., 2017] 是一个基于多头自注意力的序列到序列模型,其整个网络结构可以分为两部分:
基于 Transformer的 序列到序列生成过程见
https://nndl.github.io/v/sgm-seq2seq
编码器只包含多层的多头自注意力(Multi-Head Self-Attention)模块,每一层都接受前一层的输出作为输入.编码器的输入为单词序列 x 1 : S \mathbf{x}_{1:S} x1:S,输出为一个向量序列
H
enc
=
[
h
1
enc
,
…
,
h
S
enc
]
=
[
e
1
enc
+
p
1
enc
,
…
,
e
S
enc
+
p
S
enc
]
=
E
enc
+
P
enc
\begin{aligned} \mathbf{H}^{\text{enc}} &= [\mathbf{h}_{1}^{\text{enc}},\dots,\mathbf{h}_{S}^{\text{enc}}] \\ &= [\mathbf{e}_{1}^{\text{enc}}+\mathbf{p}_{1}^{\text{enc}},\dots,\mathbf{e}_{S}^{\text{enc}}+\mathbf{p}_{S}^{\text{enc}}] \\ &= \mathbf{E}^{\text{enc}}+\mathbf{P}^{\text{enc}} \end{aligned}
Henc=[h1enc,…,hSenc]=[e1enc+p1enc,…,eSenc+pSenc]=Eenc+Penc
其中
H
enc
\mathbf{H}^{\text{enc}}
Henc是输入层所有位置的输出,
E
enc
\mathbf{E}^{\text{enc}}
Eenc是所有位置的词嵌入,
P
enc
\mathbf{P}^{\text{enc}}
Penc是所有位置的位置嵌入。
然后,用两个矩阵将
H
enc
\mathbf{H}^{\text{enc}}
Henc 映射到
K
enc
\mathbf{K}^\text{enc}
Kenc 和
V
enc
\mathbf{V}^\text{enc}
Venc 作为键值对供解码器使用,即
K
e
n
c
=
W
k
′
H
e
n
c
,
V
e
n
c
=
W
υ
′
H
e
n
c
,
\begin{aligned}\mathbf{K}^{\mathrm{enc}}&=\mathbf{W}_k^{\prime}\mathbf{H}^{\mathrm{enc}},\\ \mathbf{V}^{\mathrm{enc}}&=\mathbf{W}_\upsilon^{\prime}\mathbf{H}^{\mathrm{enc}},\end{aligned}
KencVenc=Wk′Henc,=Wυ′Henc,
其中
W
k
′
\mathbf{W}_k^{\prime}
Wk′和
W
υ
′
\mathbf{W}_\upsilon^{\prime}
Wυ′为线性映射的参数矩阵。(Transformer中这两个线性映射的参数矩阵实际上是恒等映射)
给定编码器第
l
−
1
l-1
l−1层的输入为隐状态
H
E
l
−
1
\mathbf{H}_E^{l-1}
HEl−1,第
l
l
l层输出为隐状态
H
E
(
l
)
\mathbf{H}_E^{(l)}
HE(l),可以通过一个多头自注意力模块和一个非线性的前馈网络得到.每次计算都需要残差连接以及层归一化操作.具体计算为
Z
E
(
l
)
=
norm
(
H
E
(
l
−
1
)
+
Multi
H
e
a
d
(
H
E
(
l
−
1
)
,
H
E
(
l
−
1
)
,
H
E
(
l
−
1
)
)
)
,
H
E
(
l
)
=
norm
(
Z
E
(
l
)
+
FFN
(
Z
E
(
l
)
)
)
,
\begin{aligned} &\mathbf{Z}_E^{(l)}= \text{norm}\Big(\mathbf{H}_E^{(l-1)}+\text{Multi}\mathrm{Head}(\mathbf{H}_E^{(l-1)},\mathbf{H}_E^{(l-1)},\mathbf{H}_E^{(l-1)})\Big), \\ &\mathbf{H}_E^{(l)}= \text{norm}\Big(\mathbf{Z}_E^{(l)}+\text{FFN}(\mathbf{Z}_E^{(l)})\Big), \end{aligned}
ZE(l)=norm(HE(l−1)+MultiHead(HE(l−1),HE(l−1),HE(l−1))),HE(l)=norm(ZE(l)+FFN(ZE(l))),
解码器
解码器是通过自回归的方式来生成目标序列.和编码器不同,解码器由以下三个模块构成:
a ) 掩蔽自注意力模块:第 t t t 步时,先使用自注意力模型对已生成的前缀序列 y 0 ∶ ( t − 1 ) y_{0∶(t−1)} y0∶(t−1) 进行编码得到 H dec = [ h 1 dec , ⋯ , h t dec ] \mathbf{H}^{\text{dec}} = [\mathbf{h}^{\text{dec}}_1 , ⋯ , \mathbf{h}^{\text{dec}}_t ] Hdec=[h1dec,⋯,htdec].
y 0 y_0 y0为一个特殊符号.
为了提高训练效率,这里的自注意力模型实际上是掩蔽自注意力,即阻止每个位置看到它右边的词.
b ) 编码器到解码器注意力模块:将
h
t
dec
\mathbf{h}^{\text{dec}}_t
htdec进行线性映射得到
q
t
dec
\mathbf{q}^{\text{dec}}_t
qtdec.将
q
t
dec
\mathbf{q}^{\text{dec}}_t
qtdec作为查询向量,通过键值对注意力机制来从输入
(
K
dec
,
V
dec
)
(\mathbf{K}^{\text{dec}}, \mathbf{V}^{\text{dec}})
(Kdec,Vdec) 中选取有用的信息.
编码器-解码器注意力模块允许解码器的每个位置访问整个编码器的输出。
c ) 逐位置的前馈神经网络:使用一个前馈神经网络来综合得到所有信息.
给定解码器第
l
−
1
l-1
l−1层的输入为隐状态
H
D
l
−
1
\mathbf{H}_D^{l-1}
HDl−1,第
l
l
l层输出为隐状态
H
D
(
l
)
\mathbf{H}_D^{(l)}
HD(l),可以通过多头自注意力子层,多头自注意力和一个非线性的前馈网络得到.每次计算都需要残差连接以及层归一化操作.具体计算为
I
D
(
l
)
=
norm
(
H
D
(
l
−
1
)
+
Multi
H
e
a
d
(
H
D
(
l
−
1
)
,
H
D
(
l
−
1
)
,
H
D
(
l
−
1
)
)
)
,
Z
D
(
l
)
=
norm
(
I
D
(
l
)
+
Multi
H
e
a
d
(
I
D
(
l
)
,
H
E
(
L
)
,
H
E
(
L
)
)
)
,
H
D
(
l
)
=
norm
(
Z
D
(
l
)
+
FFN
(
Z
D
(
l
)
)
)
,
\begin{aligned} &\mathbf{I}_D^{(l)}= \text{norm}\Big(\mathbf{H}_D^{(l-1)}+\text{Multi}\mathrm{Head}(\mathbf{H}_D^{(l-1)},\mathbf{H}_D^{(l-1)},\mathbf{H}_D^{(l-1)})\Big), \\ &\mathbf{Z}_D^{(l)}= \text{norm}\Big(\mathbf{I}_D^{(l)}+\text{Multi}\mathrm{Head}(\mathbf{I}_D^{(l)},\mathbf{H}_E^{(L)},\mathbf{H}_E^{(L)})\Big), \\ &\mathbf{H}_D^{(l)}= \text{norm}\Big(\mathbf{Z}_D^{(l)}+\text{FFN}(\mathbf{Z}_D^{(l)})\Big), \end{aligned}
ID(l)=norm(HD(l−1)+MultiHead(HD(l−1),HD(l−1),HD(l−1))),ZD(l)=norm(ID(l)+MultiHead(ID(l),HE(L),HE(L))),HD(l)=norm(ZD(l)+FFN(ZD(l))),
将上述三个步骤重复多次,解码器的输出层计算在当前第
i
i
i个位置的条件概率,也就是下一个位置的单词出现的条件概率。
p
i
=
softmax
(
W
e
⊤
⋅
h
i
(
L
)
)
\mathrm{p}_i = \operatorname{softmax}(\mathbf{W}_e^\top \cdot \mathbf{h}_i^{(L)})
pi=softmax(We⊤⋅hi(L))
其中,
h
i
(
L
)
\mathbf{h}_i^{(L)}
hi(L)是
H
D
(
l
)
\mathbf{H}_D^{(l)}
HD(l)第
i
i
i列也是最后一列的向量,
W
e
\mathbf{W}_e
We是嵌入矩阵。
因此整个流程,从原始文本,经过embedding层转换为输入单词序列,在每一个位置上,基于输入单词序列和通过transformer模型的编码器和解码器(已经生成的输出单词序列),计算下一个单词出现的条件概率。最后通过贪心算法或束搜索算法决定整个输出单词序列。
学习时,基于给定的输入单词序列和输出单词序列,在输出序列的每一个位置上进行并行训练,更新模型的参数。由于解码器使用的是掩码注意力,可以保证学习基于自回归过程,每一步都只能使用“过去”的数据而不是未来的数据。
Transformer模型有三个超参数:编码器和解码器的层数 l l l,头的个数 h h h,模型的维度 d m d_m dm,通常取 l = 6 , h = 8 , d m = 512 l=6,h=8,d_m=512 l=6,h=8,dm=512.