自学内容网 自学内容网

要不要设置tokenizer.pad_token = tokenizer.eos_token? ——对pad_token和eos_token的分析

是否应该让pad_token=eos_token?

pad_token和eos_token在训练过程和推理中扮演的角色是不同的

训练中

pad_token

pad_token的作用:训练中pad_token主要是用来补齐一个batch中各个样本的长度的,这样可以方便batch训练。

pad的方向:另外,pad包括在右边padding,或者在左边padding,这两种方式会产生区别,例如在位置编码上会产生不同,可能会影响效果 (动动小手搜一搜,往上很多讨论)。
我的建议是选择pad left,这样在prompt-completion的训练中,prompt和completion是连续在一起的,中间没有pad分割。如果训练的是llama,glm这类基于ROPE的相对位置编码方案,那么这个pad可以在理论上对效果不产生任何影响。

注意

  1. 在主流的大语言模型训练中,模型并不会学习预测生成pad_token。
    ps:例如,如果你使用huggingface的trainer或者trl库中的SFTrainer训练大语言模型,Trainer中默认调用的DataCollator (DataCollatorForLanguageModeling) 的默认行为,会去在label中寻找你设置的pad_token,并且将这个token label重置为-100 (这个是ignore index),因此,模型并不会学习生成pad_token。
  2. 和过去的语言模型不同,现在的LLM很多时候pad_token并不会被默认指定,这也给了使用者更多的灵活性。

eos_token

eos_token的作用:当然是用来标记结束。很明确。

注意

  1. 正常情况下,模型应当学习正常生成eos_token,以正确的结束生成内容。例如文章的结尾,对话的结束。

推理中

pad_token

就像上文说的,正常的训练中,模型并不会学习生成pad_token(如果你要魔改,那除外),因此,模型在推理过程中不会输出pad,同时模型的输入如果存在left/right padding,也会被attention mask遮盖。因此正常情况,pad_token设置不设置几乎不会对推理阶段造成影响。

eos_token

如果你调用默认的模型生成方法,例如model.generate()方法,那么模型会在第一次采样生成eos_token的时候,认为已经生成到了句子的结束,从而终止生成过程。

能不能设置tokenizer.pad_token = tokenizer.eos_token?

推理中

根据上面的分析,如果你pad_token = eos_token,反正模型的输入无论你怎么pad,attention_mask会尽职尽责的,同时正常条件下,模型也不会生成pad_token,那么他会正常的生成到第一个eos_token让这个任务结束。所以结论是:可以

训练中

如果在训练中你设置了pad_token = eos_token,下面有两种情况:

  1. 你用默认的训练方案,例如使用huggingface的Trainer,那么模型将不会学习生成pad_token,又因为pad_token = eos_token,模型被迫也不会学习生成eos_token。这样将带来巨大的问题!
    例如:训练数据是 How are you? Thank you <eos_token> 此时,模型将不会学习到生成eos_token,那么这样训练的模型很有可能在推理过程(model.generate)中没办法采样到eos,从而只能生成到max_length limit。
  2. 你让模型学习生成pad_token。(这种形式的任务也有)。这个时候,模型生成pad_token等价于生成eos_token。这个时候将不能使用model.generate这类默认方案进行推理,否则一生成pad,模型就结束任务啦。

综上,在训练中,能不能用pad_token = eos_token?结论是:有坑!

怎么办?
我的选择是,随便拿一个不用的token就好了!例如:tokenizer.pad_token="<|reserved_special_token_9|>; tokenizer.padding_side="left"",这样pad_token纯粹起到占位作用,正常情况下,不影响loss,不影响相对位置编码,也不影响推理输出。


原文地址:https://blog.csdn.net/weixin_44839047/article/details/143625998

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!