NLP教程(6) - 神經機器翻譯、seq2seq與注意力機制

ShowMeAI發表於2022-05-10

ShowMeAI研究中心

作者:韓信子@ShowMeAI
教程地址http://www.showmeai.tech/tutorials/36
本文地址http://www.showmeai.tech/article-detail/242
宣告:版權所有,轉載請聯絡平臺與作者並註明出處

收藏ShowMeAI檢視更多精彩內容


神經機器翻譯、seq2seq與注意力機制
本系列為史丹佛CS224n《自然語言處理與深度學習(Natural Language Processing with Deep Learning)》的全套學習筆記,對應的課程視訊可以在 這裡 檢視。

機器翻譯、seq2seq與注意力機制
ShowMeAI為CS224n課程的全部課件,做了中文翻譯和註釋,並製作成了 GIF動圖!點選 第8講-機器翻譯、seq2seq與注意力機制 檢視的課件註釋與帶學解讀。更多資料獲取方式見文末。


引言

CS224n是頂級院校史丹佛出品的深度學習與自然語言處理方向專業課程,核心內容覆蓋RNN、LSTM、CNN、transformer、bert、問答、摘要、文字生成、語言模型、閱讀理解等前沿內容。

本篇筆記對應史丹佛CS224n自然語言處理專項課程的知識板塊:神經翻譯系統、seq2seq模型、注意力機制。首先介紹了序列到序列模型seq2seq以及其在翻譯系統中的應用,接著對注意力機制展開做了介紹,對序列解碼器和翻譯系統評估做了講解,並介紹了翻譯系統中一些常見問題如大詞彙庫,最後介紹了基於字元級別的翻譯模型。

筆記核心詞

  • seq2seq
  • 序列到序列模型
  • 注意力機制
  • 神經翻譯系統
  • 語音處理

1.Seq2Seq與神經翻譯系統

