现场是这样的。给模型加了中文词表并 resize 嵌入层,加载时报 shape mismatch,提示词表大小与权重维度不一致。

中间走过弯路,把「加载时用了旧的 tokenizer 覆盖新词表」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。保存了 tokenizer 却没有同步保存模型;resize 之后没有重新保存权重;新增词只加了 tokenizer 没有初始化向量。

先确认两端词表大小一致

python -c "print(len(tokenizer), model.get_input_embeddings().weight.shape[0])"

接着按新词表调整嵌入层

model.resize_token_embeddings(len(tokenizer))

保存模型与分词器到同一目录

model.save_pretrained('./new'); tokenizer.save_pretrained('./new')

剩下的就是验证新词能正常编码解码

python -c "print(tokenizer.decode(tokenizer.encode('测试新词')))"

中途换过一次思路,把范围缩到最小的那一层,反而快了。

别只看报错消失,验证要多做一步。加载不再报形状不匹配,新词能正确编码,模型输出里可以出现这些词。

提醒一点。新增词的向量是随机初始化的,必须继续训练才有意义,直接推理往往得到语义混乱的结果。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189