我有一个关于Hugging存储库上的语言模型微调代码的问题。BERT模型的前向方法似乎将一个名为attention_mask的参数作为输入。
documentation指出,注意掩码是将序列批处理在一起时使用的可选参数。此参数向模型指示哪些令牌应该关注,哪些不应该关注。例如,记号赋予器编码方法返回这个注意掩码,一个指示填充索引位置的二进制张量,以便模型不关注它们,这是有意义的。
然而,如果我没记错的话,我在语言模型微调的代码中没有看到这个注意掩码的用法。实际上,在前向传递过程中,只有输入ids被作为输入cf this code给出。
我的问题是:这是否意味着我们在训练期间不会扼杀填充标记上的注意力?把它们考虑进去有意义吗?或者也许我在代码中遗漏了什么?
非常感谢您的回答:)
编辑
我注意到Hugging Face构建数据集的方式根本不需要填充(参见this code )
发布于 2020-02-27 17:05:53
我同意这确实是一个令人困惑的提法,但解决方案超出了PyTorch中的huggingface部分。在查看您链接到的实现时,您会发现BertTokenizer有一个属性pad_value,该属性还用特定的索引替换了填充值。然后,这可能会传递给PyTorch,它可以自己处理填充值,例如在pad_sequence中。
实际上,在前面的语言建模示例中也调用了pad_sequence,请参见here。这应该足以让模型在前向传递过程中忽略令牌,而不需要专门调用单独的注意掩码。
编辑:我感到困惑的是,通常情况下,损失是专门指示不计算特定值的损失,这里不是这种情况(因为损失从未明确计算过,而只是由模型返回),这促使我进一步研究这一点。据我所知,还有labels,它也包含一个特定的令牌,请参见参数masked_lm_labels here。总而言之,这应该会形成一个关于如何忽略这些值的非常清晰的图景,而不需要特别的注意掩码。这似乎更多地用于“实际掩蔽”(即,BERT的训练目标),这与您问题中考虑的“填充掩蔽”不同。
https://stackoverflow.com/questions/60397610
复制相似问题