(本篇相關內容也可以參考ShowMeAI的對吳恩達老師課程的總結文章深度學習教程 | Seq2Seq序列模型和注意力機制

到目前為止,我們已經處理了預測單個輸出的問題:一個單詞的 NER 標籤,在一個句子中根據前面的單詞來預測下一個最可能的單詞,等等。然而有一類的 NLP 任務是依賴序列輸出的,或者輸出是長度變化的序列。例如:

  • Translation :將一種語言的一個句子作為輸入,然後輸出是另外一種語言的相同的意思的句子。
  • Conversation :以陳述或問題作為輸入並作出回應。
  • Summarization :將大量文字作為輸入並輸出其摘要。

在下面的部分,我們將介紹 Seq2Seq 模型,一個用來處理上述問題的深度學習框架。這個框架被證明了是非常有效的,在不到三年的時間裡成為了機器翻譯的標準方法。

1.1 翻譯系統發展史簡介

在過去,翻譯系統是基於概率模型構建的:

  • 翻譯模型 ,告訴我們源語言基於翻譯概率最可能被翻譯的一些結果候選。
  • 語言模型 ,結合語句的通順度等綜合評估最優的翻譯結果。

這些組成部分用於構建基於單詞或短語的翻譯系統。正如你所想到的,一個簡單的的基於單詞的翻譯系統將完全不能捕獲語言之間的排序差異(例如,否定詞移動,句子中的主語和動詞的位置等)。

基於短語的翻譯系統在 Seq2Seq 之前是非常常見的。基於短語的翻譯系統可以根據短語序列考慮輸入和輸出,相比比基於詞的系統可以處理更復雜的語法。然而,在基於短語的翻譯系統仍然難以捕獲長距離的資訊。

Seq2Seq 帶來很大的優勢,尤其是使用 LSTM,現代翻譯系統可以在觀測到整個輸入後生成任意的輸出序列。他們甚至可以自動地專注於輸入的特定部分,以幫助生成有用的翻譯。

1.2 序列到序列模型

序列到序列,或者 Seq2Seq,是一個典型的深度學習模型,在 2014 年被提出用英語-法語翻譯。在更高的層面上,Seq2Seq 是一個有兩個RNN組成的端到端模型

  • 一個 encoder 編碼器,將模型的輸入序列作為輸入,然後編碼固定大小的“上下文向量”。
  • 一個 decoder 解碼器,使用來自編碼器生成的上下文向量作為從其生成輸出序列的“種子”。

因此,Seq2Seq 模型通常被稱為“編碼器-解碼器模型”。

接下來我們將分別討論這兩個網路的細節。

1.3 Seq2Seq 結構 - 編碼器

編碼器網路的作用是讀取輸入序列到我們的 Seq2Seq 模型中,然後對該序列生成一個固定維度的上下文向量 \(C\) 。為此,編碼器使用一個迴圈神經網路單元(一般使用 LSTM)每個時間步讀取一個輸入單詞。單元的最終隱藏狀態就是 \(C\) 。然而,因為將一個任意長度序列壓縮到一個單一固定大小的向量是很困難的(特別是像翻譯這樣的困難任務),編碼器通常由堆疊的 LSTM 組成:一系列 LSTM“層”,其中每層的輸出是下一層的輸入序列。LSTM 最後一層的最終隱藏狀態就是 \(C\)

Seq2Seq 編碼器通常會做一些奇怪的事情:它們將反向處理輸入序列。實際上這麼處理是有目的的。通過這樣做,編碼器看到的最後的資訊(粗略地)對應於模型輸出的開始資訊;這使得解碼器更容易在輸出上“開始”,同時解碼器也更容易地產生適當的輸出句子。在翻譯的環境中,我們允許網路在看到輸入的前幾個單詞時就進行翻譯;一旦前幾個單詞被正確地翻譯,構建一個正確的句子比從頭開始更加容易。

下圖是一個展示編碼器的例子,這個例子是翻譯英語句子 what is your name? 注意這裡是反向讀取輸入單詞的。注意網路是展開的,每一列是一個時間步和每一行是單一層,所以水平箭頭是對應隱藏狀態和垂直箭頭是 LSTM 的輸入/輸出。

Seq2Seq 結構 - 編碼器

❐ 請注意,輸入標記是反向讀取的。注意網路是展開的;每列是一個時間步,每行是一個單層,因此水平箭頭對應於隱藏狀態,垂直箭頭是LSTM輸入/輸出。

1.4 Seq2Seq 結構 - 解碼器

解碼器也是一個 LSTM 網路,但是它的使用比編碼器網路略微複雜。從本質上講,我們希望它能作為一個語言模型,可以“知道”到目前為止生成的單詞和輸入。為此,我們將編碼器保持“堆疊”的 LSTM 架構,但是我們將使用編碼器生成的上下文向量來初始化第一層的隱藏層;然後編碼器將使用輸入的上下文向量來逐詞地生成輸出。

一旦編碼器使用其上下文向量設定好,我們將傳入一個特殊的字元來表示生成輸出的開始。在文獻中,一般是附加到輸入結尾的 \(\text{}\) 標記(在輸出的結尾也有這樣的標記,表示生成輸出完成)。然後我們第一個時間步將一層接一層地執行這個三層的 LSTM,將最後一層的輸出放到 softmax 函式中生成一個輸出單詞。然後我們把這個詞傳遞到下一個時間步的第一層,重複上述的流程生成輸出單詞。這就是我們如何使 LSTM 像語言模型一樣起作用。

下圖是一個展示解碼器的例子。該解碼器正在解碼 what is your name? 的上下文向量。注意在生成的開始使用了一個特殊的符號 GO,而且解碼的生成是按照正常的句子順序,而不是反向讀取的輸入。注意輸入和輸出長度不需要相同。

Seq2Seq 結構 - 解碼器

❐ 此解碼器正在解碼“what is your name”(參見圖1)的上下文向量,將其翻譯為法語“comment t'appelles tu?”注意在生成開始時使用的特殊“GO”標記,並且該生成是正向的,而不是反向讀取的輸入。還要注意的是,輸入和輸出不需要是相同的長度。

一旦我們有了輸出序列,我們就像往常一樣使用相同的學習策略。我們對預測序列定義一個交叉熵損失函式,然後用梯度下降演算法和反向傳播演算法來最小化損失函式。同時對編碼器和解碼器進行訓練,使得它們都學習到相同的上下文向量表示。

1.5 複習 & 基礎神經翻譯系統示例

注意輸入和輸出的長度之間是沒有任何聯絡的:模型的輸入句子可以是任意長度的,模型的輸出句子可以是任意長度的。然而,已經知道 Seq2Seq 模型在輸入句子很長的情況下效果會變得很差,LSTM 在實際使用中有一系列的限制。

讓我們回顧一下 Seq2Seq 模型為了將英語 what is your name? 翻譯為法語 comment t’appelles tu 的例子:

  • 首先,我們從四個 one-hot 向量輸入開始。這些輸入需要或者不需要(對翻譯任務,一般需要)用一個稠密的詞向量表示。
  • 然後,一個層疊 LSTM 反向讀取輸入序列,將其編碼為一個上下文向量。這個上下文向量是一個向量空間表示,表示“詢問某人他們的名字”(輸入的英文句子)的意思。
  • 我們執行這個網路的每一層的每一個時間步,對最後一層的輸出放到 softmax 函式中計算,並生成我們第一個輸出單詞。這個單詞作為網路下一個時間步的輸入,並且以這種方式解碼句子comment t’appelles tu的剩餘部分。
  • 在反向傳播期間,編碼器的 LSTM 的權值被更新,使得它能學習到更好的句子向量表示,同時訓練解碼器的 LSTM 權值,使得它能生成與上下文向量相關的正確語法的句子。

Encoder:逐層執行,每一層的輸出是下一層的輸入
Decoder:逐時間步執行,每一個時間步的最後一層的輸出是下一個時間步的第一層的輸入

1.6 雙向RNN

之前討論過句子的依賴不僅僅在一個方向的傳播起作用;一個單詞可以依賴它前面或者後面的單詞。

到目前為止,我們已經討論過的 Seq2Seq 模型並沒有考慮到這一點;在每個時間步,我們只是考慮當前時間步的單詞的前面單詞的資訊(通過 LSTM 的隱藏狀態)。

對於 NMT,我們需要能夠有效地對任意輸入進行編碼,而不管與輸入之間的依賴關係的方向,因此這才能夠讓獲得的資訊不會減少。

雙向RNN通過遍歷序列的兩個方向並連線所得到的輸出(神經元輸出和最終隱藏狀態都進行連線)來解決這個問題:

  • 對於每個 RNN 神經元,我們簡單地新增另一個神經元,但是以相反的方向向其放入輸入;對應第 \(t\) 個單詞的輸出 \(o_t\) 是連線了向量 \(\left[o_{t}^{(f)} \quad o_{t}^{(b)}\right]\) ,其中 \(o_{t}^{(f)}\) 是詞 \(t\) 在正向的 RNN 的輸出, \(o_{t}^{(b)}\) 是詞 \(t\) 在反向的 RNN 的輸出。類似地,最終隱藏狀態是 \(\left[h^{(f)} \quad h^{(b)}\right]\) ,其中 \(h^{(f)}\) 是正向的 RNN 的最終隱藏狀態和 \(h^{(b)}\) 是反向的 RNN 的最終隱藏狀態。

下圖是一個雙向 LSTM 解碼器的例子。

雙向 LSTM 解碼器

❐ 單層雙向LSTM編碼器網路示例。注意,輸入被輸入到兩個不同的LSTM層中,但是方向不同,隱藏狀態被連線起來以得到最終的上下文向量。

2.注意力機制

2.1 動機與想法

當你聽到句子 the ball is on the field,你不會認為這 6 個單詞都一樣重要。你首先會注意到單詞 ballonfield,因為這些單詞你是覺得最“重要”的。

類似的,Bahdanau 等人注意到使用 RNN 的最終狀態作為 Seq2Seq 模型的單一“上下文向量”的缺點:一般而言,輸入的不同部分具有不同的重要程度。再者,此外,輸出的不同部分甚至可以考慮輸入的不同部分是“重要”的。例如,在翻譯任務中,輸出的第一個單詞是一般是基於輸入的前幾個詞,輸出的最後幾個詞可能基於輸入的幾個詞。

注意機制利用這一觀察結果,為解碼器網路提供了在每個解碼步驟檢視整個輸入序列的功能;然後解碼器可以在任何時間點決定哪些輸入單詞是重要的。有很多型別的編碼器機制,但是我們將討論由 Bahdanau 提出的機制。

2.2 Bahdanau 等的神經機器翻譯系統

神經機器翻譯系統

再回顧一下我們的 Seq2Seq 模型是由兩部分組成,一個編碼器將一個輸入句子編碼,以及利用解碼器所提取的資訊生成翻譯句子的解碼器。基本上,我們的輸入句子是一個我們想要翻譯的詞序列 \(x_{1}, \ldots, x_{n}\) ,我們的翻譯過結果(目標句子)是一個詞序列 \(y_{1}, \ldots, y_{m}\)

神經機器翻譯系統

1) 編碼器

