“线性变换”是机器学习中针对数据常用的变换方式,通过线性变换可以将数据进行降维、解耦、筛选精炼等操作。而 Transformer 中的“线性变换”有着十分独特且重要的意义,它是导致 Multi-Head Attention 机制得以成功运行的根基。但是要彻底了解 Transformer 中独特的“线性变换”机制,你首先要彻底理解 Q、K、V 三矩阵与生成它们的三个线性变换矩阵
W
Q
,
W
K
,
W
V
W^{Q},W^{K},W^{V}
WQ,WK,WV之间的巧妙关系,让我们开始。。。。
由浅入深,首先简要回顾一下 Q、K、V 三者之间的关系。
目录
- 1. Q、K、V 三者之间的运算关系
- 2. Q、K、V 是如何产生的?与 Multi-Head Attention 有何关系?
- 3. “Multi-Head Attention 多头注意力机制”的运算方式
- 4. 对“Multi-Head Attention 多头注意力机制”最通俗易懂的比喻
1. Q、K、V 三者之间的运算关系
先举个不是100%贴切,但容易让我们理解的例子。Q、K、V 就好比当你在 YouTube 上搜索视频时,搜索引擎会将你的查询内容 Q ( Query 搜索栏中输入的查询内容)映射到数据库中与候选视频相关的一组关键字 K(Keys 视频标题、描述等)匹配相关性。最后系统通过计算,向你展示最匹配的 K 所对应的内容 V( Values 值,在 YouTube 上给出的搜索结果为最匹配的视频的链接)。而 Attention 机制就好比是对这全部查询过程的一个称呼。Attention 此时就是将你想要查询的 Q 与 YouTube 数据库中 K进行比较,一对一地测量它们之间的相似度,并最终从最高相似度顺序向下依次返回并排列索引到的视频链接 V。所以,你也可以理解 Attention 为一个数据库查表的过程:
当然,以上只是一个对 Q、K、V 这三个矩阵的作用的比喻。在具体的 NLP 领域,我们往往是要给 Transformer 大模型输入一个序列的文本,即一句话或一段话,甚至有可能是一篇论文、一本书的文字量。其中的每一个单词都会由一个 Embedding 向量来表达。这个 Attention 查表的过程,其实就是对海量的 Embedding 进行搜索查询的过程。
(实际上不是单词,而是 token。token 本质上与“单词”概念是有区别的,token 为词元,即最小语义单位。为了更精准地解释,下面我们将用正规的描述 “token” 来进行讲解。)
既然一个输入序列中,每一个 token 都只有一个 Embedding 向量来表达,那么,我们要如何获得针对这每一个 Embedding 向量进行上面所描述的 Q、K、V 三者之间的搜索逻辑呢?
2. Q、K、V 是如何产生的?与 Multi-Head Attention 有何关系?
在 Attention 机制中,从广义上来说 Q、K、V 三者做了一种类似上面所说的搜索运算,从而找出在全部输入给 Attention 的序列中每一个 token 与序列中其他 token 之间的语义关联度。比如:输入给 Attention 一句话:How are you?。此时系统会首先把这个输入序列转化为四个token(“How”、“are”、“you”、“?”),然后找出这四个 token 互相之间的语义关联度,即 Attention 过程,即“How”与其余三个 token:“are”、“you”、“?”之间的的语义关联度,“are”与其余三个 token:“How”、“you”、“?”之间的的语义关联度,以此类推。。。。是不是很无聊?四个token之间不用机器,肉眼一看就能懂。而一本10万字的书呢,机器是怎么通过 Attention 机制几秒钟的时间,一下子就读懂10万字之间的语义关系呢,最终又是怎样了解其中的语义逻辑呢?很明显,无论你输入给机器是四个 token 的一句话,还是10万字的一本书,它都在执行这同一套运算!Attention 都要把输入的序列中的每一个 token,转化成 Embedding 向量,然后再把 Embedding 向量“拆成”或者说是“分解成”、“变幻成”三个矩阵 Q、K、V
2.1 W Q , W K , W V W^{Q},W^{K},W^{V} WQ,WK,WV三个权重矩阵的引入与作用
实际上,我们把每个 token 的 Embedding 向量分别做三次线性投影(或称为线性变换),也就是说它与三个具有不同权重的矩阵 W Q , W K , W V W^{Q},W^{K},W^{V} WQ,WK,WV分别相乘得到 Q、K、V 三个矩阵。而 W Q , W K , W V W^{Q},W^{K},W^{V} WQ,WK,WV就是 Transformer 大模型在预训练阶段时,通过神经网络反向传播来训练出来的权重矩阵(注意,这里提到的“权重”,是指神经网络中的连接权重,与Attention中token之间的语义关联权重不是一个意思),这三个矩阵是 Transformer 大模型当初通过百万级的训练语料在 8 块 NVIDIA P100 GPU 上运算 3.5 天后的训练所得(当然,这是2017年 Google 团队首次提出 Transformer时的事情了,今天许多的多模态大模型中的 Transformer 架构在训练时往往采用至少百亿计的语料训练集,同时在成千上万块至少是 A100 GPU 上,训练十几天才会完成,以后这个训练成本只可能是越来越巨大)。很多人会在这里感觉很迷惑, W Q , W K , W V W^{Q},W^{K},W^{V} WQ,WK,WV 这三个矩阵到底是从何而来的,因为很多介绍 Transformer 的文章在这里都只是一笔带过,仅仅说了一下 W Q , W K , W V W^{Q},W^{K},W^{V} WQ,WK,WV 这三个权重矩阵是随机初始化的,但并没有说明是在模型“训练阶段”随机初始化的,这造成了诸多的混淆。因为,不同于“训练阶段”,在模型的“执行阶段”(模型预测阶段)这三个矩阵是固定的,即 Transformer 神经网络架构中的固定的节点连接权重,是早就被预先训练好的了(Pre-Trained)。比如说大家耳熟能详的 GPT ,就是 Generative Pre-Trained Transformer。
注意,这里因为是把全句子(输入的全序列)拆成具体的 token 来讲解,所以为了理解起来方便,暂用向量来表达。其实,在实际的运算过程中是以矩阵的方式来运行的,以提高运行效率,即整个序列中所有 token 的 Embedding 向量都放在一起组成一个矩阵同时进行运算。所以,该矩阵的维度由输入序列的 token 数 nnn ,与 Embedding 的维度(一般为512)决定。所以,该矩阵的形状为 n × 512 n \times512 n×512
2.2 Multi-head Attention 多头注意力机制的引入
实际上,权重矩阵 W Q , W K , W V W^{Q},W^{K},W^{V} WQ,WK,WV是与 Multi-head Attention 多头注意力机制息息相关的,也就是说这三个矩阵是为了实现 Multi-head Attention 多头注意力机制而存在的。这三个权重矩阵将输入序列的完整矩阵进行“多头”处理,导致输入序列矩阵形状由原来的 n × 512 n\times512 n×512 变成了 n × 64 n\times64 n×64。刚才不是说 nnn 是输入序列的 token 总数,512 为单个 Embedding 的向量维度吗?那这个 64 又是从何而来的呢?512 与 64 差了8倍,也就是说把一个完整的进程分解为了 8 个并列的并行的进程来实施。这个进程被原论文称为“头”,即 head。这 8 个“头”之间互不干扰,各自运算各自的 Attention 机制。8 个头中的每一个头都只采用初始 Embedding 的向量长度 512 的 8 分之一来运行,即通过把 Embedding 向量与 W Q , W K , W V W^{Q},W^{K},W^{V} WQ,WK,WV三矩阵分别相乘之后,得到的向量长度为 Embedding 原始向量长度 512 的 1/8,即 64 维的向量。。。。然后,这样的动作,做了8次,这就是多头自注意力机制了。当然,每次 Embedding 向量乘的 W Q , W K , W V W^{Q},W^{K},W^{V} WQ,WK,WV这三矩阵,都是不同的,所以,严谨地说,应该用 W i Q , W i K , W i V W^{Q}_{i},W^{K}_{i},W^{V}_{i} WiQ,WiK,WiV( i = 8,即 head 数 )来表达。所以,这相当于把 Embedding 向量作线性变换的同时,顺便把它“切”成了 8 份来运行。当然,这样的“切”并不是直接在一个长度为 512 的向量上等分 8 份,而是通过与 W Q , W K , W V W^{Q},W^{K},W^{V} WQ,WK,WV三矩阵分别相乘,线性变换而来的。这样的降维变换明显含有某种特殊的意义,好比龙生九子,各有所好、各有特长一样,下面会详细讲解。这里,龙生了 8 个子。。。其实 Multi-head Attention 也可以顺势理解为西方的多头龙,每一个头喷出的攻击元素不同,有的是冰冻、有的是火焰、有的是电击、有的是毒素、有的是眩晕。。。
各位尽可以用自己最熟知最喜欢的方式去体会、去理解、去深化记忆这个 Multi-Head Attention 机制中的这8个头到底是干什么用的。。。。
下面,回归主线!!
2.3 Embedding 空间中语义结构的多样性与 Multi-Head 多头之间的关系
这里我们再继续往下深挖,将挖出 Embedding 才是多头背后的真正内在成因。我之前的文章讲过,在 Embedding 的空间中,一个词的语义逻辑、语法逻辑、上下文逻辑、在全句中位置逻辑、分类逻辑等等,有很多种,如下两图中的几种 word embedding 逻辑。在 Embedding 的二维空间中 dog、cat、rabbit 三个向量的坐标点位排布,可以看到三个绿色的点距离很近,是因为他们三个相对于其他词汇来说语义上更接近。tree 和 flower 则离它们较远,但是 cat 会因为在很多语言的文章中都会有“爬树”的词汇出现在同一句话中,所以导致 cat 会与 tree 离得较近一些。同时 dog、rabbit 与 tree 的关系就较远。
想象一下全世界的所有语言文字里,是不是大体上都是这样,在如此众多的语言文字的资料里,描述“狗”的句子、段落、书籍里,提到“树”的次数,是不是要比描述“猫”的句子、段落、书籍里,提到“树”的次数要少,“兔子”与“树”共同出现就就更少了?这背后透露出了这个世界中的各种事物间的逻辑规律,是 AI 往 AGI 方向发展的内在核心。
这就是 Embedding 最有意思的地方,也是 Embedding 的核心了。我会单独写一篇文章来详细介绍 Embedding 的!这里为了介绍 Multi-Head Attention ,先简要介绍一些 Embedding 的知识点。
我们可以把在 Embedding 想象成一个多维的空间。在这个空间中,词与词之间的关系不仅仅限于像上面所举到的猫、狗与树之间仅仅是因为在海量训练语料中结伴出现的频次所导致了在 Embedding 空间中定位的远近亲疏。一个词所代表的事物与其他词所代表的事物之间能产生内在联系的因素往往有成百上千上万种之多。
比如 man 和 woman,他们之间的关系还会映射出 king 和 queen 之间的关系。同时,语法也会带来一定的联系,比如在 Embedding 空间中,由 walking 到 walked 的距离与斜率竟然与 swimming 到 swam 的距离与斜率一致(即向量的长度与斜率一致),且距离几乎相等,见下图。因为这背后是两组动作单词的现在分词形式和过去分词形式的变化关系。我们可以尽情地想象,凡是事物或概念有逻辑联系的,甚至是逻辑与逻辑之间的联系的,在 Embedding 向量空间中都可以得到远近亲疏的空间表达。
(注:为了文章中表达方便,我们仅用二维或三维空间来表达,实际上 Embedding 空间的维度很高,至少要在 512 维之上!一维二维三维的空间大家容易在脑中想象出来对应的画面,但是四维以上以至于 512 维就难以图形化的想象了。所以,这里做了简化,以方便大家理解。)
于是,通过把 Embedding 向量线性变幻成 8 个 1/8 的向量再分别去做 Attention 机制运算,这其实在本质上并不会耽误每个 token 的语义表达,而只是细分出了不同的语义子空间,即不同类型的细分语义逻辑而已,Attention 机制运算起来将更细腻精准、更有针对性。
无论是实际战斗还是玩游戏,我们通常发现,一套连招下来,二技能位移连一技能再放大再接二技能……,还是别的什么套路,其实道理大家都懂,但在应有的游戏阶段你死活就是打不死对方。或者你看直播,人家在战斗的不同阶段,就是能创造那个阶段的神奇,出身和你一样,但就是能以不败之身屡屡秒杀对方。怎么如此神奇?开挂了吗?
其实,就是一个道理。他的操作太细腻了,细腻到你都不认为那些因素是需要注意的,而大神就是这样较真地去面对每一个细节。可能有放大的时机问题、有奔跑方向的问题、有己方支援方式问题、有对方同伴是否干扰问题、有预判了对方心态问题等等,诸多问题…都同时考虑。这就是 Multi-Head 的核心意义!把工作做细、做精!
2.4 被 Multi-Head 分解的“语义逻辑子空间”的重要意义
知道了多头的真正内因是 Embedding,那么让我们再看看这个 Embedding 中的语义逻辑子空间: W Q , W K , W V W^{Q},W^{K},W^{V} WQ,WK,WV 这三个经过训练的权重矩阵可以帮我们把一个完整的 token 的 Embedding 向量中的这些不同细微逻辑,通过线性变换 “投射在某个细分语义逻辑子空间”的方式降维分解成 8 个细分的 Embedding 向量,并产生 8 套不同的 Q、K、V 组合,以进行不同 head 的 Attention 计算。这样,实际上便是把 Attention 机制分割在 Embedding 中的不同细分逻辑子空间中(语义逻辑、语法逻辑、上下文逻辑、分类逻辑等等)来运作了。
W
Q
,
W
K
,
W
V
W^{Q},W^{K},W^{V}
WQ,WK,WV 均是 Transformer 大模型在训练阶段时,通过海量的对照语料训练集训练出来的,他们是专门用来拆解每个 token 在 Embedding 空间中的逻辑细分子空间用的。并且,这样的子空间可以有很多,不仅仅限于 8 个,一般在 Transformer 的大模型中,可以设置不同的多头数,head = 4、8、16、32 均可。但经过 Google 技术团队的反复测试得出一个结论,8 个头的综合技术得分最高,所以一般以 8 个头 head 为默认子空间数目。(注:BLEU 越高越好、PPL 则越低越好,同时还要考虑其他的指标,比如参数规模、模型维度、工作效率等等,见下表。原论文中表格3:BLEU主要考量单词翻译精确度,越高越好。PPL主要考量困惑度,越低越好)
虽然从 Embedding 向量的角度看是从 512 维降到了每一个头的 64 维,缩小了,但实际上每一个头 head 同样可以在某个子空间中表达某些细分的语义逻辑。
考虑一下这样的句子“The animal didn’t cross the street because it was too tired.”。我们先模拟出两个“头head”来看看它们各自都是把语义逻辑做怎样的细分。下图总共 8 个头之中只启用 2 个头(橙黄色、绿色),可以看出橙黄色的头把 it 关注的细分语义逻辑重点放在了“The”、“animal”上,而绿色的头把 it 关注的细分语义逻辑重点放在了“tired”身上。
如果 8 个头全部启用,每个头的语义逻辑关注点则更细腻、更有针对性。这样的细腻性来源于 Embedding 空间的独特表达方式,之所以用 512 维的向量来表达一个 token,说明这个世界上任何一个单词(token)它背后的语义逻辑可以挖掘的点实在是很多很多,别以为 512 太多了(因为有的 Embedding 维度甚至为 1024 呢~),甚至从理论上来说是趋向于无限高维的。在我稍后单独写的一篇有关 Embedding 的文章中会详细解读。当然,你可以用 1024 维来表达,不过一般 512 维的向量就足够丰富了,人间足够用了。。。。再多就带来了运算成本陡然提升的问题了,而效果未必带来长足的提升。
加个题外话,中文语言的 Embedding 语义逻辑子空间的细腻和变化程度,应该比英文高。中文字符为二维的文字,如果把一个汉字转化为 token,其内涵,语义逻辑空间,势必要比靠一维字母组合的语言文字复杂一个数量级。这也导致我们以中文为母语的人类个体思维比较复杂,单位时间内考虑信息量偏多。而西方人比较直线条思维。是高一维度好呢还是低一维度好呢?可以说各有利弊吧…,先到为止,这里就不展开了。
一个头分成8个头,战斗完毕了,还要在变回来,总不能一直是8个头的状态。于是,在 Multi-head Attention 多头注意力机制运算结束后,系统会通过 Concat 方式把 8 个子进程的结果串联起来,并通过另一个线性变换的方式恢复为原 Embedding 的 512 维的向量长度。
如何从 8 头再线性变换回来,稍后再讲解,我们先看看分成8个头后,在每个头中是如何具体运算的。
3. “Multi-Head Attention 多头注意力机制”的运算方式
3.1 先看看单头的“Attention 注意力机制”的运算方式
针对每一个 token,单头的 Attention 机制运算如下:
- 我们将一个输入序列中其中一个 token 的 Embedding 向量线性变换出来的 Q i Q_{i} Qi 向量(下图图例中为 Q 2 Q_{2} Q2)与同一序列中其他所有 token 的 Embedding 向量线性变换出来的 K i K_{i} Ki 向量进行比较,计算两者之间的语义关联度得分(即原始论文中所说的点积相似度);
- 将这些语义关联度得分转换为权重值,权重数值的大小在 0~1 之间,数值接近 1 代表权重高,即语义逻辑很紧密,比如猫和树。数值接近 0 代表权重低,比如兔子和树。所有权重数值的总和为 1,即 Softmax 归一化;
- 然后,把 Softmax 后的权重值与每个 token 的 Embedding 向量线性变换出来的 V i V_{i} Vi 做加权和,最终生成结果 Z i Z_{i} Zi(图例中为 Z 2 Z_{2} Z2)。
i
如图,在 n 个 token 组成的文本序列
X
i
X_{i}
Xi 中(黄色部分),做
Q
i
Q_{i}
Qi 中第二个向量
Q
2
Q_{2}
Q2 (青色部分)的 Attention。首先用
Q
2
Q_{2}
Q2 向量与
K
i
K_{i}
Ki(上图中 Keys 紫色部分) 中的每一个向量点乘得到紫色部分,然后再被 Softmax ,获取 0~1 之间取值范围的权重值向量,然后再和
V
i
V_{i}
Vi 做矩阵乘法(图中 Values 蓝色部分)。所以相当于是给
V
i
V_{i}
Vi 矩阵的每个向量做了一次加权和,得到
Z
2
Z_{2}
Z2 (橙色部分)。
Z
2
Z_{2}
Z2 为 Attention 后,含有上下文语义权重的新
X
2
X_{2}
X2 ,也就是说
X
2
X_{2}
X2 的变体,用
Z
2
Z_{2}
Z2 表示。原论文中对此运算用公式表达为:
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
V
Attention(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt d_{k}})V
Attention(Q,K,V)=softmax(dkQKT)V
(注:
Q
i
Q_{i}
Qi 与
K
i
K_{i}
Ki 点乘后的结果除以
d
k
\sqrt{d_{k}}
dk ,是为了缓和并稳定“梯度”的作用。“梯度”则为“梯度下降法”中的“梯度”,为神经网络在训练过程中损失函数计算中的术语,以后会单独介绍。
d
k
d_{k}
dk 为 K 矩阵的维度, Q 与 K 使用同样的维度,在这里:
d
k
d_{k}
dk=
d
m
o
d
e
l
/
h
d_{model}/h
dmodel/h = 64,
d
m
o
d
e
l
d_{model}
dmodel 为整个 Transformer 模型中所有子层和 Embedding 层的统一的输出维度,
d
m
o
d
e
l
d_{model}
dmodel 为 512。 h 为 head 数,h 默认为 8。
下面,用一个具体的例子来解释。
比如这样一句话:“He booked a room at a hotel.”。我们对其中“booked”这个单词(实际上是 token)做 Attention 机制。“booked”会对“He booked a room at a hotel.”这句话中所有的 token ,包括“booked”自己,都做一遍点乘,然后做 Softmax 。再然后,Softmax 后的结果与“He booked a room at a hotel.”转换成的 VVV 向量相乘,得到加权后的变换结果:
0.55
∗
b
o
o
k
e
d
+
0.15
∗
r
o
o
m
+
0.3
∗
h
o
t
e
l
=
b
o
o
k
e
d
0.55*booked+0.15*room+0.3*hotel=booked
0.55∗booked+0.15∗room+0.3∗hotel=booked,即“booked”这个单词可以用“
0.55
∗
b
o
o
k
e
d
+
0.15
∗
r
o
o
m
+
0.3
∗
h
o
t
e
l
0.55*booked+0.15*room+0.3*hotel
0.55∗booked+0.15∗room+0.3∗hotel” 这样一个复杂的单词来表示(把“
0.55
∗
b
o
o
k
e
d
+
0.15
∗
r
o
o
m
+
0.3
∗
h
o
t
e
l
0.55*booked+0.15*room+0.3*hotel
0.55∗booked+0.15∗room+0.3∗hotel”想象成一个单词,便能轻松理解这样表示的意义),见下图。
从中可以看出“booked”在全句中与“hotel”关联度最大,其次是“room”。所以“booked”这个单词也可以理解为“hotel-room-booked”。这便把“booked”在这句话中的本质通过“变形”给体现出来了。“booked”本身并没有变,而是通过“变形”展示出了另外一种变体状态“hotel-room-booked”。灵魂没变,外在变了。
3.2 “Multi-Head Attention 多头注意力机制”的运算方式
如之前所讲,这样的 Attention 机制(下图中左侧部分为 Attention 机制的架构图)实际上是被分配到了 8 个头 head 之中去分别运行了。每一个头在各自运行之后,再通过 Concat 把得到的结果链接起来,然后再做一次线性变换,变回初始的形状。
一个完整的 Embedding 被有机分割成 8 个子语义逻辑的“小Embedding”后进行运算,在运算完之后,便需要把 8 个被 Attention 变换后的“小Embedding”再有机组合成完整的 Embedding。于是就需要把 8 个头中每个头的 Attention 运算结果 ZiZ_{i}Z_{i} 做连接工作,即做 Concat(Concat 为一个可以连接相同形状的矩阵与矩阵的函数)。
3.3 W O W^{O} WO矩阵的引入和作用
首先我们要知道 Concat 后的矩阵实际上并不是有机地融合 8 个“小Embedding”,而只是简单地做了矩阵的前后链接。而早在当初,分出 8个头 head 时,并非直接在物理层面上八等分切割 512 长度的 Embedding 到 64 长度,而是通过线性变换得来的 8 个具有独立语义逻辑的子空间“小Embedding”。所以在 Multi-Head 运行结束后,在 Concat 后,我们需要通过 W O W^{O} WO 矩阵再做一次线性变换,即再把 8 个小的语义逻辑子空间有机地整合成一个总体的 Embedding。
这个
W
O
W^{O}
WO类似
W
Q
,
W
K
,
W
V
W^{Q},W^{K},W^{V}
WQ,WK,WV 也是在模型训练阶段一同训练出来的权重矩阵(右上角码“
O
O
O”,意为输出 “Output” 的意思)
以上,就是对 Q、K、V 矩阵与权重矩阵
W
Q
,
W
K
,
W
V
,
W
O
W^{Q},W^{K},W^{V},W^{O}
WQ,WK,WV,WO 的“线性变换“与 Multi-Head Attention 机制的较正统的解读,当然也由于我的YY导致成了封神演义和王者荣耀版的解读……但无论如何,该解读过程完全尊重了原论文中的函数公式与架构流程。
下面再看看 Multi - Head Attention 的公式表达。
用原论文公式表示为:
M
u
l
t
i
H
e
a
d
(
Q
,
K
,
V
)
=
C
o
n
c
a
t
(
h
e
a
d
1
,
.
.
.
,
h
e
a
d
h
)
W
O
MultiHead(Q, K, V) = Concat(head_1, ..., head_h)W^O
MultiHead(Q,K,V)=Concat(head1,...,headh)WO where
h
e
a
d
i
=
A
t
t
e
n
t
i
o
n
(
Q
W
i
Q
,
K
W
i
K
,
V
W
i
V
)
head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)
headi=Attention(QWiQ,KWiK,VWiV)
(
W
i
Q
∈
R
d
m
o
d
e
l
×
d
k
,
W
i
K
∈
R
d
m
o
d
e
l
×
d
k
,
W
i
V
∈
R
d
m
o
d
e
l
×
d
v
,
W
O
∈
R
h
d
v
×
d
m
o
d
e
l
)
(W_i^Q \in \mathbb{R}^{d_{model} \times d_k}, W_i^K \in \mathbb{R}^{d_{model} \times d_k}, W_i^V \in \mathbb{R}^{d_{model} \times d_v}, W^O \in \mathbb{R}^{hd_v \times d_{model}})
(WiQ∈Rdmodel×dk,WiK∈Rdmodel×dk,WiV∈Rdmodel×dv,WO∈Rhdv×dmodel)
注1: ∈ \in ∈ 为“属于”符号, R \mathbb{R} R 为“实数集”, d m o d e l d_{model} dmodel 为整个Transformer模型中所有子层和Embedding层的输出维度, d m o d e l = 512 d_{model} = 512 dmodel=512, d k = d v = d m o d e l / h = 64 d_k = d_v = d_{model}/h = 64 dk=dv=dmodel/h=64, d k d_k dk 与 d v d_v dv 在模型的执行阶段不必须相等,可以取不同的值, h h h 为head数, h h h 默认认为8。
注2:以上公式有一处需要解释一下,针对 h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) head_i = Attention(QW_i^Q, KW_i^K, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV) 这个公式很多朋友都问到了一个问题,那就是为什么用 Q Q Q、 K K K、 V V V 而不是用 X X X 来分别与 W i Q W_i^Q WiQ、 W i K W_i^K WiK、 W i V W_i^V WiV 相乘做线性变换, Q Q Q、 K K K、 V V V 应该是 X X X 分别与 W i Q W_i^Q WiQ、 W i K W_i^K WiK、 W i V W_i^V WiV 做线性变换所得的结果啊,这里会不会是原论文的笔误。解释:在Multi - Head Attention中,这个公式里的 Q Q Q、 K K K、 V V V 实际上是一种名义上的称呼,是说他们要执行各自对应的使命,而本质上他们都是 X X X 本身。注意论文中的这个图(下图)中红框圈出的部分,进程走到这里简单地分成了四个分支,其中1支直接去往后端的Add & Norm了,另外3支输入到Multi - Head Attention中,这3支就是 Q Q Q、 K K K、 V V V。如果这里需要线性变换的话,图中会给出对应的Linear变换标注的,而实际上并没有。可以将这个公式里的 Q Q Q、 K K K、 V V V 等价理解为输入矩阵 X X X 即可,即 h e a d i = A t t e n t i o n ( X W i Q , X W i K , X W i V ) head_i = Attention(XW_i^Q, XW_i^K, XW_i^V) headi=Attention(XWiQ,XWiK,XWiV)。
上面这些公式,看起来挺唬人,其实当你把Attention和Multi - Head Attention都搞明白后,再看这些就显得简单多了。
让我们举一个例子,假设一个输入的句子只有两个token,那么Attention和Multi - Head Attention是这样运算的:
-
首先,明确几个参数, d m o d e l = 512 d_{model}=512 dmodel=512。设 h h h为默认值8。 d k = d q = d m o d e l / h = 64 d_k = d_q = d_{model}/h = 64 dk=dq=dmodel/h=64。设 d v = 100 d_v=100 dv=100( d v d_v dv可以等于 d q d_q dq、 d k d_k dk,也可以不等于,这里设置100并无实际意义,只是为了举例子时方便速口算)。输入序列为2个token转化为2个Embedding向量,每个向量是512维度,即512个数值组成的向量,2个这样的向量就组成了一个形状为 2 × 512 2\times512 2×512的矩阵,命名为 X X X矩阵;
-
训练好的权重矩阵 W i Q W_i^Q WiQ和 W i K W_i^K WiK是形状为 512 × 64 512\times64 512×64( d m o d e l × d k d_{model}\times d_k dmodel×dk)的矩阵。它们把 X X X分别线性转化为 2 × 64 2\times64 2×64的 Q i Q_i Qi矩阵和 K i K_i Ki矩阵(在这里,线性转化是通过矩阵乘法执行的,即 X × W i Q X\times W_i^Q X×WiQ与 X × W i K X\times W_i^K X×WiK);
-
然后 Q i Q_i Qi与 K i T K_i^T KiT( K i K_i Ki的转秩矩阵)做矩阵乘法(或者此处可以理解为把 Q i Q_i Qi与 K i T K_i^T KiT拆分为向量做点积,与论文中提到的“the dot products of the query with all keys”一致,见下图),得到 2 × 2 2\times2 2×2矩阵,然后做 s o f t m a x ( Q K T d k ) softmax(\frac{QK^T}{\sqrt{d_k}}) softmax(dkQKT)运算,产生的结果依旧是 2 × 2 2\times2 2×2形状的矩阵,命名为 Y i Y_i Yi;
-
预训练好的权重矩阵 W i V W_i^V WiV是形状为 512 × 100 512\times100 512×100( d m o d e l × d v d_{model}\times d_v dmodel×dv)的矩阵。它把 X X X线性变化为 2 × 100 2\times100 2×100的 V i V_i Vi矩阵;
-
然后,用 Y i Y_i Yi的 2 × 2 2\times2 2×2矩阵与 V i V_i Vi的 2 × 100 2\times100 2×100矩阵做矩阵乘法,即做Attention运算 s o f t m a x ( Q K T d k ) V softmax(\frac{QK^T}{\sqrt{d_k}})V softmax(dkQKT)V得到结果 Z i Z_i Zi矩阵,形状为 2 × 100 2\times100 2×100;
-
以上的进程做8次,即 i = 1 ∼ 8 i = 1\sim8 i=1∼8。并把每次Attention的结果 2 × 100 2\times100 2×100的 Z i Z_i Zi矩阵Concat到一起,得到一个 2 × 800 2\times800 2×800的矩阵 Z c o n c a t Z_{concat} Zconcat;
-
最后,训练好的权重矩阵 W O W^O WO是形状为 800 × 512 800\times512 800×512( h d v × d m o d e l hd_v\times d_{model} hdv×dmodel)的矩阵。它把 Z c o n c a t Z_{concat} Zconcat线性变化成一个 2 × 512 2\times512 2×512的新矩阵 Z Z Z。 Z Z Z与初始输入的矩阵 X X X具有完全一样的形状,即 2 × 512 2\times512 2×512。此时 Z Z Z可以理解为 X X X做过一次Multi - Head Attention机制后产生的变体,此变体即为Transformer一词的由来。也可以理解为被太乙真人Transformer法力赋能后,哪吒从此就是一个随时可以变身为三头八臂法身的新哪吒了。本尊的灵魂没有变,但是能耐大了去了~!
这就是Transformer的核心灵魂,Attention和Multi - Head Attention!
至此,我们可以清晰地搞明白,
W
O
W^O
WO权重矩阵与
W
Q
W^Q
WQ,
W
K
W^K
WK,
W
V
W^V
WV三矩阵类似,他们都是在训练阶段随机初始化的,但是一旦训练完毕,它们的数值和形状就固定下来了。当然,你可以事先根据不同的头数
h
h
h来训练出多组这四个权重矩阵,即当
h
h
h分别为4、6、8、16、32时,四个矩阵
W
Q
∈
R
d
m
o
d
e
l
×
d
k
,
W
K
∈
R
d
m
o
d
e
l
×
d
k
,
W
V
∈
R
d
m
o
d
e
l
×
d
v
,
W
O
∈
R
h
d
v
×
d
m
o
d
e
l
W^Q \in \mathbb{R}^{d_{model} \times d_k}, W^K \in \mathbb{R}^{d_{model} \times d_k}, W^V \in \mathbb{R}^{d_{model} \times d_v}, W^O \in \mathbb{R}^{hd_v \times d_{model}}
WQ∈Rdmodel×dk,WK∈Rdmodel×dk,WV∈Rdmodel×dv,WO∈Rhdv×dmodel。实际上官方自己也是这样做,只是他们根据结果的综合评分(PPL、BLEU、参数规模、
d
m
o
d
e
l
d_{model}
dmodel等)给出了一个建议:当
h
h
h为8时效果最好。
W
O
W^O
WO矩阵的作用就是把Concat后的
Z
c
o
n
c
a
t
Z_{concat}
Zconcat矩阵线性变回同
X
X
X一样形状的矩阵
Z
Z
Z。此时,这个
Z
Z
Z便可以视作
X
X
X在做过一次Multi - Head Attention机制之后的新变体来出现,然后作为下一层编码器的输入再继续做Multi - Head Attention运算。也就是说
X
X
X是哪吒的普通肉身,
Z
Z
Z是哪吒法身。
当然,形状的恢复只是 W O W^O WO矩阵的附属功能,其主要功能则是将8个head中每个head的子语义逻辑空间中的Attention运算结果有机地整合到一个 Z Z Z中来。
最后,用一图流来把整个Multi - Head Attention的四个
W
W
W权重矩阵、
Q
Q
Q、
K
K
K、
V
V
V三矩阵、Multi - Head机制之间的逻辑关系表达一下:
4. 对“Multi-Head Attention 多头注意力机制”最通俗易懂的比喻
以上,虽然我已尽量减少用公式来解读,但是对比我一直坚持的“比喻解读”的方式则还是显得有点晦涩难懂。那么让我们看看用纯比喻的描述会是怎样的。
在上一篇文章中(Transformer 架构为什么如此强大!)我用一个公司中新进的一个员工来比喻“Self-Attention 自注意力机制”,这个新员工需要迅速地在全部成员之间做一遍工作岗位关联重要度的“Attention 注意力机制“的审查,以便自己能快速定位出自己在团队中的位置,找准自己的位置,接下来的业务与工作进展自然也会很流畅。
其实,找准个人在团队中的定位,除了在业务流程上的考量外,还有很多其他的维度需要考量,比如职位的权重、性格匹配度、男女比例关系、前辈与新兵、人际关系。。。等等等等。如果在这些不同的维度领域,都来一套“Attention 注意力机制”,这就叫“Multi-head Attention 多头注意力机制”了。如果说“Self-Attention 自注意力机制”是一个团队成功的基本必要条件,那么“Multi-head Attention 多头注意力机制”就是确保全团队最优协作的充分条件了。
相信任何一个长时间在一起磨合的团队,都会有意无意地走完这个“Multi-head Attention 多头注意力机制”的过程。这个过程可能会很漫长,并伴随着公司中各种大大小小数不尽的事情,但每每经历过一些磨合之后,团队的协作能力就会进一步提高。而且这种磨合的重头戏往往不是只集中在业务流程上,而是在职位、性格、性别、前辈与新兵、人际关系等等方面的磨合上。因为业务流程是团队存在的必须的基础,而其他方面才是团队的升华。
这也好比一个代驾司机,驾驶汽车的刹车油门方向盘的配合,以及交通法规的遵守,那只是作为一个好司机必须的基础,是业务的最底层。但是,服务好客户不能仅靠这些,更需要靠热情的服务态度、整洁的车内外卫生环境、贴心的便利化设施等等周到考量,这便是”Multi-head“的作用和意义!
全文为转载内容
来源:知乎
作者:7号床