Schwertlilien
As a recoder: notes and ideas.

2025-7-1

Q:在detrtgt2 = self.self_attn(q, k, value=tgt2, attn_mask=tgt_mask,key_padding_mask=tgt_key_padding_mask)中这里根本就没传入mask相关的参数,那是不是没有做mask mla???

1
2
3
4
5
def forward_pre(self, tgt, memory, tgt_mask=None, memory_mask=None,tgt_key_padding_mask=None, memory_key_padding_mask=None,pos=None, query_pos=None):
tgt2 = self.norm1(tgt)
q = k = self.with_pos_embed(tgt2, query_pos)
tgt2 = self.self_attn(q, k, value=tgt2, attn_mask=tgt_mask,key_padding_mask=tgt_key_padding_mask)[0]
...

在 DETR 的 Transformer 实际调用过程中:

1
2
hs = self.decoder(tgt, memory, memory_key_padding_mask=mask,
pos=pos_embed, query_pos=query_embed)

只传入了 memory_key_padding_mask,其他如 tgt_mask, tgt_key_padding_mask, memory_mask 都是默认 None也就是说没有做 decoder 自注意力和 cross-attention 的 masking


那这是不是代表没有做 Masked Multi-Head Attention?

是的,在 DETR 默认实现中:

  • 没有使用 tgt_mask,所以 decoder 自注意力是全连接的,即每个 query 可以看到其他所有位置(不像语言建模那样屏蔽未来)。
  • 没有使用 memory_mask,说明 encoder 的输出 memory 也没有屏蔽某些位置。
  • 只用了 memory_key_padding_mask,确保 padding 部分的 memory 不参与计算。

那为什么这样做也没问题?

因为 DETR 是用于图像目标检测:

  • 输入是图像特征,不像 NLP 那样存在序列顺序依赖和 future token 的问题,不需要 causal mask;
  • 所以 decoder 每个 query 可以看到所有的位置信息,不需要强行限制注意力范围
  • 唯一要 mask 的是 padding 部分(如 backbone 特征 map 中 padding 的 token),所以只用了 memory_key_padding_mask

小结

参数 DETR 是否使用 说明
tgt_mask ❌ 未使用 不需要 decoder mask future,非语言建模任务
memory_mask ❌ 未使用 图像特征空间均匀,不做位置 mask
tgt_key_padding_mask ❌ 未使用 query 是 learnable 的,通常不需要 mask
memory_key_padding_mask ✅ 使用 避免 decoder 注意到 padding 的 image token
搜索
匹配结果数:
未搜索到匹配的文章。