\(\left(h_{1}, \ldots, h_{n}\right)\) 是輸入句子的隱藏向量表示。這些向量是例如 bi-LSTM 的輸出,並且捕獲句子中每個單詞的上下文表示。

2) 解碼器

我們想使用以下形式的遞迴公式計算解碼器的隱藏狀態 \(s_i\)

\[s_{i}=f\left(s_{i-1}, y_{i-1}, c_{i}\right) \]

其中 \(s_{i-1}\) 是前面的隱藏向量, \(y_{i-1}\) 是前面時間步生成的單詞,和 \(c_i\) 是從原始句子捕獲與解碼器的時間步 \(i\) 相關的上下文的上下文向量。

上下文向量 \(c_i\) 捕獲對第 \(i\) 個解碼時間步的相關資訊(與標準的的 Seq2Seq 模型只有一個上下文向量不同)。對每個原始句子的隱藏向量 \(h_j\) ,計算分數

\[e_{i, j}=a\left(s_{i-1}, h_{j}\right) \]

其中 \(a\) 是在 \(\mathbb{R}\) 中具有值的任意函式,例如是一個單層的全連線神經網路。然後,我們得到一系列標量值 \(e_{i, 1}, \ldots, e_{i, n}\) 。然後,使用 softmax 層對這些分數進行歸一化,得到向量 \(\alpha_{i}=\left(\alpha_{i, 1}, \ldots, \alpha_{i, n}\right)\)

