Self-attention
一、引入
之前我们的神经网络的input通常是一个vector,现在我们的input变为大小不定的vector set,这样的场景有许多,比如语音信号、图网络等。

那么我们的output有如下三种情况,它们都有对应的场景,分别如句子中每个单词词性的判定、句子积极or消极判定、跨语言翻译,我们这里关注情况一。

如何处理输入的vector set呢?直观方法是每个vector都通过全连接神经网络(FC),但存在一个问题,比如I saw a saw这个句子,两个saw是同一个单词,但词性不同(一个动词一个名词),所以同样的输入FC怎么会得到不同结果呢?想法是考虑上下文(context),那么就可以使用一个window,但是window大小设定为多少呢?句子很长时window可以包含整个句子吗?显然不好处理。

于是,self-attention来啦!我们希望vector经过self-attention后成为嵌入context的vector

二、基本实现
假如我们的输入(\(a^i\))输出(\(b^i\))如下图所示,我们如何来衡量输入vector之间的相关性\(\alpha\)呢?


比如我们计算\(a^2、a^3、a^4\)与\(a^1\)的相关性(也称为attention score),方法如下:

更进一步,\(a^1\)与自身也存在attention score,计算出所有attention score后,可以通过softmax层进行归一化:

我们根据attention score,提取出最后的信息\(b^1\)(即\(a^1\)嵌入context后的输出):

三、精简表达
\(Q、K、V\)的计算:

attention score的计算:

最终输出的计算:

因此,整个计算过程概括为:(其中只有\(W^q、W^k、W^v\)是需要学习的parameter)

四、进阶知识
之前的self attention中,我们只考虑了一种相关性(one head),其实我们可以假设不同的vector间存在多种相关性(multi head),如下图,存在两种相关性(\(q、k、v\)均有两个,且配套计算):


最终的输出为:

之前的self attention中,我们的vector是没有位置的(编号只是方便表达,vector之间没有远近,无论在哪里计算均一样);如果我们想把位置考虑进去呢?可以使用位置向量进行处理,即每个vector(或position)都加上一个独一无二的position vector:

五、应用
语音应用:

图像应用

六、对比
self-attention V.S. CNN


self-attention V.S. RNN

self-attention V.S. GNN


浙公网安备 33010602011771号