《Ask Me Anything: Dynamic Memory Networks for Natural Language Processing》

arxiv
MetaMind
2015.06

主要工作

  • 提出 dynamic memory network(DMN),DMN 能进行端到端训练,并且在 bAbI、Stanford Sentiment Treebank、WSJ-PTB 上获得了 state-of-the-art 的结果

模型

input-question-answer
几乎所有的自然语言问题都可以转换为 QA 任务,DMN 针对解决 QA 任务设计,因此可以用于几乎所有自然语言任务。

DMN 架构图 Alt text

  • Input Module:编码原始文本数据 input,将其转换成向量表示
  • Question Module:编码原始文本数据 question,将其转换成向量表示
  • Episodic Memory Module:事件记忆模块,通过 attention 机制选择需要注意的 input 并根据 question 给出 memory 向量。这个模块有 retrieve 新信息的能力
  • Answer Module:根据最终的 memory 向量生成答案

架构示例 Alt text

Input module

使用 RNN 对 input 序列进行编码。本文里使用的 GRU

  • 模块输入是具有 \(T_I\) 个词 \(w_1,...,w_{T_I}\) 的序列
  • 每个 step \(t\) 里,网络更新隐藏状态 \(h_t=RNN(L[w_t],h_{t-1})\)\(L\) 是 embedding 矩阵。
  • 模块的输出是 RNN 的隐藏状态。当输入是句子列表的时候,把数据连接成一个单词的长列表,每个句子结尾加一个 end-of-sentence token。每个 end-of-sentence token 处的隐藏状态就是模块的最终表征。(具体架构示例图)

Question Module

使用 RNN 对 question 进行编码。

  • 模块输入是具有 \(T_Q\) 个词的 question
  • 隐藏状态 \(q_t=GRU(L[w_t^Q],q_{t-1})\),Input module 和 question module 共享同一个 embedding 矩阵 \(L\)
  • 输出是最终的隐藏状态 \(q=q_{T_Q}\)

Episodic Memory Module

  • 事件记忆模块根据 input module 的输出进行迭代,更新模块内部的事件记忆
  • 每次迭代中,attention 机制根据 fact 表征 \(c\),question 表征 \(q\) 和前一个 memory \(m^{i-1}\) 来生成事件 \(e^i\)
  • 然后事件和前一个 memory 都用来更新当前 memory:\(m^i=GRU(e^i,m^{i-1})\),GRU 初始化 \(m^0=q\)
  • \(T_M\) 之后,模块最终输出 \(m^{T_M}\) 到 answer module

  • Need for Multiple Episodes
    • 每次迭代关注不同的输入
    • 例如架构示例里第一次关注 football,第二次关注 John
  • Attention Mechanism
    • gating function:\(g_t^i=G(c_t,m^{i-1},q)\)\(c_t\) 为候选 fact,\(G\) 是 scoring function
    • 特征向量 \(z(c,m,q)=[c,m,q,c\cdot q,c\cdot m,|c-q|,|c-m|,c^TW^{(b)}q,c^TW^{(b)}m]\)
    • scoring function \(G(c,m,q)=\sigma(W^{(2)}\tanh(W^{(1)}z(c,m,q)+b^{(1)})+b^{(2)})\)
  • Memory Update
    • 隐藏状态 \(h_t^i=g_t^iGRU(c_t,h_{t-1}^i)+(1-g_t^i)h_{t-1}^i\)
    • 事件 \(e^i=h_{T_C}^i\)
  • Criteria for Stopping
    • 如果 gate function 选择到输入中一个特殊的 end-of-passes 表征,则停止迭代

Answer Module

根据任务类型不同,模块可能是最后输出一个 answer,也可能每个 time step 都输出

  • 初始化 last memory \(a_0=m^{T_M}\),每个 time step,输入 question \(q\),最后一个隐藏状态 \(a_{t-1}\)
  • \(a_t=GRU([y_{t-1},q],a_{t-1})\)
  • 模块输出 \(y_t=softmax(W^{(a)}a_t)\)

读后感

DMN 的开端,之后还有 DMN+
不是 facebook 做的 memory network,架构感觉区别还挺大的
感觉实用价值挺高的,只要能构造出 QA 问题就能用,很有意思