Self attention
1.Input
问题引入:由于对于不同的问题,我们输入的序列长度不同,比如输入是一个句子,那么就需要将句子中的每个单词当作一个vector,输入即为set of vector,还有声信号,graph等输入也为set of vector。
2.Output
对于输出分为以下几种情况:
1.每个输入均有一个输出,若输出是一个数值,则为回归问题,若输出是一个class则为分类问题。
2.输出只有一个label,比如Sentiment analysis即输入一段话只需要输出一个label表明这段话是positive还是negative。或者输入一段话输出为什么语言以及预测分子亲水性等。
3.我们无法确定有多少个输出,例如翻译系统,当我们在进行翻译时,输入的长度与输出的长度我们均无法确定,均需要机器自己进行学习。这是seq2seq问题
3.self attention
此前我们输入均为独立的变量,未考虑输入与输入之间的联系,但有时候我们需要考虑这种联系,例如给一个英文句子,让我们进行词性分析,I saw a saw,句子中的两个saw应该是不同的词性,但是我们需要根据上下文才能判断,因此我们需要采用注意力机制,将输入变量经过self attention得到带有关联的变量。
关于self-attention的具体实现如下:
首先需要在sequence中计算其他vector与自己的相关程度,计算得出α
关于α的计算一般采用Dot-product或Additive
计算出每个attention score后经过一个activation function(例如softmax)后得到a‘
将得到的a’乘每个对应的v相加后即可得到b
同理对于每一个vector均进行相同操作,我们就能得到一列新的vector b
用矩阵表示上述过程,其中W(q,k,v)三个矩阵是我们需要学习的参数,即:
同时由于一个输入序列sequence可能不止有一个相关性,因此我们有时采用Multi-head Self-attention方法生成多个q,k,v计算多个相关性。
但是self attention机制没有考虑输入的位置信息,输入的每个位置均是一样的,但是I saw a saw中的两个saw具有不同的信息,因此我们需要用Positional Encoding技术加上位置信息。
self attention和CNN相比,CNN可以看作是简化版的self attention,self attention相当于自己学习receptive fields而CNN是自己指定,且self attention中的receptive fields可以不相连,即CNN其实是特殊的self attention:
self-attention和RNN(Recurrent Neural Network)相比,RNN也是用来处理输入是一个序列的模型,现在RNN已经基本被self-attention取代,基本结构如下,有一个计算顺序,每一个输入只考虑到了前面的输入情况,但是无法考虑到后面vector的信息(但是RNN也可以是双向的)
Self-attention每一个输入都考虑到了所有input,与RNN相比:如果最后一个vector要考虑第一个vector,RNN需要一直存在memory中,而self-attention不需要。RNN无法平行化处理输入,运算速度与效率上Self-attention更有优势。
图片来自李宏毅2021春季机器学习课程笔记6:Self-attention_Andy in boots的博客-CSDN博客