Transformer (變形金剛,大霧) 三部曲:RNN 的繼承者

  • 2019 年 10 月 31 日
  • 筆記

講講最近深度學習裏面的後期之秀吧,Transformer(和變形金剛沒有半毛錢關係)

話說自公元二零一三年,深度學習網絡一枝獨秀,自機器學習王國脫穎而出,帶動了人工智能領域的發展。其中它最主要的兩大家,卷積網絡(CNN)循環網絡(RNN),因其獨特的性質,分別在計算機視覺和自然語言處理領域得到廣泛使用。

然而這兩大家卻都還是上世紀就被提出來了,本世紀雖有創新,卻也逃脫不了這兩大家的干係。前有 RNN 的變種樹狀的遞歸網絡 (Recursive Neural Network),後有卷積網絡里的 ResNet,InceptNet 這些變種,外加對它們的一些訓練技巧。

於是乎,說到學習深度學習,實際上主要就在學習 CNN 和 RNN。近來,Google 提出了一種新的架構 Transformer,徹底顛覆了過去的理念,沒用到 CNN 和 RNN,主要是一種叫做 Attention (注意力)機制的結構組成。用更少的計算資源,取得了比過去的結構更好的結果

提出 Transformer 的論文,Attention is All You Need (你只需要注意力就行) 也在去年被封 NLP 領域的年度最佳論文。於是 Transformer 一下子就火起來了,在很多任務有取代 RNN 的趨勢。之前自己投的論文也被審稿人吐槽怎麼不用 Transformer.

而本篇要介紹的就是 Transformer,還有之後比較成功的兩個變體,Weighted Transformer 以及 Universal Transformer.

進入正題之前,先來介紹一下 RNN 序列到序列(seq2seq) 架構,以及注意力機制。這樣更便於我們理解之後的 Transformer 如何取代它。

經典架構:RNN + Seq2Seq + Atten

之前 Twitter 上有人開過玩笑,深度學習使得 NLP 領域太過簡單粗暴,無論什麼問題用 seq2seq + atten 都能解決。這裡說的 seq2seq 是 sequence to sequence 的簡稱,一般默認的結構是由 RNN 組成的編碼器和解碼器,再加上在之間的注意力機制 (atten)。

關於 RNN 的詳細知識參考我之前的文章《吳教授的循環神經網絡(RNN)課堂》,而關於 seq2seq 也可以參考《神經機器翻譯概覽:基準模型與改進(上)》

首先需要知道,在沒有注意力機制之前,用 seq2seq 架構翻譯是這樣的。先是編碼器,按照順序處理源句,得到一個描述(representation)向量,然後解碼器利用這個描述,來翻譯出整個句子。然而這導致了信息的大量丟失,特別是對一些長的句子,和有不同語序的語言對。比如下面這個。

可以發現,要把 「like」 翻譯成 「好き(suki)」,得經歷很長的距離,這中間會混入噪音,還會丟失有用信息,所以很難翻譯準確。

即使之後,加了部分注意力機制來輔助翻譯,也會因為對關係的捕捉不足,而出現翻譯失誤。因為在這樣的翻譯任務中,需要發現的關係有三種:

  1. 源句內部的關係
  2. 目標句內部的關係
  3. 源句和目標句之間的關係

而這樣的 seq2seq,只在捕捉源句和目標句之間關係用注意力機制進行了捕捉,而源句內部和目標句內部還是在用 RNN,從一邊到另一邊這樣捕捉關係(好一點的用雙向 RNN),但這樣並不夠直接,特別是對一些距離遠的關係捕捉很差。

除了對遠距離關係難以學習的不足以外,RNN 還有一點不足,那就是訓練慢。因為它默認是按時序來進行處理的,所以得一個個詞從左到右看過去,這樣導致 RNN 不能像 CNN 一樣,充分利用 GPU 的並行運算優勢。

值得一提的是,為了解決 RNN 的訓練問題,Facebook 的研究人員有提出 CNN 的 seq2seq 架構,使得訓練速度更快,但是性能並沒有得到太大的提高。

Transformer:沒錯,你只需要注意力機制

因為這只是科普文,所以我會盡量用自己的理解來說,當然能讀懂公式是最好的。

首先先說說自己對 Transformer 理解,我認為它最大的改進有如下幾點:

  1. 提出用注意力機制來直接學習源語言內部關係和目標語言內部關係,而不是像之前用 RNN 來學;
  2. 對存在多種不同關係的假設,而提出多頭 (Multi-head) 注意力機制,有點類似於 CNN 中多通道的概念;
  3. 對詞語的位置,用了不同頻率的 sin 和 cos 函數進行編碼。

所以之後我也就圍繞着這三點來講,想了解更具體,還是去讀論文和代碼吧。

首先說說核心構件,多頭注意力機制。先來看看注意力機制的基本組成,如下圖。

注意力機制的運算需要三部分,querykeysvalues。一般來說 keys 和 values 相同,便於更廣義上的理解分成兩個。計算過程大概是這樣:

  1. 先用 query 和所有的 keys 值相乘(也能用其他一些運算),於是每個 key 都能得到一個值
  2. 上面得到的值可以看做是每個 key 的權重,為了使得權重加起來等於1,這裡需要用 softmax 壓一下得到注意力評分(attention score)
  3. 最後用評分和相對應的 value 值相乘,決定哪個 value 比較重要,再相加,就得到想要的注意力向量了。

論文中用到的注意力機制公式如下,Q,K,V 分別是 query,key,value 的矩陣,除以根號 d 是為了更好的數值運算:

