本文将对自注意力(self attention)进行简要分析,它是tranformer中最重要的模块,而transformer又是bert类模型重要组成部分,所以充分了解自注意力是非常必要的。主要原理来自Google的《Attention Is All You Need》。
首先把Attention的定义给出来:
对于(1)其实很好理解,注意力公式主要就是算V的加权后的表示,说到加权,必要得有权重啊。权重就是前面的softmax(~)部分,为什么要加softmax,因为权重必须为概率分布即和为1。softmax里面部分算的就是注意力的原始分数,通过计算Q(query)与K(key)的点积得到相似度分数,其中
但是Google为了更加完善Attention机制,增强Attention的表示能力,提出了Multi-Head Attention,即多头注意力机制。从公式上看,其实很简单,就是把Q,K,V通过参数矩阵进行线性变换一下,然后再做Attention,最后重复h次,结果拼接起来就好了。公式如下:
=========================
Pytorch代码如下:
class
在pytorch上的小实验,用法就是先将Self Attention类实例化,然后输入记得有两个,x_in和x_mask。x_mask = (input_ids > 0).float(),也就是非padding置为1,padding部分置为0。
shape分别为:x_in = [bs, seqlen, hid_size],x_mask = [bs, seqlen]
![v2-59408426def743238b1a7e4096425a96_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=e24955a5-462f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-59408426def743238b1a7e4096425a96_b.jpg)
-完结-