跳到主内容
快讯直播
AI智模界
AI 词典

损失掩码:微调时别把提问算进损失

损失掩码(Loss Masking)是在训练语言模型时,用一个 0/1 的标记序列告诉损失函数:哪些位置的预测要算分,哪些位置直接跳过——不算分、不产生梯度。

为什么需要它

微调对话模型时,一条样本通常长这样:User: 北京有什么好吃的? Assistant: 烤鸭、炸酱面……。训练时会把整段拼成一个序列喂给模型,模型的任务是"看前文、猜下一个词",所以序列里每个位置都会产生一个预测和一个损失。

问题就出在"每个位置"。用户那句话的每个 token 也被拿来算损失了,等于在教模型:看到"User: 北京有什么好吃的"这半句,你应该把它原样复述出来。模型确实学得会。上线后你会看到它开始重复你的问题,或者回复里突然冒出 User:Human:Assistant: 这类模板串。

打个比方:老师让学生做填空题,题目是印好的,学生只填空。批改时该只看学生填的部分;如果连题目里印好的字也一起打分,学生就会以为"把题干抄一遍"也算答案。

实现上做什么

自回归模型在每个位置输出一个词表上的概率分布,预测下一个 token。总损失是各位置交叉熵的加权和:

loss = -Σ m_t · log p(y_t) / Σ m_t

其中 m_t 取 0 或 1。分母只统计有效 token 数,否则长回复和短回复的样本权重会不一样。

这里有个容易踩的坑:训练目标是"预测下一个词",所以预测和标签天然错开一位,掩码也必须跟着对齐。实现方式各家不同——有的框架让你直接给出 labels、内部完成错位,有的要求你自己对齐。无论哪种,都得确认被忽略的位置和实际的提问 token 是同一批。这类 bug 不报错,只是悄悄把效果拉低。

和相邻概念的区别

概念管什么为什么需要
损失掩码 Loss Masking哪些位置算损失、产生梯度语义上不该学的内容:用户提问、AI 词典:系统提示词">系统提示词
注意力掩码 Attention Mask每个位置能"看到"哪些位置保证因果性,不让模型偷看后文
填充掩码 Padding Mask屏蔽凑 batch 用的填充 token长度不同的样本拼在一起,填充位不该影响结果

三者经常同时存在,实现里有时共用一个张量,很容易混。另外还有样本级过滤:整条数据直接扔掉。token 级掩码的价值在于保留上下文,只丢掉梯度。

对实际工作的意义

做微调的人,建议在数据管线里固定打印一条样本,把 input 和 labels 并排看:提问部分是否被忽略、助手回复是否保留、结束符建议保留(否则模型学不会在该停的时候停)。不同框架和 chat template 的处理方式不一样,具体以官方文档为准。

普通用户也有感知:聊天机器人复读你的问题,或者回复里蹦出"用户:""Human:",多半就是这一步没做干净留下的痕迹。

AI 生成本文由 AI 基于公开信息自动生成,仅供参考。