colab:https://colab.research.google.com/drive/1poFdFYmkR_rDM5U5Z2WWjTepMQ8h vzNc?usp=sharing
HF falcon 教程有以下行:
tokenizer.pad_token = tokenizer.eos_token
Run Code Online (Sandbox Code Playgroud)
我觉得很奇怪。pad 和 eos 是相同的,但为什么首先要在它们之间做出区分呢?
请注意,这样做 pad = eos. 这意味着在微调期间,模型永远不会被训练为输出 eos(最有可能),因为 eos 被视为填充令牌并且不会反向传播:
I just observed that when I set tokenizer.pad_token = tokenizer.eos_token during training, the model won't stop generating during inference, since it was trained to not output the eos token (per discussions above).
Run Code Online (Sandbox Code Playgroud)
我看到了这个(这里https://github.com/huggingface/transformers/issues/22794):
tokenizer.add_special_tokens({'pad_token': '[PAD]'})
Run Code Online (Sandbox Code Playgroud)
但这假设模型有 pad_token。我认为必须进行额外的检查,确保它确实具有 pad_token 的嵌入,以便不存在运行时错误(〜从嵌入“表”/矩阵提取矩阵中的类型错误)。
但如果这样做,可能需要注意初始化新令牌,以便它主导生成: https: //nlp.stanford.edu/~johnhew/vocab-expansion.html
代码:
tokenizer.pad_token = tokenizer.eos_token
Run Code Online (Sandbox Code Playgroud)
该死的,这仍然不起作用:
UserWarning: You …Run Code Online (Sandbox Code Playgroud) machine-learning pytorch huggingface-transformers huggingface-tokenizers huggingface