如何修改HuggingFace预训练Longformer模型的token长度等参数
问题1:设置max_length=20但tokenizer未填充到对应长度的原因
padding=True参数的默认逻辑是仅填充到当前批次内的最长序列长度,你的批次里只有1个句子,tokenize后的实际长度是7,所以最终输出长度为7。要填充到你指定的max_length,需要把padding参数的值改为'max_length',同时建议补充truncation=True防止句子超过max_length时报错。
修改后的编码代码如下:
# 注意你传入的text是列表,取第一个元素即可 input_ids = torch.tensor(tokenizer.encode(text[0], max_length=20, padding='max_length', truncation=True, add_special_tokens=True)).unsqueeze(0) # 此时输出的序列长度就是20
更推荐直接使用tokenizer的调用方法,同时返回input_ids和attention_mask,避免手动构造mask出错:
encoded_input = tokenizer(text[0], max_length=20, padding='max_length', truncation=True, return_tensors='pt') input_ids = encoded_input.input_ids attention_mask = encoded_input.attention_mask
问题2:模型输出token数固定为512的解决方案
Longformer本身支持动态序列长度,输出的hidden states维度会完全匹配输入的input_ids长度,出现固定512的原因有两个:
- 你输入的input_ids实际长度就被补到了512(对应第一个参数设置错误的问题)
- 旧版本Longformer会默认将输入序列填充到
attention_window参数的整数倍,默认attention_window=512,所以长度不足时会自动补到512。
你可以在加载模型时指定attention_window为你常用的最大长度,或者在调用模型时补充参数pad_to_multiple_of=1关闭自动填充:
# 加载模型时指定关闭自动填充到窗口倍数 model = LongformerModel.from_pretrained( 'allenai/longformer-base-4096', output_hidden_states = True, pad_to_multiple_of=1 )
按上述方法修改后,输入的序列长度是多少,模型输出的hidden states对应的token维度就是多少,完全适配动态输入长度。
内容的提问来源于stack exchange,提问作者MAC
相关产品推荐
相关产品推荐

