背景 | 基于 Transformers 的編碼器-解碼器模型

!pip?install?transformers==4.2.1
!pip?install?sentencepiece==0.1.95
Vaswani 等人在其名作 Attention is all you need 中首創(chuàng)了?基于 transformer?的編碼器-解碼器模型,如今已成為自然語言處理 (natural language processing,NLP) 領(lǐng)域編碼器-解碼器架構(gòu)的?事實標(biāo)準(zhǔn)?。
最近基于 transformer 的編碼器-解碼器模型訓(xùn)練這一方向涌現(xiàn)出了大量關(guān)于?預(yù)訓(xùn)練目標(biāo)函數(shù)?的研究,?例如?T5、Bart、Pegasus、ProphetNet、Marge 等,但它們所使用的網(wǎng)絡(luò)結(jié)構(gòu)并沒有改變。
本文的目的是?詳細(xì)?解釋如何用基于 transformer 的編碼器-解碼器架構(gòu)來對?序列到序列 (sequence-to-sequence)?問題進(jìn)行建模。我們將重點關(guān)注有關(guān)這一架構(gòu)的數(shù)學(xué)知識以及如何對該架構(gòu)的模型進(jìn)行推理。在此過程中,我們還將介紹 NLP 中序列到序列模型的一些背景知識,并將?基于 transformer?的編碼器-解碼器架構(gòu)分解為?編碼器?和?解碼器?這兩個部分分別討論。我們提供了許多圖例,并把?基于 transformer?的編碼器-解碼器模型的理論與其在 ?? transformers 推理場景中的實際應(yīng)用二者聯(lián)系起來。請注意,這篇博文?不?解釋如何訓(xùn)練這些模型 —— 我們會在后續(xù)博文中涵蓋這一方面的內(nèi)容。
基于 transformer 的編碼器-解碼器模型是?表征學(xué)習(xí)?和?模型架構(gòu)?這兩個領(lǐng)域多年研究成果的結(jié)晶。本文簡要介紹了神經(jīng)編碼器-解碼器模型的歷史,更多背景知識,建議讀者閱讀由 Sebastion Ruder 撰寫的這篇精彩 博文。此外,建議讀者對?自注意力 (self-attention) 架構(gòu)?有一個基本了解,可以閱讀 Jay Alammar 的 這篇博文 復(fù)習(xí)一下原始 transformer 模型。
截至本文撰寫時,?? transformers 庫已經(jīng)支持的編碼器-解碼器模型有:?T5?、?Bart?、?MarianMT?以及?Pegasus?,你可以從 這兒 獲取相關(guān)信息。
本文分 4 個部分:
背景?-?簡要回顧了神經(jīng)編碼器-解碼器模型的歷史,重點關(guān)注基于 RNN 的模型。
編碼器-解碼器?-?闡述基于 transformer 的編碼器-解碼器模型,并闡述如何使用該模型進(jìn)行推理。
編碼器?-?闡述模型的編碼器部分。
解碼器?-?闡述模型的解碼器部分。
每個部分都建立在前一部分的基礎(chǔ)上,但也可以單獨閱讀。
背景
自然語言生成 (natural language generation,NLG) 是 NLP 的一個子領(lǐng)域,其任務(wù)一般可被建模為序列到序列問題。這類任務(wù)可以定義為尋找一個模型,該模型將輸入詞序列映射為目標(biāo)詞序列,典型的例子有?摘要?和?翻譯?。在下文中,我們假設(shè)每個單詞都被編碼為一個向量表征。因此,?個輸入詞可以表示為??個輸入向量組成的序列:
因此,序列到序列問題可以表示為找到一個映射?,其輸入為??個向量的序列,輸出為??個向量的目標(biāo)序列?。這里,目標(biāo)向量數(shù)??是先驗未知的,其值取決于輸入序列:
?
Sutskever 等 (2014) ?的工作指出,深度神經(jīng)網(wǎng)絡(luò) (deep neural networks,DNN)“?盡管靈活且強大,但只能用于擬合輸入和輸出維度均固定的映射。?”?
因此,要用使用 DNN 模型??解決序列到序列問題就意味著目標(biāo)向量數(shù)??
必須是先驗已知的,且必須獨立于輸入
?。這樣設(shè)定肯定不是最優(yōu)的。因為對 NLG 任務(wù)而言,目標(biāo)詞的數(shù)量通常取決于輸入內(nèi)容?
,而不僅僅是輸入長度?
。?例如?,一篇 1000 字的文章,根據(jù)內(nèi)容的不同,有可能可以概括為 200 字,也有可能可以概括為 100 字。
2014 年,Cho 等人 和 Sutskever 等人 提出使用完全基于遞歸神經(jīng)網(wǎng)絡(luò) (recurrent neural networks,RNN) 的編碼器-解碼器模型來解決?序列到序列?任務(wù)。與 DNN 相比,RNN 支持輸出可變數(shù)量的目標(biāo)向量。下面,我們深入了解一下基于 RNN 的編碼器-解碼器模型的功能。
在推理過程中,RNN 編碼器通過連續(xù)更新其?隱含狀態(tài)?? 對輸入序列?
?進(jìn)行編碼。我們定義處理完最后一個輸入向量?
?后的編碼器隱含狀態(tài)為?
。因此,編碼器主要完成如下映射:
然后,我們用??來初始化解碼器的隱含狀態(tài),再用解碼器 RNN 自回歸地生成目標(biāo)序列。
下面,我們進(jìn)一步解釋一下。從數(shù)學(xué)角度講,解碼器定義了給定隱含狀態(tài)??下目標(biāo)序列?
?的概率分布:
根據(jù)貝葉斯法則,上述分布可以分解為每個目標(biāo)向量的條件分布的積,如下所示:
因此,如果模型架構(gòu)可以在給定所有前驅(qū)目標(biāo)向量的條件下對下一個目標(biāo)向量的條件分布進(jìn)行建模的話:
那它就可以通過簡單地將所有條件概率相乘來模擬給定隱藏狀態(tài)??下任意目標(biāo)向量序列的分布。
那么基于 RNN 的解碼器架構(gòu)如何建模 呢?
從計算角度講,模型按序?qū)⑶耙粫r刻的內(nèi)部隱含狀態(tài)??和前一時刻的目標(biāo)向量?
?映射到當(dāng)前內(nèi)部隱含狀態(tài)?
?和一個?logit 向量?
?(下圖中以深紅色表示):
此處,?為 RNN 編碼器的輸出。隨后,對 logit 向量?
?進(jìn)行?softmax?操作,將其變換為下一個目標(biāo)向量的條件概率分布:
更多有關(guān) logit 向量及其生成的概率分布的詳細(xì)信息,請參閱腳注?。從上式可以看出,目標(biāo)向量?
?的分布是其前一時刻的目標(biāo)向量?
?及前一時刻的隱含狀態(tài)?
?的條件分布。而我們知道前一時刻的隱含狀態(tài)?
?依賴于之前所有的目標(biāo)向量?
,因此我們可以說 RNN 解碼器?隱式?(或間接) 地建模了條件分布?
。
目標(biāo)向量序列??的概率空間非常大,因此在推理時,必須借助解碼方法對 =?
?對 ?
??進(jìn)行采樣才能高效地生成最終的目標(biāo)向量序列。
給定某解碼方法,在推理時,我們首先從分布??中采樣出下一個輸出向量; 接著,將其添加至解碼器輸入序列末尾,讓解碼器 RNN 繼續(xù)從?
?中采樣出下一個輸出向量?
,如此往復(fù),整個模型就以?自回歸?的方式生成了最終的輸出序列。
基于 RNN 的編碼器-解碼器模型的一個重要特征是需要定義一些?特殊?向量,如?? (終止符) 和
??(起始符) 向量。
??向量通常意味著?
?中止,出現(xiàn)這個即“提示”編碼器輸入序列已結(jié)束; 如果它出現(xiàn)在目標(biāo)序列中意味著輸出結(jié)束,一旦從 logit 向量中采樣到?
,生成就完成了。
?向量用于表示在第一步解碼時饋送到解碼器 RNN 的輸入向量?
。為了輸出第一個 logit?
,需要一個輸入,而由于在其之前還沒有生成任何輸入,所以我們饋送了一個特殊的?
?輸入向量到解碼器 RNN。好,有點繞了!我們用一個例子說明一下。

