記憶網絡(譯)

筆者:本文爲英文論文的翻譯文章,供機器學習、深度學習相關學者參考,若有錯誤理解之處請指出,不勝感激!(如需轉載,請聯繫本人:jtianwen2014,並註明出處)。api

記憶網絡(譯)

Jason Weston, Sumit Chopra & Antoine Bordes.數組

Facebook AI Research, 770 Broadway, New York, USA.網絡

{jase,spchopra,abordes}@fb.com架構

摘要

本文將介紹一種新的學習模型,稱爲記憶網絡。記憶網絡利用結合了長期記憶模塊的推斷組件進行推理;並學習如何聯合地使用它們。長期記憶模塊被用做預測,能夠讀出也能夠寫入。咱們將記憶網絡用於問答任務,長期記憶模塊扮演着知識庫的角色,記憶網絡的輸出是文本回復。咱們在一個大規模的問答任務上,以及一個從仿真的世界裏生成的小規模可是足夠複雜的玩具任務(toy task)上進行評測。在本文的末尾,咱們經過鏈乘支持語句到須要理解動詞意圖的問答來展現這寫模型的推理能力。框架

1 概述

大多數機器學習模型缺少一種簡單的方式從長期記憶模塊中讀取或寫入,並沒有縫地結合到推理中。因此,這些方法並無利用現代計算機的卓越的優點之一。舉個例子,考慮一個任務,給定一些事實或者故事的集合,而後須要回答相關的問題。理論上這個任務能夠經過語言模型來完成,好比循環神經網絡(RNN)(Mikolov et al., 2010; Hochreiter & Schmidhuber, 1997) ,由於這些模型被訓練得能夠對於給定的單詞流預測出下一個(或多個)可能的單詞(或單詞集合)。然而,它們的內存(編碼在隱狀態和權值)通常很小,並不能準確地記住過去的事實(導致被壓縮到稠密的向量中)。衆所周知,RNNs很難執行記憶操做,好比簡單的拷貝任務即輸出剛剛讀到的輸入(Zaremba & Sutskever, 2014)。一樣的情形發生在其餘的任務上,好比,在視頻和音頻領域,觀看影片須要長期記憶以回答關於這個影片的問題。機器學習

在本文的工做中,咱們介紹一種叫作記憶網絡的模型,嘗試修復以上提到的問題。核心思想就是將在機器學習中用於推理的有效學習策略和能夠讀寫的內存模塊相結合。而後訓練模型,使之能夠高效的操做內存內存模塊。咱們在第2部分介紹總體的框架,在第3部分相你們展現在文本問答領域的具體實現。咱們在第4部分討論相關工做,而後再第5部分介紹實驗部分,最後在第6部分做出總結。函數

2 記憶網絡

一個記憶網絡由1個內存模塊\(\mathbf{m}\)(用\(m_i\)索引的數組)和以下的4個(經過學習獲得的)模塊\(I,G,O,R\)學習

\(\mathbf{I}\):(輸入特徵映射)—— 將輸入轉換爲內部特徵表示。測試

\(\mathbf{G}\):(泛化)—— 對於給定新的輸入更新舊的內存。咱們稱之爲泛化是由於在這個階段網絡有機會壓縮並泛化其內存以供將來某些須要。優化

\(\mathbf{O}\):(輸出特徵映射)—— 給定新的輸入與當前的內存狀態,產生新的輸出(在特徵空間中)。

\(\mathbf{R}\):(回覆)—— 將輸出轉換爲特定格式的回覆。好比,文本回復或者一個動做。

給定輸入\(x\)(好比,一個輸入字符,單詞或者句子,這依賴於粒度的選擇,一幅圖片或者一段音頻信號),模型執行以下的流程:

  1. \(x\)轉換爲內部特徵表示\(I(x)\)
  2. 對於給定的新的輸入,更新內存\(\mathbf{m}_i\)\(\mathbf{m}_i=G(\mathbf{m}_i,I(x),\mathbf{m}),\forall i\)
  3. 對於給定的新的輸入和內存,計算輸出特徵\(o\)\(o=O(I(x),\mathbf{m})\)
  4. 最後,將輸出\(o\)解碼爲最後的回覆:\(r=R(o)\)