了解了一般的注意力機制,那麼多頭注意力機制就很好理解了。它相當於有多組這樣的注意力機制,對 Q K V 之間的不同關係進行提取,最後再把得出的結果拼接起來。為了保證多樣性,還給每組注意力機制增加了不同的線性變換層來先處理 Q K V。

公式表達:

之後來看看論文中 Transformer 的整體結構。

這張圖,特別想直接摔電腦,但現在我們只需要看箭頭和注意力機制模塊就可以了。會發現,對應之前提到的三種關係:源句內部關係,目標句內部關係,源句和目標句之間關係,多頭注意力機制也剛好有三個,分別學習這三種關係

首先從中間把整張圖切開,左邊有輸入 (input)的看做是 seq2seq 的編碼器,而右邊就是解碼器了。

來看看編碼器,非常簡單。

首先是輸入源句,轉換成向量,加入位置編碼,然後利用多頭注意力學習源句內部的關係,傳入一個前向層(Feed Forward),這是為了讓網絡內的向量互動更多,學到更複雜的關係。其餘一些跳躍的箭頭,Add 和 Norm 什麼的只是訓練技巧。

之後看解碼器:

比編碼器要複雜些,但也就中間多了個注意力模塊。我們輸入目標句子,轉化成向量,加入位置編碼,然後用第一個多頭注意力機制學習目標句內部之間的關係,之後將向量和編碼器端傳過來的向量一起傳入第二個注意力機制,來學習目標句和源句之間的關係,再如編碼器一樣傳入前向層。最後在一個線性變換之後,用 softmax 得出概率向量,並給出預測的值。

這就是最初的 Transformer 模型了,那它實際的表現呢。在機器翻譯任務上,相比起之前的模型,它取得了更高的 BLEU 分數,同時卻只用了更少的計算資源(英語法語任務差距達到幾十倍)。

Weighted Transfomer: 加權就是加強,沒錯就是這樣

在最初的 Transformer 後不久,最成功的 Transformer 的變種模型便是,Weighted(加權的) Transformer。

在整體上架構和上面提到的 Transformer 差不多,最主要的不同是對注意力機制的處理。在 Transformer 中,先通過多頭注意力機制來學習多個不同方面特徵,然後拼接起來傳給一個線性層。

而 Weighted Transformer 則是通過兩種權重值,並且將一些不同的線性層放入注意力機制中,使得各個頭(head)更加多樣,互動更加強。

兩個權值分別是κ和α,κ 是在多頭注意力機制後,對每個頭進行權值加成,論文中稱為 concatenate weight (拼接權重,但我並沒發現有對多頭進行拼接的操作,有懂的可以告訴我。) 而 α 是將 κ 加權處理後再經過一層前饋處理(就是上面的 Feed Forward,FFN)的值再次進行加權,最後將這些頭直接加起來。

公式如下:

這篇論文中將這種注意力機制叫做,multi-branch attention (多支注意力機制)。值得注意的一點是,在 Weighted Transformer 中並不是三處都是用相同的多支注意力機制,在解碼器捕捉目標語言內部關係的注意力機制就只用了普通的注意力機制,不知道是刻意為之還是什麼。

Universal Transformer: 通用 Transformer

最近 Transformer 又得到新的突破,在谷歌大腦實習的 Mostafa Dehghan 提出更強大的 Transformer 模型:Universal Transformer,比之前的 Weighted Transformer 更進一步。

首先是比起前兩篇更加規範化了,模型裏面的基本模塊,主要由多頭注意力機制和轉換函數組成。這篇論文中最主要的 idea 是,Transformer 最主要是利用注意力機制通過查看相關信息,對每個位置詞語的向量進行不停的精鍊。論文中幾個創新點是:

  1. 基本模塊很簡潔,多頭注意力機制加轉換函數,不停堆疊對詞語向量進行精鍊;
  2. 每一次精鍊就是一個 step ,加上句子里的位置,就會產生一個二維的位置坐標,論文中對這個位置進行了向量化,並且加入了運算中(但是我並沒有懂這樣做的用途,因為使用的只有最後一層的);
  3. 假設一句話中每個詞需要精鍊的程度不一樣,利用 Adaptive Computation Time 方法來使得對需要多次精鍊的多次精鍊,而對已經精鍊足夠多次的不予處理。

基本模塊中的公式如下:

而其中 t 等於 0的時候,也就是 H_0 的時候表示的就是詞向量,之後按照上面的公式計算。

在對二位坐標進行編碼時,使用的是如下公式:

關於 Adaptive Computation Time 可以讀這篇論文《Adaptive computation time for recurrent neural networks》。

實驗結果對比

關於這三個 Tranformer 模型,在英德翻譯上的對比如下表:

可以看到這三個模型依次變得更強。當然 Universal Transformer 還有其他一些強處,比如說在之前的 Transformer 不擅長的一些任務上也取得了很好的成績,具體查看論文。

結語

我相信,未來 Transformer 將會成為趨勢,成為主流的模型,因為眾多實驗都證明了它的有效性。或許之後,RNN 會變得像 Sigmoid 激活函數一樣,成為教科書上的「經典」,也或許 RNN 會得到改進在一些特定任務上取得到更好的應用吧。

參考文獻

  1. Paper Dissected: 「Attention is All You Need」 Explained
  2. Attention Is All You Need
  3. WEIGHTED TRANSFORMER NETWORK FOR MACHINE TRANSLATION
  4. Universal Transformer