【NLP】You May Not Need Attention詳解

廢話:git

以前蹭上了BERT的熱度,粉以個位數天天的速度增加,感謝同窗們的厚愛!弄得我上週原本打算寫文本分類,寫了兩筆又放下了,畢竟文本分類有不少SOTA模型,而個人研究還不夠深刻。。慢慢完善吧,今天看到一篇You may not need attention,寫attention起家的我怎麼能放過,馬上打印出來讀了讀,下面詳細說一下。其實每次在寫的過程當中我也在思考,但願一下子能夠給本身和你們帶來不一樣的東西。github


正文:web

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,定義規則纔是ui

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

接下來咱們一塊兒好好看一下做者如何用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
相關文章
相關標籤/搜索