記憶網路之Hierarchical Memory Networks(架構分層)

記憶網路之Hierarchical Memory Networks(架構分層)

這是中科院去年發表的一篇論文「[Hierarchical Memory Networks for Answer Selection on Unknown Words](arxiv.org/abs/1609.0884)」。其[模擬代碼](github.com/jacoxu/HMN4Q)作者已經開源,是用Lasagne實現的。雖然和上一篇一樣都叫做「Hierarchical Memory Networks」,但是卻千差萬別。上一篇主要是將memory以分層結構進行存儲和搜索,以實現大規模記憶時可以加快計算速度。而本篇則是從模型結構上面進行分層構建,從sentence-level和word-level兩個層面進行訓練以達到準確度的提升和對unknown words的識別。

作者認為End-to-End MemNN僅從句子層面對輸入進行編碼會丟失一些細節信息,尤其是當答案是稀有詞或者從未出現過的詞時(答案肯定會在輸入文本中,只不過作者說大部分工作中會把稀有詞直接當做unknown對待。可是那是因為別人的答案並不是稀有詞的前提下啊。而且究其根源最終的目標不過是從一段材料中找到一個答案而已。反正感覺有些牽強吧==)。所以作者提出HMN模型來解決這種問題,該模型首先使用sentence-level的memory作為推理模塊找到輸入memory中與問題的相關程度,然後使用k-max pooling選擇出最相關的k個句子。接下來對所有句子中每個單詞使用Bi-GRU進行word-level的建模,得到word-level的memory,然後對k個句子中的每個單詞按照句子層面的輸出進行Attention操作,得到最終單詞層面的輸出。最後將句子和單詞的輸出相加並進行聯合訓練即可。模型的架構圖如下所示,接下來我們來看一下模型的細節部分:

首先句子層面的memory部分,與End-to-End MemNN完全相同,這裡就不再贅述。

k-max pooling:將sentence-level memory最後一層計算出來的權重向量alpha作為句子重要性判斷依據,使用k-max pooling操作取出最大的k個句子認為是與問題最相關的句子,然後對相應的單詞進行Attention操作。

word-level Memory:首先對所有的輸入使用Bi-GRU進行編碼,得到每個單詞對應的memory信息 M^{W}=left{ m_{t} right}_{t=left( 1,2,...,left| t right| right)} ;接下來對k-max pooling選擇出的k個句子所包含單詞的記憶進行Attention操作,公式如下所示:

由於這裡得到的結果是k個句子中所包含的單詞對應的,所以需要進行一次轉換,將其變成長度是V的向量,使用的方法就是補零。

最後將word-level和sentence-level的輸出相加用於生成最終的答案。整個模型就是這樣,之所以可以回答低頻次的問題,我感覺主要是因為作者在選擇出關鍵句子之後再次從單詞層面上進行一次檢索,而且返回結果中其他單詞都直接補零,這樣可能有助於選擇正確答案的樣子吧。

至於論文時用的數據集是作者新創建的,關於機票預訂、酒店預訂的數據集,包含中英文,而且句子都很短(就像bAbI一樣),最終的實驗結果就使用MemNN在該數據集上跑了一遍,效果自然不如HMN,對比如下所示:

最後作者又結合一個實際的例子進行了介紹,倒沒有什麼新鮮的,就是從直觀的角度來介紹模型每一層的Attention都可以選擇出正確的句子和單詞。如下圖所示:

推薦閱讀:

PyTorch提取中間層特徵?
theano中怎麼查看TensorVariable的值,在debug時如何跟蹤這樣的變數?
「深度神經網路」(deep neural network)具體是怎樣工作的?
詞向量( Distributed Representation)工作原理是什麼?
為什麼CNTK知名度和普及率不如Tensorflow、Theano、caffe、Torch?

TAG:深度学习DeepLearning | 自然语言处理 |