講講最近深度學習里面的后期之秀吧,Transformer(和變形金剛沒有半毛錢關系)
話說自公元二零一三年,深度學習網(wǎng)絡一枝獨秀,自機器學習王國脫穎而出,帶動了人工智能領域的發(fā)展。其中它最主要的兩大家,卷積網(wǎng)絡(CNN)和循環(huán)網(wǎng)絡(RNN),因其獨特的性質(zhì),分別在計算機視覺和自然語言處理領域得到廣泛使用。
然而這兩大家卻都還是上世紀就被提出來了,本世紀雖有創(chuàng)新,卻也逃脫不了這兩大家的干系。前有 RNN 的變種樹狀的遞歸網(wǎng)絡 (Recursive Neural Network),后有卷積網(wǎng)絡里的 ResNet,InceptNet 這些變種,外加對它們的一些訓練技巧。
于是乎,說到學習深度學習,實際上主要就在學習 CNN 和 RNN。近來,Google 提出了一種新的架構 Transformer,徹底顛覆了過去的理念,沒用到 CNN 和 RNN,主要是一種叫做 Attention (注意力)機制的結(jié)構組成。用更少的計算資源,取得了比過去的結(jié)構更好的結(jié)果。
提出 Transformer 的論文,Attention is All You Need (你只需要注意力就行) 也在去年被封 NLP 領域的年度最佳論文。于是 Transformer 一下子就火起來了,在很多任務有取代 RNN 的趨勢。之前自己投的論文也被審稿人吐槽怎么不用 Transformer.
而本篇要介紹的就是 Transformer,還有之后比較成功的兩個變體,Weighted Transformer 以及 Universal Transformer.
進入正題之前,先來介紹一下 RNN 序列到序列(seq2seq) 架構,以及注意力機制。這樣更便于我們理解之后的 Transformer 如何取代它。
經(jīng)典架構:RNN + Seq2Seq + Atten
之前 Twitter 上有人開過玩笑,深度學習使得 NLP 領域太過簡單粗暴,無論什么問題用 seq2seq + atten 都能解決。這里說的 seq2seq 是 sequence to sequence 的簡稱,一般默認的結(jié)構是由 RNN 組成的編碼器和解碼器,再加上在之間的注意力機制 (atten)。
關于 RNN 的詳細知識參考我之前的文章《吳教授的循環(huán)神經(jīng)網(wǎng)絡(RNN)課堂》,而關于 seq2seq 也可以參考《神經(jīng)機器翻譯概覽:基準模型與改進(上)》。
首先需要知道,在沒有注意力機制之前,用 seq2seq 架構翻譯是這樣的。先是編碼器,按照順序處理源句,得到一個描述(representation)向量,然后解碼器利用這個描述,來翻譯出整個句子。然而這導致了信息的大量丟失,特別是對一些長的句子,和有不同語序的語言對。比如下面這個。
可以發(fā)現(xiàn),要把 “l(fā)ike” 翻譯成 “好き(suki)”,得經(jīng)歷很長的距離,這中間會混入噪音,還會丟失有用信息,所以很難翻譯準確。
即使之后,加了部分注意力機制來輔助翻譯,也會因為對關系的捕捉不足,而出現(xiàn)翻譯失誤。因為在這樣的翻譯任務中,需要發(fā)現(xiàn)的關系有三種:
源句內(nèi)部的關系;
目標句內(nèi)部的關系;
源句和目標句之間的關系。
而這樣的 seq2seq,只在捕捉源句和目標句之間關系用注意力機制進行了捕捉,而源句內(nèi)部和目標句內(nèi)部還是在用 RNN,從一邊到另一邊這樣捕捉關系(好一點的用雙向 RNN),但這樣并不夠直接,特別是對一些距離遠的關系捕捉很差。
除了對遠距離關系難以學習的不足以外,RNN 還有一點不足,那就是訓練慢。因為它默認是按時序來進行處理的,所以得一個個詞從左到右看過去,這樣導致 RNN 不能像 CNN 一樣,充分利用 GPU 的并行運算優(yōu)勢。
值得一提的是,為了解決 RNN 的訓練問題,F(xiàn)acebook 的研究人員有提出 CNN 的 seq2seq 架構,使得訓練速度更快,但是性能并沒有得到太大的提高。
Transformer:沒錯,你只需要注意力機制
因為這只是科普文,所以我會盡量用自己的理解來說,當然能讀懂公式是最好的。
首先先說說自己對 Transformer 理解,我認為它最大的改進有如下幾點:
提出用注意力機制來直接學習源語言內(nèi)部關系和目標語言內(nèi)部關系,而不是像之前用 RNN 來學;
對存在多種不同關系的假設,而提出多頭 (Multi-head) 注意力機制,有點類似于 CNN 中多通道的概念;
對詞語的位置,用了不同頻率的 sin 和 cos 函數(shù)進行編碼。
所以之后我也就圍繞著這三點來講,想了解更具體,還是去讀論文和代碼吧。
首先說說核心構件,多頭注意力機制。先來看看注意力機制的基本組成,如下圖。
注意力機制的運算需要三部分,query,keys,values。一般來說 keys 和 values 相同,便于更廣義上的理解分成兩個。計算過程大概是這樣:
先用 query 和所有的 keys 值相乘(也能用其他一些運算),于是每個 key 都能得到一個值;
上面得到的值可以看做是每個 key 的權重,為了使得權重加起來等于1,這里需要用 softmax 壓一下得到注意力評分(attention score);
最后用評分和相對應的 value 值相乘,決定哪個 value 比較重要,再相加,就得到想要的注意力向量了。
論文中用到的注意力機制公式如下,Q,K,V 分別是 query,key,value 的矩陣,除以根號 d 是為了更好的數(shù)值運算:
了解了一般的注意力機制,那么多頭注意力機制就很好理解了。它相當于有多組這樣的注意力機制,對 Q K V 之間的不同關系進行提取,最后再把得出的結(jié)果拼接起來。為了保證多樣性,還給每組注意力機制增加了不同的線性變換層來先處理 Q K V。
公式表達:
之后來看看論文中 Transformer 的整體結(jié)構。
這張圖,特別想直接摔電腦,但現(xiàn)在我們只需要看箭頭和注意力機制模塊就可以了。會發(fā)現(xiàn),對應之前提到的三種關系:源句內(nèi)部關系,目標句內(nèi)部關系,源句和目標句之間關系,多頭注意力機制也剛好有三個,分別學習這三種關系。
首先從中間把整張圖切開,左邊有輸入 (input)的看做是 seq2seq 的編碼器,而右邊就是解碼器了。
來看看編碼器,非常簡單。
首先是輸入源句,轉(zhuǎn)換成向量,加入位置編碼,然后利用多頭注意力學習源句內(nèi)部的關系,傳入一個前向?qū)樱‵eed Forward),這是為了讓網(wǎng)絡內(nèi)的向量互動更多,學到更復雜的關系。其余一些跳躍的箭頭,Add 和 Norm 什么的只是訓練技巧。
之后看解碼器:
比編碼器要復雜些,但也就中間多了個注意力模塊。我們輸入目標句子,轉(zhuǎn)化成向量,加入位置編碼,然后用第一個多頭注意力機制學習目標句內(nèi)部之間的關系,之后將向量和編碼器端傳過來的向量一起傳入第二個注意力機制,來學習目標句和源句之間的關系,再如編碼器一樣傳入前向?qū)?。最后在一個線性變換之后,用 softmax 得出概率向量,并給出預測的值。
這就是最初的 Transformer 模型了,那它實際的表現(xiàn)呢。在機器翻譯任務上,相比起之前的模型,它取得了更高的 BLEU 分數(shù),同時卻只用了更少的計算資源(英語法語任務差距達到幾十倍)。
Weighted Transfomer: 加權就是加強,沒錯就是這樣
在最初的 Transformer 后不久,最成功的 Transformer 的變種模型便是,Weighted(加權的) Transformer。
在整體上架構和上面提到的 Transformer 差不多,最主要的不同是對注意力機制的處理。在 Transformer 中,先通過多頭注意力機制來學習多個不同方面特征,然后拼接起來傳給一個線性層。
而 Weighted Transformer 則是通過兩種權重值,并且將一些不同的線性層放入注意力機制中,使得各個頭(head)更加多樣,互動更加強。
兩個權值分別是κ和α,κ 是在多頭注意力機制后,對每個頭進行權值加成,論文中稱為 concatenate weight (拼接權重,但我并沒發(fā)現(xiàn)有對多頭進行拼接的操作,有懂的可以告訴我。) 而 α 是將 κ 加權處理后再經(jīng)過一層前饋處理(就是上面的 Feed Forward,F(xiàn)FN)的值再次進行加權,最后將這些頭直接加起來。
公式如下:
這篇論文中將這種注意力機制叫做,multi-branch attention (多支注意力機制)。值得注意的一點是,在 Weighted Transformer 中并不是三處都是用相同的多支注意力機制,在解碼器捕捉目標語言內(nèi)部關系的注意力機制就只用了普通的注意力機制,不知道是刻意為之還是什么。
Universal Transformer: 通用 Transformer
最近 Transformer 又得到新的突破,在谷歌大腦實習的 Mostafa Dehghan 提出更強大的 Transformer 模型:Universal Transformer,比之前的 Weighted Transformer 更進一步。
首先是比起前兩篇更加規(guī)范化了,模型里面的基本模塊,主要由多頭注意力機制和轉(zhuǎn)換函數(shù)組成。這篇論文中最主要的 idea 是,Transformer 最主要是利用注意力機制通過查看相關信息,對每個位置詞語的向量進行不停的精煉。論文中幾個創(chuàng)新點是:
基本模塊很簡潔,多頭注意力機制加轉(zhuǎn)換函數(shù),不停堆疊對詞語向量進行精煉;
每一次精煉就是一個 step ,加上句子里的位置,就會產(chǎn)生一個二維的位置坐標,論文中對這個位置進行了向量化,并且加入了運算中(但是我并沒有懂這樣做的用途,因為使用的只有最后一層的);
假設一句話中每個詞需要精煉的程度不一樣,利用 Adaptive Computation Time 方法來使得對需要多次精煉的多次精煉,而對已經(jīng)精煉足夠多次的不予處理。
基本模塊中的公式如下:
而其中 t 等于 0的時候,也就是 H_0 的時候表示的就是詞向量,之后按照上面的公式計算。
在對二位坐標進行編碼時,使用的是如下公式:
關于 Adaptive Computation Time 可以讀這篇論文《Adaptive computation time for recurrent neural networks》。
實驗結(jié)果對比
關于這三個 Tranformer 模型,在英德翻譯上的對比如下表:
可以看到這三個模型依次變得更強。當然 Universal Transformer 還有其他一些強處,比如說在之前的 Transformer 不擅長的一些任務上也取得了很好的成績,具體查看論文。
結(jié)語
我相信,未來 Transformer 將會成為趨勢,成為主流的模型,因為眾多實驗都證明了它的有效性?;蛟S之后,RNN 會變得像 Sigmoid 激活函數(shù)一樣,成為教科書上的“經(jīng)典”,也或許 RNN 會得到改進在一些特定任務上取得到更好的應用吧。