\[\alpha_{i, j}=\frac{\exp \left(e_{i, j}\right)}{\sum_{k=1}^{n} \exp \left(e_{i, k}\right \]

向量 \(\alpha_i\) 稱為注意力向量

然後,計算原始句子的隱藏向量與注意力向量的加權平均值作為上下向量 \(c_i\)

\[c_{i}=\sum_{j=1}^{n} \alpha_{i, j} h_{j} \]

利用注意向量提取上下文向量並捕獲相關上下文

直觀上看,該向量從原始句子的解碼器的第 \(i\) 個時間步中捕獲相關的上下文資訊。

2.3 與機器翻譯“對齊”的關聯

基於注意力的模型為輸出的每個時間步分配對輸入的不同部分的顯著性(“重要性”)。在翻譯任務中,注意力可以認為是“對齊”。Bahdanau 等人認為在解碼的時間步 \(i\) 中的注意力分數 \(\alpha_{ij}\) 表示源句子中的單詞對齊目標句子中的單詞 \(i\)。注意到這一點,我們可以使用注意力分數來構建一個對齊表——這個表是將源句子中的單詞對映到目標句子中的相應單詞——基於從我們從 Seq2Seq NMT 系統中學習到的編碼器和解碼器。

下圖是一個對齊表的例子

與機器翻譯“對齊”的關聯

2.4 長句上的效果表現

基於注意力模型的主要優點是能夠有效地翻譯長句。當句子的輸入長度變大時,模型如果只使用最終隱藏狀態表示而不使用注意機制,這會丟失資訊和降低準確度。注意力機制是一個聰明的方式來解決這個問題,並且現在很多實驗也證實了確實如此。

下圖是長句子在不同的 NMT 模型中的表現:
不同NMT模型在長句上的表現

3.其他方法

3.1 Luong et al. 等的神經機器翻譯系統

神經機器翻譯系統

Luong 等人在論文 《Effective Approaches to Attention-based Neural Machine Translation》 提出了一個注意力機制模型的變體,是由兩個不同的注意力機制組成。

全域性 & 區域性注意力

1) 全域性注意力

我們執行簡單的 Seq2Seq NMT。我們稱編碼器的隱藏狀態 \(h_{1}, \ldots, h_{n}\) ,解碼器的隱藏狀態 \(\overline{h}_{1}, \ldots, \overline{h}_{n}\) 。現在對每個 \(\overline{h}_{i}\) ,我們計算編碼器的隱藏狀態的注意力向量。我們可以使用下面其中一個得分函式:

\[\operatorname{score}\left(h_{i}, \overline{h}_{j}\right)=\left\{\begin{array}{l}{h_{i}^{T} \overline{h}_{j}} \\ {h_{i}^{T} W \overline{h}_{j} \quad \in \mathbb{R}} \\ {W\left[h_{i}, \overline{h}_{j}\right]}\end{array}\right. \]

現在我們有一個分數的向量,然後可以用 Bahdanau 等人提出的方法來計算一個上下文向量。首先,我們通過一個 softmax 層來對分數進行歸一化,得到向量 \(\alpha_{i}=\left(\alpha_{i, 1}, \ldots, \alpha_{i, n}\right)\)

\[\alpha_{i, j}=\frac{\exp \left(\operatorname{score}\left(h_{j}, \overline{h}_{i}\right)\right)}{\sum_{k=1}^{n} \exp \left(\operatorname{score}\left(h_{k}, \overline{h}_{i}\right)\right)} \]

\[c_{i}=\sum_{j=1}^{n} \alpha_{i, j} h_{j} \]

然後再計算上下文向量,我們可以使用上下文向量和隱藏狀態對解碼器的第 \(i\) 個時間步計算一個新的向量

\[\tilde{h}_{i}=f\left(\left[\overline{h}_{i}, c_{i}\right]\right) \]

最後一步是使用 \(\tilde{h}_{i}\) 來對解碼器進行最終預測。為了解決覆蓋問題,Luong 等人使用了一個 input-feeding 方法。注意力加權的向量 \(\tilde{h}_{i}\) 是作為解碼器的輸入,而不是最終預測。這類似於 Bahdanau 等人提出的方法,他們使用上下文向量來計算解碼器的隱藏向量。

2) 區域性注意力

該模型預測輸入序列中的對齊位置。然後,它使用以此位置為中心的視窗來計算上下文向量。這個計算耗費的計算資源是恆定的,不會隨著句子的長度而暴增。

有很多方法來使用注意力機制。

3.2 Google的新神經翻譯系統

簡而言之,Google 最近通過提升自己的翻譯系統為 NMT 做出了重大突破。不是為他們支援翻譯的每一種語言維護一個完整的 Seq2Seq 模型——每種語言必須單獨進行訓練,而是構建一個單獨系統可以翻譯任意兩種語言,這在資料和計算時間方面都是一個巨大的成就。這是一個 Seq2Seq 模型,它接受一個單詞序列和一個指定要翻譯的語言的符號作為輸入。該模型使用共享引數來翻譯為任何目標語言。

Google的新神經翻譯系統示例

這個新的的多語言模式不僅改善了他們的翻譯表現,還能夠“零資料翻譯”,即使我們沒有翻譯的訓練資料。我們也可以在兩種語言之間進行翻譯。例如,我們如果僅有日語-英語的翻譯資料和韓語-英語的翻譯資料,Google 團隊發現多語言 NMT 系統對這些資料進行訓練後的實際上可以產生合理的日語-韓語翻譯。這個發現的重要意義在於,解碼過程的部分並不是特定於語言的,而且該模型實際上維持一個了 獨立於所涉及的實際語言的輸入/輸出句子的內部表示 。

3.3 基於注意力機制的前沿論文與技術

  • Show, Attend and Tell: Neural Image Caption Generation with Visual Attention
    • 這篇論文是提出單詞/影像對齊的方法
  • Modeling Coverage for Neural Machine Translation
    • 他們的模型使用覆蓋向量,考慮到使用注意力的歷史以幫助計算將來的注意力。
  • Incorporating Structural Alignment Biases into an Attentional Neural Translation Model
    • 這篇論文通過引入其他傳統語言學的思想來提高注意力表現。

4.序列模型解碼器

機器翻譯的另一種方法來自統計機器翻譯。考慮一個計算給定原始句子 \(s\) 的翻譯 \(\overline{s}\) 的概率模型 \(P(\overline{s} \mid s)\) 。我們想從這個概率模型中選擇概率最高的翻譯 \(\overline{s} *\) 。換而言之,我們希望

\[\overline{s} *=\arg \max _{\overline{s}} P(\overline{s} \mid s) \]

因為搜尋的空間可能會非常的大,所以我們需要縮小它的大小。以下是序列模型解碼器的列表(包含好的和不好的)。

1) 窮舉對比法

