1. 程式人生 > >【NLP】You May Not Need Attention詳解

【NLP】You May Not Need Attention詳解

廢話:

之前蹭上了BERT的熱度,粉以個位數每天的速度增長,感謝同學們的厚愛!弄得我上週本來打算寫文字分類,寫了兩筆又放下了,畢竟文字分類有很多SOTA模型,而我的研究還不夠深入。。慢慢完善吧,今天看到一篇You may not need attention,寫attention起家的我怎麼能放過,立刻打印出來讀了讀,下面詳細說一下。其實每次在寫的過程中我也在思考,希望一會兒可以給自己和大家帶來不同的東西。


正文:

1. 背景

其實no attention只是個噱頭,這篇文章的本質是去除encoder-decoder的架構,用簡單的LSTM去實現seq2seq任務。我當時看到這個網路結構的第一想法,就是好奇之前的seq2seq任務是如何做的,於是這次我們先來看一下seq2seq模型的發展脈絡。

Seq2seq模型的出現主要是為了解決翻譯任務。最初的機器翻譯是詞典規則匹配,之後是統計機器學習方法,主要是基於概率的思想。12年深度神經網路開始興起後,影象、語音識別都取得了很好的進展,其中有一位Schwenk在文章Continuous Space Translation Models for Phrase-Based Statistical Machine Translation中提出了基於神經網路的翻譯模型,如圖:

Schwenk在文章中介紹了三個模型結構,具體內容我沒有細讀,但是從左往右我們可以看到兩種思想:hidden layer的加入和time step上的依賴。

在這篇文章的奠基下,Bengio在13年發表了文章

Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation,提出了沿用到現在的encoder-decoder框架。後來的seq2seq任務,預設代表機器翻譯、文字摘要等輸入輸出不等長的任務,而對於這種任務預設使用encoder-decoder架構。

故事的之後,就有了facebook的convolutional seq2seq模型和RNN encoder-decoder + Attention和Transformer。

相信大多數在最近一兩年接觸NLP的同學們都一樣,學到seq2seq任務的經典模型們,也沒想太多就直接用了。直到今天讀這篇論文時我才發現,在之前竟沒有想過為什麼不能用LSTM去解決seq2seq問題

,即使想到了,也會因為輸入輸出長度不一致而讓自己忘記這個疑問。

之所以要寫這篇論文詳解,不是他文章難懂需要我來翻譯,而是想寫下來告訴自己:不要讓自己的思維限定在別人的框架裡,遵守規則不牛b,定義規則才是

上面說了太多廢話,也可能有不對的地方,希望有經驗的老玩家指教。

接下來我們一起好好看一下作者如何用LSTM去解決不等長輸入輸出的問題。


2. 模型

2.1 預處理

翻譯的一個難點在於兩種語言的語序可能不一樣,面對這樣的問題,作者對訓練資料都進行了對齊處理,圖示比較直觀:

紅色是target句子,藍色是source,作者用了兩種預處理方法:

  1. 遍歷target句子,一旦碰到target word在對應source word之前的,就新增佔位符 \varepsilon 直到兩者位置一樣或者target word位置偏後。這個演算法很直觀,看圖就懂了。
  2. 直接在target句子前插入0-5個佔位符,這樣的話之後的佔位符就會少一些。

注:處理完target句子之後,作者直接在source句子結尾補齊佔位符

2.2 Aligned Batching

經過預處理步驟之後,target句子和source句子的長度就一樣了,作者直接把一個batch的句子收尾拼接程一個長字串,然後像訓練語言模型一樣去訓練。(這一節沒什麼創新點)

2.3 Model

模型結構很好理解,如圖:

每個time step(比如輸入white時),將El和white分別進行embedding,一個詞的維度為E,兩個的拼起來變成2E,然後經過兩層LSTM,之後通過FC層把維度變成E維,就可以在target語言的詞向量矩陣裡找到概率最大的詞了。

以上模型中包含著三個embedding matrix:source language的input(用來embed 單詞white),target language的input(用來embed單詞El),target language的output(用來embed單詞perro)。值得注意的是,作者使這三個詞向量矩陣保持相等。也就是西語和英語中相同詞根的詞向量是相同的。(具體請看評論區大佬留言)至於為什麼這麼做,是因為參考了其他研究,說這樣做的效果會更好。說不定這就是模型有效的原因,因為它其實是預測之前出現的word。那麼問題來了,如果目標語言或者源語言有各種近義詞,那預處理階段做這個詞典的代價就比較大了。

2.4 Decoding

解碼階段,作者對beam search做了兩個改進,可以看到作者碰到問題和解決的思路:

  1. Padding limit:如果後面一直解碼成佔位符怎麼辦?那就限制佔位符的個數,超了之後概率就置為0。但是最先開始的佔位符不能限制,模型可能一直在醞釀之後的大招。
  2. Source padding injection(SPI):作者在模型訓練時發現,如果碰到了source句子的結束標誌<EOS>,那大概率也會輸出<EOS>。所以作者的解決方法是拖延,在輸出句子的<EOS>之前找位置插入一些佔位符,這樣輸出的句子就會更長。

3. 優缺點

3.1 優點

  1. 跳出encoder-decoder框架,解決了如何用RNN語言模型的架構做seq2seq任務
  2. 訓練消耗的資源更少了,每一步預測只需要上一步的結果
  3. 預測更加快速,輸入一個詞就能立刻給出輸出,不像encoder要都過完一遍才可以
  4. 在預測長句子的任務上表現更好

3.2 缺點

  1. 效果其實沒有那麼好。。。
  2. 比起經得起考驗的SOTA模型,這個模型還需要多多改進,經得住其他seq2seq任務的考驗

4. 總結

這篇文章沒什麼難理解的東西,但是卻讓讀論文很少的我陷入了思考。其實encoder-decoder的intuition很簡單,就是讀完一句英文,理解了,再用中文說出來。加attention也好,就是我雖然理解了,但翻譯的時候還要回去看一眼斟酌一下。那這篇文章,其實就是我讀一個詞看看能翻譯就先翻譯了,不能翻譯我先差不多理解意思留到後面翻譯。都是符合我們平常翻譯的邏輯,直覺上講得通的東西。

很多時候可能跳出原有的框架,去思考解決遇到的問題,就會有獨特的contribution,希望大家在學習工作生活中多多思考,以上。


【參考資料】:

  1. You May Not Need Attention
  2. 你可能不再需要Attention:這是一個賊簡單的神經機器翻譯架構
  3. GitHub: YouMayNotNeedAttention