訓練和測試階段都須要這個過程,這兩個階段的差異在於測試階段不更新\(I,G,O,R\)的參數。記憶網絡能夠用於不少任務。其組件\(I,G,O,R\)可使用不少目前存在的機器學習策略,如,SVMs、決策樹、等等。

\(I\)組件:組件\(I\)能夠利用一些通用的預處理過程,如,爲文本輸入進行句法分析、指代和實體消解。它也能夠將輸入編碼到一個內部特徵表示,好比,將文本轉換到稀疏或稠密的特徵向量。

\(G\)組件:\(G\)最簡單的形式是將\(I(x)\)存儲在內存的‘槽’中:

\[ \mathbf{m}_H(x) = I(x) \tag{1} \]

其中\(H(.)\)是槽選擇函數。也就是,\(G\)只更新內存\(\mathbf{m}\)中索引爲\(H(x)\)的部分,而不去觸碰其餘部分。\(G\)的更復雜的變種能夠基於當前輸入\(x\)所獲的的信息來回退並更新早期存儲的內存(或者所有內存)。若是輸入是字符級別或者能夠詞級別,那麼能夠將其進行分組(也就是,將其分塊化)並將每塊存儲到一個內存槽中。

若是須要的內存巨大(好比,對於Freebase或者Wikidata),那麼咱們須要對其進行組織。這能夠經過以前介紹的槽選擇函數來實現:好比,能夠對其設計或者訓練使之能夠按照實體或者主題存儲記憶。所以,爲了提升擴展的效率,\(G\)(以及\(O\))不須要在全部內存上進行操做:能夠只對檢索到的候選子集進行操做(只在相關主題的記憶上進行操做)。咱們將在後續的實驗中介紹一個簡單的變種。

若是內存滿了,\(H\)能夠經過選擇替換哪一個內存來進行「忘記」處理,好比,\(H\)能夠對每一個記憶的價值進行打分,覆蓋掉最沒有價值的部分。咱們還未開展這個實驗。

\(O\)\(R\)組件:組件\(O\)一般負責從內存中讀取並執行推理,好比,計算哪一個是能夠得到優質回覆的相關內存。組件\(R\)對於給定的\(O\)產生最後的回覆。舉個例子,在問答任務上,階段\(O\)找到相關的內存,而後由\(R\)產生實際的回答詞語,好比\(R\)多是個以\(O\)爲輸入的RNN。咱們的假設是,若是沒有這些記憶做爲條件,這樣的RNN沒法很好執行。

3 爲文本實現記憶網絡

有一種特別的記憶網絡,其組件都是神經網絡。咱們稱其爲記憶神經網絡。在本節中,咱們描述具備文本輸入和輸出的記憶神經網絡的一個相對簡單實現。

3.1 基礎模型

在基礎架構中,\(I\)模塊以文本爲輸入。咱們首先假設這是一個句子:也能夠是一個事實的陳述,或者須要系統回答的問題(稍後咱們基於單詞的輸入序列)。這個文本以原始的形式存儲在下一個可用的內存槽中,也就是\(S(x)\)返回下一個空的內存槽\(N\)\(\mathbf{m}_N=x,N=N+1\)\(G\)模塊只用來存儲這個新的記憶,舊的內存不被更新。更加複雜的模型將在後續的章節中敘述。

推理的核心模塊位於\(O\)\(R\)模塊。對於給定\(x\),模塊\(O\)經過查找\(k\)個支持記憶來產生輸出特徵。咱們將\(k\)設爲2,可是這個過程適用於更大的\(k\)。對於\(k=1\),經過以下方式檢索出得分最高的支持記憶:

\[ o_1 = O_1(x,\mathbf{m})=\mathop{\arg\max}_{i=1,\cdots,N}s_O(x,\mathbf{m}_i) \tag{2} \]

其中,\(s_O\)\(x\)\(\mathbf{m}_i\)的匹配程度進行打分的函數。對於\(k=2\),咱們能夠利用迭代的方式發現第二個支持記憶:

\[ o_2 = O_2(x,\mathbf{m})=\mathop{\arg\max}_{i=1,\cdots,N}s_O([x,\mathbf{m}_{o_1}],\mathbf{m}_i) \tag{3} \]

其中候選支持記憶\(\mathbf{m}_i\)如今須要基於初始輸入和第一個支持記憶經過打分,方括號表明列表。最終的輸出\(o\)\([x,\mathbf{m}_{o_1},\mathbf{m}_{o_2}]\),做爲模塊\(R\)的輸入。

最後,\(R\)須要產生一個文本回復\(r\)。最簡單的回覆就是返回\(\mathbf{m}_{o_k}\),也就是輸出剛剛檢索到的句子。爲了進行真實語句的生成,能夠利用RNN來代替。在咱們的實驗中,咱們也考慮使用一種簡單的方式來評估方法,即咱們經過排序的方式將文本回復限定爲一個單詞:

\[ r=\mathrm{argmax}_{w\in W}s_R([x,\mathbf{m}_{o_1},\mathbf{m}_{o_2}],w) \tag{4} \]

其中\(W\)是字典中全部單詞的集合,\(s_R\)是對匹配進行打分的函數。

圖1給出了一個任務的例子。將來回答問題\(x=\)「Where is the milk now?」,模塊\(O\)須要首先對全部內存進行打分,也就是全部以前見過的語句,以\(x\)爲背景進行檢索最相關的事實,在這個例子中\(\mathbf{m}_{o_1}=\)「Joe left the milk」。而後在給定\([x,\mathbf{m}_{o_1}]\)的狀況下,再一次搜索第二個相關事實,也就是\(\mathbf{m}_{o_2}=\)「Joe travelled to the office」(在Joe放下牛奶以前去過的最後一個地方)。最後,模塊\(R\)對給定的\([x,\mathbf{m}_{o_1},\mathbf{m}_{o_2}]\)利用公式(4)對單詞進行打分,輸出\(r=\)「office」。

圖 1:

在咱們的實驗中,打分函數\(s_O\)\(s_R\)具備相同的形式,一個嵌入表示模型:

\[ s(x,y) = \Phi_x(x)^{\top}U^{\top}U\Phi_y(y) \tag{5} \]

其中,\(U\)是一個\(n\times D\)矩陣,\(D\)是特徵的數量以及\(n\)是嵌入表示的維度。\(\Phi_x\)\(\Phi_y\)是用於將原始文本映射到\(D\)維的特徵空間裏。特徵空間最簡單的選擇是詞袋錶示,對於\(s_O\)咱們選擇\(D=3|W|\),也就是詞典中的每一個單詞有三個不一樣的表示:一個用於\(\Phi_y(.)\),另外兩個用於\(\Phi_x(.)\),依賴於輸入的單詞來自於實際輸入\(x\)仍是支持記憶,以使得它們能夠不一樣建模。相似地,對於\(s_R\)也使用\(D=3|W|\)。這兩個打分函數使用不一樣的矩陣\(U_O\)\(U_R\)

訓練 咱們在徹底有監督的設置下訓練,在訓練數據中給定應有的輸入和回答,以及被標記的支持這個回答的句子(但在測試集中只有輸入)。也就是在訓練時咱們知道eq.(2)和eq.(3)的最佳選擇。訓練使用一個邊際排序損失和隨機梯度降低(SGD)來進行。更確切點說,對於給定真實回覆\(r\)的問題\(x\),以及支持的語句\(\mathbf{m}_{o_1},\mathbf{m}_{o_2}\)(當\(k=2\)時),咱們在參數\(U_O\)\(U_R\)之上優化模型:

\[ \sum_{\overline{f}\ne \mathbf{m}_{o_1}}\mathrm{max}(0, \gamma-s_O(x,\mathbf{m}_{o_1})+s_O(x,\overline{f}))+ \tag{6} \]