這是最簡單的思路。對每個可能的序列計算其概率,然後我們從中選擇概率最高的序列。但是,搜尋空間對輸入的大小是呈指數級增長的,所以這個方法在很難擴充套件到大規模輸出的情況。在這個情況的解碼過程是 NP 難度的問題。

2) 原始取樣法

在時間步 \(t\) ,我們計算基於時間步 \(t\) 前面的單詞的條件概率分佈,並從該分佈中進行抽樣得到 \(x_t\)

\[x_{t} \sim \mathbb{P}\left(x_{l} \mid x_{1}, \ldots, x_{n}\right) \]

理論上這個技術是有效的漸進精確的。然而在實際中,這個方法的表現很差和會出現高方差。

貪婪搜尋 & 集束搜尋

3) 貪婪搜尋

在每個時間步,我們選擇最可能的單詞,換而言之

\[x_{l}=\operatorname{argmax}_{x_{l}} \mathbb{P}\left(\tilde{x}_{t} \mid x_{1}, \ldots, x_{n}\right) \]

這種技術是有效的,但是它探索了一小部分的搜尋空間,如果我們在一個時間步中出現一個錯誤,那麼剩下的句子生成可能會受到很大的影響。

4) 集束搜尋

這個方法是在每個時間步保持著 \(K\) 個候選單詞

\[\mathcal{H}_{t}=\left\{\left(x_{1}^{1}, \ldots, x_{t}^{1}\right), \ldots,\left(x_{1}^{K}, \ldots, x_{t}^{K}\right)\right\} \]

通過擴充套件 \(\mathcal{H}_{t}\) 並保持 K 個最好的候選單詞來計算 \(\mathcal{H}_{t+1}\) 。換而言之,我們在下面的集合中選擇最好的 K 個序列

\[\tilde{\mathcal{H}}_{t+1}=\bigcup_{k=1}^{K} \mathcal{H}_{t+1}^{\tilde{k}} \]

\[\mathcal{H}_{t+1}^{\tilde{k}}=\left\{\left(x_{1}^{1}, \ldots, x_{t}^{1}, v_{1}\right), \ldots,\left(x_{1}^{K}, \ldots, x_{t}^{K}, v_{|V|}\right)\right\} \]

隨著增加 \(K\) 的增加,我們獲得了準確率和漸近地精確。然而,提高並不具有單調性,所以我們要設定一個 \(K\),既要考慮合理效能又要考慮計算效率。正因為如此,beam search 是在 NMT 中最常見的方法。

5.機器翻譯系統的評估

現在我們知道有關機器翻譯系統的基礎知識,我們將討論一些評估這些模型的方法。評估翻譯質量是一個非常棘手和主觀的任務。在現實生活中,如果你給十個不同的翻譯者提供一段相同的文字,你將獲得十個不同的翻譯結果。翻譯在實踐中是不完美和有噪聲的。他們關注不同的資訊,強調不同的含義。一種翻譯可以儲存隱喻和長期思想的完整性,而而另一種翻譯可以更忠實地重構句法和風格,嘗試逐字翻譯。注意,這種靈活性並不是負擔;這證明了語言的複雜性和我們解碼和解釋意思的能力,也是我們交流能力的一個奇妙方面。

在這一點上,應該注意的是,模型的目標損失函式與我們將要討論的評估方法之間存在差異。由於損失函式本質上是對模型預測的一個評估,所以很容易混淆這兩個概念。前面的評估指標針對一些度量標準為模型提供了一個最終的、總結性的評價,沒有一個度量方法優於所有其他方法,雖然有些具有明顯的優勢和多數偏好。

評估機器學習翻譯的質量已經自成體系為一個研究領域,已經提出了許多評估的方法 TER, METEOR, MaxSim, SEPIA 和 RTE-MT 。我們將重點關注兩個基準評估方法和 BLEU。

