2015 End-To-End Memory Networks

2015 End-To-End Memory Networks

摘要:

作者介紹了一種在大型外部記憶 (a possibly large external memory) 上使用循環注意力模型的神經網絡。這個結構是記憶網絡 (Memory Network) ,但卻不像記憶網絡那樣工作,它通過端對端進行訓練,因此訓練時只需要明顯較少的監督,使得它更適合應用于真實場景。它可以看做是在 需要每個輸出符號 (per output symbol) 表現出多個計算步/跳 (multiple computational steps(hops)) 的情況下 對 RNN 研究的一個擴展。 該模型的適應性使其可以應用很多任務,例如(綜合型的)問答和語言模型建模。之前,作者將他們的方法與記憶網絡進行比較,使用更少的監督信息。之后,在 the Penn TreeBank 和 Text8 數據集上,使用他們的方法與 RNNs 和 LSTMs 進行對比。從實驗結果看,多重計算跳 (multiple computational hops) 這個關鍵的概念提高了測試結果。

數據集:

  • bAbI:測試模型在問答系統上的性能
  • the Penn TreeBank 和 Text8:測試模型在語言建模上的能力

模型的創新點:

  1. 解決當時人工智能領域的兩大挑戰:
    • 建立一個在回答問題或者完成一個任務時可以進行多重計算步( multiple computational steps)的模型。
    • 作者所提出的模型是對記憶網絡( Memory Network)的一個改進,解決記憶網絡難以通過使用BP算法進行訓練,需要對網絡中的每一層進行監督的問題。它從輸入-輸出對(input-output pairs)中使用端對端(end-to-end)進行訓練, 因此可以應用于大多數任務中。
  2. 作者所提出的模型是對記憶網絡 (Memory Network) 的一個改進,解決記憶網絡難以通過使用 BP 算法進行訓練,需要對網絡中的每一層進行監督的問題。它從輸入-輸出對 (input-output pairs) 中使用端對端 (end-to-end) 進行訓練, 因此可以應用于大多數任務中。
  3. 作者提出的模型,雖然結構與 RNN 類似,但不像傳統的 RNN 網絡,它顯式地將存儲在記憶中的輸出在 K 跳中進行調整 (explicitly condition on the outputs stored in memory during the K hops) ,同時保持輸出 soft (keep these output soft) ,而不是對輸出進行采樣。因此他們的模型在產生一個輸出之前會經過幾個計算步 (several computational steps) 。
  4. 與基于RNNs或LSTM模型去捕捉序列數據中長期結構 (long-term structure) 的各種方法不同,作者提出的模型使用的是一個全局記憶,并共享讀取和寫入函數。

