Transformer编码器中的查询填充掩码和键填充掩码

我在使用pytorch的nn.MultiheadAttention实现变换器编码器中的自注意力部分时,对变换器的填充掩码感到困惑。

下图展示了查询(行)和键(列)的自注意力权重。

如您所见,有一些标记为”<PAD>”的标记,我已经在键中对其进行了掩码处理。因此,这些标记不会计算注意力权重。

enter image description here

仍然有两个问题:

  1. 在查询部分,除了红色方块部分之外,我也能够掩码这些”<PAD>”吗?这样做合理吗?

  2. 如何在查询中掩码”<PAD>”?

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


回答:

在自注意力过程中没有必要对查询进行掩码,只要在网络的后续部分不使用对应于<PAD>标记的状态(无论是作为隐藏状态还是键/值),它们就不会影响损失函数或网络中的其他任何部分。

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

Related Posts

如何对SVC进行超参数调优?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

如何在初始训练后向模型添加训练数据?

我想在我的scikit-learn模型已经训练完成后再…

使用Google Cloud Function并行运行带有不同用户参数的相同训练作业

我正在寻找一种方法来并行运行带有不同用户参数的相同训练…

加载Keras模型,TypeError: ‘module’ object is not callable

我已经在StackOverflow上搜索并阅读了文档,…

在计算KNN填补方法中特定列中NaN值的”距离平均值”时

当我从头开始实现KNN填补方法来处理缺失数据时,我遇到…

使用巨大的S3 CSV文件或直接从预处理的关系型或NoSQL数据库获取数据的机器学习训练/测试工作

已关闭。此问题需要更多细节或更清晰的说明。目前不接受回…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注