目录
- 引入
- 基本组成
- 编码器
- 多头自注意力机制(Multi-Head Self-Attention)
- 多头自注意力的计算过程
- 头数与维度关系
- 前馈神经网络(Feed-Forward Neural Network)
- 编码器中的ADD&NORM
- 加法操作(Addition)
- 归一化操作(Normalization)
- 批归一化(Batch Normalization)和层归一化(Layer Normalization)
- 解码器
- 遮蔽多头注意力(Masked Multi-Head Attention):
- 遮蔽多头注意力的操作步骤:
- 举例
- 多头注意力(Multi-Head Attention):
- 前馈神经网络(Feed-Forward Network):
- 如何实现并行
- 编码器和解码器的堆叠
- 编码器和解码器的联系
- Transformer的位置编码
- Transformer的输入和输出
- Transformer输入的嵌入
- Transformer输出的嵌入
- 三级目录
引入
相对于传统的 LSTM,Transformer 模型在处理长序列时具有更高的训练效率。这是由于Transformer模型的并行计算性质以及自注意力机制的引入。
传统的循环神经网络(如LSTM)在处理序列数据时需要按照时间顺序逐步计算和更新隐藏状态,导致训练速度较慢。而Transformer模型通过引入自注意力机制,能够同时对整个输入序列进行并行计算,从而加速了训练过程。在自注意力机制中,每个位置的编码可以直接关注到其他位置的编码,而不需要像LSTM一样逐步传递信息。
基本组成
编码器
编码器(Encoder):编码器是Transformer模型的输入部分,负责将输入序列转换为一系列高维表示。
编码器由多个相同的编码器层(Encoder Layer)堆叠而成,堆叠多个相同的编码器层可以逐渐提取输入序列的高级表示,捕捉输入序列中的语义和上下文信息。
每个编码器层通常包含两个子层
多头自注意力机制(Multi-Head Self-Attention)
-
是Transformer模型中的一种变体自注意力机制,用于增强模型对输入序列的建模能力。
-
在传统的自注意力机制中,通过计算每个位置与其他位置之间的相似度来获取位置之间的关联性,并生成加权表示。而多头自注意力则引入了多个注意力头(Attention Head),每个头都会学习不同的相似度权重,从而能够更全面地捕捉输入序列的信息。
-
多头自注意力的核心思想是将输入序列先经过多个线性变换,然后分成多个注意力头。每个注意力头都会进行独立的自注意力计算,生成自己的查询、键和值,并计算相应的注意力权重。
多头自注意力的计算过程
1、输入序列的线性变换:
将输入序列经过三个不同的线性变换,分别得到查询(Queries)、键(Keys)和值(Values)【 就是输入特征进行变换以后的下一轮要用到的真正的特征。】的表示。这些线性变换通常是具有不同权重的独立线性层。
X
1
X_1
X1与
W
Q
W^Q
WQ相乘得
q
1
q_1
q1,
X
2
X_2
X2与
W
Q
W^Q
WQ相乘得
q
2
q_2
q2
X
1
X_1
X1与
W
K
W^K
WK相乘得
k
1
k_1
k1,
X
2
X_2
X2与
W
K
W^K
WK相乘得
k
2
k_2
k2
X
1
X_1
X1与
W
V
W^V
WV相乘得
v
1
v_1
v1,
X
2
X_2
X2与
W
V
W^V
WV相乘得
v
2
v_2
v2
2、多头注意力计算:
- 对于每个注意力头,分别计算查询和键之间的相似度。这可以通过对查询和键的内积进行计算得到。
- 为了控制相似度的尺度,通常会对相似度进行缩放,例如将相似度除以查询或键的维度的平方根。
- 将相似度得分进行softmax操作,以获得注意力权重。这样可以确保注意力权重的和为1,用于对值进行加权求和。
- 注意力权重乘以对应的值,得到每个位置的加权值。
流程图的形式
3、多头注意力的合并:
对输入序列进行多组线性变换,得到多组查询(Q)、键(K)和值(V)的表示。每组Wk、Wq和Wv都是独立的权重矩阵。
在真实做的时候,使用了八组
W
Q
,
W
K
,
W
V
W^Q,W^K,W^V
WQ,WK,WV。得到八组Z。八组结果,分别为
Z
0
,
Z
1
.
.
.
Z
7
Z_0,Z_1...Z_7
Z0,Z1...Z7。
然后将这八组结果contact起来。然后再学一组线性变换
W
0
W^0
W0
总结流程:
将多个注意力头的输出表示进行拼接或线性变换,以得到多头注意力模块的最终输出。
头数与维度关系
前馈神经网络(Feed-Forward Neural Network)
编码器中的ADD&NORM
加法操作(Addition)
- 在编码器中,加法操作通常是通过将多头注意力模块的输出【 z z z】与残差连接(Residual Connection)【 x x x】进行相加实现的。
- 在多头注意力模块的输出和残差连接之间进行元素级别的相加操作。
- 加法操作的目的是将多头注意力模块的输出与原始输入进行融合,以保留输入的原始信息。
归一化操作(Normalization)
- 在加法操作之后,对结果进行归一化操作,通常使用层归一化(Layer Normalization)或批归一化(Batch Normalization)来实现。
- 归一化操作的目的是对加法操作后的结果进行规范化,以提高模型的稳定性和泛化能力。
- 归一化操作通常包括对结果进行平移和缩放,以使其具有适当的平均值和方差。
批归一化(Batch Normalization)和层归一化(Layer Normalization)
是两种常见的归一化技术,用于在神经网络中提升训练的效果和收敛速度。它们的主要区别在于归一化的维度和应用的位置。
批归一化(Batch Normalization):
- 批归一化是在每个批次(batch)的数据上进行归一化操作。
- 它的计算是基于每个特征在整个批次中的均值和方差进行的。
- 在训练过程中,批归一化可以减少内部协变量偏移(Internal Covariate Shift),有助于加速收敛并提高模型的泛化能力。
- 在卷积神经网络中,批归一化通常应用在卷积操作后、激活函数之前。
层归一化(Layer Normalization):
- 层归一化是在每个样本的特征维度上进行归一化操作。
- 它的计算是基于每个样本在同一层内的特征维度上的均值和方差进行的。
- 与批归一化相比,层归一化更适用于循环神经网络(RNN)等没有明确批次维度的场景。
- 层归一化可以减少样本间的依赖关系,有助于提高模型的鲁棒性和泛化能力。
- 在循环神经网络中,层归一化通常应用在循环层的计算之后。
解码器
解码器(Decoder):解码器是Transformer模型的输出部分,负责根据编码器的表示生成输出序列。
解码器也是由多个相同的解码器层(Decoder Layer)堆叠而成。通过堆叠多个相同的解码器层,解码器可以逐步生成目标序列,并在每个解码器层中融合源语言序列的上下文信息和自身的上下文信息。
每个解码器层通常包含三个子层:
遮蔽多头注意力(Masked Multi-Head Attention):
- 遮蔽多头注意力是解码器中的第一个组件。
- 它类似于编码器中的自注意力层,但在解码器中应用了遮蔽操作。
- 遮蔽多头注意力允许解码器在生成每个目标位置的预测时,只关注之前生成的位置,遮蔽掉后续位置的信息。
- 它帮助解码器在生成目标序列时保持自回归的性质,确保生成的每个位置只依赖于之前已生成的部分。这样可以编码模型在生成当前位置时访问未来位置的信息。
遮蔽多头注意力的操作步骤:
1、输入:
- 解码器的输入是来自上一层解码器的输出。
- 输入包括查询(Query)向量、键(Key)向量和值(Value)向量。
2、掩码(Masking):
- 在遮蔽多头注意力中,需要对注意力权重进行掩码操作。
- 掩码矩阵的形状与注意力权重矩阵相同,其中需要遮蔽的位置被设置为一个很小的值或负无穷,以使得在softmax操作中相应位置的注意力权重趋近于零。
- 掩码矩阵通常是一个上三角矩阵,确保当前位置只能依赖于之前已生成的部分。
3、注意力计算:
- 对于遮蔽多头注意力,与常规的多头注意力计算类似,但是在计算注意力权重时,需要将掩码矩阵与注意力得分相乘,以实现遮蔽效果。
- 注意力得分是通过查询向量和键向量之间的点积计算得到的。
- 掩码矩阵的作用是将掩码位置对应的注意力得分置为负无穷,使得在softmax操作中对应的注意力权重趋近于零。
- 最后,将掩码后的注意力权重与值向量相乘,得到加权和作为遮蔽多头注意力的输出。
举例
当将中文词组"计算机视觉"翻译成英文"computer vision"时,遮蔽多头注意力的作用就像是给解码器戴了一副眼罩。它确保解码器在翻译每个词的时候,只能看到之前已经翻译的词,而不能看到后面还没翻译的词。
在生成翻译结果的过程中,遮蔽多头注意力起到的作用如下:
-
开始翻译时,解码器只知道第一个位置是一个特殊的开始标记。通过遮蔽多头注意力,它只能看到开始标记,而不知道后面还有什么内容。
-
然后,解码器会生成第一个翻译结果的词,比如英文的"computer"。在生成这个词时,遮蔽多头注意力确保解码器只能看到开始标记,而不知道"视觉"这个词的存在。
-
接着,解码器生成第二个翻译结果的词,比如英文的"vision"。在生成这个词时,遮蔽多头注意力仍然起作用,确保解码器只能看到开始标记和前面已生成的"computer",而不知道后面还有什么内容。
通过遮蔽多头注意力,解码器可以逐步生成正确的翻译结果,每一步只依赖于之前已经生成的部分。这样可以确保翻译结果的准确性和连贯性,避免未来信息对当前生成的影响。在这个例子中,遮蔽多头注意力确保了生成英文单词"computer"时不会受到中文词组"视觉"的影响,从而得到正确的翻译结果"computer vision"。
多头注意力(Multi-Head Attention):
多头注意力是解码器中的第二个组件。
它类似于编码器中的编码器-解码器注意力层,但没有遮蔽操作。
多头注意力允许解码器对编码器的输出进行注意力计算,以捕捉与当前解码位置相关的编码器信息。
它帮助解码器在生成每个目标位置的预测时,结合编码器的上下文信息,以更好地对输入序列进行对齐和建模。
前馈神经网络(Feed-Forward Network):
前馈神经网络是解码器中的最后一个组件。
它接收遮蔽多头注意力和多头注意力的输出,并通过一层或多层的全连接神经网络进行非线性变换。
前馈神经网络层有助于解码器对特定目标位置进行更深入的建模和预测,以生成最终的输出序列。
如何实现并行
编码器和解码器的堆叠
通过堆叠多个编码器层和解码器层,可以增加模型的表示能力和深度。
Encoder和Decoder是累加的形式,既然是累加的形式,则要求输入和输出保持一致。
编码器和解码器的联系
编码器和解码器之间存在辫子连接,主要体现在以下两个方面:
-
编码器-解码器注意力机制(Encoder-Decoder Attention):在解码器的每个解码器层中,引入了编码器-解码器注意力机制。这个注意力机制使得解码器可以关注编码器的输出,从而将编码器的上下文信息引入到解码器的生成过程中。通过编码器-解码器注意力,解码器可以在生成目标序列的每个位置时,动态地关注与之对应的源语言序列的不同位置。这有助于解码器更好地利用编码器的信息,提高生成的准确性和一致性。
-
编码器的输出作为解码器的输入:编码器的最后一层的输出被传递给解码器作为输入。这样,解码器在生成目标序列时可以直接访问编码器的表示和上下文信息。编码器的输出向解码器提供了一个初始的上下文向量,起到了引导解码器生成合理输出的作用。
因为编码器和解码器都是可堆叠的,所以旁边显示的是Nx。
原始论文:编解码器均为6层,即N=6
Transformer的位置编码
Transformer 模型中的位置编码(Positional Encoding)是为了在输入序列中引入位置信息,以帮助模型学习序列中的顺序和位置关系。由于 Transformer 模型没有像循环神经网络(RNN)那样的显式顺序处理机制,位置编码可以为模型提供序列中不同位置的信息。
位置编码通常是通过在输入序列的嵌入表示中添加一个表示位置的向量来实现的。
一种常用的位置编码方法是使用正弦和余弦函数。对于输入序列中的每个位置,使用以下公式计算位置编码向量:
公式:
PE ( p o s , 2 i ) = sin ( p o s 1000 0 2 i / d model ) \text{{PE}}(pos, 2i) = \sin\left(\frac{{pos}}{{10000^{2i/d_{\text{{model}}}}}}\right) PE(pos,2i)=sin(100002i/dmodelpos)
PE
(
p
o
s
,
2
i
+
1
)
=
cos
(
p
o
s
1000
0
2
i
/
d
model
)
\text{{PE}}(pos, 2i+1) = \cos\left(\frac{{pos}}{{10000^{2i/d_{\text{{model}}}}}}\right)
PE(pos,2i+1)=cos(100002i/dmodelpos)
其中,
p
o
s
pos
pos 表示位置,
i
i
i 表示维度索引,
d
model
d_{\text{{model}}}
dmodel 表示输入嵌入向量的维度。位置编码向量中的偶数索引位置使用正弦函数,奇数索引位置使用余弦函数。
通过这种方式,位置编码将不同位置的单词表示映射到不同的位置编码向量,使得模型能够通过位置编码来区分不同位置的单词。
在Transformer模型中,位置编码与词嵌入向量相加,成为模型的输入。这样,模型就能同时利用词嵌入的语义信息和位置编码的顺序信息来进行计算和建模,从而更好地处理序列数据。
Transformer的输入和输出
输入是:待翻译的句子+已翻译的词汇
假如待翻译的句子长度是L,则使用One-hot编码,是L个One-hot维度的向量。One-hot维度和字典长度有关系。然后经过Input Embeding(嵌入层),嵌入层会对其进行降维,降到我们使用的一个
d
m
o
d
e
l
=
512
d_{model}=512
dmodel=512的维度。
同样的,已翻译的词汇,加入个数是M个,使用One-hot编码,是M个One-hot维度的向量。然后经过Output Embeding(嵌入层),嵌入层会对其进行降维,降到我们使用的一个 d m o d e l = 512 d_{model}=512 dmodel=512的维度。
L和M不一定相同
输出:单词的概率