矩阵乘法角度讲解self-attention运作:
1、所有的a都有对象的q,k,v所以将所有的a拼接为一个矩阵。
同理获得K,V。
做矩阵点乘:(看作矩阵和向量相乘)
在转换成矩阵与矩阵相乘:
综上:self-attention输入是A,输出是Q。
进阶版:multi-head self-attention:
多个head:翻译之类多个head效果更好。
用q找相关的v;想要用不同的q找不同种类的相关性。
2种不同的head找两种不同的相关性。
每一个head只做对应的head的dot product.
Self-attention少了每一个向量的位置,操作其实是一摸一样的,所有位置距离相同。例如:词性标注位置信息是一个非常重要的信息。--àpositional encoding,为每一个位置设置一个向量。
每一个位置用一个不同的信息,每一列是一个positional encoding:
Positional encoding的产生仍是一个待讨论的问题!!!(每一行是一个positional encoding)
Self-attention应用:
- 语音辨识:
语音向量是特别长的一个向量。或许不需要考虑一整个句子的长度,可以只截取一部分做处理。
- 用于影像处理:
将每一个pixel看作是一个三维向量。整张图像其实就是一个5x10的向量。
目前也有人将self-attention用于影像处理上:
将self-attention与cnn进行对比:
某一个pixel产生q,其他pixel产生v:考虑整张影像的信息。
Cnn是一个简单的self-attention,是因为他只考虑感受野之内的像素,而且感受野也是学出来的。Self-attention相当于一个复杂的cnn,因为他考虑的是整个图像。
Cnn通过对self-attention进行某种限制,就可以达到相同的结果。
将cnn应用于图像上,把图像裁剪成16x16的patch,每一个patch类别成一个单词。
横轴是资料量。随着资料量越来越多,self-attention可以超过cnn。
- Self-attention与rnn的区别:
RNN:处理数据也是一个序列:
RNN与self-attention的区别:
(1)RNN的输出不是并行的,self-attention的输出是并行的。
(2)RNN的最后一个输出需要要考虑最左边的输入,必须要将最左边的输入放入到memory且不能忘记,一路带进去才可以。但self-attention完全不存在这种问题。
- Self-attention应用于graph:
图上的edge直接就反映了attention score.
Self-attention的最大问题就是运算量特别大!!!--à减少运算量是一个好的研究方向。
目前的各种self-attention,如上图。