1. 程式人生 > >一文讀懂「Attention is All You Need」| 附程式碼實現

一文讀懂「Attention is All You Need」| 附程式碼實現

前言

2017 年中,有兩篇類似同時也是筆者非常欣賞的論文,分別是 FaceBook 的Convolutional Sequence to Sequence Learning和 Google 的Attention is All You Need,它們都算是 Seq2Seq 上的創新,本質上來說,都是拋棄了 RNN 結構來做 Seq2Seq 任務。

在本篇文章中,筆者將對Attention is All You Need做一點簡單的分析。當然,這兩篇論文字身就比較火,因此網上已經有很多解讀了(不過很多解讀都是直接翻譯論文的,鮮有自己的理解),因此這裡儘可能多自己的文字,儘量不重複網上各位大佬已經說過的內容。

序列編碼

深度學習做 NLP 的方法,基本上都是先將句子分詞,然後每個詞轉化為對應的詞向量序列。這樣一來,每個句子都對應的是一個矩陣 X=(x1,x2,…,xt),其中 xi 都代表著第 i 個詞的詞向量(行向量),維度為 d 維,故

。這樣的話,問題就變成了編碼這些序列了。


第一個基本的思路是 RNN 層,RNN 的方案很簡單,遞迴式進行:

不管是已經被廣泛使用的 LSTM、GRU 還是最近的 SRU,都並未脫離這個遞迴框架。RNN 結構本身比較簡單,也很適合序列建模,但 RNN 的明顯缺點之一就是無法並行,因此速度較慢,這是遞迴的天然缺陷。

另外我個人覺得RNN 無法很好地學習到全域性的結構資訊,因為它本質是一個馬爾科夫決策過程

第二個思路是 CNN 層,其實 CNN 的方案也是很自然的,視窗式遍歷,比如尺寸為 3 的卷積,就是:

在 FaceBook 的論文中,純粹使用卷積也完成了 Seq2Seq 的學習,是卷積的一個精緻且極致的使用案例,熱衷卷積的讀者必須得好好讀讀這篇文論。

CNN 方便並行,而且容易捕捉到一些全域性的結構資訊,筆者本身是比較偏愛 CNN 的,在目前的工作或競賽模型中,我都已經儘量用 CNN 來代替已有的 RNN 模型了,並形成了自己的一套使用經驗,這部分我們以後再談。

Google的大作提供了第三個思路:純 Attention,單靠注意力就可以。

閱讀原文