本文是南洋理工大学 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 罗列的一些研究工作简单梳理一下,后续再逐一展开.