You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 05:22:29