其中Q∈Rn×dk,K∈Rm×dk,V∈Rm×dv。而Multi-Head Attention,就是将Q,K,V分别用h个不同的投影矩阵投影h次,然后分别做h次Single-Head Attention,最后把结果拼接起来,即
多头注意力,没个头的参数是不一样的,提取不一样的特征
在实际使用中,Q,K,V一般具有相同的特征维度dk=dv=d(即hidden_size),比如BERT Base里边是768;h一般选择12、16、24等,比如BERT base里边是12;确定了d,h之后,通常的选择是让投影矩阵W∈Rd×(d/h),也就是说,每个Attention Head里边,是将原始的d维投影到d/h维,然后在进行Attention运算,输出也是d/h维,最后把h个d/h维的结果拼接起来,得到一个d维的输出。这里的d/h我们通常称为head_size。
方便后面拼接,没个头的维度刚好做了限制d/h维
那没有其他办法了吗?有!当我们用投影矩阵将Q,K,V都投影到低维时,前面都是将它们投影到d/h维,但其实它们的维度不一定要相等,而是只需要保证Q,K的维度相等就行了(因为要做内积),为了区别,我们通常称Q,K的维度为key_size,V的维度才叫head_size,改变key_size的大小而不改变head_size的话,也不影响模型的hidden_size。
所以,这篇论文提出来的解决方法就是增大模型的key_size,它能增加Attention的表达能力,并且不改变模型整体的hidden_size,计算量上也只是稍微增加了一点。
补充说明:
事实上原论文考虑的是同时增大key_size和head_size、然后Multi-Head Attention的输出拼接之后再用一个变换矩阵降维,但笔者认为由于拼接降维这一步只是一个线性变换,所以本质上的提升还是来源于增大key_size,所以本文只强调了增大key_size这一步。
此外,如果同时增大key_size和head_size,那么会导致计算量和显存消耗都明显增加,而只增大key_size的话,增加的资源消耗就小很多了。
理解代码的实际运算的维度本质,矩阵运算的本质,思想的本质就是不同维度的映射,以及维度的表达而已
在前一篇论文里边,我们提到了低秩瓶颈,也就是由于key_size太小所以Q(i)K(i)⊤表达能力不足,因此softmax之后无法很好地建议完整的二元分布。为了缓解这个问题,除了增大key_size之外,还有没有其他方法呢?有,比如这篇论文使用的混合分布思路。
所谓混合分布,就是多个简单分布的叠加(比如加权平均),它能极大地增强原分布的表达能力。典型的例子是高斯混合模型:我们知道高斯分布只是一个常见的简单分布,但多个高斯分布叠加而成的高斯混合分布(也叫高斯混合模型,GMM)就是一个更强的分布,理论上来说,只要叠加的高斯分布足够多,高斯混合分布能逼近任意概率分布。这个例子告诉我们,想要增加Attention中分布的表达能力,又不想增加key_size,那么可以考虑叠加多个低秩分布。
那么“多个”低秩分布哪里来呢?不是有Multi-Head嘛,每个head都带有一个低秩分布,就直接用它们叠加就行了,这就是Talking-Heads Attention了。具体来说,它的形式是:
把原来的简单直接拼接,到做了一些线性相关的运算,然表达能力更强,效果更好,思想就是高斯混合分布的思想或者说集成的思想
如果您需要引用本文,请参考:
苏剑林. (Apr. 13, 2020). 《突破瓶颈,打造更强大的Transformer 》[Blog post]. Retrieved from https://kexue.fm/archives/7325