【深度学习系列】五、Self Attention

Self Attention

https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/self_v7.pdf

引入

目前说的DNN都是输入一个vector,经过网络得到一个output,但通常也会遇到一些其他场景,输入的vector个数并不固定,比如输入是一段句子、一段声音、一个社交网络或者是图结构的其他形态,不同场景下的输出也有不同要求:

1)每个输入vector对应一个class/scalar,i.e., N to N

如:词性标注、语音领域的音标(phonetic)辨识、推荐任务下对每个样本推荐一个商品

2)多个输入vector输出一个class/scalar,i.e., N to 1

如:情感极性分析

3)多个输入vector输出多个class/scalar,i.e., N to N’

如:翻译任务

Self Attention着重于解决N to N的问题,这类问题也被成为Sequence Labeling.

网络架构

要解决Sequence Labeling的问题,最容易想到的就是将被一个Sequence使用FC得到需要的class/scalar,但这没有考虑到Sequence的上下文,比如词性标注任务中 I saw a saw,对于FC来说两个saw是同一个词汇 没有理由输出不同的结果,但我们期待第一个saw是动词 而第二个saw是名词,这会是FC非常的混乱。

考虑上下文语义的信息,最直接的方式可以将Sequence前后的若干vector都输入到一个FC中,在某些场景下(如词性标记)就足以取的比较好的效果。那如果需要考虑一整个sequence的信息的话,就得把整个sequence都输入到FC,但sequence中vector的个数是未知的,需要看整个训练集才能知晓输入到FC的vector数目,这会使FC的参数极其庞大,运算效率低且容易过拟合。

Self Attention可以完美解决这种问题,input vector经过selft attention 变换得到充分考虑sequence信息的输出vector,经过FC输出需要的结果,self attention也可以进行多次变换、对sequence信息进行多次提炼。

在这里插入图片描述

self attention会考虑每个输入vector和其他vector的相关性,基于向量之间的相关性来决定输出vector中其他输入vector的比重。首先根据相关性衡量算法获取vector和其他vector的attention score,通过soft max将score做变换,将变换后的结果与对应的vector相乘,得到输入vector经过self attention变换之后的结果。在self attention中通常有三个超参需要学习。

1)attention score

self attention中attention score的方法有两类,dot product和additive,两类方法没有特别的优劣势。方法如下,不做特别赘述

在这里插入图片描述

2)self attention变换

设input vector set = ( a 1 , a 2 , a 3 , a 4 ) (a^1,a^2,a^3,a^4) (a1,a2,a3,a4), output vector set = ( b 1 , b 2 , b 3 , b 4 ) (b^1,b^2,b^3,b^4) (b1,b2,b3,b4),以 a 1 − > b 1 a^1-> b^1 a1>b1为例:

a. 对input vector set 做矩阵变换,计算 a 1 a^1 a1与其他vecoter的相关性

q 1 = W q a 1 q^1=W^q a^1 q1=Wqa1

k 1 = W k a 1 k^1=W^k a^1 k1=Wka1 k 2 = W k a 2 k^2=W^k a^2 k2=Wka2 k 3 = W k a 3 k^3=W^k a^3 k3=Wka3 k 4 = W k a 4 k^4=W^k a^4 k4=Wka4

其中 W q , W k W^q, W^k Wq,Wk是超参,需要网络学习优化。根据变换后的vector,使用dot product计算相关性attention score

α 1 , 1 = q 1 . k 1 \alpha_1,_1=q^1.k^1 α1,1=q1.k1 α 1 , 2 = q 1 . k 2 \alpha_1,_2=q^1.k^2 α1,2=q1.k2 α 1 , 3 = q 1 . k 3 \alpha_1,_3=q^1.k^3 α1,3=q1.k3 α 1 , 4 = q 1 . k 4 \alpha_1,_4=q^1.k^4 α1,4=q1.k4

b. softmax变换,将attention score经过softmax得到 α 1 ′ , i \alpha'_1,_i α1,i

α 1 ′ , i = exp ⁡ ( α 1 , i ) / ∑ j exp ⁡ ( α 1 , j ) \alpha'_1,_i=\exp(\alpha_1,_i)/\sum_{j}\exp(\alpha_1,_j) α1,i=exp(α1,i)/jexp(α1,j)

在这里插入图片描述

c. 基于attention score抽取不同向量之间相关性,得到output vector

v i = W v a 1 v^i=W^v a^1 vi=Wva1

b 1 = ∑ i α 1 ′ , i . v i b^1=\sum_{i}\alpha'_1,_i.v^i b1=iα1,i.vi

其中 W v W^v Wv是网络学习优化的超参。
在这里插入图片描述

d. 矩阵运算。self attention操作的都是向量之间的运算,因此在gpu可以使用矩阵加速运算。

设input vector set = I, W q , W k , W v W^q,W^k,W^v Wq,Wk,Wv是超参,self 变换的矩阵操作如下:
在这里插入图片描述

Multi-Head Self Attention

Multi-head self attention在self attention的基础上考虑向量之间的不同类型的关系。在对input vector set中不同vector生成多个 q i , k i , v i q^i,k^i,v^i qi,ki,vi, 分别计算出 b i , j b^i,^j bi,j,然后增加一个超参 W o W^o Wo,将 b i , j b^i,^j bi,j合并为统一的 b i b^i bi.

在这里插入图片描述

Position Encoding

self attention虽然能够表达不同输入向量之间的相互关系,但没有记录向量之间的位置信息,然而vector之间的顺序在某些场景是非常重要的。为了弥补这个缺陷,通过postional encoding的技术在self attention中加入位置信息。具体做法是,构造一个表示顺序的向量 e i e^i ei,与inpout vector相加,在self attention中加入句子的顺序。

e i e^i ei 可以通过hand crafted,也可以通过从数据中学习得到。

在这里插入图片描述

selft attention vs CNN

先说结论:self attention是复杂版本的CNN,后续待补充

selft attention vs RNN

self attention相对于RNN更具优势,一方面来说self attention包含对其他所有vector的相关性信息,另一方面对于相关信息的计算可以实现并行,效率更优。RNN的优势在于天然包含顺序信息,这个优势在self attention加入positional encoding之后也不复存在

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值