如何训练T5/BART等Seq2Seq模型实现单字符串转多字符串?
如何用T5/BART实现单字符串到字符串列表的Seq2Seq训练?
你遇到的错误本质是:Hugging Face的Tokenizer不支持直接传入二维字符串列表作为输入,它只能处理单文本序列或成对文本序列,所以才会抛出TypeError: TextEncodeInput must be Union[TextInputSequence, Tuple[InputSequence, InputSequence]]。
要解决这个问题,核心思路是把二维的标签列表转换成Tokenizer能处理的单文本格式,后续解码时再拆分回列表,具体可以这么做:
方案1:用特殊分隔符拼接标签列表
这是最直接的方法,步骤如下:
- 选一个不会出现在标签文本里的特殊分隔符(比如自定义的
###SPLIT###,或者模型自带的特殊token如T5的<sep>) - 将每个样本的标签列表用分隔符拼接成单个字符串
- 正常用Tokenizer处理拼接后的标签文本
- 模型生成结果后,再用同样的分隔符拆分回列表
修改后的代码示例
tokenizer = AutoTokenizer.from_pretrained(args.model_name) # 处理输入文本(保持原有逻辑) encodings = tokenizer(texts, truncation=True, padding=True, return_tensors='pt') # 处理标签:把二维列表转为单字符串 # 这里用自定义分隔符,也可以替换成模型自带的特殊token SEPARATOR = "###SPLIT###" labels_processed = [SEPARATOR.join(label_group) for label_group in labels] decodings = tokenizer(labels_processed, truncation=True, padding=True, return_tensors='pt') dataset_tokenized = Dataset(encodings, decodings)
避免拆分错误的注意事项
- 确保分隔符绝对不会出现在训练数据的标签文本中,如果不确定,可以提前对标签文本中的分隔符做转义(比如把原文本中的
###SPLIT###替换成###ESCAPED_SPLIT###,解码时再还原) - 优先使用模型预定义的特殊token(如T5的
<extra_id_*>系列),这类token不会出现在自然文本中,拆分可靠性更高
方案2:利用模型原生的多输出支持(以T5为例)
T5本身支持用<extra_id_0>、<extra_id_1>这类特殊token来分隔多个输出项,比如把标签列表转为"<extra_id_0> 第一个标签 <extra_id_1> 第二个标签..."的格式,解码时通过识别这些特殊token来拆分列表,这种方式比自定义分隔符更适配模型的训练逻辑。
内容的提问来源于stack exchange,提问作者mph
相关产品推荐
相关产品推荐

