self-attention:
输入:是多个向量,如一句话里的每个单词都可作为一个单独的向量。有可能是原始输入,也可能是某个hidden layer的输出
输出:是融合全文语义信息后生成的向量,输入和输出是一对一的
如上图,就是考虑了所有input sequence,才有的输出
还可以多次叠加使用
具体实现:
1、找到与a1相关的所有向量,分别计算,代表相似程度
计算的两种方法:
左侧点乘:两个向量,分别乘上wq和wk两个权重矩阵,得到q和k两个向量,再做点乘,得到结果,w一般是随机初始化,然后train出来的
右侧:差不多,qk拼接,往后算,不是重点,跳过
算a1与其它向量的关联程度时,a1乘wq(),其他的都乘wk,最后内积算出每个attention score(注意力分数)
注意,自己的关联性也要算,好像很重要,但是不知道为啥重要
之后送入softmax,不一定非要是soft,可以换
a1乘上矩阵Wv得出v1,乘上,以此类推,求和,结论是,谁的
越大,b1就与谁更接近,这里不太懂
注意,这里b1到b4全是并行计算的
实际上是将所有qkv拼成矩阵来计算的,权重矩阵wq、wk、wv乘上所有input的vector拼接成的矩阵,得到q k v的矩阵
将k矩阵转置后,inner-product Q矩阵,得到所有的attention score的矩阵表示,然后softmax,无敌,矩阵计算需要加强
和上边都一样,都是矩阵的inner-product,得出b1到b4组成的矩阵,就是对应位置相乘
无敌了,全过程只有wq、wk和wv是需要train出来的,I是输入,其他的都是人为设定好的
多头自注意机制muti-head self-attention
所谓多头,就是self-attention的变形,因为单头只能计算一个特征的相关性(我的理解是,就那一个矩阵,你不可能计算世间万物,只能算某一个特征是不是相似),但是任何事物都是有很多特征的,所以用多头可以计算多个特征的相关性,比如,一个西瓜,颜色是一个头,大小是一个头,深浅是一个头等等,综合考量这些所有的特征,才能进行最终的预测。
多头就是把原来的q,乘上两个不同的矩阵,就会得到q(i,1)和q(i,2),以此类推k和v,但是计算的时候,q1就算k1,v1;q2就算k2,v2,以此类推
最后把b1、b2...拼接起来,乘上一个权重矩阵Wo
position vector
目前为止,无论单头多头,都没有考虑到位置因素,不面对不同的业务场景时,有时候位置信息也很重要,比如英文中动词不能出现在句首,这样的位置信息在词性标注这样的业务场景下显得尤为重要。
方法就是给input的ai拼接一个ei位置向量(positional vector),右边那图看不懂,反正位置向量的产生方式不是固定的,可以自己研究