RNN解決長期依賴的能力隨着文本長度的增加越來越差,attention機制是解決這種問題的一種思路,今天我們再來看另外一種思路,深度記憶網絡。Deep Memory Network在QA和Aspect based Sentiment等NLP領域都有過成功的實踐,但其提出者本身是以通用模型的形式提出的。
Introduce of Memory Network
Memory Network是一種新的可學習模型,它使用一個整合了長期記憶的一個組件(稱爲Memory)作爲推斷組件(inference components)來進行推理。長期記憶Memory可以被讀和寫,以實現預測的最終目的。原論文作者認爲RNN的記憶問題(無法完成簡單的複製任務,即將輸入原樣輸出)也可以被Memory Network解決。它核心思想來自機器學習文獻中成功應用的使用外置的可讀寫的記憶模塊來進行推斷。
Memory Networks
一個記憶網絡是由一個記憶(一個以作爲索引的數組對象)和4個組件組成。其中:
- I:(input feature map) - 將輸入轉化爲中間特徵表示。
- G:(Generalization) - 給定新輸入的條件下更新舊記憶。原作者稱之爲泛化,因爲網絡在該階段有機會將記憶壓縮和泛化以供後面使用。
- O:(Output feature map) - 給定新輸入和當前記憶狀態,產生一個新的輸出(在特徵表示空間上)。
- R:(Response) - 將output(即O)轉化到目標形式(例:一個文本的回覆或者一個動作)
Memory Networks的處理過程
給定一個輸入x(例:字符、詞或者句子(視處理力度而定),圖像或者聲音信號),模型處理過程如下:
- 將x轉化爲中間特徵表示。
- 使用新輸入更新記憶:
- 使用新輸入的中間特徵表示和記憶計算輸出特徵:
- 最後,解碼輸出特徵到最終回覆:
這個過程在訓練和測試時都適用,兩者之間的區別在於:測試時記憶也會被存儲,但模型參數將不會再更新。可以使用現有任何機器學習的方法來實現(SVM, 決策樹)。
組件: 可以使用標準的預處理步驟來實現,比如輸入文本的語法分析、指代消解、實體識別等。它同樣也可以將輸入編碼到一箇中間的特徵表示(將文本轉化爲稀疏或者稠密的特徵向量)。
組件: 最簡單的G的形式可以是將儲存起來的槽位(slot):
其中是選擇槽位的一個函數。即,只更新m的索引,其他索引下的記憶部分將保持不變。更復雜的的實現還可以允許去根據當前輸入x得到的新證據去更新先前存儲的記憶。如果輸入是字符級別或者詞級別的你也可以將其進行分組。
如果記憶非常龐大(假設要記憶整個Freebase或者Wikipedia),你可能不得不把記憶使用來組織起來。
如果記憶已經被填滿。你也可以使用來實現一種遺忘機制。
和組件:組件被特別應用於讀取記憶和執行推斷,組件則根據的輸出產生最終回覆。例:在QA中,使用查找相關的記憶,然後生成文字來組成答案。可以是RNN,視的輸出而定。這種設計基於的假設是,如果沒有限定在這種記憶上,RNN會表現得相當差(事實上很多場景下確實如此)。
原論文給了一個QA的例子,但由於這個模型並沒有廣泛使用這裏就不介紹了。我們轉而介紹一種常用的端到端的記憶網絡實現。
End-To-End Memory Network
端到端的記憶網絡本質上也是一種RNN架構,但與RNN不同之處在於,在遞歸過程中會多次讀取大型外部存儲的記憶來輸出一個符號。下面介紹的Memory Network可以有很多層,也易於反向傳播,需要對網絡的每一層進行監督訓練。它以端到端的形式被應用於QA和Aspect Based Sentiment。
模型將一系列離散的輸入存儲在記憶中,並接受一個查詢,輸出回答。模型會將所有的寫爲記憶存儲在一個固定大小的緩存中,然後尋求一個和的連續表示。該連續表示會被多跳處理以輸出a。這使得錯誤信號能夠在多級記憶中反向傳播到輸入。
Single Layer
整個模型是很多層堆起來的,我們先介紹單個層。
輸入記憶表示(Input memory representation):假定我們被給定輸入集存儲在記憶中。整個輸入集都會經由每個所處的連續空間的嵌入(embedding)被轉化爲維度爲的記憶向量,最簡單的實現方法可以使用一個嵌入矩陣,查詢也會被嵌入,可以用維度與相同的嵌入矩陣來得到一箇中間狀態,在嵌入空間上,我們使用內積計算和記憶的匹配程度,然後再softmax:
輸出記憶表示(Output memory representation):每一個都有一個相關的輸出向量(最簡單的情況下使用另外的嵌入矩陣)。自記憶產生的回覆向量通過使用自輸入產生的概率向量與轉化後的加權求和得到:
產生最終預測:在單層的情況下,輸出向量的和輸入嵌入求和再乘上一個最終的權重矩陣,然後經過softmax產生預測標籤:
Multi Layers
模型可以擴展到處理K跳操作。記憶層是以如下方式進行堆積的:
- 下一層的input由上一層的輸出和輸入求和得來:
- 每一層都有自己的嵌入矩陣,本用於對輸入進行嵌入。但是,這些矩陣被限制在易於訓練並且能減少參數的數量的程度。
- 在網絡頂層,對應的輸入同樣組合了輸入和記憶層頂層的輸出:
原論文探索了兩種類型的權重捆綁:
- 鄰接(Adjacent):一個層輸出的嵌入是下一層的輸入,即:,作者同樣也限制: (a)回答預測矩陣要和最終的輸出嵌入相同,即:。(b)問題嵌入和第一層的輸入嵌入相同,即
- 層級別(Layer-wise,類RNN):層與層之間共享輸入個輸出嵌入,即:
且。作者發現在層間加上一個線性的映射函數非常有用,即。H同樣也是被學習的參數和其他參數一起更新。
在使用層級別權重捆綁的情況下,Deep Memory Network某種程度上退化到了RNN,這一點讀者可以仔細體會一下。
參考文獻
- MEMORY NETWORKS (ICLR 2015)
- End-To-End Memory Networks (NIPS 2015)