02.28 Encoder-Decoder 模型架構詳解

人工智能的發展非常迅速,翻譯的準確性越來越高,以至於有人擔心譯員是否會失業,甚至有的家長擔心孩子學習外語專業將來找不到工作。哎呀,扯遠了,本人認為:機器翻譯可以便於人們更好的獲得國外的信息,提高專業譯員的翻譯速度,但是更深層次的思考,仍然還要依賴人工翻譯。

機器翻譯目前只在通用領域 (商業領域,口語領域等) 的短句上效果不錯,複雜結構的長句,需要結合知識嘗試和上下文判斷歧義句,特定領域的翻譯上,一些小眾語種以及一些特別複雜的語言結構,效果還遠不能讓人滿意。

研究算法,除了調參就是洗數據,數據不好再收集更多數據,接著洗數據,調參,調參。在我們調參結束的時候,我們有沒有思考過,我們對調參的這個模型的原理真的理解嗎?

我曾經在跑一個 Bert 模型,我只是粗略的看了大致的原理,總以為自己很懂了,由於 Bert 模型效果確實挺不錯,以至於我用一個模型打天下了很久,直到某天我遇到了一個問題,我著實不懂如何解決,後來,翻看源碼,改了其中某一個參數值,總算解決了。

所以,我們工作之餘,對一些模型,架構的思想要理解,更要明白原理,今天,我們就先來學習 Encoder-Decoder 框架,本著死磕模型原理的原則,面對心中一堆的疑問,我覺得有必要好好談談 Encoder-Decoder。

追溯 Encoder-Decoder 的由來

Encoder-Decoder 通常稱作 編碼器-解碼器,是深度學習中常見的模型框架,很多常見的應用都是利用編碼-解碼框架設計的,如:

  • 無監督算法的 auto-encoding 就是利用編碼-解碼結構設計的。
  • image caption 的應用也是利用 CNN-RNN 的編碼-解碼框架。
  • 神經網絡機器翻譯 NMT 模型,就是 LSTM-LSTM 的編碼-解碼框架。

綜合上述的應用,我們可以知道 Encoder-Decoder 並不是一個具體的模型,而是一個通用的框架。Encoder 和 Decoder 部分可以是任意文字,語音,圖像,視頻數據,模型可以是 CNN,RNN,LSTM,GRU,Attention 等等。所以,基於 Encoder-Decoder,我們可以設計出各種各樣的模型。

上面提到的編碼,就是將輸入序列轉化轉化成一個固定長度向量。解碼,就是講之前生成的固定向量再轉化出輸出序列。

由此,Encoder-Decoder 有 2 點需要注意:

  • 不管輸入序列和輸出序列長度是什麼,中間的「向量 c」長度都是固定的,這也是它的一個缺陷。
  • 不同的任務可以選擇不同的編碼器和解碼器 (RNN,CNN,LSTM,GRU)。

Encoder-Decoder 有一個比較顯著的特徵就是它是一個 End-to-End 的學習算法,以機器翻譯為力,可以將法語翻譯成英語。這樣的模型也可以叫做 Seq2Seq。

Seq2Seq

Seq2Seq ( Sequence-to-sequence 的縮寫),就如字面意思,輸入一個序列,輸出另一個序列。這種結構最重要的地方在於輸入序列和輸出序列的長度是可變的。

Seq2Seq 強調目的,不特指具體方法,滿足輸入序列,輸出序列的目的,都可以統稱為 Seq2Seq 模型。Seq2Seq 使用的具體方法基本都是屬於 Encoder-Decoder 模型的範疇。

在機器翻譯裡面,如下圖,將英語 「it is a cat.」翻譯成漢語 「這是一隻貓。」,輸入 4 個單詞,輸出 5 個漢字。

Encoder-Decoder 模型架構詳解

在訓練數據集中,我們可以在每個句子後附特殊字符 ”“ (end of sequence) 以表示序列終止,每個句子前用到了特殊字符 "" (begin of seqence) 表示序列開始。Encoder 在最終時間步的隱狀態作為輸入句子表徵和編碼信息。Decoder 在各個時間步中使用輸入句子的編碼信息和上一個時間步的輸出以及隱藏狀態作為輸入。

案例:英文 it is a cat. 翻譯成中文的過程。

  1. 先將整個源句子進行符號化處理,以一個固定的特殊標記作為翻譯的開始符號和結束符號。此時句子變成 it is a cat .
  2. 對序列進行建模,得到概率最大的譯詞,如第一個詞為 “這”。將生成的詞加入譯文序列,重複上述步驟,不斷迭代。
  3. 直到終止符號被模型選擇出來,停止迭代過程,並進行反符號化處理,得到譯文。

Encoder-Decoder 的缺陷

與其說是 Encoder-Decoder 的侷限,不如說是 RNN 的侷限,在機器翻譯中,輸入某一序列,通過 RNN 將其轉化為一個固定向量,再將固定序列轉化為輸出序列,即上面所講的將英文翻譯成中文。

不管輸入序列和輸出序列長度是什麼,中間的「向量 c」長度都是固定的。所以,RNN 結構的 Encoder-Decoder 模型存在長程梯度消失問題,對於較長的句子,我們很難寄希望於將輸入的序列轉化為定長的向量而保存所有有效信息,即便 LSTM 加了門控機制可以選擇性遺忘和記憶,隨著所需翻譯的句子難度怎能更加,這個結構的效果仍然不理想。

Attention 機制的引入

