详解Self-attention

self-attention用来解决什么问题呢?

输入是一排向量,且长度可变,例子:文字处理(输入一个句子,每次长度不一样),语音(一串声音信号其实就是一排向量)

输出是什么?三种可能性

1. 对于每一个输入都有一个label,即输入输出等长,Sequence Labeling(词性标注)

2. 对于整个sequence只有一个label(句子情感判别,说话人识别)

3. 输入输出不等长,机器自己决定输出多长,Seq2Seq任务(翻译,语音辨识)

    

为了更好的考虑整个sequence的资讯,self-attention

self-attention会吃一整个sequence进去,输入几个vector,就会对应输出几个vector(是考虑了整个sequence后的资讯),可以和fully-connected network多次叠加,交替使用,self-attention处理整个sequence的资讯,FC专注于处理某个位置的资讯。

 

  

self-attention是怎么运作的呢?

输入可以时input也可以是某个hidden layer的output,所以用a而不是x表示,代表前面有可能已经做过某些处理。

  

怎么产生b1呢?

首先要根据a1找出整个sequence中和a1相关的向量,也就是找出哪些部分是重要的,哪些部分跟判断a1是哪个label是有关系的,哪些部分是我们要决定a1的class决定a1的regression数值的时候所需要用到的资讯。

每一个向量跟a1的关联程度用一个数值叫\alpha来表示

self-attention的module怎么能够自动决定两个向量之间的关联性呢?这里就需要一个计算attention的模组,就是拿两个向量作为输入,然后它直接输出\alpha这个数值,并当作两个向量之间的关联程度,比较常见的作法叫做用Dot-product.把输入的两个向量分别乘上两个不同的矩阵Wq,Wk,然后得到q和k这两个向量,然后再把q和k做Dot-product就得到\alpha,该方法也是用在transformer里面的方法。当然还有其他的计算方式

要用a1和a2,a3,a4分别去计算它们之间的关联性,也就是计算它们之间的\alpha,具体怎么做呢?

用a1乘上Wq得到q1,这里的q有个名字,叫作query,就像是你用搜索引擎的时候去搜索相关文章的问题,

接下来a1,a2,a3,a4都要乘上Wk得到k1,k2,k3,k4,这里的k这个vector也有个名字,叫作Key

用q1和每一个k1,k2,k3,k4分别做Inner-product就得到\alpha11,\alpha12,\alpha13,\alpha14,比如\alpha12就代表query是a1提供的key是a2提供的时候二者之间的相关性,这里的\alpha也有一个称号,叫作Attention score

以此类推

接下来会做一个softmax,其实没有什么道理,也不一定非得用softmax, 可以用别的东西,也没有问题,比如有人尝试说用ReLU

接下来会用a1,a2,a3,a4分别乘上新的向量Wv,得到v1,v2,v3,v4, 然后用得到的每个向量都去乘上attention的分数,然后再加起来就得到了b1

  

同理,b2,b3,b4也类似得到

值得注意的是,这里的b1,b2,b3,b4并不需要依序产生,它们是同时被计算出来的

从矩阵乘法的角度,每一个a都要产生q,k,v, 于是可以把a1,a2,a3,a4拼起来看作是一个矩阵I,

   

      

 

其实上面一串操作就是一系列矩阵的乘法,

I是self-attention的input,是一排vector拼起来,分别乘上3个矩阵Wq,Wk,Wv,得到Q,K,V这三个矩阵,........O是self-attention这个layer的输出

会发现self-attention这个layer里面算了一个很复杂的操作,其实这里面唯一需要学的参数就只有Wq,Wk,Wv而已,只有这三个是未知的,是需要透过我们的训练资料把它找出来的,其他的操作都没有未知的参数,都是我们人为设定好的

self-attention有一个进阶的版本,叫作Multi-head Self-attention,在今天的使用是非常广泛的

有些任务,比如机器翻译,语音辨识,反而需要比较多的head能得到比较好的效果,那至于需要用多少的head,这个又是另外一个超参,也是你需要调的

为什么可能需要比较多的head呢?你可以想成说相关这件事情有很多不同的形式,有很多种不同的定义,也许不能只有一个q,应该有多个q,不同的q负责不同种类的相关性

如果要做Multi-head self-attention会做什么操作呢?

会先用ai乘上一个矩阵得到qi,接下来再用q乘上另外两个矩阵分别得到qi1,qi2,这里i代表位置,1和2代表不同的head,来找两种不同的相关性,同理,k,v都有两个

接下来,把1类的那类一起做,2类的那类一起做

   

接下来会把bi1,bi2接起来,再乘上一个矩阵,得到bi,再送到下一层去

到这里会发现,其实self-attention少了一个很重要的资讯,就是位置的资讯,对于一个input,它是出现在前面还是后面,是完全没有这个资讯的,位置1,2,3,4没有任何差别。

有时候位置的资讯也会很重要,比如说POS tagging

所有在做self-attention的时候,如果觉得位置的资讯是比较重要的,那你可以把位置的资讯把它塞进去,怎么把位置的资讯塞进去呢,这里就要用到一个叫作positional encoding的技术,具体是,为每一个位置设定一个vector,叫作positional vector,这个用ei来表示,上标i代表的是位置,每一个不同的位置,就会有不同的vector,把这个ei加到ai上面,就结束了,等于就是告诉self-attention位置的资讯

那这个ei长什么样呢?如下

   

   

   

   

   

参考:李宏毅2021春机器学习

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值