注意力机制

看完李沫讲解的Transformer,写一些笔记。只看了注意力机制而不是Transformer本身。

注意力层

输入一个(多个)请求query和许多对key和value(都是一维向量),使用某种相似度计算函数,查询出与query最相似的key对应的value的值。不同的相似度计算方法衍生出不同的注意力机制。

# Scaled Dot-Product Attention 最简单的注意力机制,“缩放后的内积注意力”,其query和key拥有相同的长度dkd_k,value的长度是dvd_v(由此可知输出的向量长度就是dvd_v)。此方法将query和key的内积作为相似度,即,query与所有key中内积较大的相似度高,内积较小的相似度低。 具体的计算方法是,将query与每一个key做内积,得到的每一个相似度进行“缩放”后使用[[多分类问题#softmax回归算法|softmax]]对所有相似度进行归一化,使用归一化相似度对value进行加权求和则得到最终的输出。实际使用中使用公式如下 Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(\frac{Q\cdot K^T}{\sqrt{d_k}})V 其中Q为长度为dkd_k的查询向量,而K为n×dkn\times d_k的矩阵(n为key的个数),这里使用QKTQ \cdot K^T这样的矩阵乘计算query与每一个key的内积,得到一个长度为n的相似度向量,接着除以dk\sqrt{d_k}进行缩放,经过softmax归一化后与value矩阵V相乘以完成加权求和操作。V为一个n×dvn \times d_v的矩阵。 当然,更进一步,如果有许多个查询向量,那么Q就是一个查询向量矩阵,计算方法还是一样的。
之所以需要除以dk\sqrt{d_k}进行缩放,是因为在dkd_k较大时,内积得到的相似度可能较大,使得softmax函数在输入都偏大,导致梯度消失。所以除一下。

多头注意力机制

注意力机制中,所有的Q,K,V都是输入,这意味着,没有可以用于学习的权重(啊这)。所以引入多头注意力机制,首先使用h×3h \times 3个线性层将Q,K,V投影到低维,再使用hh个注意力层计算出value,直接将这些value拼接起来,再通过一个线性层投影得到最终结果。 MultHead(Q,K,V)=Concat(head1,head2headh)WOheadi=Attention(QWiQ,KWiK,VWiV)\begin{aligned} MultHead(Q,K,V)=Concat(head_1, head_2\dots head_h)W^O \\ head_i=Attention(QW_i^Q,KW_i^K,VW_i^V) \end{aligned} 其中这些线性层的参数是可以训练的,取的h越多,模型可能学到的不同映射方法就越多(Transformer中使用的h=8h=8)。在实际上实现的时候可以先拼接Q,K,V,用一个线性层投影得到Q,K,V三个各自的h个不同投影(一次乘以h个不同的矩阵,可以借用batch来实现),再拆分进行Attention操作。

自注意力机制

Transformer使用的就是自注意力机制,即将输入既作为Q,又做为K,又做为V,当然因为内部是多头注意力机制所以进行缩放和内积前对Q,K,V进行了投影操作。可以看出,通过合理设置线性层的大小,自注意力层的输入和输出的大小可以是完全一样的。这就是在Transformer中的情况,输入为n个长度为dkd_k词向量组成的n×dkn \times d_k的矩阵,则其Q,K,V也是同样的,输出大小也相同(也许是为了加上残差连接)。