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
相关产品推荐
相关产品推荐

