基於 Transformer 的編碼器-解碼器模型 Hugging Face 部落格文章 2020
TL;DR
Hugging Face 發布了一篇教育性部落格文章,逐步說明基於 Transformer 的編碼器-解碼器模型,解釋其編碼器與解碼器組件、 自注意力與交叉注意力的運作方式,並以 MarianMT 翻譯範例展示使用 🤗Transformers 套件進行自回歸生成。
背景
該部落格文章將序列對序列任務描述為將輸入向量序列映射到未知長度的目標序列,此表述促使了編碼器-解碼器模型的發展。
"自然語言生成(NLG)——NLP 的子領域——的任務最適合以序列對序列問題來表述。"
文章指出,早期基於 RNN 的編碼器-解碼器雖能處理可變長度的輸出,但受到梯度消失與平行化受限的問題。
"RNN 受到梯度消失問題的困擾,使得捕捉長距離依賴變得非常困難……其二,RNN 內在的循環結構阻礙了編碼時的有效平行化。"
接著,文章介紹了 Vaswani 等人(2017)提出的 Transformer 架構,作為能高度平行化處理可變長度序列的解決方案。
編碼器-解碼器架構
基於 Transformer 的編碼器-解碼器由編碼器堆疊與解碼器堆疊組成,兩者皆由殘差注意力區塊構成。
"類似於基於 RNN 的編碼器-解碼器模型,基於 Transformer 的編碼器-解碼器模型由編碼器與解碼器組成,兩者皆是殘差注意力區塊的堆疊。"
編碼器將輸入序列映射為一系列具語境的隱藏狀態,而解碼器則在給定這些編碼與先前產生的標記的條件下,建模目標序列的條件分佈。
"基於 Transformer 的編碼器部分將輸入序列 … 編碼為一系列隱藏狀態… 基於 Transformer 的解碼器部分則根據已編碼的隱藏狀態序列,對目標向量序列的條件機率分佈進行建模…"
自回歸生成以逐步方式進行,解碼器在首次前向傳遞後會重複使用編碼器的輸出。
"重要的是要了解編碼器僅在第一次前向傳遞時用於映射 … 從第二次前向傳遞開始,解碼器即可直接利用先前計算好的編碼。"
編碼器細節
每個編碼器區塊包含一個雙向自注意力層,之後接兩個前饋層。自注意力層將輸入向量投射為查詢、鍵和值,透過 softmax 計算注意力權重,並回傳值的加權總和加上原始輸入。
"每個輸入向量 … 被投射為鍵向量、值向量與查詢向量… 輸出向量被定義為所有值向量的加權總和 … 加上輸入向量本身。"
由於每個查詢都會注意所有鍵,編碼器能在一次運算中捕捉長距離依賴,並在各位置間實現完整平行化。
"輸出 … 透過一系列矩陣乘法與 softmax 操作計算,可有效平行化。"
程式碼片段顯示,修改輸入的最後一個詞會改變編碼器對第一個標記的表示,驗證了上下文依賴性。
解碼器細節
每個解碼器區塊包含單向自注意力層、交叉注意力層以及兩個前饋層。單向自注意力限制每個查詢僅注意自身位置與先前位置,確保自回歸行為。
"在單向自注意力中,每個查詢向量僅與其對應的鍵向量以及所有先前的鍵向量比較… 這防止了輸出向量包含任何關於後續輸入向量的資訊。"
交叉注意力接著透過將解碼器的隱藏狀態作為查詢,對編碼器的鍵和值進行投射,將解碼器的表示條件於完整的編碼器輸出。
"交叉注意力層將每個輸入向量與所有具語境的編碼向量建立關聯,從而使下一個目標向量的機率分佈同時受編碼器輸入的條件影響。"
解碼器的最終線性層(LM head)將隱藏狀態映射為詞彙表上的 logits,然後透過 softmax 轉換為機率。
"『LM head』將目標向量的編碼序列映射為 logits 向量序列… 透過 softmax 操作即可得到整個詞彙表的機率分佈。"
程式碼範例示範,修改給定位置之後的解碼器標記不會影響較早標記的 logits,說明了單向自注意力的因果性。
使用 🤗Transformers 進行推論
文章示範如何使用 🤗Transformers 套件搭配預訓練的 MarianMT 模型執行翻譯,並強調 generate() 方法在內部處理編碼、使用 BOS/pad 標記初始化解碼器,以及光束搜尋解碼。
"呼叫
.generate()會在背後執行多項操作。首先,它將input_ids傳遞給編碼器。其次,它傳遞一個預先定義的標記,即<pad>符號… 並將編碼後的input_ids一併傳給解碼器。第三,它套用光束搜尋解碼機制…"
提供的範例將「I want to buy a car」翻譯成德文,產生的輸出為 <pad> Ich will ein Auto kaufen。
附錄:程式碼片段
附錄包含一個最小化的貪婪解碼迴圈,手動逐步呼叫編碼器與解碼器,使用 argmax 選取下一個標記,並將其串接至解碼器輸入,重現翻譯的前幾個詞。
"在此程式碼範例中,我們精確展示了前述內容… 因此,模型產生了詞彙 'Ich will ein'。"
文章最後指出,讀者現在已對 Transformer 基礎的編碼器-解碼器模型的運作原理以及如何使用 🤗Transformers 有了詳細的了解,同時說明訓練細節將於未來的文章中說明。