QA: Dynamic Memory Networks for Natural Language Processing

摘要

我們提出一種動態內存網絡(DMN)的方式,來解決,輸入多個描述句子和問題來生成答案的這種場景。

簡介

Question answering (QA):根據上下文(文本,圖片等),結合問題(question), 來生成答案
dynamic memory network (DMN):它是一種網絡結構,處理的是(context_input-querstion-answer)這樣的三元組。
inputs: 提前需要記住的上下文輸入
querstion: 問題
answer: 輸出

這裏寫圖片描述

網絡框架

DMN的目標是: 先將輸入的inputs encoding 成一個向量,然後這個向量結合question 來生成answer

各個模塊的介紹:
Input Module

處理的是這個問題的上下文輸入,比如一段話,一個圖片,視頻等。然後將這個原始信息encoding 成一個向量。

Semantic Memory Module

這個模塊存儲的是通用的語義內容,比如知識圖譜,詞向量等

Question Module:

這個模塊將原始的文本問題通過計算後生成向量,然後這些向量觸發episodic memory module開始迭代計算

episodic memory module

DMN的核心,這個模塊根據問題,從輸入模塊中選取相關的信息,然後開始迭代,生成一個表示

Answer Module
將episodic memory module輸出的表示生成答案


這裏寫圖片描述

詳細介紹:

Input Module

後續我們稱每一個輸入的上下文是一個fact,我們的目標是對facts進行encodding 生成一個向量。
我們先不考慮圖片的問題

  • 輸入是一段話:

    TI=(wI1,wI2,,...,wITI) 
    TI 是對fact的詞個數,那我們直接將這個序列輸入一個序列模型,
    比如(LSTM,GRU)等,會得到一個狀態向量ct
    它的shape是:
    [batch_size, sentence_count, word_dim] = [batch大小,詞的個數,詞向量的長度]

    c_t, _ = tf.nn.dynamic_rnn(gru_cell, input, T_I, dtype=tf.float32)
  • 輸入的是n句話:

    facts=(fact1,fact2,...,factF)
    facti=(wi1,wi2,...,wiL)

    其中F是input的輸入句子數量,L是每個句子最長的值,我們將facts寫成矩陣的形式
    他的shape是:
    [batch_size, fact_count, sentence_count, word_dim] = [batch大小,fact個數,詞的個數,詞向量的長度]

    這裏有兩種處理方式:

    • 直接將facts 變成一段話,得到 F*L 個序列 將這L個序列進入序列模型

      facts = tf.reshape(facts, [batch_size, F * L, word_dim])
      c_t, _ = tf.nn.dynamic_rnn(gru_cell, facts, F * L, dtype=tf.float32)
    • 將每個fact的向量直接相加,然後得到L個序列

      facts = tf.reduce_sum(facts, 2)
      c_t, _ = tf.nn.dynamic_rnn(gru_cell, facts, L, dtype=tf.float32)

    ct 這個向量就是我們需要輸入內存的向量

Semantic Memory Module

  1. 保存基本概念,比如知識圖譜
  2. 基礎的詞向量等

Question Module

question mudule很簡單,question的輸入是一個問題TQ=(wQ1,wQ2,...,wQt)
將這個序列通過seq model後得到的state即可:

ques_embed = tf.nn.embedding_lookup(embedding, question)  # [N, Q, V]
ques_embed = tf.unstack(ques_embed, axis=1)  # Q X [N, V]
_, question_vec = tf.nn.static_rnn(gru, ques_embed, dtype=tf.float32)  # [N, d]

Episodic Memory Module

它的作用是根據問題從輸入的上下文中選出相關的facts,然後根據這些facts生成一個合理的表示memory,這個表示輸出到answer module。

然後這個模塊可以多次處理這些facts,每次處理這些facts可以聚焦不同的點。每次通過後就生成一個 episodic, 然後所有的episodic都被歸結成一個memory。

所以episodic memory module 是一種attention 機制,這個機制簡單描述是:

  1. 將所有的facts通過attention機制聚焦,生成episodic
  2. 將所有的episodic歸納成memory

我們從後開始介紹:
memory是經過多次迭代得到的,
我們令這個內存memory序列爲:m1,m2,...,mTp
episodic序列爲:e1,e2,...,et
那麼meory的迭代如下:
mi=GRU(ei,mi1) m0=q

memory = question_vec
memory, _ = gru(e_i, memory)

最終輸出的memory m=mTp

下面我們給出ei 的計算邏輯,上面介紹了,ei 就是第i次通過迭代facts時得到的episodic,
那它的計算和facts有關,上面在Input module我們介紹過,facts encoding出來的結果是ct
我們令 t 的最大長度爲 TC
所以 episodic 是ct 經過TC 長度的seq model的結果,但是簡單的GRU,還加了gate權重

hit=EP(ct,hit1)
ei=hiTC

這裏 EP 是呆權重因子的序列模型,我們令第i次迭代的attention機制通過gate weight 方式實現

EP(ct,hit1)=gitGRU(ct,hit1)+(1git)hit1

現在我們開始計算gate 權重,它是一個sigmoid函數:
git=G(ct,mi1,q)
G(c,m,q)=σ(W2tanh(W1z(c,m,q)+b1)+b2)
z(c,m,q)=[c,m,q,cq,cm,|cq|,|cm|,cTWbq,cTWbm]

到此我們就完成了
input facts => episodic => memory 的計算

Answer Sequence

上面的模塊最終生成了memory m,這個模塊就是根據m生成答案

這裏還是一個序列模型,比如GRU,它的初始狀態 a0=m
然後生成答案(seq2seq裏面的decode步驟)
at=GRU([yt1,q],at1)
yt=softmax(Waat)

訓練數據

face book 發佈的 bAbI

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章