Memory Augmented Neural Network.

循环神经网络把历史压缩在固定维度的隐状态中,因此隐状态可以看作一种内部记忆(internal memory)。这种记忆与模型计算紧密耦合:每写入新信息都要覆盖旧状态,容量不会随输入长度增长,模型也很难精确回答“某条事实存在哪里”或“刚才写入了什么”。长序列上的梯度问题会进一步削弱远距离信息的保存与调用。

记忆增强神经网络(Memory Augmented Neural Network,MANN)在控制器之外增加显式的外部记忆(external memory)。控制器负责计算,外部结构负责保存可寻址的信息;模型用可微接口读取记忆,并在支持写入的结构中更新记忆。这样,梯度可以穿过“寻址—读取”,也可以在可读写模型中穿过“擦除—写入”。不同模型的核心差异在于三件事:记忆中存什么、如何寻址、是否允许写回。

本文目录:

  1. 为什么需要外部记忆
    • (1) 内部状态的容量瓶颈
    • (2) 外部记忆的归纳偏置
  2. 记忆增强网络的统一接口
    • (1) 控制器与记忆矩阵
    • (2) 内容寻址与读取
    • (3) 擦除与写入
  3. 面向问答的只读记忆网络
    • 3.1 Memory Networks
    • 3.2 End-To-End Memory Networks
    • 3.3 Key-Value Memory Networks
    • 3.4 Dynamic Memory Networks
  4. 可读写记忆:Neural Turing Machine
    • (1) 控制器、记忆与读写头
    • (2) 内容寻址与位置寻址
    • (3) 擦除—增加写入
  5. Differentiable Neural Computer
    • (1) 动态分配与使用率
    • (2) 时间链接与顺序遍历
    • (3) 读取模式
  6. 面向特定任务的记忆结构
    • 6.1 少样本学习中的MANN
    • 6.2 可微栈、队列与双端队列
  7. 训练、评估与能力边界
    • (1) 记忆是否真的被使用
    • (2) 可微寻址的优化问题
    • (3) 外部记忆为何没有取代常规网络

符号约定:记忆矩阵记为\(M_t\in\mathbb{R}^{N\times W}\),包含\(N\)个宽度为\(W\)的槽位;第\(i\)个槽位是\(M_t[i]\)。控制器状态为\(h_t\),读权重和写权重分别为\(w_t^r,w_t^w\in\Delta^{N-1}\),读向量为\(r_t\),擦除向量与增加向量分别为\(e_t,a_t\in\mathbb{R}^{W}\)。本文统一把\(M_{t-1}\)记为第\(t\)步操作前的记忆,把写入后的记忆记为\(M_t\);只读模型中的记忆不随时间变化。

1. 为什么需要外部记忆

(1) 内部状态的容量瓶颈

普通RNN、LSTM和GRU都把历史写入固定维度的隐状态:

\[h_t=f(x_t,h_{t-1}).\]

无论输入序列有多长,所有历史都必须压缩到\(h_t\)。门控结构可以改善梯度传播,却不会让存储容量随序列长度增加。面对“复制一个长序列”“按键检索对应值”或“依据多条事实完成推理”等任务,网络既要保存内容,又要在同一向量中维护检索线索,容易出现覆盖与干扰。

外部记忆把表示拆成两个层次:

这种分工类似传统计算机中的处理器与内存,但神经网络不会使用离散地址指令,而是学习一组连续的读写权重。

(2) 外部记忆的归纳偏置

不同外部记忆结构提供的归纳偏置并不完全相同,常见能力包括:

  1. 持久性:信息可以停留在某个槽位中,而不必每一步都经过隐状态更新。
  2. 内容寻址(content addressing):通过查询向量寻找相似内容;栈和队列等结构化记忆则使用固定访问规则。
  3. 多步推理(multi-hop reasoning):一次读取产生新查询,再进行下一次读取,把证据链拆成多跳。
  4. 容量解耦:记忆槽位数与控制器隐状态维度分开设定;扩大槽位可以提高可用容量,但模型未必能直接泛化到训练时未见的规模。

这些性质并非免费获得。软寻址会把概率质量分散到多个槽位,写操作可能造成干扰,顺序访问还需要额外的位置机制。记忆网络的设计重点,就是在“可微、可训练”和“近似离散读写”之间取得平衡。

2. 记忆增强网络的统一接口

(1) 控制器与记忆矩阵

记忆增强模型可以用四个模块统一描述:

  1. 控制器\(C\):接收当前输入、上一步控制状态和读向量,生成\(h_t\)及接口参数。
  2. 外部记忆\(M_t\):由一组向量槽位组成,保存事实、特征或中间计算结果。
  3. 读取模块\(R\):根据查询生成读权重,并把若干槽位聚合成\(r_t\)。
  4. 写入模块\(W\):决定写入位置、删除哪些旧内容,以及增加什么新内容。

只读模型在预处理阶段构造记忆,可以省略可训练的写入接口;NTM和DNC等可读写模型则显式实现全部模块。控制器可以是前馈网络、RNN或LSTM。外部记忆本身通常没有复杂计算,模型能力主要来自接口如何生成寻址权重。

(2) 内容寻址与读取

设控制器产生查询键\(k_t\),用相似度函数\(K(\cdot,\cdot)\)与操作前的每个槽位比较:

\[w_{t,i}^{r} =\frac{\exp\left(\beta_tK(k_t,M_{t-1}[i])\right)} {\sum_{j=1}^{N}\exp\left(\beta_tK(k_t,M_{t-1}[j])\right)}.\]

$\beta_t>0$控制分布锐度,常用相似度是余弦相似度。若本步包含写入,则先得到\(M_t\);读取是对当前记忆加权求和:

\[r_t=\sum_{i=1}^{N}w_{t,i}^{r}M_t[i].\]

这一过程可以看作注意力机制的一种:查询来自控制器,键和值来自记忆槽位。普通内容注意力只描述如何加权读取;NTM的位置寻址、DNC的分配与时间链接以及可写模型的状态更新都超出了这一操作。

(3) 擦除与写入

可读写记忆常把更新拆成“擦除”和“增加”两步:

\[\begin{aligned} \widetilde{M}_t[i] &=M_{t-1}[i]\odot\left(1-w_{t,i}^{w}e_t\right),\\ M_t[i] &=\widetilde{M}_t[i]+w_{t,i}^{w}a_t. \end{aligned}\]

若\(w_{t,i}^{w}=0\),第\(i\)个槽位不变;若某个擦除分量接近\(1\),相应旧内容被清除;增加向量再按写权重写入。连续权重使操作可微,但也意味着一次写入可能污染多个槽位。

⭐ 讨论:外部记忆不等于参数记忆

模型权重也能记住训练数据中的规律,但那是缓慢更新的参数记忆(parametric memory);外部记忆是样本级或序列级的工作记忆(working memory),可以在一次任务中快速装载信息,可读写类型还允许在前向过程中更新和清除。二者解决的问题不同:参数负责长期知识,外部记忆负责当前任务所需的临时事实与中间状态。

3. 面向问答的只读记忆网络

这一类模型由输入事实预先构造可寻址记忆,推理阶段主要执行读取,不学习像NTM那样逐时间步写回记忆矩阵。其代表任务是问答:给定若干事实和一个问题,从记忆中检索支持事实并输出答案。

3.1 Memory Networks

⚪ Memory Networks:显式拆分输入、更新、输出与响应

原始Memory Network,MemNN由四个组件构成:

抽象地写:

\[\begin{aligned} M&\leftarrow G(M,I(x)),\\ o&=O(I(q),M),\\ \hat{y}&=R(o). \end{aligned}\]

原模型使用离散的支持事实选择,主要实验设置依赖“哪一句是支持事实”的强监督,也讨论了只有答案标签的弱监督。它证明了显式记忆可以完成多跳问答,但各模块还没有被组织成后来那种完全端到端可微的结构。

⚪ bAbI Tasks:用合成任务诊断推理能力

bAbI包含\(20\)类合成问答任务,分别检查单事实检索、双/三事实推理、计数、时间推理、路径寻找等能力。它不仅是一个真实语言理解数据集,而且是一套受控诊断:模型若连短模板句中的支持事实都无法检索,就很难声称具备更复杂的推理能力。

3.2 End-To-End Memory Networks

⚪ MemN2N:用软注意力替代支持事实监督

MemN2N把支持事实选择改成软注意力,使答案监督即可训练整个网络。每条事实\(x_i\)被映射为寻址向量\(m_i=A x_i\)和值向量\(c_i=C x_i\);问题被编码为\(u=Bq\)。单跳读取为:

\[\begin{aligned} p_i&=\frac{\exp(u^\top m_i)}{\sum_j\exp(u^\top m_j)},\\ o&=\sum_i p_i c_i,\\ u^{(2)}&=u^{(1)}+o^{(1)}. \end{aligned}\]

重复\(K\)次就得到多跳(multi-hop)推理:第\(k\)跳的读取结果\(o^{(k)}\)更新查询,再检索下一条支持事实。最后预测答案:

\[\hat{y}=\operatorname{softmax}\left(Wu^{(K+1)}\right).\]

模型还使用位置编码(position encoding)表示句内词序,用时间编码(temporal encoding)区分事实先后。不同跳之间可以采用相邻权重共享或层式权重共享,减少参数并稳定训练。

⭐ 讨论:多跳次数不等于推理深度

增加跳数只是允许模型重复读取,并不保证每一跳对应一条可解释的推理步骤。注意力可能在第一跳已混合全部证据,后续跳只做重加权;也可能所有跳都关注同一句。判断是否学到组合推理,需要同时检查跨分布泛化、支持事实对齐与去除中间证据后的性能。

3.3 Key-Value Memory Networks

⚪ Key-Value Memory Network:分离“如何找到”与“读出什么”

MemN2N已经用\(A\)与\(C\)把同一条事实投影为独立的寻址表示和输出表示,但两者仍由同一事实生成。KV-MemNN进一步显式构造语义不同的键\(k_i\)和值\(v_i\):键保存适合匹配问题的线索,值保存真正需要读出的内容。

\[\begin{aligned} p_i&=\operatorname{softmax}_i(q^\top k_i),\\ o&=\sum_i p_i v_i,\\ q^{(k+1)}&=q^{(k)}+o^{(k)}. \end{aligned}\]

例如在知识库问答中,键可以是“主体+关系”,值是客体;在文档问答中,键可以是包含实体的上下文窗口,值是窗口中心的候选答案。键值分离减少了“用于检索的表述”和“作为答案的表述”之间的冲突。

3.4 Dynamic Memory Networks

⚪ Dynamic Memory Network:用情景记忆迭代聚合证据

DMN由输入模块、问题模块、情景记忆(episodic memory)模块和答案模块组成。输入模块把句子编码成事实\(f_1,\dots,f_T\);情景模块根据问题\(q\)与上一轮记忆\(m^{(k-1)}\)生成注意力门:

\[g_{t}^{(k)}= \sigma\left(W^{(2)}\tanh\left(W^{(1)}z_t^{(k)}+b^{(1)}\right)+b^{(2)}\right),\]

其中\(z_t^{(k)}\)组合了\(f_t\)与\(q,m^{(k-1)}\)之间的相似度特征。带门的循环单元按顺序扫描事实并形成情景\(e^{(k)}\),再更新\(m^{(k)}\)。多次迭代允许模型先找到一条事实,再以其为条件寻找下一条。

与MemN2N直接对记忆槽位加权求和相比,DMN在每一跳内部用门控循环单元顺序编码事实,因而能把事实次序纳入情景聚合。原论文用同一架构处理问答、文本分类、序列标注等多类自然语言任务,但这并不意味着它在所有顺序任务上都优于MemN2N。

4. 可读写记忆:Neural Turing Machine

图灵机由一条可读写纸带、一个读写头和有限状态控制器组成。读写头按离散地址访问纸带并向左或向右移动;理论上,这一极简系统足以描述任意可计算过程。

神经网络若要模仿这种机制,困难在于离散地址选择不可导。Neural Turing Machine用分布式权重替代单一地址:每个读写头都维护一个长度为\(N\)的概率向量,在所有槽位上执行软读取或软写入。

(1) 控制器、记忆与读写头

⚪ Neural Turing Machine:把可微读写头连接到外部记忆

Neural Turing Machine,NTM由控制器、记忆矩阵和一个或多个读写头组成。第\(t\)步控制器接收输入\(x_t\)与上一时刻读向量\(r_{t-1}\),输出状态\(h_t\)以及一组接口参数:查询键\(k_t\)、键强度\(\beta_t\)、插值门\(g_t\)、移位分布\(s_t\)、锐化系数\(\gamma_t\)、擦除向量\(e_t\)和增加向量\(a_t\)。

控制器可以是前馈网络,也可以是LSTM。前馈控制器没有内部循环状态,迫使模型把跨时间信息保存在外部记忆中;循环控制器本身也能记忆,因此性能更强,但更难判断任务究竟由哪一种记忆完成。

(2) 内容寻址与位置寻址

NTM把寻址拆成四步。

第一步,根据查询键与操作前记忆内容的余弦相似度得到内容权重:

\[w_{t,i}^{c} =\frac{\exp\left(\beta_tK(k_t,M_{t-1}[i])\right)} {\sum_j\exp\left(\beta_tK(k_t,M_{t-1}[j])\right)}, \qquad K(u,v)=\frac{u^\top v}{\Vert u\Vert\Vert v\Vert}.\]

第二步,用插值门融合新内容地址与上一时刻地址:

\[w_t^{g}=g_t w_t^{c}+(1-g_t)w_{t-1}.\]

当\(g_t\approx1\)时按内容跳转到新位置;当\(g_t\approx0\)时保留原来的读写位置。

第三步,用移位分布\(s_t\)对地址做循环卷积:

\[\widetilde{w}_{t,i}=\sum_{j=1}^{N}w_{t,j}^{g}s_t[i-j].\]

若\(s_t\)集中在偏移\(+1\),读写头就近似向右移动一格。内容寻址负责“跳到某个值附近”,位置寻址负责“沿着刚才的位置顺序移动”。

第四步,用\(\gamma_t\geq1\)锐化移位后的分布:

\[w_{t,i}=\frac{\widetilde{w}_{t,i}^{\gamma_t}} {\sum_j\widetilde{w}_{t,j}^{\gamma_t}}.\]

完整寻址流程如下:

⭐ 讨论:为何同时需要内容与位置寻址

只有内容寻址时,模型可以找到“与查询相似”的槽位,却难以表达“读取它后面的下一个元素”;只有位置寻址时,模型能顺序移动,却不知道从哪里开始。两者结合后,NTM既能随机访问,又能执行复制、排序和重复复制等依赖顺序扫描的算法。

(3) 擦除—增加写入

读头根据最终权重聚合记忆:

\[r_t=\sum_{i=1}^{N}w_{t,i}^{r}M_t[i].\]

写头先擦除,再增加:

\[\begin{aligned} \widetilde{M}_t[i] &=M_{t-1}[i]\odot\left(1-w_{t,i}^{w}e_t\right),\\ M_t[i] &=\widetilde{M}_t[i]+w_{t,i}^{w}a_t. \end{aligned}\]

擦除向量通过\(\sigma\)限制在\([0,1]\),增加向量通常由\(\tanh\)产生。多个写头同时操作时,所有擦除先相乘,再把增加项相加,以避免执行顺序造成歧义。

原论文在复制、重复复制、联想回忆、优先排序等合成任务上训练NTM。它可以把学到的程序泛化到比训练序列更长的输入,但结果依赖初始化、课程学习与控制器形式;“可微图灵机”描述的是设计目标,不代表网络在任意任务上都会学到通用算法。

5. Differentiable Neural Computer

NTM知道如何按内容或邻近位置寻址,却没有显式回答两个问题:哪里还有空闲空间,以及某些记录按照什么顺序写入。Differentiable Neural Computer在相同读写接口之上增加动态分配和时间链接,使记忆管理更接近传统计算机。

(1) 动态分配与使用率

⚪ Differentiable Neural Computer:学习分配、释放与遍历记忆

DNC维护使用率向量\(u_t\in[0,1]^N\),表示每个槽位当前被占用的程度。写入提高使用率,读头的释放门则允许模型声明某些位置不再需要。简化地写:

\[\begin{aligned} \psi_t[i]&=\prod_{j=1}^{R}\left(1-f_t^j w_{t-1}^{r,j}[i]\right),\\ u_t&=\left(u_{t-1}+w_{t-1}^{w}-u_{t-1}\odot w_{t-1}^{w}\right)\odot\psi_t, \end{aligned}\]

其中\(R\)是读头数量,\(f_t^j\)是第\(j\)个读头的释放门。释放门只降低槽位在使用率向量中的占用估计,使其可以被重新分配;它不会直接擦除\(M_t\)中的内容,真正的覆盖仍由后续写入完成。模型按使用率从低到高排序,优先把新内容写入最少使用的槽位,得到分配权重(allocation weighting)\(a_t\)。

最终写权重混合两种策略:

\[w_t^w=g_t^w\left(g_t^a a_t+(1-g_t^a)c_t^w\right),\]

其中\(c_t^w\)是内容寻址权重,\(g_t^a\)决定“写入空闲位置”还是“按内容覆盖旧位置”,\(g_t^w\)决定是否执行写入。

(2) 时间链接与顺序遍历

DNC为最近的写入顺序维护时间链接矩阵(temporal link matrix)\(L_t\in[0,1]^{N\times N}\)。若槽位\(i\)在槽位\(j\)之后被写入,则\(L_t[i,j]\)增大。令\(p_t\)记录最近写入位置,则:

\[\begin{aligned} p_t&=\left(1-\sum_iw_t^w[i]\right)p_{t-1}+w_t^w,\\ L_t[i,j]&=\left(1-w_t^w[i]-w_t^w[j]\right)L_{t-1}[i,j] +w_t^w[i]p_{t-1}[j],\qquad i\neq j. \end{aligned}\]

沿链接矩阵正向或反向传播读权重,就能读取“下一条写入记录”或“上一条写入记录”:

\[f_t^j=L_t w_{t-1}^{r,j}, \qquad b_t^j=L_t^\top w_{t-1}^{r,j}.\]

这相当于在记忆中动态构造双向链表。与NTM固定的小范围卷积移位相比,时间链接可以跨越任意物理槽位;即使记录被分散写入,也能按照逻辑顺序遍历。

(3) 读取模式

每个读头把三种读取模式混合:

  1. 反向模式(backward mode):沿时间链接读取上一条记录。
  2. 内容模式(content mode):按查询键直接检索。
  3. 正向模式(forward mode):沿时间链接读取下一条记录。

若\(\pi_t^j\in\Delta^2\)是第\(j\)个读头的模式权重,则:

\[w_t^{r,j} =\pi_t^j[1]b_t^j+\pi_t^j[2]c_t^{r,j}+\pi_t^j[3]f_t^j.\]

DNC在图遍历、最短路径、关系推理与问答任务上展示了比NTM更强的结构操作能力。其代价是状态庞大:时间链接矩阵占用\(O(N^2)\)空间,分配需要排序,接口参数多且训练敏感。

6. 面向特定任务的记忆结构

通用记忆矩阵不是唯一形式。若任务先验明确,可以限制读写规则,换取更稳定的优化和更强的泛化。

6.1 少样本学习中的MANN

⚪ Meta-Learning with MANN:快速绑定样本与标签

少样本分类要求模型看到一个新类别的一两个样本后立即完成预测,不能通过许多轮梯度更新把类别写进参数。Santoro等人把每个样本表示及其标签临时写入外部记忆,再用新样本作为查询检索相似表示。

训练序列故意把标签延迟一个时间步输入:第\(t\)步接收\(x_t\)和上一样本标签\(y_{t-1}\),模型必须在预测\(y_t\)后才能看到正确答案。这样,网络被迫学习“先预测,再把样本—标签关联写入记忆”。

该方法使用最近最少使用访问(Least Recently Used Access,LRUA):

这一结构在Omniglot单样本分类上展示了快速适应能力。它学到的是一个跨任务共享的写入与检索策略。

6.2 可微栈、队列与双端队列

⚪ Neural Stack/Queue/Deque:用结构化读写替代任意寻址

Grefenstette等人为循环网络连接可微的栈、队列和双端队列。控制器不再生成长度为\(N\)的任意地址分布,而只输出待写向量、压入强度和弹出强度。栈遵循后进先出(LIFO),队列遵循先进先出(FIFO);连续强度允许一次操作只弹出一个向量的部分质量,因此仍可用反向传播训练。

结构化记忆牺牲随机访问,换来更强的算法先验:

这类模型在序列复制、反转和语言识别上具有更好的长度外推,但前提是数据确实符合指定的数据结构。若任务需要按内容随机检索,通用记忆矩阵更合适。

7. 训练、评估与能力边界

(1) 记忆是否真的被使用

仅凭最终准确率不能证明模型使用了外部记忆。循环控制器可能独自解决训练长度内的任务,而读写头只是旁路。更可靠的诊断包括:

原始MemN2N、NTM和DNC主要在bAbI或算法合成任务上验证。此类任务便于控制推理链和序列长度,却与真实语言、噪声知识库和开放词表差距很大;在模板数据上成功,不等于掌握通用推理。

(2) 可微寻址的优化问题

外部记忆模型常见四类失败模式:

  1. 地址弥散:读写权重过于平滑,多个槽位被混合,信息边界逐渐消失。
  2. 槽位干扰:写权重不够尖锐或释放时机错误,新内容覆盖仍需使用的旧内容。
  3. 控制器捷径:训练任务太简单时,控制器把答案保存在隐状态或参数中,绕过外部记忆。
  4. 梯度链过长:一次预测依赖“写入—多步保留—寻址—读取”,任何阶段的软门控饱和都会削弱梯度。

常用缓解措施包括课程学习、梯度裁剪、地址锐化、限制控制器容量、辅助支持事实监督以及从短推理链逐步增加跳数。但过度锐化会让寻址接近离散选择,导致梯度集中且训练不稳定。

(3) 外部记忆为何没有取代常规网络

几类经典模型可以从读写能力和寻址方式上概括:

模型 记忆 寻址 写入 主要任务
MemNN / MemN2N 事实槽位 内容注意力、多跳 通常预先构造 问答与事实推理
KV-MemNN 键值槽位 键寻址、值读取 通常预先构造 文档与知识库问答
DMN 顺序事实 门控情景注意力 更新情景状态 多任务语言理解
NTM 可读写矩阵 内容+位置 擦除+增加 算法学习与序列操作
DNC 可读写矩阵 内容+分配+时间链接 擦除+增加;释放门更新使用率 图、关系与程序式推理
Meta-Learning MANN 样本级缓存 内容+最近最少使用 快速绑定 少样本分类

外部记忆没有成为所有神经网络的默认组件,主要有三点原因:

⭐ 讨论:外部记忆与注意力的关系

二者共享“查询—键—值”的读取形式,但侧重点不同。注意力通常在当前输入产生的固定键值集合上读取;经典MANN还要决定何时写入、写到哪里、何时释放,以及如何跨时间保持槽位。可以把只读MemN2N看成注意力式检索,把NTM/DNC看成“注意力读取 + 可微状态更新 + 记忆管理”。

因此,记忆增强网络更重要的贡献是是把神经网络的记忆问题拆成可检查的接口:内容表示、地址选择、读取聚合、写入更新与容量管理。当任务确实需要在一次前向过程中快速保存、修改并按结构调用信息时,这套视角仍然比单纯增大隐状态更有针对性。