如何理解mBART中的decoder_start_token_id与forced_bos_token_id参数
mBART系列模型decoder_start_token_id与forced_bos_token_id使用指南
参数含义差异
decoder_start_token_id:属于模型配置层参数,定义了解码器启动自回归生成时输入的第一个token。mBART预训练阶段就是用目标语言的语言ID作为解码器的起始输入,该参数修改后会全局生效,适合固定单目标语言的生成场景。forced_bos_token_id:属于generate方法的调用层参数,作用是强制将生成结果的首token替换为指定ID,优先级高于模型配置中的decoder_start_token_id,不需要修改模型全局配置,适合多目标语言切换的生成场景。
不同mBART变体的参数选择
facebook/mbart-large-cc25
该版本为初代mBART预训练模型,官方示例推荐修改模型全局配置的decoder_start_token_id为目标语言ID,使用逻辑完全对齐预训练规则,示例代码如下:
from transformers import MBartForConditionalGeneration, MBartTokenizer model = MBartForConditionalGeneration.from_pretrained("facebook/mbart-large-cc25") tokenizer = MBartTokenizer.from_pretrained("facebook/mbart-large-cc25", src_lang="en_XX", tgt_lang="zh_CN") # 固定解码器起始token为中文ID model.config.decoder_start_token_id = tokenizer.lang_code_to_id["zh_CN"] inputs = tokenizer("Hello world", return_tensors="pt") outputs = model.generate(**inputs, max_new_tokens=100)
facebook/mbart-large-50 系列
该版本为优化后的50语言预训练模型,官方推荐直接在generate调用时传入forced_bos_token_id参数即可,无需修改模型全局配置,切换目标语言时仅需修改传参值即可,示例代码如下:
from transformers import MBartForConditionalGeneration, MBart50Tokenizer model = MBartForConditionalGeneration.from_pretrained("facebook/mbart-large-50") tokenizer = MBart50Tokenizer.from_pretrained("facebook/mbart-large-50", src_lang="en_XX") inputs = tokenizer("Hello world", return_tensors="pt") # 生成中文结果 outputs = model.generate(**inputs, forced_bos_token_id=tokenizer.lang_code_to_id["zh_CN"], max_new_tokens=100) # 切换生成法语结果 outputs = model.generate(**inputs, forced_bos_token_id=tokenizer.lang_code_to_id["fr_XX"], max_new_tokens=100)
使用注意
- 不要同时配置两个参数,避免逻辑冲突,
forced_bos_token_id的优先级更高,会覆盖decoder_start_token_id的设置 - 所有mBART变体必须指定对应目标语言的ID作为起始token,未指定的情况下默认使用未知语言ID,会出现输出乱码、内容不符合预期的问题
- 经过特定双语任务微调后的mBART模型,如果微调阶段已经固定了目标语言的起始token,无需额外传参即可正常生成对应语言的结果
内容的提问来源于stack exchange,提问作者Kaim hong
相关产品推荐
相关产品推荐

