调整用于条件生成的预训练Huggingface Pegasus模型层数的问题
解决Pegasus修改层数时的索引越界错误
你遇到的索引越界问题,核心原因是新增的层数没有对应的预训练权重:原google/pegasus-pubmed的encoder/decoder层数默认是12层,你改成14层后,模型会创建14层结构,但加载预训练权重时只有12层的参数,代码尝试给第13、14层赋值时找不到对应权重,就会触发索引越界。
另外,直接从头创建PegasusConfig会遗漏原模型的很多关键默认参数(比如hidden_size、ffn_dim等),也会导致参数不匹配问题。
正确的修改步骤
- 先加载原模型的配置,再修改目标参数,继承所有默认配置
- 加载预训练权重后,手动初始化新增层的参数,避免权重缺失
示例代码
from transformers import PegasusConfig, PegasusForConditionalGeneration # 加载原模型的完整配置,避免遗漏参数 original_config = PegasusConfig.from_pretrained('google/pegasus-pubmed') # 修改需要调整的参数 original_config.encoder_layers = 14 original_config.decoder_layers = 14 original_config.encoder_attention_heads = 16 original_config.decoder_attention_heads = 16 original_config.max_position_embeddings = 2048 # 加载模型,ignore_mismatched_sizes=True跳过已存在层的形状不匹配问题 model = PegasusForConditionalGeneration.from_pretrained( 'google/pegasus-pubmed', config=original_config, ignore_mismatched_sizes=True ) # 初始化新增的encoder层(原模型12层,新增2层) encoder_layer_count_diff = original_config.encoder_layers - len(model.model.encoder.layers) for _ in range(encoder_layer_count_diff): # 复制已有层的结构,用模型默认初始化方法初始化参数 new_encoder_layer = model.model.encoder.layer[0].__class__(original_config) new_encoder_layer.apply(model._init_weights) model.model.encoder.layers.append(new_encoder_layer) # 同样处理decoder的新增层 decoder_layer_count_diff = original_config.decoder_layers - len(model.model.decoder.layers) for _ in range(decoder_layer_count_diff): new_decoder_layer = model.model.decoder.layer[0].__class__(original_config) new_decoder_layer.apply(model._init_weights) model.model.decoder.layers.append(new_decoder_layer)
补充说明
- 如果是减少层数,直接修改config后加载模型,
ignore_mismatched_sizes=True就能正常工作,因为只需要加载前N层的权重,不会有缺失。 - 新增层用模型自带的
_init_weights方法初始化,能保证参数符合Pegasus的初始化规范,避免随机初始化带来的不稳定。
内容的提问来源于stack exchange,提问作者Simran
相关产品推荐
相关产品推荐