上圖中,我們將編碼器 RNN 編碼器展開,并用綠色表示; 同時,將解碼器 RNN 展開,并用紅色表示。
英文句子?I want to buy a car
,表示為?)。將其翻譯成德語: “Ich will ein Auto kaufen",表示為?
。首先,編碼器 RNN 處理輸入向量?
?并更新其隱含狀態(tài)。請注意,對編碼器而言,因為我們只對其最終隱含狀態(tài)?
?感興趣,所以我們可以忽略它的目標(biāo)向量。然后,編碼器 RNN 以相同的方式依次處理輸入句子的其余部分:?
,并且每一步都更新其隱含狀態(tài),直到遇到向量??
。在上圖中,連接展開的編碼器 RNN 的水平箭頭表示按序更新隱含狀態(tài)。編碼器 RNN 的最終隱含狀態(tài),由?
?表示,其完全定義了輸入序列的?編碼?,并可用作解碼器 RNN 的初始隱含狀態(tài)。可以認(rèn)為,解碼器 RNN 以編碼器 RNN 的最終隱含狀態(tài)為條件。
為了生成第一個目標(biāo)向量,將??向量輸入給解碼器,即上圖中的?。然后通過?
?語言模型頭 (LM Head)?前饋層將 RNN 的目標(biāo)向量進(jìn)一步映射到 logit 向量?
,此時,可得第一個目標(biāo)向量的條件分布:
最終采樣出第一個目標(biāo)詞??(如圖中連接?
?和
??的灰色箭頭所示)。接著,繼續(xù)采樣出第二個目標(biāo)向量:
依此類推,一直到第 6 步,此時從??中采樣出?
,解碼完成。輸出目標(biāo)序列為?
, 即上文中的 “Ich will ein Auto kaufen”。
綜上所述,我們通過將分布??分解為?
?和
??的表示來建?;?RNN 的 encoder-decoder 模型:
在推理過程中,利用高效的解碼方法可以自回歸地生成目標(biāo)序列?。
基于 RNN 的編碼器-解碼器模型席卷了 NLG 社區(qū)。2016 年,谷歌宣布用基于 RNN 的編碼器-解碼器單一模型完全取代其原先使用的的含有大量特征工程的翻譯服務(wù) (參見此處)。
然而,基于 RNN 的編碼器-解碼器模型存在兩個主要缺陷。首先,RNN 存在梯度消失問題,因此很難捕獲長程依賴性,?參見?Hochreiter 等 (2001) ?的工作。其次,RNN 固有的循環(huán)架構(gòu)使得在編碼時無法進(jìn)行有效的并行化,?參見?Vaswani 等 (2017) ?的工作。

