能否提高RoBERTa的512令牌限制?EmoRoBERTa长文本分类问题咨询
关于EmoRoBERTa文本长度超限的解决方案
首先直接回答你关心的问题:直接设置max_length = 1024不可行。EmoRoBERTa是基于RoBERTa-base架构预训练的情感分类模型,预训练阶段的位置嵌入层最多支持512个token的输入,仅修改tokenizer的最大长度参数,模型无法识别超出512长度的位置编码,会输出完全错误的预测结果。
以下是三种可行的处理方案:
方案1:长文本滑动窗口推理(无需微调,推荐优先使用)
对超出长度的文本拆分为多个重叠的512token片段分别推理,再聚合结果。tokenizer侧可通过以下参数实现拆分:encoded_input = tokenizer( your_text, truncation=True, max_length=512, stride=128, # 相邻片段的重叠长度,可自行调整 return_overflowing_tokens=True, padding=True, return_tensors="tf" )推理完成后可对所有片段的预测概率取均值,或投票选出出现次数最多的情感类别作为最终结果。如果不需要拆分,直接丢弃超出部分,只需在tokenizer或pipeline中添加
truncation=True, max_length=512即可。
如果你使用transformers的pipeline做推理,可直接添加参数实现自动截断:classifier = pipeline( "text-classification", model=model, tokenizer=tokenizer, truncation=True, max_length=512 )方案2:扩展模型位置嵌入层(需要微调,适配长文本需求)
如果你必须支持1024长度的输入,可修改模型的位置嵌入配置,扩展后用自有数据集微调即可使用:from transformers import RobertaConfig, TFRobertaForSequenceClassification import tensorflow as tf # 修改配置,将最大位置嵌入改为1024 config = RobertaConfig.from_pretrained("arpanghoshal/EmoRoBERTa", max_position_embeddings=1024) # 加载模型时忽略位置嵌入维度不匹配的报错 model = TFRobertaForSequenceClassification.from_pretrained( "arpanghoshal/EmoRoBERTa", config=config, ignore_mismatched_sizes=True ) # 扩展位置嵌入权重:前512用预训练权重,后512随机初始化 original_pe = model.roberta.embeddings.position_embeddings.weight[:512] new_pe = tf.Variable(tf.concat([original_pe, tf.random.normal(shape=(512, config.hidden_size), stddev=0.02)], axis=0)) model.roberta.embeddings.position_embeddings.weight = new_pe注意该方案必须在你的自有数据集上完成微调后才能正常使用,直接用扩展后的模型推理会因为新增位置编码是随机值,导致结果失真。
方案3:更换长上下文预训练模型
可直接选用预训练阶段就支持1024及以上长度输入的情感分类模型,无需额外修改架构即可使用。
内容的提问来源于stack exchange,提问作者Shrumo
相关产品推荐
相关产品推荐

