几十年来,神经网络已被证明是卓越的模式识别机器。它们可以分类图像、翻译语言,甚至生成富有创意的文本。然而,它们在历史上一直难以处理一些对于计算机科学专业一年级新生来说都轻而易举的任务——比如复制一个数据序列、对列表进行排序或执行关联回忆。

为什么会这样?因为传统的神经网络,即使是像 LSTM 这样强大的模型,也缺少经典计算机的一个基本组成部分:** 外部、可寻址的存储器**。它们必须将所有的知识都塞进神经元的权重中,这就像试图只凭脑中的便签本进行复杂运算。

如果我们能弥合这一鸿沟呢? 如果我们能让神经网络访问一个专用的存储器——就像计算机的 RAM 一样——并让它学会如何读取和写入呢?

这正是 Google DeepMind 在 2014 年发表的开创性论文《神经图灵机》的核心思想。研究人员提出了一种新颖架构,将神经网络与外部存储器相结合,打造出一个能够仅凭输入-输出示例就学会简单算法的系统。

最精妙的地方是什么?整个系统是端到端可微分的。这意味着我们可以使用最常用的工具——梯度下降——来训练它,就像训练任何其他深度学习模型一样。这个网络不只是学会执行某个任务,而是学会完成该任务的过程

在本文中,我们将探讨神经图灵机 (NTM) 的工作原理、成就它的巧妙机制,以及它们如何学会执行那些过去神经网络难以企及的任务。


NTM 架构: 带有可学习 RAM 的 CPU

神经图灵机的核心由两个主要组件构成: 一个控制器和一个存储矩阵

神经图灵机架构的高层示意图,展示了一个中央控制器通过读写头与外部存储矩阵进行交互。

你可以将控制器看作 CPU。它是一个标准的神经网络——可以是一个前馈网络,也可以是像 LSTM 这样的循环网络。它负责处理输入、生成输出,并决定如何与内存交互。

存储矩阵的作用类似于 RAM。它是一个规模较大、二维的实数数组。控制器只能通过读写头来访问这块内存,类似于传统图灵机的读写头。

主要挑战在于如何让与内存的交互可微分。在传统计算机中,你要么从某个离散地址 (如 0x1A) 读数据,要么不读——这种方式与梯度下降不兼容。NTM 使用了带注意力的“模糊”聚焦来解决: 读写头不是直接定位到某一个内存位置,而是为所有位置分配权重,决定每个位置被读取或写入的强度。这种“软”方式使整个过程可微分。


从内存读取

读取操作并不会直接选择单一的位置,而是计算所有内存行的加权平均值

如果 \( M_t \) 是时刻 \(t\) 的 \(N \times M\) 存储矩阵 (有 \(N\) 行,向量长度为 \(M\)) ,读头会发出一个归一化的权重向量 \( w_t \):

\[ \sum_{i=0}^{N-1} w_t(i) = 1, \quad 0 \le w_t(i) \le 1 \]

返回的读取向量为:

\[ \mathbf{r}_t = \sum_{i=0}^{N-1} w_t(i) \mathbf{M}_t(i) \]

如果 \( w_t \) 很“尖锐” (某一个元素接近 1,其余接近 0) ,读取效果就类似于离散数据查找。如果权重分布比较“模糊”,则会混合多个位置的信息。


向内存写入

写入分为两个阶段:** 擦除然后添加**,灵感来自 LSTM 的门控机制。

给定一个写权重 \( w_t \)、一个擦除向量 \( \mathbf{e}_t \) (\(M\) 个数值在 0 到 1 之间) 和一个添加向量 \( \mathbf{a}_t \):

  1. 擦除:

    \[ \tilde{\mathbf{M}}_t(i) = \mathbf{M}_{t-1}(i) \left[ \mathbf{1} - w_t(i) \mathbf{e}_t \right] \]

    只有权重高擦除值高的分量才会被清零。

  2. 添加:

    \[ \mathbf{M}_t(i) = \tilde{\mathbf{M}}_t(i) + w_t(i) \mathbf{a}_t \]

这种细粒度、连续化的控制方式可实现选择性更新,同时保持可微分性。


可微寻址: 秘密武器

最大的问题是: 控制器如何生成权重向量 \( w_t \)?

答案是: 结合基于内容的寻址基于位置的寻址

展示寻址机制的流程图,从内容寻址到插值、卷积移位和锐化。


1. 基于内容的聚焦

基于内容的寻址通过相似度搜索内存。控制器会输出一个键向量 \( \mathbf{k}_t \) 和一个键强度 \( \beta_t \)。

相似度常通过余弦相似度来计算:

\[ K[\mathbf{u}, \mathbf{v}] = \frac{\mathbf{u} \cdot \mathbf{v}}{||\mathbf{u}|| \, ||\mathbf{v}||} \]

权重计算为:

\[ w_t^{c}(i) = \frac{\exp\left(\beta_t K[\mathbf{k}_t, \mathbf{M}_t(i)]\right)}{\sum_j \exp\left(\beta_t K[\mathbf{k}_t, \mathbf{M}_t(j)]\right)} \]

2. 基于位置的聚焦

在某些任务中需要顺序遍历——基于位置的寻址可以实现迭代访问。

首先,通过门控参数 \( g_t \) 在新的内容地址 \( w_t^c \) 与上一时刻的权重 \( w_{t-1} \) 间作插值:

\[ \mathbf{w}_t^{g} = g_t \mathbf{w}_t^{c} + (1 - g_t) \mathbf{w}_{t-1} \]

然后,通过移位权重 \( s_t \) (定义在允许的整数移位范围内) 进行循环移位:

\[ \tilde{w}_t(i) = \sum_{j=0}^{N-1} w_t^{g}(j) \, s_t(i-j) \quad \text{(mod $N$)} \]

最后,用因子 \( \gamma_t \ge 1 \) 对结果进行锐化:

\[ w_t(i) = \frac{\tilde{w}_t(i)^{\gamma_t}}{\sum_j \tilde{w}_t(j)^{\gamma_t}} \]

这一三步机制可实现:

  • 跳转到内容匹配的位置;
  • 移位到相邻位置;
  • 在不依赖内容查找的情况下迭代。

效果如何?

复制任务

内存增强神经网络的“Hello, World”: 输入一个序列,延迟一段时间后复现它。

复制任务的学习曲线: NTM 比 LSTM 学习更快且误差更低。

在长度不超过 20 的序列上训练后,NTM 能泛化到长度为 30、50,甚至 120 的序列。

NTM 在复制任务上的泛化: 远超训练长度的精确复现。 LSTM 在复制任务上的泛化: 超过长度 20 后性能迅速下降。

通过分析内存访问过程,我们可以看到它学到的算法:

  1. 写入循环: 从起始位置开始 → 写入输入 → 向前移动读写头。
  2. 读取循环: 重置到起始位置 → 读取输出 → 向前移动读写头。

复制任务中 NTM 内存访问可视化: 读写头顺序遍历。


重复复制任务

输入: 一个序列 + 重复次数 → 输出: 该序列重复相应次数。

重复复制任务学习曲线: NTM 比 LSTM 学习更快。

NTM 能泛化到比训练中出现过的更长序列和更多重复次数。

重复复制任务中 NTM 与 LSTM 泛化对比。

内存使用显示了一个嵌套循环: 一次写入过程,多次读取过程,读写头会跳回起始位置——实际上相当于 goto 操作。

重复复制任务中 NTM 内存使用: 多次遍历存储数据。


关联回忆任务

输入一个项目序列;给定其中一个项目,返回下一个项目。

关联回忆任务学习曲线: NTM (红色、绿色) 显著领先于 LSTM (蓝色) 。 泛化效果: NTM 能处理更长的项目序列。

学到的策略是: 将每个项目压缩成一个向量;用内容寻址存储;查询时,重新计算压缩向量,在内存中找到它,然后移位 +1 来获取下一个项目。

关联回忆任务内存使用: 内容查找 + 移位到下一个项目。


优先级排序任务

输入: 带有标量优先级的向量;输出: 按优先级从高到低排序的向量。

优先级排序任务学习曲线: NTM 性能显著优于 LSTM。

NTM 将优先级映射到写入地址 (高优先级 → 较高索引) 。排序过程变为从最高地址到最低地址的顺序读取。

优先级排序任务输入/目标示例。 写入地址与优先级近似线性关系;读取地址是顺序的。


核心要点

神经图灵机是神经网络研究的里程碑:

  • 可微分存储器: 读写操作用软注意力实现,使端到端梯度训练成为可能。
  • 混合寻址: 结合内容寻址与位置寻址,支持多样化的数据结构和算法。
  • 算法泛化: NTM 能将学到的算法推广到远超训练范围的任务。

NTM 开启了内存增强神经网络的大门,并启发了诸如可微分神经计算机 (DNC) 等后续研究。它弥合了符号化、基于规则的 AI 与子符号化、基于学习的表征之间的鸿沟——证明了只要有合适的架构,神经网络也能学会像计算机一样去思考