特色:
1.attention矩阵由query直接过全连接层得到,而不进行Q*K
2.attention矩阵乘value时,并不使用所有value,而是每个query(对应attention矩阵的每一行)对应k个value,因此,O(N^2C)变成了O(NKC),减少了计算量
3.如何确定每个query对应哪些value?——由query过全连接层得到offset矩阵,通过offset得到每个query对应的value的位置
注意:
每个query对应k个value,即相当于要算出Nq组offset,每组有k套offset
说明
主要说说attention矩阵和value,key,query的对应关系
重要: 求self-attentio里面的乘法都是矩阵乘法,不要求shape相等
transformer维度说明
(1)QxK
假设Q有Nq个,K有Nk个,由于两个矩阵要做矩阵乘法,同时乘时K会转置,因此要求两者的每个单位长度相同
因此,假设Q:(Nq,d_embedding)
K也必须为(Nk,d_embedding)
相乘后attention矩阵:(Nq,Nk)
(2)attention x Value
这里便是直接相乘了,没做转置,因此要求Value的第一个维度为Nk,但第二个维度却不限制
Q:(Nq,d_embedding)
K:(Nk,d_embedding)
attention:(Nq,Nk)
V:(Nk,d_v)
result:(Nq,d_v)
计算说明
QxK得到每个Query对每个Key的attention
每一行对应1个Query和所有Key,做了Softmax,和为1
Value有Nk行,即相当于每一行对应一个Key的Embedding
attention x Value
即attention的一行,与Value的一列相乘,假设Value只有1列,即计算1次所有key的加权和得到1个新的result
因此,offset由Query矩阵得到合适,每行Query对应k套offset,即设置每个query去选择由哪k个Value加权成最终结果