1.Attention公式
想必大家对Transformer中Attention公式不陌生
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、K、V三个矩阵不谈,self-Attention最原始的形态其实长上面这样。那么这个公式到底是什么意思呢?
我们一步一步讲
2. X X T XX^T XXT代表什么
X X T XX^T XXT代表什么?
一个矩阵乘以它自己的转置,会得到什么结果,有什么意义?
我们知道,矩阵可以看作由一些向量组成,一个矩阵乘以它自己转置的运算,其实可以看成这些向量分别与其他向量计算内积。(此时脑海里想起矩阵乘法的口诀,第一行乘以第一列、第一行乘以第二列…嗯哼,矩阵转置以后第一行不就是第一列吗?这是在计算第一个行向量与自己的内积,第一行乘以第二列是计算第一个行向量与第二个行向量的内积第一行乘以第三列是计算第一个行向量与第三个行向量的内积…)
向量的内积,其几何意义是什么?
答:表征两个向量的夹角,表征一个向量在另一个向量上的投影
我们假设 X = [ X 1 T ; X 2 T ; X 3 T ] X = [X_1 ^ T;X_2 ^ T;X_3 ^ T] X=[X1T;X2T;X3T] ,其中 X为一个二维矩阵, X i T X_i ^ T XiT 为一个行向量(其实很多教材都默认向量是列向量,为了方便举例请读者理解笔者使用行向量)。对应下面的图, X 1 T X_1 ^ T X1T 对应"早"字embedding之后的结果,以此类推。
下面的运算模拟了一个过程,即 X X T XX^T XXT。我们来看看其结果究竟有什么意义
首先,行向量 X i T X_i ^ T XiT 分别与自己和其他两个行向量做内积(“早"分别与"上”"好"计算内积),得到了一个新的向量。我们回想前文提到的向量的内积表征两个向量的夹角,表征一个向量在另一个向量上的投影。那么新的向量向量有什么意义的?是行向量 X i T X_i ^ T XiT在自己和其他两个行向量上的投影。我们思考,投影的值大有什么意思?投影的值小又如何?
投影的值大,说明两个向量相关度高。
我们考虑,如果两个向量夹角是九十度,那么这两个向量线性无关,完全没有相关性!
更进一步,这个向量是词向量,是词在高维空间的数值映射。词向量之间相关度高表示什么?是不是在一定程度上(不是完全)表示,在关注词A的时候,应当给予词B更多的关注?
上图展示了一个行向量运算的结果,那么矩阵 X X T XX^T XXT的意义是什么呢?
矩阵 X X T XX^T XXT是一个方阵,我们以行向量的角度理解,里面保存了每个向量与自己和其他向量进行内积运算的结果。
3.softmax的意义
至此,我们理解了公式
s
o
f
t
m
a
x
(
X
X
T
)
softmax(XX^T)
softmax(XXT)中,
X
X
T
XX^T
XXT的意义。那么更进一步的话,softmax的意义是什么呢?回忆一下softmax公式
s
o
f
t
m
a
x
(
z
i
)
=
e
z
i
∑
c
=
1
c
e
z
c
softmax(z_i) = \frac{e^{z_i}}{\sum _{c=1} ^ ce^{z_c}}
softmax(zi)=∑c=1cezcezi
所以softmax的作用,在于归一化
结合上面的图,经过softmax以后,这些数字的和就为1了。我们再想,Attention机制的核心是什么?
加权求和
那么权重从何而来呢?就是这些归一化之后的数字。当我们关注"早"这个字的时候,我们应当分配0.4的注意力给它本身,剩下0.4关注"上",0.2关注"好"。当然具体到我们的Transformer,就是对应向量的运算了,这是后话。
行文至此,我们对这个东西是不是有点熟悉?Python中的热力图Heatmap,其中的矩阵是不是也保存了相似度的结果?
4.最后一个X的意义
我们仿佛已经拨开了一些迷雾,公式
s
o
f
t
m
a
x
(
X
X
T
)
softmax(XX^T)
softmax(XXT)已经理解了其中的一半。最后一个 X 有什么意义?完整的公式究竟表示什么?我们继续之前的计算,请看下图
我们取
s
o
f
t
m
a
x
(
X
X
T
)
softmax(XX^T)
softmax(XXT)的一个行向量举例,这一行向量与X相乘,表示什么?
观察上图,行向量与X相乘,得到了一个新的行向量,且这个行向量与原来的行向量的维度相同。
在新的向量中,每一个维度的数值都是由三个词向量在这一维度的数值加权求和得来的,这个新的行向量就是"早"字词向量经过注意力机制加权求和之后的表示。
一张更形象的图是这样的,图中右半部分的颜色深浅,其实就是我们上图中黄色向量中数值的大小,意义就是单词之间的相关度(回想之前的内容,相关度其本质是由向量的内积度量的)!
如果您坚持阅读到这里,相信对公式
s
o
f
t
m
a
x
(
X
X
T
)
softmax(XX^T)
softmax(XXT)已经有了更深刻的理解。
5.QKV矩阵
在我们之前的例子中并没有出现Q、K、V的字眼,因为其并不是公式中最本质的内容。
Q、K、V究竟是啥?我们看下面的图
其实,许多文章中所谓的Q、K、V矩阵、查询向量之类的字眼,其来源是
与矩阵的乘积,本质上都是X的线性变换。
为什么不直接使用X而要对其进行线性变换?
当然是为了提升模型的拟合能力,矩阵W都是可以训练的,起到一个缓冲的效果。
如果你真正读懂了前文的内容,读懂了 s o f t m a x ( X X T ) softmax(XX^T) softmax(XXT)这个矩阵的意义,相信你也理解了所谓查询向量一类字眼的含义。
6. d k \sqrt{d_k} dk的意义
假设Q, K里的元素的均值为0,方差为1,那么 A T = Q T K A^T = Q^T K AT=QTK中元素的均值为0,方差为d. 当d变得很大时, A中的元素的方差也会变得很大,如果A中的元素方差很大,那么 s o f t m a x ( A ) softmax(A) softmax(A)的分布会趋于陡峭(分布的方差大,分布集中在绝对值大的区域)。总结一下就是 s o f t m a x ( A ) softmax(A) softmax(A)的分布会和d有关。因此A 中每一个元素除以 d k \sqrt{d_k} dk后,方差又变为1。这使得 s o f t m a x ( A ) softmax(A) softmax(A)的分布“陡峭”程度与d解耦,从而使得训练过程中梯度值保持稳定。
7.Scaled Dot-Product Attention
原始论文中,有scaled dot-product attention的结构图。
上面的图中
scale指的是Q与K计算得到的相似度,再经过一定的量化,具体就是除以
d
k
\sqrt{d_k}
dk
dot-prodcut 指的是将Q与K之间通过计算点积,作为相似度
Mask是可选项,目的是将 padding的部分 填充负无穷,这样算softmax的时候这里就attention为0,从而避免padding带来的影响.
Mask attention 的思想是 掩盖掉部分内容,不参与 attention 的计算,或许是因为不需要,或许因为不存在,根据实际场景来;
不参与attention计算 其实 就把 qk = 0 就行了