PyTorch微调GPT2触发IndexError索引越界问题求助
GPT2微调触发
IndexError: index out of range in self的原因及修复方案 问题原因
- 分词器与GPT2预训练模型词汇表不匹配:GPT2默认词汇表大小为50257,若使用自定义分词器、非GPT2系列的分词器,或修改过分词器的词汇表,会导致生成的token ID超出模型嵌入层的索引范围。
- 数据中存在未被正确映射的token:部分特殊字符、生僻词被分词器映射到超出词汇表的ID,或分词器未设置
unk_token导致非法ID生成。 - 模型与分词器配置错位:加载模型时使用了非标准GPT2权重(比如自定义小词汇表的GPT2),但搭配了标准GPT2分词器,两者词汇表大小不匹配。
- 数据预处理时手动篡改token ID:比如手动添加了超出词汇表范围的标识ID,导致嵌入层索引越界。
修复方案
- 统一使用GPT2官方分词器与模型:确保加载的分词器和模型来自同一预训练权重,避免配置错位:
from transformers import GPT2Tokenizer, GPT2LMHeadModel tokenizer = GPT2Tokenizer.from_pretrained("gpt2") # GPT2默认无pad_token,需手动设置 tokenizer.pad_token = tokenizer.eos_token model = GPT2LMHeadModel.from_pretrained("gpt2")
- 过滤/修正越界token ID:在数据处理阶段添加校验,将超出范围的token替换为pad_token或直接过滤样本:
# 替换越界token vocab_size = model.config.vocab_size def correct_tokens(examples): examples["input_ids"] = [ [t if t < vocab_size else tokenizer.pad_token_id for t in seq] for seq in examples["input_ids"] ] return examples dataset = dataset.map(correct_tokens) # 或直接过滤含越界token的样本 def filter_invalid(examples): return all(t < vocab_size for t in examples["input_ids"]) dataset = dataset.filter(filter_invalid)
- 验证数据集的token ID范围:训练前检查数据集中的最大token ID,确认其小于模型词汇表大小:
max_token_id = 0 for item in dataset: current_max = max(item["input_ids"]) if current_max > max_token_id: max_token_id = current_max print(f"数据集最大token ID: {max_token_id}, 模型词汇表大小: {model.config.vocab_size}")
- 处理未知token:确保分词器的
unk_token已正确设置,避免生成非法ID:
tokenizer.unk_token = tokenizer.eos_token # 或指定其他合法token
内容的提问来源于stack exchange,提问作者Peter Shaw
相关产品推荐
相关产品推荐