5.1 人工評估

第一個也是最不令人驚訝的方法是讓人們手動評估系統的正確性、充分性和流暢性。就像圖靈測試一樣,如果你能騙過一個人,讓他無法區分人工翻譯和系統翻譯,那麼你的模型就通過了看起來像真實句子的測試!這種方法的一個明顯問題是成本高且效率低,儘管它仍然是機器翻譯的黃金標準。

5.2 藉助於其他任務評估

評估機器學習模型的一種常見方法是輸出有用的表示資料(表示為翻譯或摘要),如果你的預測對解決某些具有挑戰性的任務很幫助,那麼模型必須在預測中編碼相關資訊。例如,你可能會考慮在翻譯語言的問答任務中訓練翻譯預測。也就是說,你使用系統的輸出作為其他任務(問答)模型的輸入。如果你的第二個任務在你的預測上和在翻譯語言的格式良好的資料上一樣出色,這意味著你的輸入具有滿足任務需求的相關資訊或模式。

這種方法的問題在於,第二個任務可能不會受到許多翻譯細節的影響。例如,如果你在查詢檢索任務中衡量翻譯質量(例如,提取搜尋查詢的正確網頁),你會發現一個翻譯有助於保護文件的主題句,但忽略了語法和語法仍然可能適合的任務。但這並不意味著翻譯質量是準確可靠的。因此,確定翻譯模型的質量只是為了確定任務本身的質量,這可能是也可能不是一個好的標準。

5.3 BLEU標準

在 2002 年,IBM 的研究者提出了 Bilingual Evaluation Understudy(BLEU),時至今日,該方法的很多變體,是機器翻譯中最可靠的評估方法之一。

BLEU 演算法通過參考人工翻譯來評估機器翻譯的精確度分數。參考人工翻譯被假定為是一個翻譯的模型樣例,然後我們使用 n-gram 匹配候選翻譯與人工翻譯之間的相似程度作為度量標註。考慮一個參考句子 A 和候選翻譯 B:

A:there are many ways to evaluate the quality of a translation, like comparing the number of n-grams between a candidate translation and reference.

B:the quality of a translation is evaluate of n-grams in a reference and with translation.

BLEU 分數是查詢在機器翻譯中是否有 n-grams 也出現在參考翻譯中。以下彩色的翻譯是參考翻譯和候選翻譯之間共享的不同大小的 n-grams 的一些示例。

BLEU標準

BLEU 演算法通過識別上述所有的 n-grams 匹配,包括 unigram 匹配,然後用精確度分數來評估翻譯的好壞。精確度分數是 n-grams 既出現在參考翻譯中也出現在機器翻譯中的百分比。

這個演算法也滿足其他的兩個限制。對每個 n-grams 的大小,參考翻譯中的 gram 不能匹配多於一次。例如,unigram “a” 在 B 中出現了兩次而在 A 中只出現了一次。這隻統計兩個翻譯句子之間匹配一次的的次數。另外,我們強加一個簡單的懲罰,使得精確度分數是 1.0(“完美”匹配)的短句子不被認為是一個很好的翻譯結果。例如,對單個單詞 there 會得到一個精確度分數為 1.0 的匹配,但是很明顯這不是一個好的匹配。

接下來我們看看實際中如何計算 BLEU 分數。首先令 k 是我們要評估的分數的最大 n-gram 。即如果 k=4,BLEU 分數僅計算大小 \(\leq 4\) 的 n-grams ,並忽略大於 4 的 n-grams 。令

\[p_{n} = \text{# matched n-grams} \text{/} \text{# n-grams in candidate translation} \]

為對長度是 n 的 grams 的精確度分數。最後,令 \(w_{n}=1 / 2^{n}\) 是第 \(n\) 個 gram 的幾何加權。我們簡單懲罰的定義為

\[\beta=e^{\min \left(0,1-\frac{len_{ref}}{len_{MT}}\right)} \]

其中 \(len_{ref}\) 是參考翻譯的句子長度, \(len_{MT}\) 是機器翻譯的句子長度。

BLEU 分數然後定義為:

\[BLEU=\beta \prod_{i=1}^{k} p_{n}^{w_{n}} \]

BLEU 評分與人類對優秀翻譯的判斷密切相關,因此仍然是所有評估指標的基準。然而,它還是有許多限制的。它只能在語料庫級別上工作得很好,因為精度得分中的任何零都將使整個BLEU得分為零。另外,BLEU 得分僅僅將機器翻譯與單個人工翻譯進行比較,這肯定需要匹配相關的 n-grams 的噪聲表示。BLEU 的變體已經將這個演算法修改為可以將候選機器翻譯與多個人工翻譯進行比較。

此外,BLEU分數可能只是一個必要的,但並不足以通過一個良好的機器翻譯系統的基準。許多研究人員對 BLEU 的分數進行了優化,直到他們開始接近參考譯文之間相同的BLEU分數,但真正的質量仍然遠遠低於人類譯文。

6.處理大詞彙庫情況下的輸出部分

儘管現代的 NMT 系統取得了成功,但是他們很難處理大量的詞彙量。特別地,這些 Seq2Seq 模型通過使用 softmax 計算整個詞彙表上的目標概率分佈來預測序列中的下一個單詞。事實證明,使用大量詞彙表來計算 softmax 可能相當耗費計算資源,而且時間複雜度也會與詞彙大小成正比。我們現在將研究一些解決這個問題的方法。

6.1 縮放softmax

一個非常自然的想法是問“我們能找到更有效的方法來計算目標概率分佈嗎?”答案是可以的!實際上,我們已經學會了兩種可以降低“softmax”複雜度的方法,我們將在下面回顧一下(更多細節請看 lecture one 中的相關方法的介紹)。

1) 噪音對比估計NCE

NCE 的想法是通過隨機地從負樣本中抽取 \(K\) 個單詞來近似“softmax”。因此,我們將計算複雜度降低了 \(\frac{\left|V\right|}{K}\) 倍,其中 \(\left|V\right|\) 是詞彙表的大小。這個方法在 word2vec 中證明了非常有效。Zoph 等人最近的一項工作是應用這種技術來學習 LSTM 語言模型,他們還通過使用每個 mini batch 的相同樣本來引入一個技巧,使 GPU 的訓練效率更高。

2) 層次化Softmax