\[ \sum_{\overline{f'}\ne \mathbf{m}_{o_2}}\mathrm{max}(0, \gamma-s_O([x,\mathbf{m}_{o_1}], \mathbf{m}_{o_2})+s_O([x,\mathbf{m}_{o_1}],\overline{f'}))+ \tag{7} \]

\[ \sum_{\overline{r}\ne r}\mathrm{max}(0, \gamma-s_R([x,\mathbf{m}_{o_1}, \mathbf{m}_{o_2}], r)+s_O([x,\mathbf{m}_{o_1}, \mathbf{m}_{o_2}], \overline{r}))+ \tag{8} \]

其中\(\overline{f},\overline{f'}\)以及\(\overline{r}\)都是非正確的標籤選擇,是\(\gamma\)邊際。在SGD的每一步,咱們採樣選取\(\overline{f},\overline{f'},\overline{r}\)而不是爲每一個訓練樣例計算全部的總和,這和Weston et al.(2011)的作法相同。

當咱們使用RNN來實現記憶神經網絡的\(R\)模塊時(而不是像上面那樣用單詞回覆),咱們將最後一項替換爲語言建模任務中使用的標準對數似然函數,其中RNN的輸入是序列\([x,o_1,o_2,r]\)。在測試的時候,在給定\([x,o_1,o_2]\)的狀況下輸出\(r\)。對比最簡單的模型,即便用\(k=1\)而且輸出\(\mathbf{m}_{o_1}\)的記憶做爲回覆\(r\),將只使用第一項用來訓練。

接下來的部分,咱們將考察一些基於基礎模型的擴展。

3.2 詞序列做爲輸入

若是輸入是詞而非句子級別,即詞以流的形式到達(就像RNN常常處理的那樣)而且陳述和問題都沒有進行詞分割,咱們須要修改下以前描述的方法。因此咱們加入「分割」函數,將會經過學習獲得,輸入單詞的最後沒有分割的序列以尋找分割點。當分割器觸發時(指示當前序列時分割段)咱們將序列寫入內存,而後就能夠像之前同樣處理。這個分割器的建模方式和咱們其餘的模塊相似,以嵌入表示模型的形式:

\[ seg(c) = W^{\top}_{seg}U_S\Phi_{seg}(c) \tag{9} \]

其中\(W_{seg}\)是一個向量(其實是嵌入空間裏的線性分類器的參數),\(c\)是用詞袋錶示的詞序列。若是\(seg(c)>\gamma\),其中\(\gamma\)是邊際,那麼這個序列被視爲一個分割。經過這種方式,咱們的記憶神經網絡在寫操做時擁有一個學習模塊。咱們將這個分割器視爲第一個概念證實:固然,能夠設計得更加複雜。訓練時進一步的細節將在附錄B中展示。

3.3 利用散列表的高效記憶

若是存儲的記憶集合十分龐大,那麼eq.2和eq.3中對全部記憶進行打分的代價將十分巨大。咱們使用散列的技巧來加速查找:將輸入\(I(x)\)散列到一個或多個桶中,而後只對相同桶裏的記憶\(\mathbf{m}_i\)進行打分。咱們考察兩種散列的方式:(i)散列詞語;以及(ii)對詞嵌入表示進行聚類。對於方法(i)咱們構造和詞典中詞語數量相同的桶,而後對於給定的語句咱們將其散列到所包含詞語的對應的桶中。(i)的問題在於記憶\(\mathbf{m}_i\)只有當和\(I(x)\)至少一個相同的詞語時才被考慮。方法(ii)試圖經過聚類解決這個問題。在訓練嵌入式矩陣\(U_O\)以後,咱們使用K-近鄰進行聚類詞向量\((U_O)_i\),因此給出了K個桶。而後咱們將語句散列到全部包含詞語落入的桶中。由於詞向量會和其同義詞相接近從而彼此聚類到一塊兒,因此咱們將會對這些類似的記憶進行打分。輸入和記憶之間匹配的詞語都會按照定義被打分。選擇\(K\)控制速度準確權衡。

3.4 建模寫入時間

