肯定有很多小伙伴有疑问,大模型的预训练和推理过程的padding如何设置,以及有什么区别?
结论:
- 1 预训练时left padding和right padding都可以
- 2 推理时一定要设置left padding
1 预训练
预训练过程中由于会设置ignore_index=-100,故会忽略padding的计算。所以预训练过程没有从padding token预测下一个词的训练。
2 推理
left padding : [padding, padding , x1, x2, x3] -> [padding, padding , x1, x2, x3, x4]
right_padding: [x1, x2, x3, padding, padding] -> [x1, x2, x3, padding, padding, x4] 无法做到
由于huggingface的casuallm的类的实现方法是使用最后一个token预测下一个token,如果设置padding siez = right, 故此时padding token参与了下一个token的预测,由于预训练没有该种训练,故预测结果有误。
事实上如果改写推理类,使用padding token前一个token进行next token的预测也可以实现,只是推理类需要实时记录每一个序列的长度。综合下来不如使用left_padding。