利用预训练语言模型检查点构建编码器-解码器模型 – Hugging Face 博客摘要

利用预训练检查点构建编码器-解码器模型

Hugging Face 在 2020 年 11 月 9 日发布的这篇博客文章介绍了如何使用来自预训练的仅编码器(encoder-only)或仅解码器(decoder-only)检查点(如 BERT、RoBERTa 或 GPT2)的权重来初始化编码器-解码器(seq2seq)模型。这种热启动(warm-starting)技术避免了构建完整的编码器-解码器模型所需的高昂预训练成本,并在一系列序列到序列任务上取得了与 T5 和 Pegasus 等模型相媲美的结果。

热启动理论

编码器-解码器模型由编码器堆栈和解码器堆栈组成。热启动可以通过四种方式实现:(1) 编码器和解码器均来自仅编码器检查点(例如 BERT),(2) 编码器来自仅编码器检查点,解码器来自仅解码器检查点(例如 BERT + GPT2),(3) 仅编码器来自仅编码器检查点,或者 (4) 仅解码器来自仅解码器检查点。从 BERT 进行热启动时,编码器层与 BERT 层一一对应,并使用 BERT 权重进行初始化。解码器从 BERT 接收相同的自注意力(self-attention)和 LM-Head 权重,但由于 BERT 没有交叉注意力(cross-attention),因此会添加交叉注意力层并进行随机初始化。从 GPT2 进行解码器热启动时,自注意力层和 LM-Head 可以直接复制,而交叉注意力层将再次进行随机初始化。

如果编码器和解码器的架构相同(不包括交叉注意力),它们的权重可以进行绑定(tied),从而使参数量减半。这种权重绑定仅在两侧都从同一个仅编码器检查点进行热启动时才有意义。

热启动模型分析

该博客总结了 Rothe et al. (2020) 的实验,该实验在四个任务组上将各种热启动的编码器-解码器配置与随机初始化的基准模型进行了比较:句子融合(sentence fusion)、句子拆分(sentence splitting)、机器翻译(WMT14 EN↔DE)和生成式摘要(CNN/Dailymail, BBC XSum, Gigaword)。所有模型都使用了 12 层、768 维隐藏层大小,对应于 bert-base-cased、roberta-base 或 gpt2 检查点。

模型变体表显示了随机初始化(“random”)和利用(“leveraged”)的参数数量。例如:

  • Rnd2Rnd: 221 M random, 0 leveraged
  • Rnd2BERT / BERT2Rnd: 112 M random, 109 M leveraged
  • BERT2BERT: 26 M random, 195 M leveraged
  • BERTShare / RoBERTaShare: 26 M random, 109 M / 126 M leveraged (由于权重绑定)
  • BERT2GPT2: 26 M random, 234 M leveraged
  • RoBERTa2GPT2: 26 M random, 250 M leveraged

结果(引用自表格)表明:

  • 句子融合 (DiscoFuse, SARI): RoBERTa2GPT2 在 100% 数据上达到 89.9,在 10% 数据上达到 87.1;RoBERTaShare (large) 达到 90.3 / 87.7。
  • 句子拆分 (WikiSplit, SARI): BERTShare 得分为 63.5,RoBERTaShare 为 63.4,RoBERTaShare (large) 为 63.8。
  • 机器翻译 (WMT14, BLEU-4): BERT2Rnd 和 BERT2BERT 均达到 30.1 → 32.7 (EN→DE / DE→EN)。BERT2Rnd (large, custom) 提升至 31.7 → 34.2。基于 GPT2 的模型在 EN→DE 任务上表现较差(例如 BERT2GPT2 为 23.2),因为 GPT2 的词汇表仅限英语。
  • 摘要 (Rouge-2): RoBERTaShare 在 CNN/Dailymail 上达到 18.95,在 BBC XSum 上达到 17.50,在 Gigaword 上达到 19.70。RoBERTaShare (large) 在 CNN/Dailymail 上达到 18.91,在 BBC XSum 上达到 18.79,在 Gigaword 上达到 19.78。BERTShare 和 BERT2BERT 紧随其后,而基于 GPT2 的模型表现滞后(例如 BERT2GPT2 在 CNN/Dailymail 上为 4.96)。

分析结论认为,对编码器进行热启动在各项任务中都能带来持续的提升,而对解码器进行热启动带来的收益较少,因为交叉注意力层仍保持随机初始化。当输入和输出分布相似时(例如 BBC XSum),权重共享是有益的,但在模型容量和差异化词汇表至关重要的翻译任务中可能会产生负面影响。将检查点词汇表与任务语言匹配是成功的关键。

实践:使用 🤗Transformers 进行热启动

该博客提供了一个完整的 notebook,演示了如何热启动一个 BERT2BERT 模型并在 CNN/Dailymail 摘要任务上对其进行微调。

  1. 安装库datasets==1.0.2transformers==4.2.1
  2. 加载并预处理数据:使用 bert-base-uncased(最大长度 512)对文章进行分词,并对高亮内容(最大长度 128)进行处理,将填充标签(padding label)替换为 -100。
  3. 热启动模型
    from transformers import EncoderDecoderModel
    bert2bert = EncoderDecoderModel.from_encoder_decoder_pretrained(
        "bert-base-uncased", "bert-base-uncased"
    )
    
    正如预期的那样,警告显示分类器 (cls) 权重未被使用,且交叉注意力权重是新初始化的。
  4. 设置生成参数(复制自 bart-large-cnn):
    bert2bert.config.decoder_start_token_id = tokenizer.cls_token_id
    bert2bert.config.eos_token_id = tokenizer.sep_token_id
    bert2bert.config.pad_token_id = tokenizer.pad_token_id
    bert2bert.config.vocab_size = bert2bert.config.encoder.vocab_size
    bert2bert.config.max_length = 142
    bert2bert.config.min_length = 56
    bert2bert.config.no_repeat_ngram_size = 3
    bert2bert.config.early_stopping = True
    bert2bert.config.length_penalty = 2.0
    bert2bert.config.num_beams = 4
    
  5. 使用 Seq2SeqTrainerSeq2SeqTrainingArguments 进行微调,并使用 predict_with_generate=True 以及一个返回 Rouge-2 精确率、召回率和 F1 分数的 compute_metrics 函数。
  6. 在子集上进行训练(32 个训练样本,8 个验证样本)以进行演示;在 TITAN RTX 上进行完整训练大约需要 8 小时。
  7. 在测试集上进行评估;训练完整的 BERT2BERT 模型 (patrickvonplaten/bert2bert_cnn_daily_mail) 在完整的 CNN/Dailymail 评估中实现了 18.22 的 Rouge-2 F1 分数,与论文中报告的数值相当或略高。

该 notebook 还展示了如何保存和重新加载模型,以及如何通过向 from_encoder_decoder_pretrained 传递 tie_encoder_decoder=True 来绑定编码器-解码器权重。

核心结论

使用现有的 BERT、RoBERTa 或 GPT2 检查点来热启动编码器-解码器模型,可以让从业者在无需承担从头开始预训练的巨大计算成本的情况下,获得强大的 seq2seq 性能。编码器初始化是最关键的因素;解码器初始化带来的价值较小,除非在微调期间学习交叉注意力。当输入和输出语言或格式相似时,权重绑定是有益的,而检查点与任务语言之间的词汇匹配是成功的先决条件。

Sources