self Attention
自注意力机制,通过计算两两之间的相似度,然后更新根据相似度更新特征,达到特征增强的作用。 具体的,QKV是F的一种线性变换,自注意力机制可以如下形式:
Sefl-attention
为了表达简单,我们把 self-attention 可以简记为下面公式(3) 和 公式(4) 所示,
简记的 self-attention。
External Attention
对于(3)(4)我们可以认为只是F对F的注意力,也就是self Attention.这种注意力是非常有效的,但是也有他的不足。首先,它使用的是一个F对F 的注意力形式,这种注意力只会考虑单个样本内部的关联,忽略样本之间的潜在联系,这种联系对视觉任务来说是有用的,在语义分割中,希望分布在不同样本中的同类物体有着相似的特征。其次,F对F的注意力,不够灵活,难以用高分辨图像场景。
下面考虑这样一个问题,如果有一个共享的矩阵 , M 是随机初始化的,我们可以把上面那个形式,记成一种 M 对 F的注意力,即如下公式(5)(6)所示。
M对F的Attention
首先,M是共享的,可以隐式的考虑不同样本之间的关联,其次,S是非常灵活的,可以通过控制S的大小,使得整个external Attention 灵活,使得Attention 变成N的复杂度,便于高分辨的情况。
External attention 和 线性层
F = query_linear(F)
attn = M_k(F)
attn = softmax(attn, dim=1)
attn = l1_norm(attn, dim=2)
out = M_v(attn)
Multi-head external attention
和self Attention 的multi head 不同,我们的multi head 的每个是共享的, multi head self attention 的每个head是独立的,这个multi head external attention 也可以写成线性层, 具体写法如下:
F = query_linear(F)
F = F.view(B, N, H, C//H)
F = F.permute(0, 2, 1, 3)
attn = M_k(F)
attn = softmax(attn, dim=2)
attn = l1_norm(attn, dim=3)
out = M_v(attn)
out = out.permute(0, 2, 1, 3)
out = out.view(B, N, C)
out = W_o(out)
Normalization
在通常的attention中,通常时使用一个softmax最为中间层的归一化层,这种归一化的目的是使得attention map 中的某一行或者某一列为1。 只是用softmax岑在当某一个特征值特别大或者特别小的时候,他对别的特征点乘也会变得特别大, 在这情况下,只是用softmax回破坏attention的原始含义。 使用softmax + l1_norm 这种double normalization 方式去避免这种问题。