1 Recurrent Entity Network
這篇論文是facebook AI在2017年的ICLR會議上發表的,文章提出了Recurrent Entity Network的模型用來對world state進行建模,根據模型的輸入對記憶單元進行實時的更新,從而得到對world的一個即時的認識。該模型可以用於機器閱讀理解、QA等領域。本文參考了Google團隊的NTM和其他的神經計算單元,能夠基於內容和位置對記憶單元進行讀寫操作。本文在babi-10k的資料集和Children’s Book Test(CBT)的資料集上實現了最優的結果。
Introduction
EntNet使用了動態長期記憶,因此可以用在語言理解任務,QA等。它跟NTM一樣使用固定長度的memory,並且學習基於位置和內容的讀寫操作。不過它的更新可以多個memory並行處理。EntNet在bAbI資料集上取得了state-of-art的結果,並且是第一個解決了所有了bAbI-10k問題的模型,此外在大的資料集如Children’s Book Test上結果也很好。
簡單來說,EntNet的每個memory cell由key和value組成,分別為\(w_i\) 和 \(h_i\)。 每個cell都有一個關聯的processor,即一個gated RNN,負責根據當前輸入和過去的狀態來更新狀態。各個memory cell是獨立的,因此EntNet可以看做是一系列共享權值的gated RNN。
注意,在多層RNN中,每層的狀態更新是通過前一時刻的狀態和底層狀態來決定的,所以層與層之間的狀態是關聯的,這與EntNet是不一樣的。在另外一篇論文中給出了RelNet,在EntNet的基礎上增加了引數\(r_{ij}\)給出每個兩個memory \(h_i\)和\(h_j\)的的關聯程度,也取得了很好的結果。
模型構建
和之前的模型一樣,Entity Network模型共分為Input Encoder、Dynamic Memory和Output Model三個部分。如下圖的架構圖所示:
Input Encoder
Input Encoder部分將輸入的句子序列編碼為一個固定長度的向量,此時典型的對句子的處理方式有:
- 詞袋子編碼向量(對於詞表vocab和句子s,對於句子中的所有詞w1/s2/…/wn賦權值,但是如果vocab很大的話效率就特別低)
- 利用RNN或者LSTM等時序神經網路模型,使用最後一個時間步長的狀態作為句子編碼
- 本文中採用將w1/s2/…/wn分別通過embedding層,得到embedding向量,然後進行位置編碼,得到句子的向量表示,具體的句子位置編碼的介紹在end to end memory network。
\(e_{1}, \ldots, e_{k}\) 為在時間步長t時輸入的單詞序列的embedding表示, \(f_{1}, \ldots, f_{k}\) 是每一個位置的權重,得到的\(s_t\)就是固定長度的句子的向量表示 \(_{0}\)
Dynamic Memory
Entity network中,在時間步長t得到了t時刻句子的向量表示\(s_t\)。在\(s_t\)之上,有類似於多層GRU的單元即w1,h1,w2,h2,…wm,hm。其中,{w}是key,負責記錄實體;{h}是value,負責記錄該實體的狀態。在時間步長t,{h}由{w}和\(s_t\)兩者進行更新,更新公式如下:
- \(g_j\)是一個sigmoid的門函式,用來決定第j層的記憶有多少需要被更新,由{w}和{h}共同決定;
- \(\widetilde{h_{j}}\) 是記憶的候選值, 由 \(h_{j}, w_{j}\) 和 \(s_{t}\) 共同決定, 此處的 \(\phi\) 可以是任意一個啟用函式, 本文中選定的是ReLU;
- \(h_{j}\) 就由門限函式\(g_j\)和候選記憶 \(\widetilde{h_{j}}\) 來決定;
- 然後將\(h_{j}\) 進行正則化, 至於為什麼正則化, 我猜想應該是保證 \(\widetilde{h}_{j}\) 和 \(h_{j}\) 在同一個區間內, 這樣進行更新才有意義。
論文中第三章給出了一個非常具體的例子:
Mary picked up the ball.
Mary went to the garden.
Where is the ball?
前兩句是文字,最後一句是問題。由第一句得到在時間步長t的句子表達\(s_{t}\),由第二句得到時間步長t+1的句子表達\(s_{t+1}\)。以\(s_{t}\)和\(s_{t+1}\)來說明動態實體網路是如何捕捉輸入從而對記憶單元進行實時的更新。
- 當\(s_{t}\)被讀取,w1記錄實體Mary,h1記錄實體狀態Mary拿了一個ball;
- w2記錄實體ball,h2記錄實體狀態ball被Mary拿著;
- 然後\(s_{t+1}\)被讀取,讀取到Mary,因為w1是記錄Mary的key,位置定址項\(s_{t+1}^Tw_1\)變化,門函式被啟用,更新h1實體狀態Mary去了garden;
- 因為h2記錄ball被mary拿著,因此內容定址項\(s_{t+1}^Th_2\)變化,門函式被啟用,更新h2的實體狀態球被mary拿著,球在garden。
即使\(s_{t+1}\)中沒有提到和球有關的內容,在時間步長t+1,h2依然會被更新,是因為內容定址項起了作用。我們稱\(s_{t }^Tw_j\)為位置定址,\(s_{t }^Th_j\)為內容定址。
Output Model
在原文中使用了一層的記憶網路, 因此得到最後一個時間步長的隱層向量 \(h_{j}\) 以後, 就可以直接輸出了:
H是一個[hidden_size, hidden_size]的待訓練矩陣;
R是一個[hidden_size, vocab_size]的待訓練矩陣。
最後得到的y是一個vocab大小的向量,代表輸出單詞的概率,模型的部分也就到此結束了。
總結
實體網路提供了一種根據模型的輸入對記憶單元進行實時的更新的記憶模型,在BABI和CBT資料集上都實現了最佳的效果。在論文的表4中,提供了在CBT資料集上EntNet與其他幾個問答系統的模型的對比結果:
論文提供了兩種模型構造的思路:單輪閱讀和多輪閱讀。
- 單輪閱讀必須按順序讀story和query然後立即產生輸出
- 多輪閱讀可以使用通過多輪的閱讀,使用query來構造story的attention。
因此單輪閱讀是更有挑戰性的,因為模型事先並不知道query是什麼,所以必須學習保留對各種潛在query有用的資訊,因此單輪閱讀可以看作通用的(即不知道query的情況下)對模型構建“current state of story”能力的測試。而多輪閱讀因為知道了問題,所以可以根據問題來選擇性的讀取story。
從上表中可以看出,在CBT資料集上一向表現不好的NE和CN兩個子資料集,通過EntNet表現可以有很大的提升,但還是無法和更復雜的多輪閱讀相提並論。
2 hierarchical Memory Networks
這是Bengio團隊在2017年發表在ICLR上面的論文“hierarchical Memory Networks”,這篇論文的主要思想是使用分層結構的Memory,目的是在維持準確度的基礎上實現訓練速度的提升。因為當需要的記憶量很大時,對所有的記憶進行Attention操作,必然會及其浪費時間,而通過本文提出的Hierarchical Memory結構,可以加速選擇相關記憶的速度。總結一下本文貢獻就是,提出一種新的memory資料結構(基於聚類),和一種新的搜尋方法(MIPS)來適應該結構進行評分計算。但是這兩個東西都是他們之前的論文“clustering is efficient approximate maximum inner product search”提出的,只不過是用到Memory Networks中來。所以可以理解為是在資料結構層面的改進,而不是模型架構,和前面的論文不太一樣。下面我們來看一下: 首先說一下兩種用於memory選擇的Attention的概念和區別:
- soft Attention: 一般使用softmax對所有的memory計算得分,好處是可以方便的計算梯度並反向傳播,缺點是當memory比較大時,計算量比較大。
- hard Attention:僅一個或者幾個相關的記憶被計算,優點是計算量小,缺點是非凸,無法使用反向傳播進行計算,所以一般結合強化學習進行優化,比較複雜。
上面兩種都有各自的優缺點,所以本文在此基礎上提出了基於MIPS的Hierarchical Memory Networks,可以理解為介於兩者之間的方法,一方面使用分層結構進行儲存和定址,相比soft Attention速度更快,而且仍然可以進行端到端的反向傳播進行訓練,比hard Attention簡單。
此外,本文主要是為了解決論文“large-scale simple Question Answering with Memory Networks”,該paper中使用關鍵詞匹配的方法獲得一個問題的相關記憶子集,這是一種啟發式的方法,相對而言不是這麼智慧,所以本文提出的方法就是為了解決這個問題,想要一種自動、端到端、快速的方法來尋找query相關的記憶子集並求其相關性得分。 說了這麼多,那麼我們接下來結合“clustering is efficient approximate maximum inner product search”這篇文章來看一下分層的MIPS(maximum inner product search)的方法。為了加速計算過程,通常有三種結構被用於組織資料:
- Hashing-based:不依賴於具體資料。將memorys分成多個bins,然後只返回與query最相關的幾個bins進行MIPS
- Tree-based:依賴於資料。將memory儲存在葉子節點上。這裡有很多方案,在github上面也可以找到相應的實現方案。
- ball tree:java實現https://github.com/saulvargas/BallTreespython實現:https://github.com/gamboviol/miptree
- cone tree:python實現:https://github.com/ZexinYan/MIP-Search
- clustering-based:將memory分成多個相關的簇,並返回與query最相關的幾個簇然後執行MIPS。C++實現:https://github.com/walkowiak/k-means-mips(也就是本文方法)
MIPS
K-MIPS問題的數學描述:給定一個查詢q和一個資料集x,選擇出最相關的K個資料即可。其複雜度與x的大小成線性相關。可以表述為:
為了解決上面的問題,我們可以使用最近鄰或者最大相似度搜尋方法,但是上式中內積既不滿足三角不等式,也不滿足相似度函式的概念,所以沒辦法直接使用,我們首先要將K-MIPS轉化為K-MCSS(maximum cosine similarity search)問題。K-MCSS問題表述如下所示:
通過上面兩個公式的定義我們可以看出,當x的模相等時,MIPS就等價於MCCS,所以我們要做的就是轉化x的模。所以使用P和Q兩個函式分別對x和q進行對映,對映之後MIPS就轉化為了MCCS:
接下來就是將資料分簇,按照其方向的相關度進行分。而分層是為了進一步加快速度和縮小簇的大小。可以參考下圖:
總結一下起流程就是,將memory使用分層聚類的方法進行儲存和排列,然後輸入一個query時,先返回與q最相關的一個或者幾個聚類,然後在這個自己上進行MIPS搜尋,得到最相關的K個memory及其得分。但是該方法仍然存在兩個最大的缺點和侷限:
- 但是在剛開始訓練的時候,很可能返回的幾個聚類中並不包含目標答案,為了避免這個問題,使用超監督的方法,以確保所有的正確答案均在返回的幾個聚類中。
- 訓練過程中memory向量需要保持不變==也就是靜態記憶。因為如果memory實時變化的話,MIPS搜尋的效果會大幅度下降,導致無法搜到正確的相關性得分。看到這裡時,其實我是懵比的,如果memory不變的話,我們怎麼進行初始化呢??隨機嗎,這效果怎麼保證呢,然後看了作者的實驗設定才發現,其使用別人模型跑出來的memory作為初始值。所以這應該也是一個很大的缺點。
所以整體來講,本篇論文所提出的模型還需要一段時間的發展和完善才能取得比較好的效果,目前來講可能只是一個簡單的版本。效果上來講的話,也只是起到速度上的提升,而準確度並沒有辦法改善。
3 Hierarchical Memory Networks for Answer Selection on Unknown Words
這篇論文是中科院自動化研究所(CASIA)在 9 月份發表的一篇論文,收錄於 COLING2016。該論文基於 Memmory Network 做了一些改進,使得模型在特定的 QA 任務中能更好地從 memory 中選擇答案,並且能一定程度上處理低頻詞甚至未登入詞(unknown words)。論文的資料集以及模型實現已經在 Github 上開源,如果對論文細節沒有太多興趣,可以直接去 專案地址 瞭解專案詳情。
論文使用的資料集如下表所示
資料集包含機票預訂和酒店預訂兩個領域,而且包含中文的資料集哦,這點很贊,雖然資料量看起來並不是很多。擷取中文的機票預訂資料中的片段如下:
1 下午 好 , 我 是 機票 預訂 服務 代理 , 需要 什麼 服務 ?
2 我要 預訂 一張 機票 。
3 請問 先生 您 從 哪裡 起飛 ?
4 由 BGI 起飛 的 飛機 。
5 去 到 哪裡 ?
6 到 印第安納 去 。
7 電話 號 ?
8 13228762221 , 這 是 我 的 號碼
9 時間 是 ?
10 2015年09月26日22點 之前 。
11 先生 , 乘客 的 身份證 是 ?
12 我 的 身份證號 是 110100195352319154 。
13 麻煩 說 下 您 的 名字 ? 謝謝 先生 。
14 好 的 , 名字 是 袁磊 。
15 先生 , 我們 已經 成功 為 您 預訂 。
16 這麼 快 , 非常 感謝您
17 訂票 人 的 姓名 叫 什麼 ? 袁磊 16
18 出發 城市 是 哪裡 ? BGI 16
19 到達 城市 是 哪裡 ? 印第安納 16
20 出發 時間 是 什麼 時候 ? 2015年09月26日22點 16
21 證件號碼 是 多少 ? 110100195352319154 16
22 聯絡電話 是 多少 ? 13228762221 16
資料集的情況似乎有點像多輪對話,但並不完全是,如上 22 輪對話,其中前 16 輪是客服和客戶之間的對話,這段內容被作為 history 輸入到模型中儲存為 memory,而 17-22 則是問題和對應的答案,每個問題的答案都是一個單獨的詞,是從 memory 中挑選出來的。所以從資料集上來看,本文的方法適用於一些像機票預訂、酒店預訂這種流程比較明確的業務。
像這種資料集,如果要我做我會怎麼做呢?粗暴點的思路是將 history 和 question 各自 encode,然後將兩者一起用於計算來去預測輸出,事實上之前不少 QA 方面的工作都是這種思路。論文開頭就批評這種做法
the memory of these methods, such as Long Short-Term Memory(LSTM) (Hochreiter and Schmidhuber, 1997) and Gated Recurrent Unit (GRU) (Cho et al., 2014) compressing all the external sentences into a fixed-length vector, is typically too small to accurately rememberfacts from the past, and may lose important details for response generation
這個也是當前在 sentence representation 討論得比較多的話題吧,將句子直接 encode 成一個固定長度的向量,是會丟失一些細節的。不過我覺得還是看應用場景,如果是那種一問一答且目的性不是非常強的 QA 場景,encoder-decoder 的框架問題不大,語義漂移(如萬能回覆)的問題可以在前期進行意圖識別、情感分析來得到額外的特徵輸入到模型裡。但像本文的這種資料集就不是簡單的一問一答,而是先有了一部分歷史資訊,然後給定問題從歷史資訊裡尋找答案,有點類似英語的閱讀理解題目 —— 因此 PaperWeekly 在 教機器學習閱讀 中介紹了《End-to-End Memory Networks》這一篇作為本篇論文基礎的論文。
對於類似本文的 QA 任務,早先的一些相關工作也是可以用上的,比如 Sukhbaatar 提出的端到端的 Memory Networks,文中記為「MemNN」。但是 MemNN 的問題在於它單純在句子級別進行 "推理",具體一點是隻使用了 sentence level 的 attention 機制,見之前寫的筆記: End-to-End Memory Networks。如果能進一步地在詞級別進行分析,結果應該會更好一點。事實上也有人這麼做了,2015 年俞揚等人的《Empirical study on deep learningmodels for question answering》論文中就提出了一種 "Search-Response" 結構的模型,先使用 MemNN 從 history 中挑選出相關的句子(supporting sentences),這一步稱為 "Search";然後用 NTM 或者 NMT(Neural Machine Translation) 來從這些 supporting sentences 中生成答案,這一步稱為 "Response"。在 "Search-Response" 結構中,Search 和 Response 兩個步驟是分別獨立訓練的,也就是說這其實是一個 pipeline 的方法。
所以本文的基本思想是: 結合 MemNN 和 "Search-Response" 的思想,得到一個端到端的系統。本文的模型結構如下圖所示:
圖中左側是模型的整體結構,右邊的兩個小圖是左圖中兩個模組的細節圖示。整個模型大體上可以劃分為四個部分,分別是:
-
sentence level memory and reasoning
這部分將 history 資訊轉換成內部的 memory,並在 此基礎上計算結果,同 MemNN,上圖中右下塊是這部分的圖示,要注意的是這裡為了簡化畫成了類似 RNN 的結構圖,但並不是說 \(X\) 中的句子依次輸入這個模型,然後更新自連線的 \(u_{r}{(S)}\),這裡的自連線只是表示多層結構(文中使用的層數為 3),而這種多層結構和 RNN 的結構有共同之處。
在這裡,history 也就是 \(X\) 中的每個句子 \(x_i\) 和 question 也就是 q 都要表示成一個向量,使用的是《End-to-End Memory Networks》中的 position encoding 方法,即將句子中每個詞的 embedding 加權求和,而這個權值和詞在句子中的次序有關。
總之這部分跟《End-to-End Memory Networks》中的內容基本一樣,不贅述,詳見 MemNN 的筆記。
-
k-max pooling
這部分連線 1 和 3,利用 1 輸出的 internel state 和 question 一起挑選出 history 中和 question 最相關的 k 個句子。
所謂的 internel state,就是圖中的 \(\alpha^{(S)}\)
\[\alpha^{(S)}=softmax(M^{T}u_{1}^{(S)}) \]上式中 \(M\) 為 sentence level memory,\(u_{1}\)為問題 q 的 representation。
-
word level memory and attention: 使用 2 得到的 k 個句子,進行 word level 的 attention 來得到結果
這部分使用 BiGRU 來得到 attention
\[M^{(W)} = \{m_{t}\}_{t=(1,2,...)} \\ m_{t}=\overrightarrow{h_{t}}+\overleftarrow{h_{t}}\\ \alpha^{(W)}=softmax(v^{T}\tanh(Wu_{R}^{(S)}+U\hat{m}_{t})) \]這裡的 \(\alpha^{(W)}\)就是 word level 得到的結果,但是這個結果是在 k 個句子中的詞上的概率分佈,沒法直接用於第 4 步的計算,因此要做一次轉換,將\(\alpha^{(W)}\)擴充為長度為 V 的向量,V 是詞典的大小,方法是用 0 填充。
-
output: 綜合 1 和 3 的輸出來計算最後的結果
第一步得到的輸出記為 \(p^{(S)}\) ,第三步得到的輸出記為 \(p^{(W)}\),將這兩者直接相加作為最後的輸出
\[p = p^{(S)}+p^{(W)} \]
如上所述,因為在 sentence level memory network 的基礎上加上了 word level memory,作者將這個模型稱為「Hierarchical Memmory Networks」,這是一個能夠進行端到端訓練、能在更細粒度的語言成分上進行"推理"的 QA 模型。
下圖是 HMN 和其他模型在給定的資料集上的對比結果
以及 HMN 模型使用不同的 word level encoder 時的效果對比
下面的圖顯示了模型回答一個問題時的過程
- 表格第一列是 history,這些內容將會被 encode 後儲存到 sentence level memory 中
- 需要回答的問題是: When does the client depart,正確答案是 history 中第 14 條中的日期
- 表格第二列是 sentense level reasoning 的過程,其中的值是每一個 reasoning 層的 internel state 也就是 u(S)rur(S),可以看到進行三次 reasoning 後正確的 supporting sentence 也就是第 14 條的權重已經非常的高了
- 第三列是 k-max pooling,這裡的 k 取值為 4,得到的就是 8、10、13、14 這四個候選的句子
- 第四列是 word level 部分,使用 attention 來得到每個候選句子中的詞作為答案的概率,這裡概率最大的就是第 14 條句子中的日期
以上就是本篇論文的主要內容,至於開頭作者提到的未登入詞問題的處理,作者就是指著上面的圖說:你看, 10/13/2018 這樣的詞也被找出來了!總之,作者沒有提出一種對未登入詞的解決辦法,我猜他的意思是,在構建 vocabulary 的時候,不要根據詞頻去除低詞頻的詞,而是照單全收餵給模型,而這個模型是能夠將這種詞頻非常低的詞正確地找出來作為答案的。
4 Gated End-to-End Memory Networks
今天要介紹的論文“gated end-to-end memory networks”時16年10月份釋出的,他是在End-To-End Memory Networks這篇論文的基礎上做了一些修改。因為End-To-End Memory Networks在multi-fact QA、 positional reasoning、 dialog等領域的效果還不是很好,所以本文參考CV領域中HighWay Networks和Residual Networks涉及到的shortcut connections,引入Gated機制,以實現對memory的正則化,從而讓模型可以動態的修改memory。 因為End-To-End Memory Networks已經很熟悉了,所以我們先來介紹一下Highway Networks的想法,其主要是在網路輸出下一層之前引入了一個transform gate \(T\)和一個carry Gated \(C\),以讓網路學習什麼、多少資訊應該被傳到下一層。我們假設本層網路的輸出為:\(y=H(x)\),那麼就加入下面的對映函式:
往往我們會選擇C = 1-T,所以上面的公式可以轉化為:
而殘差網路則可以視為是Highway網路的一種特例,因為其直接把T和C都當做I,所以就相當於\(y=H(x) + x\)。但是這裡背後的原理我還沒來得及搞明白,為什麼這樣就可以讓更深的網路很容易就訓練成功,等有時間再看看相關的論文學習下。 然後我們來看一下如何將其融入到End-To-End Memory Networks中,由於其每個hop的功能都可以視為\(u'=H(u)\),所以對應到上面的公式,\(u\)就相當於輸入\(x\),\(o\)就相當於輸出y,所以代入上式得:
也就是修改一下原來模型中輸出層的公式即可。然後引數W和b有全域性和每個hop獨立兩種方式,後面實驗結果證明,每個hop保持獨立效果會比較好。論文的創新點倒不是很大,只不過是將兩篇論文結合一下,但是看有實驗效果好像還有挺大的提升。最終的模型架構圖如下所示:
實驗結果: 本文所提出的模型不僅僅在bAbI資料集上取得了很好的效果,而且在dialog bAbI對話資料集上也取得了很好的效果。這個資料集應該會在後面的文章中進行介紹,這裡就不贅述了。這裡也貼上兩張實驗結果的圖:
第二張圖揭示得是MemNN與本文提出模型各個hop對每個句子的權重計算,可以看出本文的模型更加集中在最重要的那個句子上面,而MemNN則比較分散,也說明了本文模型效果更好。
參考
TRACKING THE WORLD STATE WITH RECURRENT ENTITY NETWORKS
Hierarchical Memory Networks
Hierarchical Memory Networks for Answer Selection on Unknown Words
gated end-to-end memory networks