【问题标题】:Query padding mask and key padding mask in Transformer encoder在 Transformer 编码器中查询填充掩码和键填充掩码
【发布时间】:2020-12-12 08:19:34
【问题描述】:

我正在使用 pytorch nn.MultiheadAttention 在变压器编码器中实现自我注意部分,并且在变压器的填充掩码中感到困惑。

下图是query(行)和key(列)的self-attention权重。

如您所见,有一些标记“”,我已经用键将其屏蔽了。因此tokens不会计算注意力权重。

还有两个问题:

  1. 在查询部分,除了红色方块部分,我还可以屏蔽它们(“”)吗?这合理吗?

  2. 如何在查询中屏蔽“”?

注意力权重还通过在src_masksrc_key_padding_mask 参数中提供掩码,沿行使用softmax 函数。如果我将所有“”行设置为-infsoftmax 将返回nan,损失为nan

【问题讨论】:

    标签: python pytorch transformer attention-model


    【解决方案1】:

    self-attention 过程中不需要屏蔽查询,如果以后不使用网络中与<PAD> 标记对应的状态(作为隐藏状态或键/值)就足够了,它们将不影响损失函数或网络中的任何其他内容。

    如果您想确保没有导致梯度流过<PAD> 标记的错误,您可以在计算后使用torch.where 显式地将自注意力清零。

    【讨论】:

    • 抱歉,我不明白为什么在自我注意期间不需要屏蔽查询。因为我在任务中表现不佳。所以,我正在考虑问题出在哪里。
    • 关于梯度流动,我很确定如果我将-inf 设置为所有 row6 ~ row13 它将返回 nan,因为注意力权重沿每一行传递 softmax 函数。根据pytorch源码github.com/pytorch/pytorch/blob/…
    • 您可以在softmax 之后 执行torch.where 并将权重设置为零。
    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2022-01-14
    • 2020-08-24
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多