You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:09:59