关于模型padding左对齐和右对齐的问题

最近微调模型进行原因预测任务训练的时候,在eval阶段进行推理生成时遇到了一个警告:“A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set padding_side='left' when initializing the tokenizer.”,我将tokenizer初始化的定义设置为左填充依然出现该警告,问了下身边对大模型比较了解的同学,发现是token序列结尾加了eos符号导致出现的warning,下面是transformers库中该警告出现的条件:

warning

为什么模型训练选择右填充,推理时选择左填充;为什么训练时需要在结尾添加标记符,而推理时则不需要,下面给出解释说明:

训练:Q+A[EOS]

模型训练时,对于输入的token序列,我们知道其真实标签(Ques部分可直接用-100作为 mask 填充或无效标签,以确保这些位置不会影响损失计算),采用右填充是为了让每个batch内的样本长度对齐。在结尾添加eos标记符是为了告诉模型输入序列的结束位置,如果没有 EOS token,模型可能会将序列当作是没有结束的,进而可能会试图无限制地生成下一个 token,导致训练不稳定或生成行为不正确

推理:Q

自回归模型在推理时,从bos标记符开始从左到右依次预测下一个词来生成内容,如下面的图所示:

padding

如果采用右填充,将被放置在In-Context的右端,从而改变了In-Context内容,这将导致生成时模型的上下文理解出现偏差,结果可能会影响到生成的质量或连贯性。此外,如果在In-Context的结尾处加入eos标记符,这将导致模型停止生成。

参考链接:模型训练选择right填充,推理选择left填充,为什么? - 知乎


关于模型padding左对齐和右对齐的问题
http://example.com/2025/02/17/LLM padding/
作者
Peter
发布于
2025年2月17日
许可协议