Hugging Face模型pad token编号疑问:LlamaTokenizer填充编号超嵌入层范围
问题原因与解决方法
为什么pad token id是32000?
Llama-2原生tokenizer的词典大小为32000,对应的token id范围是0到31999。当你调用add_special_tokens({'pad_token': '[PAD]'})时,tokenizer会自动将新添加的特殊token的id设为当前词典的长度,也就是32000。但原模型的嵌入层仅预训练到id 31999,因此会出现索引越界问题。
两种解决办法
1. 复用现有特殊token作为pad token(推荐)
不需要新增token,直接用Llama自带的eos_token(id为2)充当pad token,不会超出原模型的词典范围:
x = "A" tokenizer = LlamaTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf") tokenizer.pad_token = tokenizer.eos_token # 复用eos token做填充 tokenized_text = tokenizer(x, return_tensors="pt", padding='max_length', max_length=10, truncation=True) print(tokenized_text)
2. 新增pad token并同步调整模型嵌入层
如果必须使用独立的[PAD] token,需要同步resize模型的嵌入层,适配新的词典大小:
from transformers import LlamaForCausalLM x = "A" tokenizer = LlamaTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf") tokenizer.add_special_tokens({'pad_token': '[PAD]'}) # 加载模型并调整嵌入层大小 model = LlamaForCausalLM.from_pretrained("meta-llama/Llama-2-7b-chat-hf") model.resize_token_embeddings(len(tokenizer)) tokenized_text = tokenizer(x, return_tensors="pt", padding='max_length', max_length=10, truncation=True) print(tokenized_text)
内容的提问来源于stack exchange,提问作者JobHunter69
相关产品推荐
相关产品推荐

