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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:52:20