目录
一、self-attention
上一章我们讲了如何计算b1
其实b2,b3,b4的计算都是并行的都是一样的
现在我们来介绍每个输入里面的q,k,v是怎么得到的
上图中W矩阵是经过训练得到的,将输入分别对应相乘就得到每个的q,k,v然后合起来就是Q,K,V矩阵
然后我们就可以简化的写:
直接K的转置乘上Q然后得到A然后经过一个激活函数得到A‘
再分别计算b:
以上就可以总结为下图:
其中大I就为输入的vector set
二、多头self-attention
这里以两头为例,其实就把每个q,k,v分解成两个。
计算了bi1 又计算bi2
然后把bi1和bi2再乘上一个矩阵就得到合起来的bi再传入下一层就和sel-attention一样了
三、Positional Encoding
在self-attention里面没有考虑位置信息,虽然考虑了每一个。像在NLP领域里的词性标注,动词在一个句子有可能大概率不会出现在句子开头,所以我们需要加入位置信息。
其实就在每个输入加上一个vector就行
四、self-attention在多领域的运用
为了减少计算量,在语音辨识里有可能不会考虑整个序列而是只考虑一个范围
而在上几次讲的CNN里面,我们可以把每一个三维的pixel看作一个vetor,然后所有合起来就是vetor set这样也可以用self-attention
其实self-attention就是复杂化的CNN,就像上图一样CNN只考虑每个感受野里面的内容而self-attention会考虑所有。也可以说是CNN是简单化的self-attention。
当参数多的时候我们就需要更多的训练资料,这样我们的模型才不会过拟合!
从上图可以看出当资料量少时,参数少的CNN更占优势,当资料量大时,则self-attention更占优势
对比RNN和self-attention时
RNN只能考虑左边已经输入的而不能考虑右边没有输入的,self-attention更胜一筹 ,现在推出了Bi-RNN弥补了这个劣势
而在图的应用上,我们或许只用考虑和该节点相连的节点
这里相关的有GNN,GAT可以上youtube学习