Bert for QuestionAnswering 输入超过 512

数据挖掘 伯特 变压器 问答 拥抱脸
2021-10-06 10:39:10

我正在训练 Bert 进行问答(西班牙语),我有一个很大的上下文,只有上下文超过 512,总问题 + 上下文是 10k,我发现 longformer 就像长文档一样,但是没有西班牙语预训练那么,有什么想法绕过bert。

我尝试的是:

from transformers import BertConfig
config=BertConfig.from_pretrained(BERT_MODEL_PATH)
config.max_length=4000 
config.max_position_embeddings=4000
config.output_hidden_states=True
model = MyBertModel(config)    

但仍然给我一个错误不匹配

RuntimeError:为 BertModel 加载 state_dict 时出错:bert.embeddings.position_embeddings.weight 的大小不匹配:从检查点复制形状为 torch.Size([512, 768]) 的参数,当前模型中的形状为 torch.Size ([4000, 768])。

1个回答

最大输入长度是模型构造的限制。该数字定义了位置嵌入表的长度,因此您不能提供更长的输入,因为模型不可能为大于最大值的位置索引位置嵌入。

然而,这种限制并不是任意的,而是有更深层次的理由:在普通变压器中,内存需求是输入长度的二次方。因此,限制这样的长度对于模型不需要太多内存是必要的。

Transformer 架构的一些变体旨在克服二次记忆问题,例如ReformerLinformerLongformerBigBird然而,它们与 Transformer 权重“不兼容”,因此有人需要在掩码语言建模任务中训练其中一个模型(可能在下一个序列预测任务中进行多任务学习),以便在你的模型中重用它们的权重语境。