本文是南洋理工大学2021年5月份的对话系统综述文章 Recent Advances in Deep Learning Based Dialogue Systems: A Systematic Survey 2.4 节 Memory Network 的理解和展开.

Memory Network 概述

Memory Network 是 FAIR 的 Jason Weston 等人于 2014 年在论文 Memory Networks 提出的一种神经网络框架, 它在通用的神经网络模型中增加了一个 Memory 模块, 用来记忆神经网络中需要经常使用(但又经常被遗忘)的信息. 对照起来看, Memory 之于神经网络, 类似于 海马体(hippocampus) 之于 大脑, 内存和硬盘 之于 计算机.

在此之前的神经网络中, 不管是 MLP, 还是 CNN 和 RNN, 都没有显式的定义记忆体. 尽管模型的隐层参数(如 RNN 的 hidden state, CNN 的卷积核) 能够记忆一些长期记忆, 但通常来说其记忆能力有限.

Memory Network 通过显式引入大小不限(当然受限于硬件环境)的记忆体, 显式定义记忆体中存储的内容, 并在模型训练和预测过程中(选择性)动态更新记忆, 增强了模型对重要信息的记忆和利用能力. 从作者在 QA (Question Answer) 任务上的实验结果来看, 记忆体可以较大地提升模型效果.

MemNN

正式地, Memory Network 包括如下五个部分:

  • Memory MM: 记忆体. 可以认为是一个包含多个记忆单元的数组, 记忆单元的具体内容和形式, 则取决于具体的任务和设计. 为了行文方便, 下文中记忆体用符号 MM 表示, 其记忆单元用符号 mim_{i} 表示, 即 M=[m0,m1,,mi,,mN1]M = [m_0, m_1, \cdots, m_i, \cdots, m_{N-1}].
  • Input Map II: 输入特征提取器. 设原始输入为 xx, 则输入 f=I(x)f = I(x) 可以提取对应的输入数据特征 ff
  • Generalization GG: 记忆生成器. 基于新的输入特征, 获取新的记忆表示, 插入记忆体或更新相关的记忆单元. 数学表示为 M=G(f,M)M = G(f, M), 或

mi=G(mi,f,M),i{0,1,}m_i = G(m_i, f, M), \forall i \in \{0, 1, \cdots\}

  • Output Map OO: 输出特征提取器. 数学表示为 o=O(f,M)o = O(f, M). 注意, 这里的记忆体 M 已经被更新过.
  • Response RR: 响应器. 数学表示为 r=R(o)r = R(o). 这个与具体的任务有关.

Memory Network 是一种模型框架, 其各个部分均可以自由设计. 在 Jason Weston 2014 年的原始论文中, 作者设计了一个 MemNN 模型, 用来解决 QA 问题.

  • MemNN 的使用了只插入不更新的记忆体, 记忆单元保存原始输入 xx, 可以是一个描述事实的句子 (如 “Joe travelled to the office.”), 也可以是对应的问题 (如 “Where was Joe before the office?”). 记忆生成器 GG 的工作模式为

mk+1=xm_{k+1} = x

其中 kk 为当前已经使用的记忆单元个数.

  • MemNN 的特征提取器 II 使用了 BoW 特征.
  • MemNN 的输出特征提取器 OO 和 响应器 RR 均使用了相似度排序模型.

其输出特征提取器 OO 会从记忆体中提取两个最相关的记忆单元:

o1=arg maxmiMSO(x,mi)o2=arg maxmiMSO([x,o1],mi)\begin{aligned} o_1 &= \argmax_{m_i \in M} S_{O} (x, m_i) \\ o_2 &= \argmax_{m_i \in M} S_{O} ([x, o_1], m_i) \end{aligned}

响应器采用了类似的方式.

MemNN 最主要的问题是, 模型使用的 arg max\argmax 是不可导的, 因此不能采用端到端的训练方法.

MemN2N

FAIR 在 2015 年的论文 End-To-End Memory Networks 提出了 MemN2N 模型, 将 MemNN 改造为 End2End 方式.

相对于 MemNN, MemN2N 的主要改动在输出特征提取器 OO 的设计上. 与 MemNN 使用 arg max\argmax 不同, MemN2N 使用了可导的 Softmax 函数, 其输出计算如下:

pi=Softmax(μTmi)o=ipici\begin{aligned} p_i &= \text{Softmax}(\mu^{T} m_i) \\ o &= \sum_{i} p_i c_i \end{aligned}

其中记忆单元 mim_i 是对应输入 xix_i (一个描述事实的句子) 的稠密向量表示, μ\mu 对应当前输入的问题 qq 的向量表示 (与 x 的编码矩阵可能不同), cic_i 又是 xix_i 对应的另一个稠密向量表示. 这里使用了三个不同的嵌入矩阵, 讲起来有点绕. 事实上, 作者也有尝试过上面三个向量表示方法使用同一个嵌入矩阵的情形.

对应的响应器 RR 也不再使用排序的方法, 而改成了分类器的方式 (作者简化了 QA 问题, 假设答案只包括一个单词), 数学表示如下:

r=Softmax(W(o+u))r = \text{Softmax}(W (o + u))

MemN2N 与 Attention 的关系

我们从上面的输出特征提取过程可以很容易联想到 Attention, 因为两者的计算过程实在太相似了.

以 Dzmitry Bahdanau 等人 2014 年在论文 Neural machine translation by jointly learning to align and translate 给出的 Attention 计算过程作为对比:

eij=a(si1,hj)αij=Softmax(eij)ci=j=1Txαijhj\begin{aligned} e_{ij} &= a(s_{i-1}, h_j) \\ \alpha_{ij} &= \text{Softmax}(e_{ij}) \\ c_i &= \sum_{j=1}^{T_x} \alpha_{ij} h_j \end{aligned}

无论是 MemN2N 还是 Attention, 都是通过概率分布的方式找到与当前关注点最相关的信息. MemN2N 的当前关注点是 Query, 相关信息是 Query 之前的事实描述. Attention 中的当前关注点是隐状态 si1s_{i-1}, 而相关信息是编码器输出的序列矩阵表示.

事实上, 还有一些 Transformer 的后续研究 (应该是之前在知乎上看到的介绍, 但是现在找不到具体的知乎帖子及对应的原始论文了, 后续补上) 称, 将 Transformer 中 Self-Attention 对应的 Q 和 K, 或者其计算结果替换成一个随机初始化的矩阵变量 (还是直接将系数 α\alpha 作为变量学习, 记不清楚了), 也能够达到 Self-Attention 类似的效果. 这里想表达的是, 不管是显式定义的 Memory, 还是通过 Q 和 K 计算得到的 Score, 甚至是随机初始化的 Score 向量, 都为模型提供了额外的记忆信息, 都能给模型带来效果提升, Memory 和 Attention 没有本质的区别.

Memory Network 在对话系统中的应用

这里先把 Recent Advances in Deep Learning Based Dialogue Systems: A Systematic Survey 罗列的一些研究工作简单梳理一下, 后续再逐一展开.