这是一篇2020年ICLR会议的文章,链接如下
https://iclr.cc/virtual_2020/poster_HJlnC1rKPB.html
摘要:
- (多头自)注意力层可以执行卷积
- (拥有足够数量的head)的多头注意力层的表现力大于等于卷积层
- 自注意力层和cnn层一样,都会处理像素网格模式
卷积的计算过程就是分区域的提取特征,具体的提取特征方式有很多,可以求和可以求最大值也可以求最小值。
这里是单头自注意力层的计算过程,就是把selfattention的公式实现一遍。
需要注意的是单头的输入输出维度是不变的。多头的拼接再乘以一个矩阵才能够是输出结果变形。
代码实现如下:
def single():
W_Q = np.random.rand(5,5)
W_K = np.random.rand(5,5)
W_V = np.random.rand(5,5)
Q1 = (Q+PE)*W_Q
K1 = (K+PE)*W_K
V1 = V*W_V
K_T1 = K1.transpose(1,0)
self_attention = model(torch.from_numpy((Q1*K_T1)/math.sqrt(5)))*V1
return self_attention
#九个head,z0-z8
for i in range(9):
locals()['z'+str(i)] = single()
W_O = np.random.rand(45,3)
#拼接9个head得多头
multi_self_attention = np.mat(torch.cat((z0,z1,z2,z3,z4,z5,z6,z7,z8),1))*np.mat(W_O)
变形了:
卷积层代码略。
结论:作者的意思是多头这种映射到多个空间,变相分割,达到了在不同区域分别集中注意力的效果,就跟卷积一样了。(解答了我之前的疑问:怎么就能确定多头一定是映射到了不同空间去了?)
具体证明没看,以后用上了再看吧。至少知道了可证。