如何让BartForConditionalGeneration适配BertTokenizer新增的自定义令牌?
适配新增令牌的后续操作与训练必要性
你已经完成了关键一步——调整词嵌入层大小以容纳新增令牌,但此时新增令牌的嵌入向量是随机初始化的,模型完全无法理解这些令牌的语义。接下来的具体操作和训练需求如下:
1. 可选优化:给新增令牌一个合理的初始嵌入
如果你的新增令牌有明确语义(比如特定领域术语、自定义符号),别用默认的随机初始化,基于已有词汇的嵌入来初始化能帮模型更快收敛:
import torch # 获取所有新增令牌的ID new_token_ids = [tokenizer.convert_tokens_to_ids(token) for token in tokenizer.added_tokens_decoded] # 示例:用语义相关的基础词汇嵌入平均值初始化(按需调整逻辑) for token_id in new_token_ids: # 替换成和当前新增令牌语义相关的基础词汇 related_base_tokens = ["相关词1", "相关词2"] # 取出对应基础词汇的嵌入并计算平均值 related_embeds = [model.model.shared.weight[tokenizer.convert_tokens_to_ids(t)] for t in related_base_tokens] avg_embed = torch.mean(torch.stack(related_embeds), dim=0) # 替换新增令牌的初始嵌入 model.model.shared.weight.data[token_id] = avg_embed
2. 必须进行微调训练
是的,必须对模型进行训练。理由很简单:
- 随机初始化的嵌入没有任何有效语义信息,模型遇到这些新增令牌时只会当作噪声处理,完全无法正确生成或理解相关内容。
- 只有在包含这些新增令牌的任务数据集上进行微调,模型才能学习到这些令牌的语义表示,以及它们在条件生成任务中的正确使用方式。
训练时要注意:
- 必须用你更新后的
tokenizer对训练数据做分词,确保新增令牌被正确编码。 - 按照BART模型的常规条件生成微调流程执行即可(调整学习率、批次大小、训练轮数等超参数)。
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

