轉自:https://www.jianshu.com/p/e5f2b20d95ff,感謝分享!網絡
傳統的RNN/LSTM等模型的隱藏狀態或者Attention機制的記憶存儲能力太弱,沒法存儲太多的信息,很容易丟失一部分語義信息,因此記憶網絡經過引入外部存儲來記憶信息.記憶網絡的通常框架以下圖所示:架構
它包括四個模塊:I(Input),G(Generalization),O(Output),R(Response),另外還包括一些記憶單元用於存儲記憶.
Input:輸入模塊,用於將文本資源(文檔或這KB)和問題(question)等文本內容編碼成向量.而後文本資源向量會做爲Generalization模塊的輸入寫入記憶單元中,而問題向量會做爲Output模塊的輸入.
Generalization:泛化模塊,用於對記憶單元的讀寫,也就是更新記憶的做用.
Output:輸出模塊,Output模塊會根據Question(也會進過Input模塊進行編碼)對memory的內容進行權重處理,將記憶按照與Question的相關程度進行組合獲得輸出向量.
Response:響應模塊,將Output輸出的向量轉爲用於回覆的天然語言答案.框架
因爲Memory-network的自身缺陷,不太容易使用反向傳播進行訓練,沒法進行end-to-end的訓練,因此在基礎的模型之上進行了擴展,造成了能夠end-to-end的模型.論文中提出了單層和多層兩種架構,多層其實就是將單層網絡進行stack。咱們先來看一下單層模型的架構函數
輸入模塊:將文本資源sentence進行embedding獲得文本向量保存到Output和Input兩個記憶單元中,論文裏介紹了兩種方法BoW和位置編.BOW就是直接將一個句子中全部單詞的詞向量求和表示成一個向量的形式,這種方法的缺點就是將丟失一句話中的詞序關係,進而丟失語義信息;而位置編碼的方法,不一樣位置的單詞的權重是不同的,而後對各個單詞的詞向量按照不一樣位置權重進行加權求和獲得句子表示。位置編碼公式以下:lj就是位置信息向量學習
此外,爲了編碼時序信息,好比Sam is in the bedroom after he is in the kitchen。咱們須要在上面獲得mi的基礎上再加上個矩陣對應每句話出現的順序,不過這裏是按反序進行索引,因此最終每句話對應的記憶mi的表達式以下所示:編碼
這裏給的符號A是Input中的A矩陣,同理,Output中的記憶向量也是這種方法求得,只不過矩陣符號換成B,結果不是mi是ci.注這裏參數矩陣A和B不是共享的,都須要參與訓練.3d
思考:是否可使用RNN/CNN對文本表示進行建模呢?orm
輸出模塊:上面的輸入模塊產生的兩個記憶模塊Output和Input.一個(Input)用於與問題計算,得出問題與各個memory slot的相關度,另外一個(Output)用於與Input產生的相關度計算,得出答案輸出.
首先看第一部分,將Question通過輸入模塊編碼成一個向量u,與mi維度相同,而後將其與每一個mi點積獲得兩個向量的類似度(也能夠用其餘方法計算類似度),在經過一個softmax函數進行歸一化(獲得Question與各個memory slot的相關度評分或者說權重):索引
pi就是q與mi的相關性指標。而後對Output中各個記憶ci按照pi進行加權求和便可獲得模型的輸出向量o,也能夠理解爲是memory中跟question相關信息的彙總.ci
Response模塊:輸出模塊根據Question產生了各個memory slot的加權求和,也就是記憶中有關Question的相關知識,Response模塊主要是根據這些信息產生最終的答案。其結合o和q兩個向量的和與W相乘在通過一個softmax函數產生各個單詞是答案的機率,值最高的單詞就是答案。而且使用交叉熵損失函數最爲目標函數進行訓練。
首先來說,上面幾層的輸入就是下層o和u的和。至於各層的參數選擇,論文中提出了兩種方法(主要是爲了減小參數量,若是每層參數都不一樣的話會致使參數不少難以訓練)。
1. Adjacent:這種方法讓相鄰層之間的A=C。也就是說Ak+1=Ck,此外W等於頂層的C,B等於底層的A,這樣就減小了一半的參數量。
2. Layer-wise(RNN-like):與RNN類似,採用徹底共享參數的方法,即各層之間參數均相等。Ak=...=A2=A1,Ck=...=C2=C1。因爲這樣會大大的減小參數量致使模型效果變差,因此提出一種改進方法,即令uk+1=Huk+ok,也就是在每一層之間加一個線性映射矩陣H。
Memory-Network能夠用於MRC,KB-QA,多輪對話系統和語言模型建模.根據本人的理解,就是用於處理有歷史信息(閱讀理解中的文檔,多輪對話的歷史對話,以及語言建模中的前面的單詞或字)的問題.本篇文章算是本人在學習memory-network時的筆記,因此有些地方寫的不明白的能夠參考大佬文章
知乎:嗚嗚哈 https://zhuanlan.zhihu.com/p/29679742.