解讀 3 篇 2016 年最值得讀的自然語言處理領域 paper,分別是:
1. LightRNN Memory and Computation-Efficient Recurrent Neural Network
2. Text understanding with the attention sum reader network
3. Neural Machine Translation with Reconstruction
➊
LightRNN: Memory and Computation-Efficient Recurrent Neural Networks
論文連結
作者
Xiang Li, Tao Qin, Jian Yang, Tie-Yan Liu
單位
Nanjing University of Science and Technology & Microsoft Research Asia
關鍵詞
LightRNN, Word Embedding, Language Model
文章來源
NIPS 2016
問題
在詞典規模比較大的情況下,傳統 RNN 模型有著模型大訓練慢的問題,本文提出的 LightRNN 模型通過採用兩個向量組合在一起表示一個詞的方法,降低實際訓練向量的數目,進而解決上述問題。
模型
LightRNN 的核心思想是將一個詞用兩個共享的向量來表示。如下圖所示,我們將所有的詞分配到下面一個二維詞表中,表中第i行所有詞語的對應的行向量為 x(i,r),第 j 列詞語對應的列向量為 x(j,c)。故第 i 行第 j 列的詞語由 x(i,r)和 x(j,c)兩部分共同表示,該方法在論文中被稱為兩部共享嵌入(2-Component shared embedding)。
每一行詞語的行向量,每一列詞語的列向量均是共享的,因此對於大小為 |V| 的詞典,只需要 2√|V| 個不同的向量就可以表示所有詞語,這大大縮小了模型的體積,加快模型的訓練速度。
通過上面的介紹我們知曉了可以通過兩個向量來表示一個詞語,接下來將介紹如何將這種新奇的詞表示方法引入到 RNN 模型中。本文的想法其實非常簡單,如下圖所示,將一個詞的行向量和列向量按照順序分別送入 RNN 中即可。以本文中的語言模型任務為例,為了計算下一個詞是 w_t 的概率,我們需要先根據前文計算下一個詞的行向量是 w_t 的行向量的概率,再根據前文和 w_t 的行向量計算下一個詞的列向量是 w_t 的列向量的概率。行向量概率和列向量概率的乘積便是下一個詞是 w_t 的概率。
現在我們已經清楚了這種新穎的詞語表示方法以及如何將這種詞語表示方法應用到語言模型中。但仍然存在一個關鍵的問題,即如何生成上圖中的二維詞表。本文提出了一種 Bootstrap 過程的方法,具體步驟如下:1. 冷啟動,隨機將詞語分配到二維詞表中。2. 訓練 Embedding 到 LightRNN 收斂為止。 3. 固定上述訓練好的 Embedding,再重新分配詞語在表中的位置來最小化損失函式。然後回到步驟 2。(該過程可以轉化成最小權完美匹配問題,文中採用相關論文中的近似演算法來解決該問題。)
通過一些在 ACLW 和 BillionW 資料集上的語言模型實驗,可以觀察到相比之前的語言模型,LightRNN 在訓練速度上有兩倍的提升,模型縮小了數十倍,且實驗效果還略有提升。
資源
[ACLW]
https://www.dropbox.com/s/m83wwnlz3dw5zhk/large.zip?dl=0
[BillionW]
http://tiny.cc/1billionLM
相關工作
語言模型相關工作
1. Blackout: Speeding up recurrent neural network language models with very large vocabularies
2. Character-aware neural language models
**本文采用的最小權完美匹配問題的近似演算法**
Linear time 1/2-approximation algorithm for maximum weighted matching in general graphs
簡評
本文提出的 LightRNN 方法大幅度提升了模型的訓練速度,縮小了模型的大小,對於苦於模型訓練過慢、視訊記憶體不足的人來說是一大福音。此外,本文提出的模型在一定程度上可以學到詞語之間的一些共享資訊,進而提升模型的效果。目前本文的方法僅在語言模型上進行了實驗,顯然此方法同樣適合擴充套件到機器翻譯、問答等任務上,期待該模型在其他任務上的應用。
完成人資訊
王寶鑫,科大訊飛,destin.bxwang@gmail.com
實錄
問:從文中 Figure5 展示的圖片來看,每一行的詞可以看出存在一些語義或形式方面的共同之處,但是列向量之間很難看出有什麼共性體現。那麼關於列向量的作用如何理解?這是否跟網路的結構有關係?
答:這個問題很有意思,一開始我看到 Figure5 中的例子時,並沒有想太多,很多論文中都有類似的展示,作者一般會把其中效果比較好的,可解釋性比較強的部分拿出來給大家展示。所以一開始,我預設作者只是選擇性把同一行語義相關性比較強的例子拿出來了,而同一列語義相關性比較強的則沒有拿出來。 事實上,本文模型中的行向量和列向量作用確實有所不同,LightRNN 是先通過預測下一個詞的行數來確定下一個詞的大體範圍,再預測下一個詞的列數來確定下一個詞具體是什麼。也正是因為這個先後過程,導致了同一行的詞語具有語義上的相似之處(範圍相接近)。舉個例子來說,Barack Obama was born on <wt>,對於這個句子,預測下一個詞 wt 的時候,模型會首先預測它的行數,這一行中會出現大量的時間類詞語,接下來通過前文和行向量,模型再進一步預測 wt 的列數來確定是哪一個時間,August。上面簡單解釋了下行向量和列向量作用的不同之處,同時也說明了同一行之間語義相似會使模型效果更好。歸根結底,真正使行中詞語聚類的原因是通過 Bootstrap 過程來對詞語重分配導致的,重分配詞語來最小化損失函式,會傾向於使同一類詞語聚集在一行。
問:除了梯度下降訓練 Embedding 引數外,還需要不斷地用 MCMF 重分配詞語在二維表中的位置。是否有一些其他的策略可以改進或者加快這個訓練過程?
答:這主要是因為二維表中的詞語採用隨機初始化的分配方式,隨機分配的如果不合適的話,同一行詞語之間彼此毫無語義關聯,會使模型在預測下一個詞行數的時候就產生較大分歧,導致了第一輪訓練困難的情況。因此,第一次分配二維表中的詞語時,或許可以提前採用一些手段做些預處理。類似於用預訓練的 word embedding 來聚類,把同一類的詞分配在同一個行裡。或者用一些 Topic Model 把相同主題的詞語分配在同一行,都有可能加快訓練過程。其他的地方,例如重分配詞語位置的方法,以及行列向量的組合方式等都有可能有改進的空間,這些地方我目前還沒有太好的想法,大家等下自由交流階段也可以多提提自己的想法 。
問:在詞表很大的情況下,也就是說無法在記憶體當中存下每個詞在詞表中的概率的情況下,怎麼高效地重分配詞表呢,分配詞表的演算法不取全域性最優解對最終的影響估計有多大呢,有沒有什麼形式化的表示可以說明影響的大小呢 ?
答:實際上我之前也想過這個問題,因為在重分配的過程中,每個詞在詞表的概率佔用的空間還是很大的,是 O(V^2)。不過相對於視訊記憶體來說,鑑於記憶體實在是比較便宜,這個問題的影響一般應該不大。記憶體如果放不下而採用從硬碟讀寫的方法,應該會極大地降低模型訓練速度,反倒得不償失。而重分配過程中,實際上分配詞表的方法一直都不是最優解。首先本文采用的是一個 1/2 近似的 MCMF 演算法,並不能達到最優解。其次,本文中的優化目標函式實際上也並不能真正的使模型在固定 Embedding 的情況下,Loss 最小。因為本文一直基於一個假設,便是每次只改動一個詞語的位置,計算對應的 Loss。而當所有位置都變化的情況下,前文的表示已經改變,也不能再用之前已經訓練好的 RNN 的狀態來計算 loss 了。這也是我之前說的,重分配詞語位置的方法還可以改進的原因,但對於具體的改進方法,目前我還沒有什麼好的想法。歡迎大家等一下詳細來討論。
問:這篇文章的做法是將一個詞拆分成一個 table 中的行列向量的表示,並分別預測行部份和列部分,那如果我將一個詞表示成 table 中行列向量的拼接,一次性地預測和輸入,效果會怎樣呢,在實驗前有沒有一些理論上的依據可以評估呢。
答:這是我之前提到的另一個改進的可能了,改進行列向量的組合方式。你提出的這種方法,輸出預測部分,將輸出的結果分割,然後分別預測行列號。在沒有實驗之前,很難評價效果是好是壞。但是我個人不是很認可這種處理方式。因為這樣缺少了一步我覺得比較關鍵的過程,即通過前文和行來預測列。行列交替預測有兩個優點,一個是縮小搜尋空間。另一方面是可以通過詞語重分配使相近詞語處於同一行,增強 rare word 的表示能力。
問:行列組合生成 word embedding 的做法是否可以擴充套件為更高維,例如 3 維(行、列、層)的 Embedding Component 組合?感覺可以進一步壓縮 Embedding 體積。
答:本文作者雖然也提到了這種可能性,即用 3 維的組合。但是我個人也不看好這種方法。實際上,我最近也在嘗試用二維的組合方式來訓練語言模型,模型非常難以收斂,只有一個好的詞表分配方法才能使模型達到比較好的效果,而我們採用三維的組合方式,減少了模型的複雜度,會讓模型更加難以訓練。應該說,減少了模型的引數,很難說現實中有一種很好地詞表組合方式,使模型訓練的很好。
➋
Text understanding with the attention sum reader network
論文連結
https://arxiv.org/abs/1603.01547
作者
Rudolf Kadlec, Martin Schmid, Ondrej Bajgar, Jan Kleindienst
單位
IBM Watson
關鍵詞
Machine Reading Comprehension
文章來源
ACL2016
問題
針對 context—question-answer 資料集,使用注意力機制直接在原文字上獲取問題的答案。網路結構簡單, 計算量小,並取得 state of the art 的結果。
模型
Attention sum reader network 的核心思想是通過注意力機制的權重計算出哪個詞為答案詞彙。如上圖所示,在使用 embedding 將文字和 query 中的詞分別對映成向量之後,使用單層的雙向 GRU 將文字中的詞編碼,每個 time step 兩個方向編碼的拼接來代表當前 time step 的詞的向量。使用另一個單層雙向 GRU 對 query 進行編碼,兩個方向最後一步輸出拼接為 query 的編碼向量。
將每一個詞的向量表示與 query 的向量點積,之後歸一化得到的結果作為每一個詞的注意力權重,同時將相同詞的權重合並。最後每個詞的權重即為答案是這個詞的概率,最大概率的詞就是答案。在實際計算過程中,只選擇了候選答案中的詞進行計算,因此減少了計算量。
從結果上來看,論文發表時模型在 CNN/Daily Mail 和 CBT 的資料集上取得了 SOTA 的結果。
資源
[CBT dataset]
http://www.thespermwhale.com/jaseweston/babi/CBTest.tgz
[AS Reader implementation]
https://github.com/rkadlec/asreader
相關工作
Attentive and Impatient Reader
1. Teaching machines to read and comprehend
2. A Thorough Examination of the CNN / Daily Mail Reading Com- prehension Task
Memory Networks
The goldilocks principle: Reading children’s books with explicit memory representations
Dynamic Entity Representation
Dynamic Entity Representation with Max-pooling Im-proves Machine Reading
Pointer Networks
Pointer Networks
簡評
1. 本文的模型相比於 Attentive Reader 和 Impatient Reader 更加簡單,沒有那麼多繁瑣的 attention 求解過程,只是用了點乘來作為 weights,卻得到了比 Attentive Reader 更好的結果,從這裡我們看得出,並不是模型越複雜,計算過程越繁瑣就效果一定越好,更多的時候可能是簡單的東西會有更好的效果。
2. 文中直接利用 attention 機制選擇答案,模型就比較偏愛出現次數多的詞,這就隱含了出現次數比較多的詞作為答案的可能性大的假設,所以從根本上本文是基於 task 的研究而不是從理論出發的。
簡評摘錄於西土城的搬磚日常的[知乎文章](https://zhuanlan.zhihu.com/p/23462480#!),這篇文章上還有詳細的本論文相關模型的分析,推薦大家讀一下。
完成人資訊
李宸宇 chenyu.li@duke.edu
實錄
問:文章的答案都是從文字中找,那如果答案是一句話呢,或者說是我們常見到的從四個句子裡選一個,那麼效果是否會怎麼樣,如果說從在模型後邊接一個生成模型,就是文中的模型選出關鍵字,然後利用這些關鍵字來生成一個句子,會不會更好一些?
答:你說的很對,這篇文章所做的任務就是給答案的一部分然後從裡面扣掉一個詞 模型的目的是從原文中找出這個詞,答案是一句話的這篇文章沒有涉及,你說的先預測關鍵字再生成句子可能效果會不錯 就是可能要分兩步訓練模型 一個用來預測關鍵字 一個用關鍵字生成句子,在生成句子的時候也可以將文章的資訊和問題的資訊通過特徵向量引入模型 具體模型怎樣設計 實驗效果如何還是要做實驗才可以知道。
問:模型介紹有一點和論文的描述有出入我幫忙強調下,對 document 的 embedding 和對 query 的 embedding 是不同的,對 document 每個 word 都 embed 成 vector,而 query 整體 embed 成一個 vector 相應的後續的 concat 兩者也會有些差異。
答:可能我在寫 note 的時候沒有寫清楚 所有的句子都是要先把每一個單詞 embed 到 vector,再用 gru 進行 encode(編碼),然後對於文字中的單詞,雙向 gru 在當前詞輸出拼在一起成為這一個詞的新的向量表示,對於問題直接用雙向 gru 最後的輸出拼接作為問題的向量表示,最後用這兩組向量進行接下來的運算,這是這篇文章的做法。
問:關鍵字生成模型——這個很難吧,context 缺乏啊:用文件 D 做 context 還是 Query 改寫呢?
答:我的想法是可以採用原來語料庫裡面的資料 自己構建一個關鍵字字型檔,訓練一個模型使用真正的關鍵字生成句子,然後將兩個模型拼接在一起,然後根據原來語料庫+答案關鍵字 生成答案句子?
問:我現在在做機器人,對 Q&A 感興趣。“Attention sum reader network 的核心思想是通過注意力機制的權重計算出哪個詞為答案詞彙。”這句話能再解釋下嗎?我是個初學者,不太明白。
答:因為 attention 一開始的時候是先用一套機制算出每一個詞向量的權重,然後用權重乘詞向量的和作為最後的文字表示 在這裡只需要算出每個詞的權重 把相同詞的權重加在一起 得到權重最高的詞就是答案。
➌
Neural Machine Translation with Reconstruction
論文連結:
https://arxiv.org/pdf/1611.01874v2.pdf
作者
Zhaopeng Tu, Yang Liu, Lifeng Shang, Xiaohua Liu, Hang Li
單位
Noah's Ark Lab, Huawei Technologies; Tsinghua University
關鍵詞
NMT, autoencoder, reconstructor, reranking
文章來源
AAAI 2017
問題
在傳統 attention-based NMT model 上增加一個 reconstructor 模組,用 auto-encoder 的思路,使得 source sentence 翻譯之後的 translation 能夠重建出 source sentence,改善翻譯不充分的問題(over-translation/under-translation)。
模型
現有的 NMT 模型容易出現重複翻譯以及部分詞語未翻譯的情況,因此翻譯不夠充分;同時在做 decoding 的時候根據 likelihood 去搜尋最好的翻譯句子並不是一個很好的方法,實驗表明 likelihood 傾向於短的句子,在 beam search 時如果把 beam size 不斷變大,那麼 search 出來最後選擇的句子會很短,bleu 就會很差。為了改善上面的兩個問題,這篇文章提出用一種 autoencoder 的思路,希望用 decoder 的 hidden 儘可能地重建出 source 的詞語,那麼 decoder 所 embed 的資訊就是相對豐富的,也能得到更好的翻譯。其實就是給 NMT 一個更強的約束,而這個約束也非常合理,和 semi-supervised learning for NMT 出發點非常類似。
模型非常簡單,直接上圖,增加的 reconstructor 模組和 decoder 長的一樣:
其中 x 的 embedding 和 encoder 中的 embedding 是共享的,而 hidden 是 reconstructor 中單獨的引數,inverse attention 的做法也是和原來的 attention 做法是一樣。那麼整個模型的 training 目標就是:
在做 testing 的時候,也是用這個目標,不同的是:先通過 beam search 根據 likelihood P 得到一些 candidate,然後用 reconstructor 去算每個 candidate 對應的 reconstruction score R,根據 P+\lambda R 去選擇最終的 translation,相當於是做一個 reranking。流程如下:
實驗只在 zh-en 的資料集上驗證,不過有很多 analyze 的實驗,同時 encoder-decoder 的引數是通過 RNNSearch 模型 warm start 的。
資源
訓練集:1.25M LDC的zh-en資料集;
驗證集:NIST2002;
測試集:NIST2005, NIST2006, NIST2008
實驗結果
做了很多分析的實驗:
1. 先是讓人打分,看 reconstruction score 和 adequacy 還是 fluency 相關性更大,人覺得是 adequacy 更相關。
2. 然後是在 training 的時候觀察驗證集上的 bleu 和 reconstruct 的 source sentence 的 bleu(x, x')的bleu 的變化,然後發現 110k iteration 的時候是這兩個值是 balance 最好的。
3. 之後是在不同 beam size 的時候,加上 reconstruction 之後驗證集上的 bleu 和 translation 的長度都變好了。
4. 接著是在測試集上的 bleu 變化,高了 2 個點以上。
5. 然後在 testing 的時候加上 reconstruction 比不加又高 1 個點。
6. 在長句子上的表現更好,bleu 更高。
另外還說雖然模型變複雜了,但是速度沒有變的特別慢,還有一個是和作者之前自己提出的 context gate,model coverage 比較,都比它們好,以及其他一些涉及人工觀察的實驗。
相關工作
1. Modeling coverage for NMT
2. Context gates for NMT
3. Semi-supervised learning for NMT
簡評
本文用(supervised)autoencoder 的思路,在原有的 NMT 模型上構建了一個 reconstructor,使得 x 翻譯得到 y 之後,這個 y 也能通過 reconstructor 重建回 x,這樣一來就說明模型中 encoder 和 decoder 的 hidden 所包含的資訊是相對充分的,能夠改善翻譯不充分(重複翻譯和翻譯不足)的問題。思路非常的清晰簡單,模型也不復雜,實驗非常豐富,分析了很多的點來說明這個模型表現的很好。值得學習這種清晰的思路和簡單的模型構建。
完成人資訊
吳酈軍 中山大學
實錄
問:為什麼 beam search size 越大,效果越差?
答:這個問題是這樣,一方面 LL 的目標函式本身傾向於更短的句子;另一方面當 beam size 變大的時候,這個問題就會凸顯的更加嚴重。我們來看下,當 beam size 變大時,其實是可能產生很多短的 candidate 的,而這些短的 candidate 的概率就會變得相對較大,因為句子的概率是連乘 `(P(y_1...t)=p(y_1)p(y_2|y_1)...p(y_t|y_<t))` 的形式,所以短的句子很可能概率更大,這也就是第一點 LL 的問題;那麼,當 beam size 比較小的時候,decoding 的每一步都會去選擇概率最大的 k 個詞語,所以那些短的句子基本上也就不會出現了。
問:Model 是 warm start 的,那如果不是 warm start 效果會如何?另外 reconstructor 是 cold start 的,這個是不是不好?
答:準確的說,現在很多 nmt 的工作都是 warm start 開始的,因為可能存在不是 warm start 模型可能無法收斂, 學不出來等的情況或者是為了加快學習速率,比如用預先訓練好的 language model 的 embedding,再比如 rl 的方法不 warm start 就會導致搜尋空間太大而無法學到等。所以 warm start 還是很重要的而且很通用。在這個工作中,如果不 warm start 似乎沒有看出特別大的問題,所以這個還是需要實驗來證明好不好;另外對於 reconstructor,的確可以先將地下的 encoder 和 decoder 固定住,先 pre-train 上層的 constructor,然後再 joint 的 supervised training,這樣也是可以的。不過同樣好不好還是得看試驗結果,這裡可能只是學習速率上的區別。這點因為沒有做實驗,也不好說。只是個人猜測。
問:為什麼 beam size 變大,就會產生更多較短的 candidates?
答:decoding 的做法是根據每一步來選概率最大的,開始的時候,概率低的那些詞語基本上是不會出現在 beam 的 pool 裡面的。而當 size 變大時,這些詞語就被 cover 在 beam 的 pool 裡面了,而如果他們比較早的就到了 eos 的話,整個句子的概率就會相對較大,也就很有可能選擇了這樣不好的答案。這點應該是和 LL 這個目標是相吻合的,所以也就是傾向於更短的句子這個意思。
問:Lambda 這個引數是 1 是如何確定的?
答:這點其實我覺得是本文可能一個不太嚴謹的地方,個人覺得應該得試下不同的 lambda,然後給出一個不同 lambda 對於這個問題的結果的影響。我覺得作者應該是嘗試了不同的 lambda,然後發現 1 是最好的,所以才這樣 report 的。不過也很好奇其他 lambda 的結果,誇張一點說,如果 lambda 大於 1 又會如何呢?其實在一些不同的任務上,lambda 一般是一個 trade-off 的作用,一般應該是 lambda*x + (1-lambda)*y 這樣,不過這裡不一定是 trade-off,所以就暫且當做同樣實驗表明 lambda=1 是效果最好的吧。
問: NMT 是如何學習到詞與詞之間的對映關係?為什麼 NMT 能夠工作?
答:這個問題。不知道這裡提到的詞到詞的對映是否指的是我理解的 x 中的詞要和 y 中的詞語一一對應?如果是的話,其實 nmt 本身就沒有這個要求,而是強大的 seq2seq 框架,整個 seq2seq 就相當於是兩個 language model 的組合(encoder,decoder),那 language model 本身就是可以產生像樣的句子。這應該是回到了第二點 nmt 為何 work。那麼再看本文,其實這就是一個 autoencoder 的框架,我們如果不看 y 作為單獨的詞語,而只看 hidden h 的話,那麼整體上就是一個 autoencoder。本身其實也不是學習一個詞到詞的對映,而只是兩個 Loglikelihood 的目標。我們從 intuition 的角度理解,他就是希望翻譯出來的 y 也能更好的翻譯回 x,如果 y 能夠翻譯回 x,那麼整體所包含的語義就是比較豐富的,應該也能表明 encoder 和 decoder 中的 hidden 都有更豐富的資訊。這也是這個工作效果為何的確好。
問:Reconstructor 是從翻譯過的 y 重新 decoder 回 y,因為 y 有可能翻譯的不好,可以理解為 noise,所以像 Denoised Autoencoder —— 如果是這樣,是否可以用 DAE 那一套:deep DAE? deep DEA 後是否效果更好 —— 但是這裡不是學習,只是驗證前面的 seq-to-seq 的效果,所以可以 single layer 就夠了。
答:關於 DAE 我沒有關注過,所以不是很好回答。但是這篇文章是一個 supervised 訓練過程,所以其實不是 sample 或者說翻譯出來的 y 來做 reconstructor 的訓練,而是用 pair 的 label data y 來做訓練的,因此 y 並沒有 noise 的這個說法。