摘要
我們提出一種動態內存網絡(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
- 保存基本概念,比如知識圖譜
- 基礎的詞向量等
Question Module
question mudule很簡單,question的輸入是一個問題
將這個序列通過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 機制,這個機制簡單描述是:
- 將所有的facts通過attention機制聚焦,生成episodic
- 將所有的episodic歸納成memory
我們從後開始介紹:
memory是經過多次迭代得到的,
我們令這個內存memory序列爲:
episodic序列爲:
那麼meory的迭代如下:
memory = question_vec
memory, _ = gru(e_i, memory)
最終輸出的memory
下面我們給出
那它的計算和facts有關,上面在Input module我們介紹過,facts encoding出來的結果是
我們令 t 的最大長度爲
所以 episodic 是
這裏 EP 是呆權重因子的序列模型,我們令第i次迭代的attention機制通過gate weight 方式實現
現在我們開始計算gate 權重,它是一個sigmoid函數:
到此我們就完成了
input facts => episodic => memory 的計算
Answer Sequence
上面的模塊最終生成了memory m,這個模塊就是根據m生成答案
這裏還是一個序列模型,比如GRU,它的初始狀態
然後生成答案(seq2seq裏面的decode步驟)
訓練數據
face book 發佈的 bAbI