利用預訓練語言模型檢查點來建構編碼器-解碼器模型 – 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

結果(引用自表格)顯示:

  • Sentence Fusion (DiscoFuse, SARI): RoBERTa2GPT2 在 100% 數據上達到 89.9,在 10% 數據上達到 87.1;RoBERTaShare (large) 達到 90.3 / 87.7。
  • Sentence Splitting (WikiSplit, SARI): BERTShare 得分為 63.5,RoBERTaShare 為 63.4,RoBERTaShare (large) 為 63.8。
  • Machine Translation (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 的詞彙表僅限英文。
  • Summarization (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 精準率(precision)、召回率(recall)和 F-measure 的 compute_metrics 函數。
  6. 在子集上進行訓練(32 個訓練樣本,8 個驗證樣本)以供演示;在 TITAN RTX 上進行完整訓練約需 8 小時。
  7. 在測試集上進行評估;完整訓練後的 BERT2BERT 模型 (patrickvonplaten/bert2bert_cnn_daily_mail) 在完整的 CNN/Dailymail 評估中達到了 18.22 的 Rouge-2 fmeasure,與論文中報告的數據相符或略高。

該 notebook 還展示了如何儲存與重新載入模型,以及如何透過在 from_encoder_decoder_pretrained 中傳遞 tie_encoder_decoder=True 來綁定編碼器-解碼器權重。

核心要點

使用現有的 BERT、RoBERTa 或 GPT2 檢查點來熱啟動編碼器-解碼器模型,讓從業者無需負擔沉重的從零預訓練計算成本,即可獲得強大的 seq2seq 性能。編碼器初始化是最關鍵的因素;解碼器初始化提供的價值較小,除非在微調期間學習交叉注意力。當輸入與輸出語言或格式相似時,權重綁定是有益的,而檢查點與任務語言之間的詞彙匹配是成功的先決條件。

Sources