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

调整用于条件生成的预训练Huggingface Pegasus模型层数的问题

解决Pegasus修改层数时的索引越界错误

你遇到的索引越界问题,核心原因是新增的层数没有对应的预训练权重:原google/pegasus-pubmed的encoder/decoder层数默认是12层,你改成14层后,模型会创建14层结构,但加载预训练权重时只有12层的参数,代码尝试给第13、14层赋值时找不到对应权重,就会触发索引越界。

另外,直接从头创建PegasusConfig会遗漏原模型的很多关键默认参数(比如hidden_size、ffn_dim等),也会导致参数不匹配问题。

正确的修改步骤

  1. 先加载原模型的配置,再修改目标参数,继承所有默认配置
  2. 加载预训练权重后,手动初始化新增层的参数,避免权重缺失

示例代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:07:07