self-attention
self-attention要解决什么问题呢?在传统神经网络的架构中,比如图片识别,我们输入的都是一个向量,输出是一个数字或者类别。
Each vector has a lablel
现在有一些任务,输入是N个向量,输出也是N个向量,即每一个向量都有对应的输出
比如词性标注(POS tagging)、语音音标识别、预测社交网络中的人会不会购买商品
The whole sequence has a label
还有一些任务,输入是N个向量,只有一个输出
比如情感分析、区分speaker、预测分子亲水性
model decides the number of labels itself
还有一种情况,输入是N个向量,输出lable的个数由机器自己决定
比如,翻译、语音识别(TTS)
Sequence Labeling
接下来讨论,输入N个向量,输出也是N个向量的问题?即输出与输出数量一样多
假设输入的向量之间是彼此独立的,我们将每个向量输入到一个Fully-connected network中
但是,如果输入的向量之间不相互独立,比如社交网络中人与人之间是存在联系的,词性标注中(I saw the saw)这两个saw一个是动词一个是名词。
以词性标注为例,我们期待在Fully-connected network中第一个saw输出动词,第二个saw输出名称,但是这一点很难做到。
我们需要让Fully-connected network考虑上下文的信息,在神经网络输入时,考虑当前向量的前面n个向量和后面n个向量。
那么就存在一个问题,我们n应该取多大?如果n很小的话,不能考虑到足够的信息;如果n很大的话,我们的network就很大。
self-attention
self-attention这种架构可以考虑整个sequence的信息,然后再将self-attention的结果输入给Fully-connected network得到结果。也就是说,self-attention处理所有sequence的信息,Fully-connected network专注于处理某一位置的信息。
self-attention的输入可以是整个network的输入,也可以是hidden layer的输出
如何产生向量b^1呢?
根据a^1找出整个sequence中与a^1相关的变量,每一个向量与a^1的关联程度,我们用一个数值\alpha表示,
如何计算\alpha呢?
计算算\alpha包括:Dot-product、Additive等
a^1 \cdot W^q叫做query,a^2 \cdot W^k叫做key,a_{1,2}=q^1 \cdot k^2是\alpha,也叫做attention score
得到\alpha后,对\alpha计算soft-max
得到{\alpha}'后,接下来根据{\alpha}'抽取重要的信息,将a^1到a^4乘W^v得到新的的向量v^1到v^4,然后用v^1到v^4乘attention score,再加起来,就得到b^1
q、k、v的矩阵运算
attention score的计算