怎么理解注意力机制和自注意力机制
一、注意力机制
对于一张图片,我们在观察它使,一定会有我们特别注意的地方和忽略的地方,而对于机器,对于一个模型来说,它无法理解到哪些地方重要,哪些地方不重要.
从而注意力机制诞生了。
如上图所示,我们在理解一个事物时,往往会着重观察某一些地方从而给出判断,也有一些地方时是忽略的,甚至完全不注意。上图红色越重的地方代表着,我们眼睛越关注越聚焦,因为那些区域的信息更有效,信息更丰富。注意力机制就是想让机器也可以特别关注到一些重要的地方,忽略不重要的地方
1. 注意力机制的实现
假设对于我来说,想知道图片上对于自己来说哪些是重点,我需要一个Q作为查询对象,去查询图片内容哪些对我重要,哪些对我不重要,图片有其自己的值V(被查询对象),这里的Q和V可以理解为向量。
那么Q是如何得到V对自己来说哪些是重点呢------即用Q去点乘V得到二者的相似度,相似度就可以理解为重要度,之前说过Q和V可以理解为向量,向量的内积正可以体现出两个向量的的相似度,两个向量越接近内积的值就越大,相似度就越大。也就是说,Q与V的内积的值的大小就代表着V对Q的重要程度。
假设有 K = k 1 , k 2 , k 3 , ⋯ , k n K = k_1, k_2, k_3, \cdots , k_n K=k1,k2,k3,⋯,kn(这里的K可以理解为V,或者与V同源),现在想要得到Q对K中每一个事物的相似度,即将Q与 K K K中的 k 1 , k 2 , k 3 , ⋯ k_1, k_2, k_3, \cdots k1,k2,k3,⋯分别做点积即可,这样可以得到一组相似度值 ( a 1 , a 2 , a 3 , ⋯ , a n ) (a_1, a_2, a_3, \cdots, a_n) (a1,a2,a3,⋯,an)在对这项相似度值做一层 s o f t m a x ( ( a 1 , a 2 , a 3 , ⋯ , a n ) ) softmax((a_1, a_2, a_3, \cdots, a_n)) softmax((a1,a2,a3,⋯,an))就可以得到Q对K内的每个事物的重要度概率值 p 1 , p 2 , p 3 , ⋯ , p n p_1, p_2, p_3, \cdots, p_n p1,p2,p3,⋯,pn
我们还得进行一个汇总,当你使用 Q 查询结束了后,Q 已经失去了它的使用价值了,我们最终还是要拿到这张图片的,只不过现在的这张图片,它多了一些信息(多了于我而言更重要,更不重要的信息在这里)。
原本的图片信息 V = v 1 , v 2 , v 3 , ⋯ , v n V=v_1, v_2, v_3, \cdots, v_n V=v1,v2,v3,⋯,vn,加上对于我来说哪些的 v i v_i vi更重要,哪些不重要
新的 V ′ = p 1 ∗ v 1 + p 2 ∗ v 2 + p 3 ∗ v 3 + ⋯ + p n ∗ v n V'=p_1*v_1+p_2*v_2+p_3*v_3+\cdots+p_n*v_n V′=p1∗v1+p2∗v2+p3∗v3+⋯+pn∗vn
这样用新的
V
′
V'
V′代替旧的
V
V
V,它比之前的多了‘我’的喜好信息。上面所提到的K,V可以是相等的,也可以是不等的,但即使不等也应该是同源的,因为其代表着图片的原始信息
二、自注意力机制
self-attention机制可以理解为注意力机制的一个具体的实例
self-attention机制的实现方式如下图所示
首先可以看到 Self Attention 有三个输入 Q、K、V:对于 Self Attention,Q、K、V 来自句子 X 的 词向量 x 的线性转化,即对于词向量 x,给定三个可学习的矩阵参数 W Q , W K , W V W_Q,W_K,W_V WQ,WK,WV(这三个矩阵都是要经过训练得到的),x 分别右乘上述矩阵得到 Q、K、V。Q,K,V这三个矩阵在自注意力机制中是同源的,即 Q ≈ K ≈ V Q\approx K\approx V Q≈K≈V
(部分同学可能对原始的词向量X是从何而来。这里给出答案:它是通过预训练而来。因为语言逻辑基本都是相同的,比如说我们通过一本书的所有文字训练得到里面所有词的向量,它其实可以用作回答我们的提问,但针对某一个具体的任务是它未免有偏差,这就需要对预训练相互来的X进行调整让他获取更多的关于这一具体任务的信息,从而在高维空间中找到更加符合这一任务的位置)
接下来为了表示的方便,我们先通过向量的计算叙述 Self Attention 计算的流程,然后再描述 Self Attention 的矩阵计算过程
1. Q,K,V从何而来
上图操作:两个单词 Thinking 和 Machines。通过线性变换,即 x 1 x_1 x1 和 x 2 x_2 x2 两个向量分别与 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV 三个矩阵点乘得到的 q 1 , q 2 , k 1 , k 2 , v 1 , v 2 q_1, q_2, k_1, k_2, v_1, v_2 q1,q2,k1,k2,v1,v2共 6 个向量。矩阵 Q 则是向量 q 1 , q 2 q_1, q_2 q1,q2的拼接,K、V 同理。所有的词共用 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV。
2. 计算相似度值(即MatMul操作)
上图操作:向量
q
1
,
k
1
q_1, k_1
q1,k1 做点乘得到得分 112,
q
1
,
k
2
q_1, k_2
q1,k2 做点乘得到得分96。同理
q
2
q_2
q2也会对
k
1
,
k
2
k_1, k_2
k1,k2做同样的操作。注意:这里是通过
q
1
q_1
q1 找到对于
x
1
x_1
x1来说
x
1
,
x
2
x_1, x_2
x1,x2中的重要信息。
3. Scale&Softmax
对于这里为什么要对得到的重要度值先进行规范化Scale再来Softmax
这里简单讲解除以 d k \sqrt{d_k} dk的作用:假设 Q , K Q,K Q,K 里的元素的均值为0,方差为 1,那么 A = Q T K A=Q^TK A=QTK中元素的均值为 0,方差为 d。当 d 变得很大时, A A A中的元素的方差也会变得很大,如果 A A A中的元素方差很大(分布的方差大,分布集中在绝对值大的区域),在数量级较大时, softmax 将几乎全部的概率分布都分配给了最大值对应的标签,由于某一维度的数量级较大,进而会导致 softmax 未来求梯度时会消失。总结一下就是 s o f t m a x ( A ) softmax(A) softmax(A)的分布会和d有关。因此 A A A中每一个元素乘上 1 d k \frac{1}{\sqrt{d_k}} dk1后,方差又变为 1,并且 A A A的数量级也将会变小。
用大白话来说,这是因为Softmax的一个缺陷:
假设相似度值为:
52, 48经过Softmax–>0.52, 0.48
88, 12经过Softmax–>0.999, 0.001
就是说只有当两个相似度值相差较近的时候经过Softmax得到的概率值才比较合理,相差较大时,得到的概率值是非常不合理的,所以就需要先进行规范化,缓和一下差值,得到一个更为合理的概率值
4. MatMul得到新的词向量(z)
用得分比例 [ 0.88 , 0.12 ] [0.88,0.12] [0.88,0.12] 乘以 [ v 1 , v 2 ] [v_1, v_2] [v1,v2] 值得到一个加权后的值,将这些值加起来得到 [ z 1 , z 2 ] [z_1, z_2] [z1,z2]。
上述过程就是self-atention所做的事,对于词Thinking而言用 q 1 q_1 q1与 K = [ k 1 , k 2 ] K=[k_1,k_2] K=[k1,k2]相乘得到Thinking与其自身和Machine的相似度,在经过Scale和Softmax得到权重值后与 V = [ v 1 , v 2 ] V=[v_1,v_2] V=[v1,v2]相乘再相加得到新的Thinking的词向量 z 1 z_1 z1,同理Machine以同样的方式得到新的词向量 z 2 z_2 z2
上面所演示的都是单个向量的计算,我们可以将向量拼接成矩阵,加快运算的速度,输入是一个 [2x4] 的矩阵(句子中每个单词的词向量的拼接),每个运算是 [4x3] 的矩阵,求得 Q、K、V。
Q 对 K 转制做点乘,除以 d k \sqrt{d_k} dk,再做一个 Softmax conger得到合为 1 的比例,对 V 做点乘得到输出 Z。那么这个 Z 就是一个考虑过 Thinking 周围单词 Machine 的输出。
注意看这个公式, Q K T QK^T QKT其实就会组成一个 word2word 的 attention map!(加了 softmax 之后就是一个合为 1 的权重了)。比如说你的输入是一句话 “i have a dream” 总共 4 个单词,这里就会形成一张 4x4 的自注意力机制的图,里面的每一个元素代表着一个权重值,每一行和为1:
这样一来,每一个单词对应每一个单词都会有一个权重,这也是 Self Attention 名字的来源,即 Attention 的计算来源于 Source(源句) 和 Source 本身,通俗点讲就是 Q、K、V 都来源于输入 X 本身。
三、注意力机制与自注意力机制的差别
说白了,自注意力机制可以理解为注意力机制的一个子类,注意力是父亲,自注意力是儿子,注意力机制是一个很广泛很庞大的概念,它提出了利用Q和K来得到权重值,在原来V的基础上得到一个富含重要度信息的一个新的 V ′ V' V′,但它并为提出Q,K,V究竟从何而来。
而自注意力就是一个注意力机制的具体实现,他提出了Q,K,V的具体来源,它们是同源的。
比如说交叉注意力机制,Q,V不同源但K,V是同源的,它同样也只是注意力机制的子类
出Q,K,V究竟从何而来。
而自注意力就是一个注意力机制的具体实现,他提出了Q,K,V的具体来源,它们是同源的。
比如说交叉注意力机制,Q,V不同源但K,V是同源的,它同样也只是注意力机制的子类
参考文献
[1] 预训练语言模型的前世今生