文章目录
1、整体框架
1.1、框架简化
(1)可以简化为Seq2Seq模型
整体框架看似复杂,其实很好理解,我们将其转化一下,就是一个
S
e
q
2
S
e
q
Seq2Seq
Seq2Seq模型。大体也就是四个部分:输入、编码器、解码器、输出。简化后的框架图如下所示:
(2)Seq2Seq模型介绍Sequence to Sequence(Encoder-Decoder)
Seq2Seq作为一种不限制输入和输出的序列长度的结构,被广泛应用于机器翻译, 文本摘要,阅读理解,语音识别等任务中。在Seq2Seq结构中,编码器Encoder把所有的输入序列都编码成一个统一的语义向量,保存在hidden state中,然后再由解码器Decoder解码。
这种结构使得输入和输出与经典的RNN结构不同,输入和输出的数据维度可以不同。在解码器Decoder解码的过程中,反复将上一个时刻
t
−
1
t-1
t−1 的输出作为当前时刻
t
t
t的输入,循环解码,直到输出停止字符才停止。
下面以机器翻译为例,来看一种Seq2Seq结构的一种经典实现方式。将中文的”早上好”通过seq2seq转换成英文的”Good morning”。
- 将”早上好”通过Encoder编码,从 t = 1 t=1 t=1时刻到 t = 3 t=3 t=3时刻通过RNN反复完成语义向量的编码,将 t = 3 t=3 t=3时刻最终的隐藏状态 h 3 h_3 h3作为语义向量。
- h 3 h_3 h3作为Decoder的初始隐藏状态 h 0 h_0 h0,并在 t = 1 t=1 t=1时刻输入标识开始解码的特殊标识符 < s t a r t > <start> <start>,开始解码。不断的将上一时刻输出作为当前时刻输入进行解码,最终输出停止字符 < s t o p > <stop> <stop>时,预测解码停止。
t t t时刻时, Decoder中的数据流流向如下所示:
- RNN先被输入大小为 [ n i , 1 ] [n_i,1] [ni,1]的向量 X t X_t Xt,即红点。
- 结合传过来的语义向量, 加上这个时刻的输入,经过RNN后输出大小为 [ n 0 , 1 ] [n_0,1] [n0,1]的向量 y t y_t yt,即蓝点。
- 在获取了输出向量后, 获取输出向量所对应的字符, 这就需要结合一层全连接层和激活函数(主要是Softmax), 将输出向量变为 y t ′ y^{'}_t yt′,大小为 [ n c , 1 ] [n_c,1] [nc,1],即图中的黄点。 n c n_c nc代表字典中的总字符数。从 y t ′ y^{'}_t yt′中找到概率最大的字符index,即图中橘红色点。
- 将分类后获取的字符index做一次Embedding,输入给下个时刻,如此循环。
当然也有人将语义向量作为Decoder的输入,而非隐藏状态提供给Decoder,Seq2Seq只是代表一种结构,而非某种具体的实现方法。
但是Seq2Seq有许多的缺点:
- 最大的局限性:编码和解码之间的唯一联系是固定长度的语义向量。
- 编码要把整个序列的信息压缩进一个固定长度的语义向量。
- 语义向量无法完全表达整个序列的信息。
- 先输入的内容携带的信息,会被后输入的信息稀释掉, 或者被覆盖掉,信息的量越大,损失就越大。
- 输入序列越长,这样的现象越严重,这样使得在Decoder解码时一开始就没有获得足够的输入序列信息,解码效果会打折扣。
1.2、框架辅助理解
通过浏览Transformer的整体框架图可会产生疑惑,对于编码器
E
n
c
o
d
e
r
Encoder
Encoder的输出部分是怎样传递给解码器
D
e
c
o
d
e
r
Decoder
Decoder的呢?其实是编码器的最终输出结果会分配给每一个解码器(
E
n
c
o
d
e
r
Encoder
Encoder的输出,会和每一层的
D
e
c
o
d
e
r
Decoder
Decoder进行结合),其直观图如下所示:
2、注意力机制
2.1、Attention的定义
A
t
t
e
n
t
i
o
n
Attention
Attention是用于计算相关程度的,例如在翻译过程中,不同的英文对中文的依赖程度不同。Attention is all you need中用到的核心公式是:
这个公式中的
Q
、
K
和
V
Q、K和V
Q、K和V分别代表
Q
u
e
r
y
、
K
e
y
和
V
a
l
u
e
Query、Key和Value
Query、Key和Value。单看这个公式,其实并不能很好地理解
A
t
t
e
n
t
i
o
n
Attention
Attention到底在做什么。我们来一步一步进行分析。首先
Q
、
K
、
V
Q、K、V
Q、K、V如何计算的,他是用过将输入矩阵进行三次线性变化生成的。总体可以理解为使用Q与K来计算权重分配,之后结合V来得到最后的结果矩阵,这个公式就是上方的
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
Attention(Q,K,V)
Attention(Q,K,V)。
其中权重是由
Q
u
e
r
y
Query
Query和每个
k
e
y
key
key计算出来的,计算方法分为三步:
1. 第一步:计算 Q Q Q和 K K K的相似度。
2. 第二步:将得到的相似度通过 s o f t m a x softmax softmax进行归一化,得到权重矩阵。
3. 第三步:针对计算出来的权重,对 V V V中所有的 v a l u e s values values进行加权求和计算,得到Attention向量:
针对第一步中计算方法包括以下四种:
在论文中,将
A
t
t
e
n
t
i
o
n
Attention
Attention落实到具体,分别叫做
S
c
a
l
e
d
D
o
t
−
P
r
o
d
u
c
t
A
t
t
e
n
t
i
o
n
和
M
u
l
t
i
−
H
e
a
d
A
t
t
e
n
t
i
o
n
Scaled Dot-Product Attention 和 Multi-Head Attention
ScaledDot−ProductAttention和Multi−HeadAttention
2.2、从向量点乘来理解核心公式
(1)将核心公式变形
对于两个行向量
X
X
X与
Y
Y
Y:
向量点乘的集合意义是:向量X在向量Y上面的投影,再与向量Y的乘积,能够反映两个向量的相似度。向量的点积结果越大,则两个向量越相似。
(2)假设一个矩阵X由n行向量组成
以
X
X
T
XX^T
XXT的第一行第一列元素为例,其实就是向量
x
0
x_0
x0与其自身进行的一个点积,也就是
x
0
x_0
x0自身与自身的相似度,那么第一行第二列就是
x
0
x_0
x0与
x
1
x_1
x1之间的相似度。
(3)以词向量矩阵为例
X
X
T
XX^T
XXT的结果结果就是一个词的词向量与各个词向量的一个相似度。
s
o
f
t
m
a
x
(
X
X
T
)
softmax(XX^T)
softmax(XXT)就是对相似度矩阵的归一化操作,通过此操作得到所需要的权重矩阵,在权重矩阵中,数值越大,代表的是两个的相似度越高。
2.3、Scaled Dot-Product Attention
这张图中
Q
Q
Q和
K
T
K^T
KT经过
M
a
t
M
u
l
MatMul
MatMul,生相似度矩阵。之后对相似度矩阵中的每一个元素除以
d
k
\sqrt{d_k}
dk,其中
d
k
d_k
dk是矩阵K维度的大小,这个除法被称作为
S
c
a
l
e
Scale
Scale。当
d
k
d_k
dk很大的时候,
Q
K
T
QK^T
QKT的乘法结果方差变大,进行
S
c
a
l
e
Scale
Scale可以使方差变小,从而使得训练梯度更新变得更加稳定。
2.3.1、为什么要进行缩放呢?
我进行了一个简单的代码实验,可以看出,当进行缩放的时候,他生成的权重矩阵分布更加合理。如果不进行缩放可能会存在其中某个权重非常接近于
1
1
1,而其他的几乎为
0
0
0。这就会导致最后训练过程中出现梯度问题,导致权重无法更新。
2.3.2、self-attention的计算过程
(1)第一步:
X
X
X与
W
W
W进行矩阵相乘,生成需要的
Q
、
K
、
V
Q、K、V
Q、K、V。
(2)第二步: 进行
Q
K
T
QK^T
QKT计算,得到相似度矩阵,如下所示:
(3)第三步: 将得到的相似度矩阵除以
d
k
\sqrt{d_k}
dk,在进行
s
o
f
t
m
a
x
softmax
softmax。经过
s
o
f
t
m
a
x
softmax
softmax归一化之后,每一个值都是
0
−
1
0-1
0−1之间的权重系数,每行的总和为
1
1
1,这就是权重矩阵。
(4)第四步: 使用刚得到的权重矩阵,与
V
V
V相乘,计算加权求和。
上图中权重矩阵的第
1
1
1行表示单词
1
1
1与其他所有单词的权重系数,最终单词
1
1
1的输出
Z
1
Z_1
Z1 等于所有单词
i
i
i的值
V
i
V_i
Vi 根据权重系数加权求和,如下图所示:
2.4、Multi-Head Attention
为了增强拟合性能,Transformer对
A
t
t
e
n
t
i
o
n
Attention
Attention继续扩展,提出了多头注意力
(
M
u
l
t
i
−
H
e
a
d
A
t
t
e
n
t
i
o
n
)
(Multi-Head Attention)
(Multi−HeadAttention)。刚才我们已经理解了,
Q
、
K
、
V
Q、K、V
Q、K、V是输入
X
X
X与
W
Q
、
W
K
、
W
V
W^Q 、W^K、W^V
WQ、WK、WV 分别相乘得到的,
W
Q
、
W
K
、
W
V
W^Q 、W^K、W^V
WQ、WK、WV 是可训练的参数矩阵。现在,对于同样的输入
X
X
X,我们定义多组不同的
W
Q
、
W
K
、
W
V
W^Q 、W^K 、W^V
WQ、WK、WV ,比如
W
0
Q
、
W
0
K
、
W
0
V
,
W
1
Q
、
W
1
K
、
W
1
V
W^Q_0 、W^K_0 、W^V_0 ,W^Q_1 、W^K_1、W^V_1
W0Q、W0K、W0V,W1Q、W1K、W1V ,每组分别计算生成不同的
Q
、
K
、
V
Q、K、V
Q、K、V,最后学习到不同的参数。
比如我们定义
8
8
8组参数,同样的输入
X
X
X,将得到
8
8
8个不同的输出
Z
0
到
Z
7
Z_0 到Z_7
Z0到Z7
在输出到下一层前,我们需要将
8
8
8个输出拼接到一起(Concat),乘以矩阵
W
O
W^O
WO ,进行一次线性变换,将维度降低回我们想要的维度。
2.4.1、训练流程
假设这里有三个词语, E m b e d d i n g Embedding Embedding且通过 E n c o d e r Encoder Encoder后的编码大小为 ( 3.512 ) (3.512) (3.512)。下面对Decoder进行训练:
- 将起始符 < s t a r t > <start> <start> 作为初始 D e c o d e r Decoder Decoder输入,经过 D e c o d e Decode Decoder处理和分类得到输出 I I I。
- 将 < s t a r t > I <start> I <start>I作为 D e c o d e r Decoder Decoder输入,经过 D e c o d e r Decoder Decoder处理和分类得到输出 a m am am。
- 将 < s t a r t > I a m <start> I am <start>Iam作为 D e c o d e r Decoder Decoder输入,经过 D e c o d e r Decoder Decoder处理和分类得到输出 D a N i n g DaNing DaNing。
- 将 < s t a r t > I a m D a N i n g <start> I am DaNing <start>IamDaNing作为 D e c o d e r Decoder Decoder输入,经过 D e c o d e r Decoder Decoder处理和分类得到结束符 < e n d > <end> <end>。
这种预测的方式也称作为 “自回归”
参考将
R
N
N
RNN
RNN更改为
S
e
l
f
−
A
t
t
e
n
t
i
o
n
Self - Attention
Self−Attention的
E
n
c
o
d
e
r
Encoder
Encoder思路, 对于这种依赖于前一个时间步预测结果的结构
D
e
c
o
d
e
r
Decoder
Decoder, 如果想做到并行训练, 需要将上面的过程转化为一个这样的矩阵直接作为
D
e
c
o
d
e
r
Decoder
Decoder的输入:
因为在训练时已知任务标签,所以可以产生类似的效果,这种方法被称为
T
e
a
c
h
e
r
F
o
r
c
i
n
g
Teacher Forcing
TeacherForcing,仅在训练阶段使用, 而不能使用在推断过程。
2.4.2、Mask图解
在论文的图中,
M
a
s
k
Mask
Mask操作顺序被放在
Q
Q
Q和
K
K
K计算并缩放后,
S
o
f
t
m
a
x
Softmax
Softmax计算前。如果继续计算下去,不做
M
a
s
k
Mask
Mask,与相乘后得到
A
t
t
e
n
t
i
o
n
Attention
Attention,所有时间步信息全部都被泄露给
D
e
c
o
d
e
r
Decoder
Decoder,必须用
M
a
s
k
Mask
Mask将当前预测的单词信息和之后的单词信息全部遮住。
遮住的方法非常简单,首先不能使用
0
0
0进行遮盖,因为Softmax中用零填充会产生错误
e
0
=
1
e^0=1
e0=1。所以必须要用
−
∞
-\infty
−∞来填充那些不能被看见的部分。我们直接生成一个下三角全为
0
0
0,上三角全部为
−
∞
-\infty
−∞的矩阵,与原数据相加就能完成遮盖的效果:
做
S
o
f
t
m
a
x
Softmax
Softmax时, 所有的负无穷全变成了
0
0
0, 不再干扰计算:
其实
M
a
s
k
Mask
Mask在对句子的无效部分填充时, 也是用同样方法将所有句子补齐, 无效部分用负无穷填充的.
Decoder仍然依赖与先前输出结果作为输入, 所以在正式使用时不能实现并行预测, 但在训练的时结果是已知的, 可以实现并行训练
2.4.3、Teacher Forcing
在模型的训练阶段,
D
e
c
o
d
e
r
Decoder
Decoder的所有正确输入是完全已知的。如果自回归预测在某个时间步
t
t
t解码出错, 则会导致
t
t
t 时刻后所有的预测结果都产生偏差。
Teacher Forcing通过将自回归模型解码过程中的所有输入强制修正为Ground Truth来避免了这个问题。
Teacher Forcing有诸多优点:
- 解决了训练阶段自回归式模型的串行问题,能够使得模型训练时并行。
- 避免了模型训练时预测一步错步步皆错的问题。
- 由于干涉了训练错误的情况,加快了模型的收敛速度。
但它也同时容易产生矫枉过正的问题: - Exposure Bias: 这是最为常见的问题,在训练时因为受到干涉,很容易产生训练推断不一致。
- Overcorrect: 有时候模型解码有自己的想法,但因为Teacher Forcing的干涉,导致生成的句子四不像。
- No diversity: Teacher Forcing对Ground Truth的约束是非常强的,模型的多样性受到严重限制。
关于其他的Teacher Forcing理解请参考:https://zhuanlan.zhihu.com/p/93030328
3、Transformer的主要工作流程(三步)
3.1、第一步
获取输入句子的每一个单词的表示向量
X
X
X,
X
X
X由单词的词向量
E
m
b
e
d
d
i
n
g
Embedding
Embedding和与单词位置有关的
P
o
s
i
t
i
o
n
a
l
E
m
b
e
d
d
i
n
g
Positional Embedding
PositionalEmbedding相加得到。
3.2、第二步
将得到的单词表示矩阵 (如上图所示,每一行是一个单词的向量表示
X
i
X_i
Xi) 传入
E
n
c
o
d
e
r
Encoder
Encoder部分(共
6
6
6个
E
n
c
o
d
e
r
B
l
o
c
k
Encoder Block
EncoderBlock)中,经过
6
6
6 个
E
n
c
o
d
e
r
B
l
o
c
k
Encoder Block
EncoderBlock后可以得到句子所有单词的中间编码信息矩阵
C
C
C,如下图。
E
n
c
o
d
e
r
Encoder
Encoder部分输入为
X
X
X,
X
X
X维度为:
(
l
e
n
×
d
)
(len \times d)
(len×d) ,
l
e
n
len
len是句子中单词个数,
d
d
d是表示词向量的维度
(
T
r
a
n
s
f
o
r
m
e
r
−
b
a
s
e
:
d
=
512
,
T
r
a
n
s
f
o
r
m
e
r
−
b
i
g
:
d
=
1024
)
(Transformer-base: d=512,Transformer-big: d = 1024)
(Transformer−base:d=512,Transformer−big:d=1024)。每一个
E
n
c
o
d
e
r
B
l
o
c
k
Encoder Block
EncoderBlock输出的矩阵维度与输入完全一致。
3.3、第三步
将Encoder输出的编码信息矩阵
C
C
C传递到
D
e
c
o
d
e
r
Decoder
Decoder部分,
D
e
c
o
d
e
r
Decoder
Decoder依次会根据已经翻译过的单词(第
0
0
0个单词到第
i
−
1
i-1
i−1个单词) 翻译下一个单词
i
i
i。最下方第一个
D
e
c
o
d
e
r
B
l
o
c
k
Decoder Block
DecoderBlock的输入为目标语言经过两层
E
m
b
e
d
d
i
n
g
Embedding
Embedding之后的词矩阵表示
X
X
X。下图左侧为单词
“
I
”
“I”
“I”的
D
e
c
o
d
e
r
Decoder
Decoder翻译过程,右侧为单词
“
h
a
v
e
”
“have”
“have”的
D
e
c
o
d
e
r
Decoder
Decoder的翻译过程。在
D
e
c
o
d
e
r
Decoder
Decoder过程中,翻译到单词i的时候需要通过
M
a
s
k
Mask
Mask操作遮盖住
i
i
i之后的单词。
4、Positonal Encoding
Transformer模型的输入为一系列词,词需要转化为词向量。一般的语言模型都需要使用
E
m
b
e
d
d
i
n
g
Embedding
Embedding层,用以将词转化为词向量。在此基础上,Transformer增加了位置编码
(
P
o
s
i
t
i
o
n
a
l
E
n
c
o
d
i
n
g
)
(Positional Encoding)
(PositionalEncoding)。**Transformer没有采用RNN的结构,不能利用单词的顺序信息,但顺序信息对于NLP任务来说非常重要。**为解决无位置信息的问题,Transformer使用位置编码来增加位置信息。
其中,
p
o
s
pos
pos表示单词在句子中的位置,
d
d
d表示词向量的维度,
2
i
2i
2i表示偶数维度,
2
i
+
1
2i+1
2i+1表示奇数维度
(
2
i
≤
d
,
2
i
+
1
≤
d
)
(2i≤d, 2i+1≤d)
(2i≤d,2i+1≤d)。
P
E
PE
PE公式生成的是
[
−
1
,
1
]
[-1, 1]
[−1,1]区间内的实数。词向量维度为
d
d
d,
d
d
d是模型设计时就确定的。给定一个词,其在句子中的位置为
p
o
s
pos
pos,就是上图中的某一行。
P
o
s
i
t
i
o
n
a
l
E
n
c
o
d
i
n
g
Positional Encoding
PositionalEncoding就是从上图中找到一行,将这行加到词向量上。
使用这种公式计算
P
E
PE
PE有以下的好处:可以让模型容易地计算出相对位置,对于固定长度的间距
k
k
k,
P
E
(
p
o
s
+
k
)
PE(pos+k)
PE(pos+k)可以用
P
E
(
p
o
s
)
PE(pos)
PE(pos)计算得到。因为:
将词向量
E
m
b
e
d
d
i
n
g
Embedding
Embedding和
P
E
PE
PE相加,就可以得到词的表示向量
X
X
X,
X
X
X就是Transformer 的输入。
5、Add & Norm 残差和归一化
A
d
d
&
N
o
r
m
Add \& Norm
Add&Norm 层由
A
d
d
Add
Add 和
N
o
r
m
Norm
Norm 两部分组成。
A
d
d
Add
Add 类似
R
e
s
N
e
t
ResNet
ResNet提出的残差连接,以解决深层网络训练不稳定的问题。
N
o
r
m
Norm
Norm为归一化层,即
L
a
y
e
r
N
o
r
m
a
l
i
z
a
t
i
o
n
Layer Normalization
LayerNormalization,通常用于 RNN 结构。
残差连接是指将输入特征直接添加到网络层的输出中,形成一个跳跃连接。这样做的目的是为了保留原始输入的信息,使得网络可以更容易地学习到残差部分,即输入与输出之间的差异。通过残差连接,网络可以更轻松地学习到更深层次的特征表示,避免了梯度在深层网络中逐渐消失的问题。
L
a
y
e
r
N
o
r
m
a
l
i
z
a
t
i
o
n
Layer Normalization
LayerNormalization是一种归一化技术,用于对神经网络中每个样本的每个特征维度进行归一化。它通过对每个特征维度进行独立的归一化,使得每个特征维度具有相似的分布。
L
a
y
e
r
N
o
r
m
a
l
i
z
a
t
i
o
n
Layer Normalization
LayerNormalization有助于减少不同特征之间的依赖关系,提高模型的稳定性和泛化能力。在Transformer中,
L
a
y
e
r
N
o
r
m
a
l
i
z
a
t
i
o
n
Layer Normalization
LayerNormalization被应用于每个子层的输入和输出,以规范化子层的输入分布,使得模型更容易学习到有效的特征表示。
通过残差连接和
L
a
y
e
r
N
o
r
m
a
l
i
z
a
t
i
o
n
Layer Normalization
LayerNormalization的结合使用,Transformer模型可以更好地处理深层网络的训练问题。残差连接允许信息在网络中更容易地传播,避免了梯度消失和梯度爆炸问题,而
L
a
y
e
r
N
o
r
m
a
l
i
z
a
t
i
o
n
Layer Normalization
LayerNormalization有助于提高模型的稳定性和泛化能力。这些技术的引入使得Transformer能够有效地学习到更深层次的特征表示,从而提升了其在自然语言处理等任务中的性能。
6、Feed Forward 前馈神经网络
在Transformer模型中, F e e d F o r w a r d Feed Forward FeedForward层是Transformer编码器和解码器中的一个重要组成部分。 F e e d F o r w a r d Feed Forward FeedForward层由两个线性变换和一个非线性激活函数组成,用于对输入进行映射和转换。
具体来说, F e e d F o r w a r d Feed Forward FeedForward层的作用是对每个位置的特征进行独立的映射和转换,以提取更高级别的特征表示。它的输入是一个多头自注意力机制的输出,即经过自注意力机制后得到的特征表示。
Feed Forward层的具体操作如下:
- 首先,对输入进行一个线性变换,将输入特征的维度映射到一个更高维度的中间表示空间。这个线性变换通常是一个全连接层,其中包含一个权重矩阵和一个偏置向量。
- 然后,对映射后的特征进行非线性变换,通常使用激活函数如 R e L U ( R e c t i f i e d L i n e a r U n i t ) ReLU(Rectified Linear Unit) ReLU(RectifiedLinearUnit)来引入非线性。ReLU函数将所有负值变为零,保留正值不变。
- 最后,对非线性变换后的特征再进行一个线性变换,将特征的维度映射回原始维度。这个线性变换与第一步的线性变换类似,也是一个全连接层。
F e e d F o r w a r d Feed Forward FeedForward层的作用是引入非线性变换,使得模型能够学习到更复杂的特征表示。通过多个 F e e d F o r w a r d Feed Forward FeedForward层的堆叠,Transformer模型可以逐渐提取出更高级别的特征,从而更好地捕捉输入序列的语义信息。
需要注意的是, F e e d F o r w a r d Feed Forward FeedForward层是在每个位置上独立地进行操作的,即每个位置的特征都会经过相同的线性变换和非线性激活函数。这种位置独立的操作有助于并行计算,提高模型的训练和推理效率。
总而言之, F e e d F o r w a r d Feed Forward FeedForward层在Transformer模型中起到了提取高级特征表示的作用,帮助模型更好地理解输入序列的语义信息。
7、问题解答
(1)Q、K、V是怎样得到的?
在Transformer中所使用的
Q
、
K
、
V
Q、K、V
Q、K、V,均是从同样的输入矩阵X进行线性变换得来的。可以理解为:
具体解释如下所示:
(2)对于这三个权重的初始化是什么? W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV
他们是三个可训练的参数矩阵。在模型的初始阶段,这些参数矩阵被赋予随机生成的初始值。常见的初始化方法包括从均匀分布或高斯分布中随机采样。例如,可以使用均匀分布在
[
−
k
,
k
]
[-k, k]
[−k,k]范围内随机采样,或者使用高斯分布以
0
0
0为均值和较小的标准差进行采样。
随机初始化的目的是为了打破对称性,使得不同位置的
Q
u
e
r
i
e
s
、
K
e
y
s
Queries、Keys
Queries、Keys和
V
a
l
u
e
s
Values
Values参数矩阵具有不同的初始值。这样有助于模型在训练过程中学习到不同的特征表示和注意力权重。
需要注意的是,随机初始化只是模型训练的初始阶段,模型会通过反向传播和优化算法来不断调整和更新这些参数,以使其逐渐适应训练数据并提高性能。因此,最终的参数值是通过训练过程中的优化得到的,而不是初始随机值。
在训练过程中,通过与目标输出进行比较,计算损失函数,并使用反向传播算法计算梯度。然后,优化器根据梯度信息来更新模型的参数,包括
Q
u
e
r
i
e
s
、
K
e
y
s
Queries、Keys
Queries、Keys和
V
a
l
u
e
s
Values
Values参数矩阵。这个过程会不断迭代,直到模型收敛或达到预定的训练轮数。
(3)为什么要使用权重与矩阵相乘生成QKV呢?
Transformer引入参数矩阵与矩阵相乘生成
Q
u
e
r
i
e
s
、
K
e
y
s
Queries、Keys
Queries、Keys和
V
a
l
u
e
s
(
Q
、
K
、
V
)
Values(Q、K、V)
Values(Q、K、V)的过程是为了引入可学习的注意力机制,以更好地捕捉输入序列中的相关信息和建立上下文关系。
直接使用输入矩阵
X
X
X作为
Q
u
e
r
i
e
s
、
K
e
y
s
Queries、Keys
Queries、Keys和
V
a
l
u
e
s
Values
Values可能会导致以下问题:
- 缺乏灵活性:输入矩阵X是固定的,无法根据不同的任务和上下文进行调整。而通过引入参数矩阵,模型可以学习到不同的权重和表示,以适应不同的输入和任务。
- 建立关联性:通过参数矩阵与矩阵相乘生成的 Q u e r i e s 、 K e y s Queries、Keys Queries、Keys和 V a l u e s Values Values可以通过计算注意力权重来建立输入序列中不同位置之间的关联性。这样,模型可以更好地关注相关的信息,忽略无关的信息,从而提高模型的表示能力和性能。
总之,引入参数矩阵与矩阵相乘生成 Q u e r i e s 、 K e y s Queries、Keys Queries、Keys和 V a l u e s Values Values是为了增加模型的灵活性、解决维度不匹配问题,并引入可学习的注意力机制,以更好地捕捉输入序列中的相关信息和建立上下文关系。
(4)为什么要引入Q、K、V?
Transformer引入
Q
u
e
r
i
e
s
(
Q
)、
K
e
y
s
(
K
)
Queries(Q)、Keys(K)
Queries(Q)、Keys(K)和
V
a
l
u
e
s
(
V
)
Values(V)
Values(V)的概念是为了实现自注意力机制
(
S
e
l
f
−
A
t
t
e
n
t
i
o
n
)
(Self-Attention)
(Self−Attention),从而在处理序列数据时能够更好地捕捉序列中的长距离依赖关系。
自注意力机制是Transformer模型的核心组成部分,它允许模型在处理每个位置的输入时,根据其他位置的信息来加权关注不同位置的重要性。
Q
u
e
r
i
e
s
、
K
e
y
s
Queries、Keys
Queries、Keys和
V
a
l
u
e
s
Values
Values的引入是为了实现这种加权关注的机制。
具体来说,
Q
u
e
r
i
e
s
Queries
Queries用于描述当前位置的输入,
K
e
y
s
Keys
Keys用于描述其他位置的输入,而
V
a
l
u
e
s
Values
Values则是对其他位置的输入进行加权求和得到的表示。通过计算
Q
u
e
r
i
e
s
Queries
Queries和
K
e
y
s
Keys
Keys之间的相似度,可以得到一个注意力权重矩阵,用于加权求和
V
a
l
u
e
s
Values
Values。这样,模型可以根据输入序列中不同位置的相关性,动态地调整对不同位置的关注程度。
引入
Q
、
K
、
V
Q、K、V
Q、K、V的概念可以帮助Transformer模型在处理序列数据时,更好地捕捉序列中的长距离依赖关系。通过自注意力机制,模型可以在每个位置上根据其他位置的信息进行加权关注,从而更好地理解序列中的上下文关系,提高模型的表示能力和性能。
(5)都有那些并行化呢?
- 多头注意力机制中是可以并行化的,每个头都可以并行计算,最后在融合在一起。
- 解码器中使用到了 t e a c h e r f o r c e teacher force teacherforce,这也可以让其实现并行化计算。对于 t e a c h e r f o r c e teacher force teacherforce,在其他 s e q 2 s e q seq2seq seq2seq模型中也有应用。它是指在每一轮预测时,不使用上一轮预测的输出,而强制使用正确的单词。还以上面这个例子来说,第二轮时,给解码器模块输入 “ < s t a r t > I ” “<start>I” “<start>I”和 编码器的输出结果,解码器没有正确预测出“Iove”,而是得到了 “ w a n t ” “want” “want”。如果没有采用 t e a c h e r f o r c e teacher force teacherforce,在第三轮时,解码器模块输入的就是 “ < s t a r t > I w a n t ” “<start> I want” “<start>Iwant”。如果采用了 t e a c h e r f o r c e teacher force teacherforce,第三轮时,解码器模块输入的仍然是 “ < s t a r t > I l o v e ” “<start> I love” “<start>Ilove”。通过这样的方法可以有效的避免因中间预测错误而对后续序列的预测,从而加快训练速度。而Transformer采用这个方法,为并行化训练提供了可能,因为每个时刻的输入不再依赖上一时刻的输出,而是依赖正确的样本,而正确的样本在训练集中已经全量提供了。值得注意的一点是: D e c o d e r Decoder Decoder的并行化仅在训练阶段,在测试阶段,因为我们没有正确的目标语句,t时刻的输入必然依赖t-1时刻的输出,这时跟之前的 s e q 2 s e q seq2seq seq2seq就没什么区别了。
- 再有并行化,就是可以批次间的并行化了。
(6)Transformer相比于RNN/LSTM, 有什么优势? 为什么?
- RNN系列的模型并行计算能力很差。
- Transformer的特征抽取能力比RNN系列的模型要好(实验结论)。
(7)为什么说Transformer可以代替seq2seq?
说替代是不妥当的,它仍有自己的用武之地,首先来说说
s
e
q
2
s
e
q
seq2seq
seq2seq的缺点:
s
e
q
2
s
e
q
seq2seq
seq2seq最大的问题在于将
E
n
c
o
d
e
r
Encoder
Encoder端的所有信息压缩到一个固定长度的向量中,并将其作为
D
e
c
o
d
e
r
Decoder
Decoder端首个隐藏状态的输入,来预测
D
e
c
o
d
e
r
Decoder
Decoder端第一个单词
(
t
o
k
e
n
)
(token)
(token)的隐藏状态。在输入序列比较长的时候,这样做显然会损失Encoder端的很多信息,而且这样一股脑的把该固定向量送入
D
e
c
o
d
e
r
Decoder
Decoder端,
D
e
c
o
d
e
r
Decoder
Decoder端不能够关注到其想要关注的信息。
Transformer针对它的缺点进行的改进:
Transformer不但对
s
e
q
2
s
e
q
seq2seq
seq2seq模型这两点缺点有了实质性的改进(多头交互式
a
t
t
e
n
t
i
o
n
attention
attention模块),而且还引入了
s
e
l
f
−
a
t
t
e
n
t
i
o
n
self-attention
self−attention模块,让源序列和目标序列首先”自关联”起来,这样的话,源序列和目标序列自身的
e
m
b
e
d
d
i
n
g
embedding
embedding表示所蕴含的信息更加丰富,而且后续的FFN层也增强了模型的表达能力,并且Transformer并行计算的能力是远远超过
s
e
q
2
s
e
q
seq2seq
seq2seq系列的模型。
参考文章链接:
https://adaning.github.io/posts/40071.html
https://zhuanlan.zhihu.com/p/93030328
https://adaning.github.io/posts/6744.html
https://mp.weixin.qq.com/s/RLxWevVWHXgX-UcoxDS70w
https://zhuanlan.zhihu.com/p/48508221