Morin 等人提出了一個二叉樹結構從而能夠更有效率地計算 目標分佈中的每個概率都是通過將樹上的一個路徑計算出來“softmax”,該計算該路徑只需要 \(O(\log \left|V\right|)\) 步長。值得注意的是,儘管 Hierarchical Softmax 可以節省計算量,但是它不能在 GPU 上並行運算。

這兩種方法的一個限制是它們僅在訓練階段中節省計算量(當目標詞已知時)。在測試階段,我們還需要計算詞彙表中的所有單詞的概率,然後做出預測。

6.2 壓縮詞彙量

除了優化“softmax”,我們還可以嘗試減少有效的詞彙量,這將加快訓練和測試過程。一種簡單的方法是將詞彙量限制在一個很小的數量上,用一個標籤 \(\text{}\) 替換限制後的詞彙表外的單詞。現在,無論是訓練和測試時間可以顯著地降低了,但這顯然是不理想的,因為我們可能會產生很多 \(\text{}\) 的輸出。

Jean 等人提出了一種保持固定詞彙大小 \(\left|V^{\prime}\right|\) 的方法, 通過將訓練資料分成具有 \(\tau\) 個唯一目標單詞的子集,其中 \(\tau=\left|V^{\prime}\right|\) 。可以通過依次掃描原始資料集直到檢測 \(\tau\) 個唯一的目標單詞,從而形成一個子集(如下圖所示)

訓練資料分割槽

然後按照上述過程遍歷整個資料集,以產生所有的 mini-batch 子集。實際中,我們可以通過這個方法詞彙量為 \(|V|=500 K\) 實現了 10 倍以上的節省( \(\left|V^{\prime}\right|=30 K, 50 K\) )。

這個概念和 NCE 非常類似,對任意給定的單詞,輸出的詞彙包含目標單詞和 \(\left|V^{\prime}\right|-1\) 個負(噪聲)樣例。然而,這兩個方法主要的不同是,對每個子集 \(\left|V^{\prime}\right|\) ,是從偏置分佈 \(\left|Q\right|\) 中取樣這些負樣例,其中

