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

Llama Cookbook中CausalLM为何不对标签进行偏移?

为什么Llama因果语言模型微调时的标签设置是正确的?

这种处理方式完全正确,核心原因在于Hugging Face框架下CausalLM类模型的内置损失计算逻辑,以及针对prompt部分的损失屏蔽策略,具体解释如下:

1. 因果语言模型的自动移位逻辑

Hugging Face的LlamaForCausalLM在计算损失时,会自动对输入序列和标签做移位处理:

  • 模型输出的logits会截取前n-1个token的预测结果(对应输入序列的前n-1个token)
  • 传入的labels会截取后n-1个token作为目标(对应输入序列的第2到第n个token)
  • 最终交叉熵损失的计算,本质还是让模型学习“用前一个token预测下一个token”的因果逻辑,不需要手动设置labels[i] = input_ids[i+1],框架会自动完成这个移位操作。

2. Prompt部分标签设为-100的作用

-100是PyTorch中CrossEntropyLoss的默认忽略索引,将prompt部分的标签全部设为-100,会让模型在训练时完全跳过这部分的损失计算。这样模型只会聚焦于摘要生成任务本身:学习从给定的对话prompt出发,生成正确的摘要内容。

3. Summary部分标签设置的合理性

代码中summary部分的labels直接复用了input_ids中的summary序列(包含摘要内容+eos_token),结合模型的自动移位逻辑:

  • 输入序列的summary部分为[s0, s1, ..., sn-1](其中sn-1是eos token)
  • 模型会用prompt + [s0, s1, ..., sn-2]作为输入,预测[s1, ..., sn-1]这一系列token
  • 这正好对应摘要生成的训练目标:让模型学习从prompt开始,逐步生成每个摘要token,直到输出eos token结束。

示例验证

从你提供的样本输出可以直观验证逻辑:

# input_ids片段
tensor([19791,   512,    32, 36645, 41778])
# labels片段
tensor([ -100,  -100,    32, 36645, 41778])

前两个token属于prompt部分,标签-100会被损失函数忽略;从第三个token开始是summary部分:

  • 模型用19791, 512, 32作为输入的一部分,预测下一个token36645,移位后的labels目标正好是36645
  • 用512, 32, 36645预测41778,移位后的labels目标也正好是41778
    完全符合因果语言模型的训练逻辑。

内容的提问来源于stack exchange,提问作者Dmitry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:24:52