阅读本篇文章的时候,可以先去看看我写的前两篇笔记,能够相辅相成,更加深入了解Transformer。
- 第一篇宏观探索,其实是从词嵌入开始说起,从ELMO、BERT、GPT等入手让你明白,哪些用了Transformer的那些部分,以及演变过程
- 第二篇是从Transformer的细节处讲,有图有真相,明白里面的构造是什么,如果初学,容易绕进去,形成障碍。可以先阅读本文,再折回去阅读微观探索。(不过这个阅读顺序,无所谓,核心是掌握Transformer)
编码器
-
首先,我们将每个词转化为其对应的词嵌入向量。嵌入只是词的特征向量,这个特征向量也是需要通过训练获得的。
-
矩阵 X \mathbf{X} X的维度为 [ 句子的长度 × 词嵌入向量维度 ] [句子的长度×词嵌入向量维度] [句子的长度×词嵌入向量维度]
-
创建三个权重矩阵 W Q 、 W K 、 W V \mathbf{W}^{\mathbf{Q}}、\mathbf{W}^{\mathbf{K}}、\mathbf{W}^{\mathbf{V}} WQ、WK、WV,用矩阵 X \mathbf{X} X分别乘以矩阵 W Q 、 W K 、 W V \mathbf{W}^{\mathbf{Q}}、\mathbf{W}^{\mathbf{K}}、\mathbf{W}^{\mathbf{V}} WQ、WK、WV,就可以依次创建出查询矩阵 Q \mathbf{Q} Q、键矩阵 K \mathbf{K} K和值矩阵 V \mathbf{V} V
自注意力机制
- 自注意力机制首先要计算查询矩阵
Q
Q
Q与键矩阵
K
T
K^T
KT的点积
- 看 Q ⋅ K T Q·K^T Q⋅KT矩阵的第一行,一行计算的是查询向量 q 1 ( I ) q_1(I) q1(I)与所有的键向量 k 1 ( I ) 、 k 2 ( a m ) 、 k 3 ( g o o d ) k_1(I)、k_2(am)、k_3(good) k1(I)、k2(am)、k3(good)的点积。通过计算两个向量的点积可以知道它们之间的相似度。(单词与句子中的所有单词的相似度)
- 将 Q ⋅ K T Q·K^T Q⋅KT矩阵除以键向量维度的平方根,这样是为了获得稳定的梯度
- 目前所得的相似度分数尚未被归一化,我们需要使用softmax函数对其进行归一化处理(分数矩阵)
- 应用softmax函数将使数值分布在0到1的范围内,且每一行的所有数之和等于1。
- 计算注意力矩阵
Z
Z
Z。
- 注意力矩阵包含句子中每个单词的注意力值。它可以通过将分数矩阵softmax ( Q ⋅ K T d k Q·K^T\over\sqrt{d_k} dkQ⋅KT)乘以值矩阵 V V V得出
- 注意力矩阵 Z Z Z就是值向量与分数加权之后求和所得到的结果
- 通过自注意力机制,我们可以了解一个词与句子中所有词的相关程度。
多头注意力层
如果某个词实际上由其他词的值向量控制,而这个词的含义又是模糊的,那么这种控制关系是有用的;否则,这种控制关系反而会造成误解。为了确保结果准确,我们不能依赖单一的注意力矩阵,而应该计算多个注意力矩阵,并将其结果串联起来。使用多头注意力的逻辑是这样的:使用多个注意力矩阵,而非单一的注意力矩阵,可以提高注意力矩阵的准确性。
假设我们有8个注意力矩阵,即
Z
1
Z_1
Z1到
Z
8
Z_8
Z8,那么可以直接将所有的注意力头(注意力矩阵)串联起来,并将结果乘以一个新的权重矩阵
W
0
W_0
W0,从而得出最终的注意力矩阵,
M
u
l
t
i
−
h
e
a
d
a
t
t
e
n
t
i
o
n
=
C
o
n
c
a
t
e
n
a
t
e
(
Z
1
,
Z
2
,
.
.
.
,
Z
8
)
W
0
Multi-head attention=Concatenate(Z_1,Z_2,...,Z_8)W_0
Multi−headattention=Concatenate(Z1,Z2,...,Z8)W0
位置编码
Transformer将句子中的所有词并行地输入到神经网络中。并行输入有助于缩短训练时间,同时有利于学习长期依赖。
位置编码是指词在句子中的位置(词序)的编码。
正弦函数来计算位置编码:
P
(
p
o
s
,
2
i
)
=
sin
(
p
o
s
1000
0
2
i
/
d
m
o
d
e
l
)
P
(
p
o
s
,
2
i
+
1
)
=
cos
(
p
o
s
1000
0
2
i
/
d
m
o
d
e
l
)
P(pos,2_i)=\sin({pos\over{10000^{2_i/d_{model}}}})\\ P(pos,2_i+1)=\cos({pos\over{10000^{2_i/d_{model}}}})
P(pos,2i)=sin(100002i/dmodelpos)P(pos,2i+1)=cos(100002i/dmodelpos)
- 只需将输入矩阵 X X X与计算得到的位置编码矩阵 P P P进行逐元素相加,并将得出的结果作为输入矩阵送入编码器中。
前馈网路层
前馈网络由两个有ReLU激活函数的全连接层组成。前馈网络的参数在句子的不同位置上是相同的,但在不同的编码器模块上是不同的。
叠加和归一组件
- 同时连接多头注意力层的输入和输出
- 同时连接多头注意力层的输入和输出
叠加和归一组件实际上包含一个残差连接与层的归一化。
层的归一化可以防止每层的值剧烈变化,从而提高了模型的训练速度。
编码器总览
将 N N N个编码器一个接一个地叠加起来。从最后一个编码器(顶层的编码器)得到的输出将是给定输入句子的特征值。让我们把从最后一个编码器得到的特征值表示为 R R R。
R R R作为输入传给解码器。解码器将基于这个输入生成目标句。
解码器
一个解码器(第一个除外)将有两个输入:一个是来自前一个解码器的输出,另一个是编码器输出的特征值。
在每一步中,解码器都将上一步新生成的单词与输入的词结合起来,并预测下一个单词
- 在编码器部分,我们将输入转换为嵌入矩阵,并将位置编码添加到其中,然后将其作为输入送入编码器。同理,我们也不是将输入直接送入解码器,而是将其转换为嵌入矩阵,为其添加位置编码,然后再送入解码器。
- 假设在时间步 t = 2 t=2 t=2,我们将输入转换为嵌入(我们称之为嵌入值输出,因为这里计算的是解码器在以前的步骤中生成的词的嵌入),将位置编码加入其中,然后将其送入解码器。
带掩码的多头注意力层
- 在训练期间,由于有正确的目标句,解码器可以直接将整个目标句稍作修改作为输入。解码器将输入的作为第一个标记,并在每一步将下一个预测词与输入结合起来,以预测目标句,直到遇到标记为止。因此,我们只需将标记添加到目标句的开头,再将整体作为输入发送给解码器。
- 掩码有助于自注意力机制只注意模型在测试期间可以使用的词
多头注意力层
每个解码器中的多头注意力层都有两个输入:
- 一个来自带掩码的多头注意力层,
- 矩阵 M M M
- 另一个是编码器输出的特征值。
- 矩阵 R R R
用从上一个子层获得的注意力矩阵 M M M创建查询矩阵 Q i Q_i Qi,使用编码器输出的特征值 R R R创建键矩阵和值矩阵。由于采用多头注意力机制,因此对于头 i i i,需做如下处理:
- 查询矩阵 Q i Q_i Qi通过将注意力矩阵 M M M乘以权重矩阵 W i Q W_i^Q WiQ来创建。
- 键矩阵和值矩阵通过将编码器输出的特征值 R R R分别与权重矩阵 W i K 、 W i V W_i^K、W_i^V WiK、WiV相乘来创建
通过上面你将知道日常在Transformer中所提到的Q、K、V
是从哪来,对应的是那一部分
为什么要用 M M M计算查询矩阵,而用 R R R计算键矩阵和值矩阵呢?
因为查询矩阵是从 M M M求得的,所以本质上包含了目标句的特征。键矩阵和值矩阵则含有原句的特征,因为它们是用 R R R计算的
前馈网络层
与编码器中的一样
叠加和归一组件
线性层和softmax层
解码器总览
- 首先,我们将解码器的输入转换为嵌入矩阵,然后将位置编码加入其中,并将其作为输入送入底层的解码器(解码器1)。
- 解码器收到输入,并将其发送给带掩码的多头注意力层,生成注意力矩阵 M M M。
- 然后,将注意力矩阵 M M M和编码器输出的特征值 R R R作为多头注意力层(编码器−解码器注意力层)的输入,并再次输出新的注意力矩阵。
- 把从多头注意力层得到的注意力矩阵作为输入,送入前馈网络层。前馈网络层将注意力矩阵作为输入,并将解码后的特征作为输出。
- 最后,我们把从解码器1得到的输出作为输入,将其送入解码器2。
- 解码器2进行同样的处理,并输出目标句的特征。
我们可以将 N N N个解码器层层堆叠起来。从最后的解码器得到的输出(解码后的特征)将是目标句的特征。接下来,我们将目标句的特征送入线性层和softmax层,通过概率得到预测的词。
训练Transformer
解码器预测的是词汇的概率分布,并选择概率最高的词作为输出。所以,我们需要让预测的概率分布和实际的概率分布之间的差异最小化。要做到这一点,可以将损失函数定义为交叉熵损失函数。我们通过最小化损失函数来训练网络,并使用Adam算法来优化训练过程。
词汇的概率分布,并选择概率最高的词作为输出。所以,我们需要让预测的概率分布和实际的概率分布之间的差异最小化。要做到这一点,可以将损失函数定义为交叉熵损失函数。我们通过最小化损失函数来训练网络,并使用Adam算法来优化训练过程。
为了防止过拟合,我们可以将dropout方法应用于每个子层的输出以及嵌入和位置编码的总和。
总结
从上面的整个过程中,你可以通俗易懂的了解,Transformer中的编码器、解码器是什么以及他们中间的细节所对应的概念是什么,具体中间是怎么变化的,可以看看我的微观探索部分
以上是我个人在学习过程中的记录所学(“温故而知新”),希望对正在一起学习的小伙伴有所帮助!!!
如果对你有帮助,希望你能一键三连【关注、点赞、收藏】!!!
参考链接
以上是我在阅读《BERT基础教程:Transformer大模型实战》中所记录的笔记,详细细节书中讲的会更好。