Self-attention module详解

Self-attention module详解

1. Data Input and Output

生活中解决实际问题时,可能会遇到一组向量作为输入的情况,这种输入情况称作为Vector Set as Input。这类问题常常出现在文本翻译,语音识别,图(Graph)分析中。

那么这类问题的输出,就是一组或一个label,根据输出label个数不同可以分为以下三类:

情况1. 每个向量都会有一个label

I
N
saw
V
a
DET
saw
N

上面这个例子就是每个单词都会对应输出其词性label,每个单词可以看作是一个向量。

情况2. 这组向量共同输出一个label值

比如在语音识别上,一段语音,去判断这段语音是谁说的。

情况3. label输出个数是不确定的

在这种情况下,label个数是由模型自动决定的,典型的模型代表是seq2seq模型,情况3也是在文本翻译上所面临的问题。

2. Sequence Labeling

考虑情况一,其中的例子稍微做一个改动,考虑为这个句子中每个单词都需要输出其意思,那么这个问题也是每个向量都会输出一个label的问题。

I
FC
saw
FC
a
FC
saw
FC
output
output
output
output

那么如果是不考虑上下文的情况,用相同的FC模型去推理,前后两个saw输入向量是完全一致的,模型没有理由会输出两个不一样的翻译结果。

那么解决这个问题的一个思路是将上下文加入,也就是设置一个像滑动窗的window,将window所覆盖的单词作为一个整体输入进行训练,得到模型再进行推理。

这个方法在一些简单问题的情况下可以取得不错的效果,但是这种思路也会存在其瓶颈。比如在sequence特别长的情况下,又需要考量整个sequence才可以得出结果的情况;sequence在文本翻译情况下长度是变化的,可长可短。若强行继续使用window的方式,并将window开大,来训练网络,那么会使得运算量急剧增大,同时也会有over-fitting的危险。

为了解决上述可能遇到的复杂输入情况,又还需要继续结合上下文分析的思路走,那么self-attention机制就是解决这种问题而产生的。

3. Self-Attention

3.1 Self-Attention与网络结构的关系

self-attention与最初的开大window有相同的想法,那就是接收了整个sequence,考虑到了整个sequence的上下文。比起window直接塞进网络训练,self-attention做了一些计算上下文关联度的操作。

我们在开始部分说到,sequence是一组向量,“vector set as input”,这么一组向量经过self-attention module后会输出与输入向量数目相等的向量,也就是说,输入了多少向量,也会输出多少向量。self-attention module可以与FC重复叠加,一个简单重复叠加网络结构可以设计如下所示。

vector
self-attention module
vector
vector
vector
FC
FC
FC
FC
self-attention module
FC
FC
FC
FC
output
output
output
output

Note: self-attention这个著名的模块是在《Attention is all you need》这篇文章提出的,在这篇文章中其实是提出了Transformer架构,self-attention是其中的一个模块,后来发扬光大的部分。

3.2 Self-Attention内部计算过程

self-attention模块最终的输出是一组向量,当我们输出第一个向量   b 1 \ b^1  b1时,模块内部做了哪些操作呢?sequence输入时,会计算每个向量与其他向量的关联度,如下图所示(台大李宏毅教授PPT)。

在这里插入图片描述

两个向量之间的关联度定义为   α \ \alpha  α,计算过程如下图所示。

向量乘
=
向量乘
=
a_1
Wq
q
a_2
Wk
k
α=q dot k

这个过程计算出来关联度定义为   α 1 , 2 \ \alpha_{1,2}  α1,2,同理我们可以计算出   α 1 , 3 , α 1 , 4 \ \alpha_{1,3}, \alpha_{1,4}  α1,3,α1,4,同时还需要计算同自己的关联度   α 1 , 1 \ \alpha_{1,1}  α1,1。此时我们得到了四个关联值,但它们还不是最终的关联值,还需要通过一层激活函数,我们可以假定是softmax函数。

也就是说,经过softmax之后,才得到了   a 1 \ a^1  a1   a 2 , a 3 , a 4 \ a^2,a^3,a^4  a2,a3,a4之间的最终关联度   α 1 , 1 ′ , α 1 , 2 ′ , α 1 , 3 ′ , α 1 , 4 ′ \ \alpha'_{1,1},\alpha'_{1,2},\alpha'_{1,3},\alpha'_{1,4}  α1,1,α1,2,α1,3,α1,4

此时,就可以通过得到的关联度计算   a 1 \ a^1  a1所对应的self-attention输出   b 1 \ b^1  b1了。计算过程如下

在这里插入图片描述

  v 1 , v 2 , v 3 , v 4 \ v^1,v^2,v^3,v^4  v1,v2,v3,v4相乘并求和,就得到了输出值   b 1 \ b^1  b1

其他向量的计算输出过程也是以此类推,便不再赘述。

3.3 向量公式表示Self-Attention内部计算过程

q 1 q 2 q 3 q 4 = W q a 1 a 2 a 3 a 4 \pmb{q^1q^2q^3q^4=W^qa^1a^2a^3a^4} q1q2q3q4=Wqa1a2a3a4q1q2q3q4=Wqa1a2a3a4q1q2q3q4=Wqa1a2a3a4

左边写为   Q \ \pmb{Q}  QQQ,右边写成   I \ \pmb{I}  III,那么可以写成下面这种形式
Q = W q I \pmb{Q=W^qI} Q=WqIQ=WqIQ=WqI

k 1 k 2 k 3 k 4 = W k a 1 a 2 a 3 a 4 \pmb{k^1k^2k^3k^4=W^ka^1a^2a^3a^4} k1k2k3k4=Wka1a2a3a4k1k2k3k4=Wka1a2a3a4k1k2k3k4=Wka1a2a3a4
左边写为   K \ \pmb{K}  KKK得到
K = W k I \pmb{K=W^kI} K=WkIK=WkIK=WkI

v 1 v 2 v 3 v 4 = W v a 1 a 2 a 3 a 4 \pmb{v^1v^2v^3v^4=W^va^1a^2a^3a^4} v1v2v3v4=Wva1a2a3a4v1v2v3v4=Wva1a2a3a4v1v2v3v4=Wva1a2a3a4

左边写成   V \ \pmb{V}  VVV得到
V = W v a 1 a 2 a 3 a 4 \pmb{V=W^v a^1a^2a^3a^4} V=Wva1a2a3a4V=Wva1a2a3a4V=Wva1a2a3a4
在这里插入图片描述

在这里插入图片描述

A = K T Q \pmb{A=K^T Q} A=KTQA=KTQA=KTQ
在经过一次softmax激活函数,得到   A ′ \ \pmb{A'}  AAA

在这里插入图片描述

得到的   A ′ \ \pmb{A'}  AAA再前乘一个   V \ \pmb{V}  VVV向量即可得到self-attention模块的向量集输出。
b 1 b 2 b 3 b 4 = v 1 v 2 v 3 v 4 A ′ \pmb{b^1b^2b^3b^4=v^1v^2v^3v^4A'} b1b2b3b4=v1v2v3v4Ab1b2b3b4=v1v2v3v4Ab1b2b3b4=v1v2v3v4A

Reference

[1] 台大李宏毅教授self-attention PPT

[2] 台大李宏毅教授self-attention 课程讲解视频

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值