Pytorch src_掩码和src_键_填充_掩码之间的差异

Pytorch src_掩码和src_键_填充_掩码之间的差异,pytorch,transformer,Pytorch,Transformer,我很难理解变形金刚。一切都一点一点地变得清晰了,但有一件事让我头疼 src_mask和src_key_padding_mask之间的区别是什么?src_key_padding_mask作为参数在编码器层和解码器层的forward函数中传递 我必须说PyTorch实现有点混乱,因为它包含太多的掩码参数。但我可以解释一下你们提到的两个掩模参数。src_mask和src_key_padding_mask都用于MultiheadAttention机制。根据以下文件: key_padding_mask–如

我很难理解变形金刚。一切都一点一点地变得清晰了,但有一件事让我头疼 src_mask和src_key_padding_mask之间的区别是什么?src_key_padding_mask作为参数在编码器层和解码器层的forward函数中传递


我必须说PyTorch实现有点混乱,因为它包含太多的掩码参数。但我可以解释一下你们提到的两个掩模参数。
src_mask
src_key_padding_mask
都用于
MultiheadAttention
机制。根据以下文件:

key_padding_mask–如果提供,则注意将忽略键中指定的padding元素

attn_遮罩–2D或3D遮罩,防止注意某些位置

正如你从论文中所知道的,多头注意在编码器和解码器中都使用。然而,在解码器中,有两种类型的多头注意。一种称为
蒙面多头注意
,另一种称为常规的
多头注意
。为了适应这两种技术,PyTorch在其MultiheadAttention实现中使用了上述两个参数

长话短说-

  • attn\u mask
    key\u padding\u mask
    用于编码器的
    MultiheadAttention
    和解码器的
    Masked MultiheadAttention
  • 如前所述,
    内存掩码
    用于解码器的
    多头注意
    机制
调查的实施情况可能会对您有所帮助

从和中可以看到,首先使用
src_mask
阻止特定位置参与,然后使用
key_padding_mask
阻止参与pad令牌


<强>注释< <强> >基于@ michael jungo的评论更新.< /P> < P>给出一个小例子,考虑我想建立一个顺序推荐器,也就是说,给定用户购买的项目,直到“t”预测“t+1”

下一个项目
u1 - [i1, i2, i7]
u2 - [i2, i5]
u3 - [i6, i7, i1, i2]
对于这个任务,我可以使用一个转换器,通过在左侧填充0,使序列长度相等

u1 - [0,  i1, i2, i7]
u2 - [0,  0,  i2, i5]
u3 - [i6, i7, i1, i2]
我将使用key_padding_mask告诉PyTorch忽略0的shd。 现在,考虑用户<代码> u3这里给出的代码< > [i6] < /代码>我想预测<代码> [i7] < /代码>,以后给出<代码> [i6,i7] < /代码>我想预测<代码> [i1] < /代码>,即,我想要因果注意,这样注意力就不会窥见未来的元素。为此,我将使用attn_面具。因此,对于用户
u3
attn\u,掩码如下

[[True, False, False, False],
 [True, True , False, False],
 [True, True , True , False]
 [True, True , True , True ]]
长话短说下的两点是不正确的。首先,一个
attn_掩码
和一个
key_padding_掩码
用于自我注意(enc-enc和dec-dec)以及编码器-解码器注意(enc-dec)。其次是PyTorch(它们通常是相同的,但在API中是分开的)
src_掩码
src_键_填充_掩码
属于编码器的自我注意。最后一句话很好地概括了它