联合训练BART与BERT时不同分词器的映射转换方案咨询
BART与BERT联合训练分词器差异适配方案
首先直接回应两个核心疑问:
1. 构建映射层适配前后模型输入输出是完全可行的
这是异构预训练模型联合训练的常规操作,不需要强行对齐两个模型的分词器词表,根据你的联合训练架构选对应方案就行:
- 如果你不需要中间输出离散的摘要文本,优先选隐层映射方案:在BART解码器的最后一层隐层输出后,加一层带GELU激活的线性映射层,把BART输出的语义隐层直接对齐到BERT的输入嵌入空间,映射后的结果直接送入BERT的编码器,不需要经过BERT的分词和嵌入查表步骤,反向传播时梯度可以直接从BERT流回BART,实现真正的端到端联合训练。如果用的都是base版本的BART和BERT,两者隐层维度都是768,这个映射层参数量很小,训练几轮就能快速收敛。
- 如果你需要中间输出可解释的离散摘要结果,可以加词表概率投影层:在BART解码器输出的、对应BART词表大小的词概率分布后,加一个形状为
[bart_vocab_size, bert_vocab_size]的可训练投影矩阵,把BART词表上的概率分布投影到BERT词表的概率分布,再和BERT的嵌入矩阵相乘得到输入嵌入,同样可以保留梯度,避免“生成文本-重新分词”流程带来的断梯度问题。
2. 手动构建词典逐值映射分词器的方案不具备落地可行性
不推荐用这个方案,核心问题有三个:
- 分词逻辑天然不匹配:BART用的是字节级BPE分词,BERT用的是WordPiece分词,两者对同一个词的子词拆分规则、拆分长度都可能存在差异,逐token映射根本无法对齐序列位置,强行对齐会引入大量语义噪声。
- 特殊token对齐成本高:两个模型的特殊token定义、对应的id完全不同,比如BART用
<s>做句首标记,BERT用<[BOS_never_used_51bce0c785ca2f68081bfa7d91973934]>做句首标记,手动映射很容易遗漏特殊token,直接导致训练时loss异常、效果崩盘。 - 方案复用性极差:两个模型的默认词表规模都在5万量级,逐一核对映射需要耗费大量时间,后续如果换用不同预训练版本(比如large版、领域微调版、多语言版)的模型,就要重新做一遍映射,投入产出比极低。
实操建议:最开始搭基线的时候,可以先不用做端到端的软映射,直接把BART生成的离散摘要结果用BERT的tokenizer重新分词后输入BERT,先把整个联合训练的pipeline跑通,验证完任务逻辑的有效性,再替换成软映射层做端到端优化,避免一开始就卡在词表对齐的细节上拖慢进度。
内容的提问来源于stack exchange,提问作者exitialium
相关产品推荐
相关产品推荐