\[\mathcal{Q}_{y_{t}}=\left\{\begin{array}{l}{\frac{1}{\left|V^{\prime}\right|}, \text { if } y_{t} \in\left|V^{\prime}\right|} \\ {0, \text { otherwise }}\end{array}\right. \]

在測試階段,也可以從整個詞彙表中選擇一個子集(稱為候選列表)來預測目標單詞。挑戰在於,正確的目標詞是未知的,我們必須“猜測”目標詞可能是什麼。在論文中,作者提出使用 \(K\) 個最常用的單詞(基於 unigram 概率)和 \(K^{\prime}\) 個可能的目標詞為每個源句構建一個候選列表。在下圖中展示了一個 \(K^{\prime}=3\) 的例子和候選列表由紫色框中的所有單片語成。在實際中,我們可以選擇以下的引數值: \(K=15 k, 30 k, 50 k, K^{\prime}=10,20\)

候選名單

6.3 處理罕見詞

當 NMT 系統使用上面提到的方法來以降低有效詞彙量,不可避免地,某些單詞將被對映到 \(\text{}\)。例如,當預測詞(通常是罕見詞)不在候選列表中或當我們在測試階段遇到未知的單詞時,可能會發生這種情況。我們需要新的機制來解決罕見和未知的單詞問題。

Gulcehre 等人提出了一個想法來處理這些問題:學習從源文字中“複製”。該模型應用了注意力分佈 \(l_t\) 來決定源文字中的指向位置,並使用解碼器的隱藏狀態 \(S_t\) 來預測二分類變數 \(Z_t\) ,從而決定何時從源文字中複製。

指標網路體系結構

最後的預測結果是根據 \(Z_t\) 的值,在候選列表中由前面介紹的方法使用 softmax 選擇的詞 \(y_{t}^{w}\) ,或者從源文字複製的 \(y_{t}^{l}\) 。他們在論文中的結果表明,該方法提高了機器翻譯和文字摘要等任務的表現。

然而可以想到的是,這種方法也是有侷限性的。這是要重點指出的是在 Google NMT 論文中對這個方法的一個評論:“這種做法在規模很大時是不可靠的——當網路是很深的時候,注意力機制是不穩定的——而複製機制可能不是最適合處理罕見單詞的策略——有時音譯更合適”。

7.基於詞與字元的翻譯系統

如上一部分所述,“複製”機制在處理罕見或未知詞語上仍然存在不足。解決這些問題的另一個思路是在 sub-word 的級別進行操作。一個趨勢是使用相同的 Seq2Seq 架構,但是在更小的單元上操作——基於字元的分詞模型。另一個趨勢是對單詞和字元采用混合架構。

7.1 分詞

Sennrich 等人提出了一種通過將罕見和未知的單詞作為一個 subword units 的序列來實現開放詞彙翻譯的方法。

這通過調整稱為 Byte Pair Encoding 的壓縮演算法來實現。基本思想是從字元詞彙表開始,並且繼續擴充套件資料集中最常見的 n-gram 對。例如,在下圖中,我們的資料集包含 4 個單詞,圖中的左邊的表示單詞頻率,例如“low”出現了 5 次。用 \((p,q,f)\) 來表示一個 n-gram 對 \(p,q\) 和出現的頻率 \(f\) 。如圖中所示,我們已經選擇的頻率最高的的 n-gram 對 \((e,s,9)\),然後我們現在增加當前頻率最高的的 n-gram 對 \((es,t,9)\) 。重複此過程,直到所有 n-gram 對被選擇過或詞彙大小達到某個閾值。

位元組對編碼

我們可以選擇為訓練集和測試集構建單獨的詞彙表,或者共同構建一個詞彙表。在構建詞彙表之後,一個帶有 Seq2Seq 體系結構的 NMT 系統(Bahdanau 等人在論文中使用的),可以直接訓練這些詞段。值得注意的是,這種方法贏得了 WMT 2016 的第一名。

7.2 基於字元的模型

Ling 等人提出了一種基於字元的模型來實現開放詞彙表示。對於具有 m 個字元的每個單詞 w,該模型不是儲存單詞的詞向量,而是遍歷所有字元 \(c_{1}, c_{2} \dots c_{m}\) 查詢字元嵌入 \(e_{1}, e_{2} \dots e_{m}\) 。然後將這些字元嵌入作為 biLSTM 輸入,以分別獲得用於前向和後向的最終隱藏狀態 \(h_{f}, h_{b}\) 。最終的詞向量是由兩個隱藏狀態的仿射變換來計算而得:

\[e_{w}=W_{f} H_{f}+W_{b} H_{b}+b \]

7.3 混合神經翻譯系統

Luong 等人提出了一個混合詞字模型來處理未知詞,從而實現開放詞彙 NMT。系統主要進行單詞級翻譯,並查閱罕見單詞的字元組成。在高層次上,字元級迴圈神經網路計算源單詞詞表示,並在需要時重新獲得未知目標單詞。這種混合方法的雙重優點在於,它的訓練比基於字元的方法要快得多,而且更容易進行訓練;同時,它不會像基於單詞的模型,產生未知的單詞。

基於單詞的翻譯作為主幹 :混合 NMT 的核心是一個單詞級翻譯的深度 LSTM 編碼器—解碼器。我們對每種語言維護大小 \(\left|V\right|\) 的詞彙表和使用 \(\text{}\) 來表示 OOV 詞彙。

基於字元表示 :在常規的基於單詞的 NMT,是使用一個通用的 \(\text{}\) 詞向量來表示全部 OOV 詞彙。這是有問題的,因為它丟棄了關於源單詞的有價值的資訊。相反,我們學習了一個關於罕見單詞的字元的深層 LSTM 模型,並使用 LSTM 的最終隱藏狀態作為罕見單詞的表示(如下圖所示)。

混合NMT

目標字元級別生成 :一般基於單詞的 NMT 允許目標輸出生成的 \(\text{}\) 。相反,這裡的目標是建立一個處理無限輸出詞彙表的連貫框架。解決方案是,在給定當前單詞級別的狀態下,使用一個單獨的深層 LSTM 來進行字元級別的“翻譯”。注意,當前單詞上下文用於初始化字元級編碼器。該系統的訓練方法是,每當單詞級別的 NMT 產生一個的 \(\text{}\) 時候,字元級的解碼器就被要求重新未知目標單詞的正確的 surface form。

8.參考資料

ShowMeAI系列教程推薦

NLP系列教程文章

史丹佛 CS224n 課程帶學詳解

ShowMeAI用知識加速每一次技術成長

相關文章