8

我对 Hugging Face 存储库上的语言模型微调代码有疑问。BERT 模型的 forward 方法似乎将一个名为attention_mask的参数作为输入。

文档说注意掩码是在将序列批处理在一起时使用的可选参数。该参数向模型指示应该注意哪些标记,哪些不应该注意。例如,tokenizer 编码方法返回这个注意掩码,一个二进制张量,指示填充索引的位置,以便模型不注意它们,这是有道理的。

但是,如果我没记错的话,我在语言模型微调的代码中看不到这个注意掩码的用法。实际上,在前向传递期间,只有输入 id 作为输入给出,参见此代码

我的问题是:这是否意味着我们不会在训练期间消除对填充标记的关注?将它们考虑在内是否有意义?或者也许我错过了代码中的某些内容?

非常感谢您的回答 :)

编辑

我注意到 Hugging Face 构建数据集的方式根本不需要填充(请参阅此代码

4

1 回答 1

2

我同意这确实是一个令人困惑的表述,但解决方案超出了 PyTorch 中的拥抱部分。在查看您链接到的实现时,您会发现BertTokenizer有一个属性pad_value,它也用特定索引替换填充值。然后这可能会传递给 PyTorch,它可以自己处理填充值,例如在pad_sequence.

确实,pad_sequence在前面的语言建模示例中也调用过,请参见此处。这应该足以让模型在前向传递期间忽略标记,而无需特别要求单独的注意掩码。

编辑:我感到困惑的是,通常特别指示损失不计算特定值的损失,这不是这里的情况(因为损失从未明确计算过,而只是由模型返回),这促使我进一步研究这一点。据我了解,还有labels,其中也包含一个特定的令牌,请参阅masked_lm_labels 此处的参数。总之,这应该形成一个关于如何忽略这些值的非常清晰的画面,而不需要特别需要注意掩码。那个似乎更用于“实际掩码”(即BERT的训练目标),这与您问题中考虑的“填充掩码”不同。

于 2020-02-27T09:05:52.787 回答