使用inputs_embeds是否会绕过模型位置编码?以LlamaForCausalLM为例
关于Hugging Face模型使用inputs_embeds时的位置编码问题
通用接口逻辑
大部分Hugging Face模型在接收inputs_embeds作为输入时,不会跳过位置编码的添加环节。模型的forward流程里,位置编码的处理是独立于“从input_ids生成embeddings”这一步的——不管你传的是input_ids还是inputs_embeds,后续的位置编码(包括RoPE、加性位置嵌入等)都会正常应用。
简单说,inputs_embeds只是替代了模型内部“input_ids → token embeddings”的转换步骤,其他核心流程(位置编码注入、注意力计算、前馈网络等)完全和传input_ids时一致。
LlamaForCausalLM的具体情况
Llama系列模型用的是旋转位置编码(RoPE),它的位置编码不是在嵌入层直接加到token embeddings上,而是在注意力计算阶段对query和key向量进行旋转处理。所以当你传入inputs_embeds时:
- 模型会直接把你传入的embeddings送入Transformer encoder层
- 在每个attention层,模型会根据当前token的位置,对embeddings对应的query/key应用RoPE编码
- 后续的注意力计算、输出流程完全正常
也就是说,你的代码里用inputs_embeds传入加权后的token embeddings,完全不会丢失位置编码信息,模型会自动处理位置相关的逻辑。
你的代码验证
你当前的代码逻辑是:
token_probabilities = F.softmax(logits,dim=-1) embeddings = token_probabilities @ model.embed_tokens.weight out = model(inputs_embed = embeddings, attention_mask=attention_mask, labels=labels)
这一步是把logits转成token概率后,和模型的token嵌入矩阵做矩阵乘法,得到的是各token嵌入的加权平均。传入inputs_embeds后,模型会正常走后续流程,包括RoPE的应用,不需要额外手动添加位置编码。
注意事项
- 确保
attention_mask的序列长度和inputs_embeds的第二维度(序列长度)完全匹配,否则会出现维度不兼容的错误 - 少数自定义或非标准实现的模型可能有特殊逻辑,但Hugging Face官方维护的主流模型(包括Llama、BERT、GPT系列等)都遵循上述流程
内容的提问来源于stack exchange,提问作者Algorithmic Canary
相关产品推荐
相关产品推荐

