arxiv
Facebook AI
2014.10
现有 RNN 在需要大量长期记忆(long-term memory)的任务中表现的并不好,而 KBQA 这类任务需要依赖这种大量的长期记忆来保存 KB,因此本文提出了 memory networks(MemNNs)来解决这个问题。这篇就是 MemNNs 的来源。
2014.10 Google DeepMind 有一篇 《Neural Turing Machines》也是用于解决 long-term memory 问题的,算和 MemNNs 是竞争关系吧。
主要工作
- 提出用于解决 long-term memory 问题的 memory networks 架构
基本模型
包括 1 个 memory m 和 4 个组件
4个组件
I(input feature map)
把输入映射为内部特征向量
converts the incoming input to the internal feature representationG(generalization)
使用新的输入更新旧的 memories
updates old memories given the new inputO(output feature map)
通过新的输入和当前 memory 状态,在特征空间里产生新的输出
produces a new output (in the feature representation space), given the new input and the current memory stateR(response)
将输出转化为任务要求格式,比如自然语言回答或者一个响应
converts the output into the response format desired. For example, a textual response or an action
工作流程
给定输入 \(x\):
- 通过 \(I(x)\) 将 \(x\) 转换为内部特征向量
- 使用 \(m_i\) 更新 memories:\(m_i=G(m_i,I(x),m),\forall i\)
- 使用输入和 memory 计算输出特征:\(o=O(I(x),m)\)
- 解码 \(o\) 获得最终响应:\(r=R(o)\)
训练和测试的时候都会进行如上工作流程,输入都会被存进 memory 里,只是在训练时会更新 4 个组件的参数,而测试的时候不会。
针对文本的 MemNN 实现
基本模型
基本模型里,向 I 模块输入句子,获得词嵌入向量。再用 G 模块把词嵌入向量存入 memory 的下一个为空 slot 中。这样做的缺点是训练过程中 embedding 参数在改变,所以 memory 里的词嵌入向量会过期,但是在测试过程中直接储存词嵌入向量就比每次输入原始文字然后再对它们重复进行 embedding 操作更有效率。
模型的核心在 O 模块和 R 模块。
O 模块需要找出 k 个针对输入 x 的 supporting memories。当 \(k = 2\) 时:
- \(k=1\),先选出得分最高的 supporting memory(最相关):\(o_1=O_1(x, m) = \mathop{\arg\max}\limits_{i=1,...,N}s_O(x,m_i)\)
- \(k=2\),根据 \(o_1\) 选出排第二的 supporting memory:\(o_2=O_2(x,m)=\mathop{\arg\max}\limits_{i=1,...,N}s_O([x,m_{o_1}],m_i)\)
- 最终输出:\(o=[x, m_{o_1},m_{o_2}]\)
R 模块输出文本响应:\(r=\arg\max_{w\in W}s_R([x,m_{o_1}m_{o_2}],w)\)
score 函数:\(s(x,y)=\Phi_x(x)U^\top U^\top \Phi_y(y)\)
训练使用 margin ranking loss ,即要求正确答案的得分比错误答案的得分高至少一个margin \(\gamma\)(这公式后两行的方括号什么情况…
)\[
\sum_{\bar f \not=m_{o_2}}\max(0,\gamma-s_O(x,m_{o_1})+s_O(x,\bar f))+\\
\sum_{\bar {f'}\not=m_{o_2}}\max(0,\gamma-s_O([x,m_{o_1}],m_{o_2}])+s_O([x,m_{o_1}],\bar{f'}]))+\\
\sum_{\bar r\not=r}\max(0,\gamma-s_R([x,m_{o_1},m_{o_2}],r)+s_R([x,m_{o_1},m_{o_2}],\bar r]))
\] 其中,\(r\) 是正确答案, \(\bar f\),\(\bar{f'}\) 和 \(\bar r\) 都是错误标签(随机从样本中采样出来的)。
- 第一行代表有没有正确挑选出得分最高的 supporting memory \(m_{o_1}\)
- 第二行代表正确挑选出了 \(m_{o_1}\) 后能不能正确找出 \(m_{o_2}\)
- 第三行代表把正确的 supporting fact 作为输入,能不能挑选出正确的答案输入 R
一些扩展
- 使用词序列作为输入
添加 embedding 模型 segmenter:\(seg(c) = W_{seg}^\top U_S\Phi_{seg}(c)\) - 使用哈希的高效 memory
- Extend model to take into account when a memory slot was written to(没太看懂)
- 用语言模型处理未知词
- add the “bag of words” matching score to the learned embedding score(没太看懂)
读后感
MemNNs 本身只是一个架构,重点在于 I、G、O、R 模块的思想。
这篇论文的具体实现参考价值不高,MemNNs 本来也是根据后面的一系列研究才具有应用价值的。