Replies: 1 comment
|
你观察得非常敏锐。在 transformers v5.0.0rc 中对 tie_weights 逻辑的重构确实引起了社区的广泛讨论,这不仅是代码实现的变化,更涉及到了训练一致性和模型权重管理策略的转变。
在 v5.0.0rc 中,逻辑变得更加“保守”: 如果 Checkpoint 中同时存在这两个 Key,Transformers 会认为用户可能想要微调或保留这种不一致性,从而跳过绑定。 只有当其中一个 Key 缺失时,才会执行绑定。
A. 显存与参数量的增加 B. 收敛性与表征漂移 输入 Embedding(负责语义理解)和 输出 LM Head(负责概率预测)的表征空间发生漂移。 原本设计为绑定的权重在训练一段时间后,内容变得截然不同。 C. 模型性能风险
加载逻辑冲突:如果你强制绑定,模型必须选择“抛弃”其中一个权重的内容(通常保留 Embedding),这会导致加载后的模型行为与训练结束时的行为不一致(推理精度下降)。 配置失效:config.tie_word_embeddings=True 在 v5 框架下如果遇到两个 Key,可能无法起到预期的“强制覆盖”作用。
方案一:手动强制绑定(最安全) model = AutoModelForCausalLM.from_pretrained("your-path") 方案三:使用 v5 的强约束(如果适用) 总结 建议: 如果你的任务对权重绑定有严格要求,请务必在训练脚本中显式调用 model.tie_weights(),并检查训练过程中的参数量(Param Count)是否符合预期。 |
Uh oh!
There was an error while loading. Please reload this page.
transformers 5.0.0rc中tie_weights函数的逻辑和v4.x的逻辑不一样。
在v4.x中,当tie_word_embeddings=True时,比如Qwen3-0.6B的config.json中tie_word_embeddings默认为True。无论embed_tokens.wheight和lm_head.weight是否都存在checkpoint中,这两个权重是绑定的
但是在v5.0.0rc中,如果embed_tokens.weight和lm_head.weight都在checkpoint中的话,那就不会绑定权重,而是两个独立的权重副本。
https://github.com/huggingface/transformers/blob/v5.0.0rc1/src/transformers/modeling_utils.py#L2362-L2369
那v5.0.0rc和v4.x在训练时,梯度更新行为就不一致。这会不会导致一些问题?比如保存的时候embed_tokens.weight和lm_head.weight都会保存在checkpoint中,但是我后续加载模型时还是想绑定这两个权重。
All reactions