?論文的原話是“?盡管 DNN 具有靈活性和強大的功能,但它們只能應(yīng)用于輸入和目標(biāo)可以用固定維度的向量進(jìn)行合理編碼的問題?”,用在本文時稍作調(diào)整。
?這同樣適用于卷積神經(jīng)網(wǎng)絡(luò) (CNN)。雖然可以將可變長度的輸入序列輸入 CNN,但目標(biāo)的維度要么取決于輸入維數(shù)要么需要固定為特定值。
?在第一步時,隱含狀態(tài)被初始化為零向量,并與第一個輸入向量??一起饋送給 RNN。
?神經(jīng)網(wǎng)絡(luò)可以將所有單詞的概率分布定義為?
。首先,其將輸入
??轉(zhuǎn)換為嵌入向量?
,該向量對應(yīng)于 RNN 模型的目標(biāo)向量。隨后將?
?送給“語言模型頭”,即將其乘以?詞嵌入矩陣?(即
),得到??
和詞表?
?中的每個向量?
?的相似度得分,生成的向量稱為 logit 向量?
,最后再通過 softmax 操作歸一化成所有單詞的概率分布:?
。
?波束搜索 (beam search) 是其中一種解碼方法。本文不會對不同的解碼方法進(jìn)行介紹,如對此感興趣,建議讀者參考 此文。
? Sutskever 等 (2014) ?的工作對輸入順序進(jìn)行了逆序,對上面的例子而言,輸入向量變成了 (
)。其動機是讓對應(yīng)詞對之間的連接更短,如可以使得
? 之間的連接更短。該研究小組強調(diào),將輸入序列進(jìn)行逆序是他們的模型在機器翻譯上的性能提高的一個關(guān)鍵原因。
敬請關(guān)注其余部分的文章。
英文原文:?https://hf.co/blog/encoder-decoder
原文作者: Patrick von Platen
譯者: Matrix Yao (姚偉峰),英特爾深度學(xué)習(xí)工程師,工作方向為 transformer-family 模型在各模態(tài)數(shù)據(jù)上的應(yīng)用及大規(guī)模模型的訓(xùn)練推理。
審校/排版: zhongdongy (阿東)