展开

self-attention

最后发布时间 : 2024-04-21 22:05:23 浏览量 :

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^1a^4W^v得到新的的向量v^1v^4,然后用v^1v^4乘attention score,再加起来,就得到b^1

生信小木屋

qkv的矩阵运算

生信小木屋

attention score的计算
生信小木屋

生信小木屋

生信小木屋

生信小木屋

生信小木屋