咱們能夠將什麼時候一個內存被寫入加入到咱們的模型中。這對於回答固定事實的問題(「What is the capital of France?」)並不重要,但當回答一個如圖1的故事相關的問題時倒是重要的。對於給定的\(\mathbf{m}_j\),實現這個的一種明顯方式就是向表示\(\Phi_x\)\(\Phi_y\)中加入編碼\(j\)的額外特徵,假設\(j\)遵循寫時間(也就是,沒有內存槽被重寫)。然而,須要處理的事絕對時間而非相對時間。咱們對如下過程有着更多的成功經驗:代替打分輸入,候選對利用上述的\(s\)學習一個定義在三元組上的函數\(s_{O_t}(x,y,y')\)

\[ s_{O_t}(x,y,y') = \Phi_x(x)^{\top}U_{O_t}^{\top}U_{O_t}(\Phi_y(y)-\Phi_y(y')+\Phi_t(x,y,y')) \tag{10} \]

\(\Phi_t(x,y,y')\)使用三個新的特徵,取值0或1:是否\(x\)\(y\)更加久,\(x\)\(y‘\)更加久,\(y\)\(y’\)更加久。(也就是,咱們將全部的\(\Phi\)維度擴展3位,若是不適用的時候都設置位0)如今,若是\(\Phi_t(x,y,y')>0\),模型更偏於選擇\(y\),若是\(\Phi_t(x,y,y')<0\),模型更偏於選擇\(y'\)。eq.2和eq.3中的argmax替換爲在\(i=1,\cdots,N\)的循環,在每步中持續贏取內存記憶(\(y\)或者\(y'\)),即老是比較當前贏得的內存和下一個內存\(\mathbf{m}_i\)。若是把時間特徵移走,這個過程等價於以前的argmax。更多的細節將在附錄C中討論。

3.5 建模生詞

即便對於閱讀量很大的人類來講,生詞也是常常遇到。好比指環王中的單詞「Boromir」。一個機器學習模型如何來處理這個問題?一個可能的方式是使用語言模型:經過生詞周圍的詞語,來預測可能的單詞,並假設這個生詞和預測的單詞語義類似。咱們提出的方法正是採用這個想法,可是咱們將其融入到咱們的網絡\(s_O\)\(s_R\)而不是做爲一個單獨的步驟。

具體地,對於咱們看到的單詞,咱們將其周圍詞保存在詞袋中,一個詞袋保存左側的詞語,另外一個保存右側的詞語。任何未知的詞語均可以這樣表示。因此咱們將特徵表示\(D\)\(3|W|\)擴展到\(5|W|\)來對這些上下文進行建模(每一個詞袋有\(|W|\)個特徵)。咱們的模型在訓練階段使用一種「dropout」技術來處理新的單詞:\(d\%\)的時間咱們裝做從未讀取過任何詞語,不使用\(n\)維嵌入表示這個詞語,而是用它的上下文來代替。

3.6 精準匹配和生詞

因爲低維度\(n\)嵌入式模型沒法進行精準的詞彙匹配。一個解決方案是對詞對\(x,y\)進行以下打分來替代以前的:

\[ \Phi_x(x)^{\top}U^{\top}U\Phi_y(y) + \lambda\Phi_x(x)^{\top}\Phi_y(y) \tag{11} \]

也就是,向學習到的嵌入式分數加入「詞袋」的匹配(使用一個混合參數\lambda)。另外一個,相關的方法仍是在這個\(n-\)維的嵌入式空間裏,可是爲特徵表示\(D\)擴展更多的匹配特徵,好比,一個詞彙。一個匹配的特徵意味着這個詞在\(x\)\(y\)中都有出現。也就是,咱們使用\(\Phi_x(x)^{\top}U^{\top}U\Phi_y(y,x)\)進行打分,其中\(\Phi_y\)實際創建在\(x\)基礎上:若是\(y\)中的詞語與\(x\)中的一次匹配,咱們就將這些匹配特徵設置爲1。未登陸詞可使用類似的方法建模,在上下文詞彙中使用匹配特徵。最後,\(D=8|W|\)

相關文章
相關標籤/搜索