模型結構:

  1. Single Layer
    作者首先介紹了模型在 Single Layer 下對單個記憶跳 (a single memory hop) 操作的實現。

    • 輸入記憶表示( Input memory representation):
      將輸入集 (input set) x_1,...,x_i 存儲在記憶中。再將 {x_i} 轉換為記憶向量 {m_i} ,該記憶向量是通過計算每個 x_i 在連續空間( continuous space)的 d 維嵌入,例如使用一個簡單的嵌入矩陣 A (維度大小為 d \times V) 。問題 q 也可以轉化為嵌入向量 u (但使用的是另一個嵌入矩陣 B ) 。 在嵌入空間中,他們通過內部乘積和 softmax 計算 u 和 每個記憶 m_i 的匹配分數 (compute the match)。 p 是一個基于輸入的概率向量( a probability vector over the inputs)。
      【這里的 x_iq 都是一維的句子向量,而不是由詞向量組成的二維矩陣。后面會解釋作者怎么產生句子向量】
      p_i = Softmax(u^Tm_i)
    • 輸出記憶表示( Output memory representation):
      每個 x_i 有一個對應的輸出向量 c_i (例如通過另一個簡單的嵌入矩陣 C)。 記憶 o 產生的響應向量( response vector ) 是對輸入轉化后的向量 c_i 進行加權求和, 權重是從輸入得到的概率向量。
      o = \sum_i p_i c_i
      因為從輸入到輸出的函數是平滑的,可以容易計算它的梯度和反向傳播。最近提出的其他記憶形式( forms of memory )或者注意力( attention )可以使用作者這種方式,例如[4],[5],[6]
    • 生成最終預測( generating the final prediction):
      在單層的情況下,先對輸出向量 o 和 輸入嵌入向量 u 進行求和,再通過一個最終權重矩陣 W (維度為 V \times d) 和 一個softmax 產生預測標簽。
      \hat{a} = Softmax(W(o+u))
  2. Multiple Layers
    這里,作者將它們的模型擴展到K跳操作 (K hop operations) 。記憶層 (the memory layers) 通過下面的方法進行堆疊 :

    • 第一層以上的輸入是來自層 k 的輸出 o^k 和輸入 u^k 之和。
      u^{k+1} = u^k + o^k
    • 每一層都有它自己的嵌入矩陣 (A^k , C^k),用來對輸入 {x_i} 進行嵌入。
    • 在網絡的最頂層, W的輸入也是通過結合最頂層的記憶層 (the top memory layer) 的輸入和輸出。
      \begin{split} \hat{a} &= Softmax(Wu^{K+1})\\ &= Softmax(W(o^K+u^K)) \end{split}
      為了減輕模型訓練 (ease training) 的計算復雜度和減小參數數量,作者對每一層的嵌入矩陣 (A^i , C^i) 分別采用了兩種權重綁定 (weight tying) 方法進行約束:
    • 鄰近 (Adjacent):
      某一層的輸出記憶的嵌入矩陣( C^k )是下一層的輸入記憶的嵌入矩陣( A^{k+1} )。 作者還約束了:
      • 答案預測矩陣 (W^T) 的 shape 與最后的輸出記憶的嵌入矩陣 (C^K) 一致。
      • 問題嵌入矩陣 (B) 為第一層的輸入記憶的嵌入矩陣 (A^1)
    • 分層(Layer-wise, RNN-like):
      輸入和輸出嵌入矩陣在不同層中都是相同。例如:A^1 = A^2 = ... = A^KC^1 = C^2 = ... = C^K 。 作者還發現在更新 u^{k+1} 時,增加一個線性映射層 H ,使 u^k 通過 H 進行線性映射。這個映射可以和其他參數一起學習,因此作者使用 layer-wise 權重綁定 (weight tying) 進行實驗時,都會使用這種線性映射。
      u^{k+1} = Hu^k + o^k
      當使用 layer-wise 權重綁定方法時,作者的模型結構會轉變成傳統的RNN模型,只是把RNN的輸出分為內部輸出和外部輸出( internal 和 external outputs)。 內部輸出( o^k )可以認為是記憶,外部輸出( u^k )可以認為是用于標簽預測。
      從 RNN 的角度上看, u 是一個隱藏狀態,模型產生一個內部輸出 p ( 可以說是圖1(a)中的注意力權重 (attention weights)),然后模型通過 pC 來更新隱藏狀態 u
  3. 模型結構圖:

    圖1

  4. 其他細節和技巧:

    • 句子表示 (Sentence Representation:
      在作者的實驗中,他們探討了兩種不同的句子表示:
      • 詞袋表示:
        先得到句子中每個詞的詞嵌入,然后進行求和得到句子表示。這種表示有一個缺點就是無法捕捉句子中詞語的順序,而詞序 (the order of the words) 對于某些任務來說是很重要的。
        m_i = \sum_jAx_{ij}
      • 結合單詞在句子中的位置進行編碼:
        對于這種句子表示,作者稱之為位置編碼 (position encoding (PE)) ,這意味著詞的順序會影響這種句子表示。
        m_i = \sum_jl_j \cdot{} A x_{ij}
        l_{kj} = (1 - j/J) - (k/d)(1 - 2j/J)
        從1開始索引。 J是句子中單詞的個數, d是嵌入的維度。
    • 臨時編碼 (Temporal Encoding):
      許多的QA任務需要臨時上下文 (temporal context) 的概念。例如在圖2中模型需要理解 Sam 在 kitchen 之后再到 bedroom 。為了使模型能夠處理這些,對記憶向量 (m_i) 和輸出向量 (c_i) 進行修改。 T_A(i) 是由臨時信息編碼得到的特殊矩陣 T_A 的第 i 行。注意:作者在論文中對句子的索引是反序的,即 x_1 是故事的最后一句話。
      m_i = \sum_jA x_{ij} + T_A(i)
      c_i = \sum_jC x_{ij} + T_C(i)
      圖2
    • 通過注入隨機噪聲來學習時間不變性( Learning time invariance by injecting random noise):
      作者發現通過加入假的記憶來正則化 T_A 對模型的訓練具有一定的幫助作用。 在訓練時,作者在故事中隨機加入10%的空記憶。他們將這個方法稱為隨機噪聲 (random noise RN)。
    • linear start training:
      一開始訓練的時候,先去除記憶層的 softmax 函數進行訓練,使得模型除了最后的答案預測有 softmax ,其他全部只有線性映射。當驗證集的 Loss 停止下降時,再將 softmax 重新插入,并繼續訓練。作者把這種方法叫做線性訓練啟動 (linear start training (LS))。

參考文獻:

  1. http://papers.nips.cc/paper/5846-end-to-end-memory-networks.pdf "End-To-End Memory Networks"
  2. https://arxiv.org/pdf/1410.3916.pdf "Memory networks"
  3. https://arxiv.org/pdf/1506.07285.pdf "Ask me anything: Dynamic memory networks for natural language processing"
  4. https://arxiv.org/pdf/1409.0473.pdf "Neural machine translation by jointly learning to align and translate"
  5. https://arxiv.org/pdf/1410.5401.pdf "Neural turing machines"
  6. https://arxiv.org/pdf/1502.04623.pdf "DRAW: A recurrent neural network for image generation"
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容