Attention 就是為了解決信息過長導致信息丟失的問題,Attention 名為注意力機制,何為注意力機制。

就像我們平時讀文章一樣,我們的視線不可能注意到所有的文字,隨著眼睛的移動,我們的注意力也會跟著視線轉移,最終會停留在認為重要的單詞上,甚至還會劃重點。一般來說,一篇文章的標題,小標題,我們都會第一時間注意到,這就是注意力機制。

在 Attention 模型中,我們翻譯當前詞,會尋找於源語句中相對應的幾個詞語,然後結合之前已經翻譯的序列來翻譯下一個詞。

這樣,當 Decoder 在預測目標翻譯的時候,就可以看到 Encoder 的所有信息,而不僅侷限於模型的定長隱向量,並且不會丟失重要信息。

Encoder-Decoder 模型架構詳解

以上是對注意力機制的直觀理解,那麼 Attention 如何準確將注意力放在關注的地方呢?

<code>② 計算 Encoder 中每個時刻的隱向量③ 將各個時刻對於最後輸出的注意力分數進行加權,計算出每個時刻 i 向量應該賦予多少注意力④ decoder 每個時刻都會將 ③ 部分的注意力權重輸入到 Decoder 中,此時 Decoder 中的輸入有:經過注意力加權的隱藏層向量,Encoder 的輸出向量,以及 Decoder 上一時刻的隱向量⑤ Decoder 通過不斷迭代,Decoder 可以輸出最終翻譯的序列。/<code>
Encoder-Decoder 模型架構詳解

引入 Attention 的 Encoder-Decoder 框架下,完成機器翻譯任務的大致流程如下:

Encoder-Decoder 模型架構詳解

Transformer 中的 Encoder-Decoder

我們知道,Transformer 中的 Attention 是 Self-Attention (自注意力機制),而且是 Multi-Head Attention (多頭注意力機制)。

Encoder-Decoder 模型架構詳解

Attention 機制

下圖可以看到,Source 是由一系列 組成,此時給定 Target 中某個元素 Query,通過計算 Query 和 各個 Key 的相似性,得到每個 Key 對 Value 的權重係數,然後對 Value 進行加權求和,即得到最終 Attention 數值。

Encoder-Decoder 模型架構詳解

Self-Attention

在機器翻譯中,一般輸入 Source 和輸出 Target 內容是不一樣的,如英文翻譯成中文,Source 是英文,Target 是中文,Attention 機制發生在 Target 元素 和 Source 中所有元素之間。而 Self-Attention 顧名思義,指的不是 Target 和 Source 之間的 Attention 機制,而是 Source 內部元素之間或者 Target 內部元素之間發生的 Attention 機制,也可以理解為 Target = Source 的特殊情況下的 Attention 機制。

Self-Attention 機制為什麼要設置為 Source = Target,也即是 Key = Value = Query?

Self-Attention 究竟學習到了哪些規律或者抽出了哪些特徵呢?

引入 Self-Attention 機制有哪些好處呢?

下圖是可視化的表示了 Self-Attention 在同一個英語句子內單詞間產生的聯繫。由此可見,Self-Attention 可以捕獲同一個句子中單詞之間的一些句法特徵 (圖 1:有一定距離的短語結構) 或語義特徵 (圖 2:its 指代的對象 Law)。

Encoder-Decoder 模型架構詳解

Encoder-Decoder 模型架構詳解

很明顯,引入 Self-Attention 後會更容易捕獲句子中長距離相互依賴特徵,因為 Self-Attention 在計算過程中直接將句子任意兩個單詞的聯繫起來,此外,由於不依賴時間序列這一特性,Self-Attention 增加了計算的並行性。

Multi-Head Attention

而 Transformer 正是利用了 Self-Attention 的並行性,採用 Multi-Head Attention。因為 有好多人對 Attention 的看法不一樣,那麼我們就可以將這個任務給很多人一起做,最後爭取大家共同的意見。

而將模型分為多個頭,形成多個子空間,可以讓模型去關注不同方向的信息,而模型真的會關注不同方面的特徵嗎?

在 Transformer 論文中,Multi-Head Attention 公式如下:

Encoder-Decoder 模型架構詳解

如果 Multi-Head 的作用是關注句子的不同方面,那麼認為不同的頭應該關注的 Token 不一樣,但是有大量 paper 表名,Transformer 或 Bert 的特定層是有獨特功能的,底層更偏向於關注語法,頂層更偏向於關注語義。既然同一層 Transformer 關注的方面是相同的,那麼對於該方面而言,不同頭的關注點應該也是一樣的。但是我們發現,同一層中,總有那麼一兩個頭獨一無二,和其它頭關注的 Token 不同。

Encoder-Decoder 模型架構詳解

下面是兩個 Self-Attention 執行同一個句子時候展現的不同的注意力,利用多頭機制,明顯學會了不同的任務下采取不一樣的注意力。

Encoder-Decoder 模型架構詳解

Transformer 中 Encoder 由 6 個相同的層組成,每個層包含 2 個部分:

  • Multi-Head Self-Attention
  • Position-Wise Feed-Forward Network (全連接層)

Decoder 也是由 6 個相同的層組成,每個層包含 3 個部分:

  • Multi-Head Self-Attention
  • Multi-Head Context-Attention
  • Position-Wise Feed-Forward Network

上面每個部分都有殘差連接 (redidual connection),然後接一個 Layer Normalization。

Encoder-Decoder 模型架構詳解

以上就是 Transformer 中 Encoder 和 Decoder 的講解。


分享到:


相關文章: