【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年發表了文章
故事的之後,就有了facebook的convolutional seq2seq模型和RNN encoder-decoder + Attention和Transformer。
相信大多數在最近一兩年接觸NLP的同學們都一樣,學到seq2seq任務的經典模型們,也沒想太多就直接用了。直到今天讀這篇論文時我才發現,在之前竟沒有想過為什麼不能用LSTM去解決seq2seq問題
之所以要寫這篇論文詳解,不是他文章難懂需要我來翻譯,而是想寫下來告訴自己:不要讓自己的思維限定在別人的框架裡,遵守規則不牛b,定義規則才是。
上面說了太多廢話,也可能有不對的地方,希望有經驗的老玩家指教。
接下來我們一起好好看一下作者如何用LSTM去解決不等長輸入輸出的問題。
2. 模型
2.1 預處理
翻譯的一個難點在於兩種語言的語序可能不一樣,面對這樣的問題,作者對訓練資料都進行了對齊處理,圖示比較直觀:
紅色是target句子,藍色是source,作者用了兩種預處理方法:
- 遍歷target句子,一旦碰到target word在對應source word之前的,就新增佔位符 直到兩者位置一樣或者target word位置偏後。這個演算法很直觀,看圖就懂了。
- 直接在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做了兩個改進,可以看到作者碰到問題和解決的思路:
- Padding limit:如果後面一直解碼成佔位符怎麼辦?那就限制佔位符的個數,超了之後概率就置為0。但是最先開始的佔位符不能限制,模型可能一直在醞釀之後的大招。
- Source padding injection(SPI):作者在模型訓練時發現,如果碰到了source句子的結束標誌<EOS>,那大概率也會輸出<EOS>。所以作者的解決方法是拖延,在輸出句子的<EOS>之前找位置插入一些佔位符,這樣輸出的句子就會更長。
3. 優缺點
3.1 優點
- 跳出encoder-decoder框架,解決了如何用RNN語言模型的架構做seq2seq任務
- 訓練消耗的資源更少了,每一步預測只需要上一步的結果
- 預測更加快速,輸入一個詞就能立刻給出輸出,不像encoder要都過完一遍才可以
- 在預測長句子的任務上表現更好
3.2 缺點
- 效果其實沒有那麼好。。。
- 比起經得起考驗的SOTA模型,這個模型還需要多多改進,經得住其他seq2seq任務的考驗
4. 總結
這篇文章沒什麼難理解的東西,但是卻讓讀論文很少的我陷入了思考。其實encoder-decoder的intuition很簡單,就是讀完一句英文,理解了,再用中文說出來。加attention也好,就是我雖然理解了,但翻譯的時候還要回去看一眼斟酌一下。那這篇文章,其實就是我讀一個詞看看能翻譯就先翻譯了,不能翻譯我先差不多理解意思留到後面翻譯。都是符合我們平常翻譯的邏輯,直覺上講得通的東西。
很多時候可能跳出原有的框架,去思考解決遇到的問題,就會有獨特的contribution,希望大家在學習工作生活中多多思考,以上。
【參考資料】: