GPT-2微调脚本运行时出现IndexError: index out of range in self的问题求助
GPT-2微调脚本运行时出现IndexError: index out of range in self的问题求助
Hey Joe,我来帮你拆解这个问题并给出解决方案!
关于你问的「index指的是什么」
你遇到的IndexError: index out of range in self里的index,指的是你新添加的[PAD] token对应的ID。GPT-2预训练模型的原始词汇表大小是50257,你给tokenizer添加[PAD]后,这个新token的ID就是50257(词汇表索引从0开始),但模型的词嵌入层还保持着原始的50257个向量的规模,当tokenizer把这个超出原始范围的ID传入模型时,就触发了索引越界的错误。
错误原因&解决办法
问题出在你只给tokenizer添加了pad token,却没有同步更新GPT-2模型的词嵌入层和语言模型头的参数。只需要在添加pad token后,调用model.resize_token_embeddings()方法,让模型适配新的词汇表大小即可。
修改后的完整可运行代码
from datasets import load_dataset from transformers import GPT2Tokenizer, GPT2LMHeadModel, Trainer, TrainingArguments # 调整顺序:先处理tokenizer,再加载模型 tokenizer = GPT2Tokenizer.from_pretrained('gpt2') tokenizer.add_special_tokens({'pad_token': '[PAD]'}) # 加载模型后立刻调整嵌入层大小,匹配tokenizer的新词汇表 model = GPT2LMHeadModel.from_pretrained('gpt2') model.resize_token_embeddings(len(tokenizer)) # 关键修复步骤 # 准备训练数据 train_file_path = 'shakespeare.txt' extension = "text" data_files = train_file_path raw_datasets = load_dataset( extension, data_files=data_files, ) def tokenize_function(examples): return tokenizer(examples['text'], padding='max_length', truncation=True, max_length=512) column_names = list(raw_datasets["train"].features) tokenized_datasets = raw_datasets.map( tokenize_function, batched=True, remove_columns=column_names, ) # 训练参数设置 training_args = TrainingArguments( output_dir='./results', num_train_epochs=3, per_device_train_batch_size=2, per_device_eval_batch_size=2, warmup_steps=500, weight_decay=0.01, logging_dir='./logs', logging_steps=1000, save_steps=5000, evaluation_strategy='steps', eval_steps=5000, load_best_model_at_end=True ) # 初始化Trainer并开始训练 trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_datasets["train"] ) trainer.train()
额外说明
我还调整了tokenizer和模型的加载顺序,先处理tokenizer再加载模型,这样能确保resize_token_embeddings操作准确匹配最新的词汇表规模,避免潜在的逻辑问题。
备注:内容来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

