30u30 中文导读 / 30 天目录 / 第 17 天

第 17 天 · 给神经网络装一块可微分的外部内存

第 4 单元Neural Turing MachinesAlex Graves, Greg Wayne, Ivo DanihelkaarXiv · 2014
这是导读,不是翻译。先用 10 分钟拿到这篇论文的思想地图,再去读 原论文 →,去原仓库的 17_neural_turing_machines/ 目录 → 动手写代码。
给孩子讲:这一天有 10 岁孩子能听懂的讲义,带猜字游戏和动手活动,可打印。打开儿童讲义 → · PDF 简体 · PDF 繁體

一句话

论文给神经网络接上一块外部记忆矩阵,读和写都用连续的权重分布完成,整个系统可以端到端用梯度下降训练。神经图灵机从输入输出样例中学会复制、联想回忆和排序这类简单算法,并能推广到比训练时更长的序列。

论文讲了什么

问题。LSTM 的记忆藏在隐状态里。隐状态大小固定,记忆和计算混在一起。想记住更多内容,就得把整个网络变大。计算机的做法不同:CPU 负责计算,内存负责存储,按地址读写。作者想把这种分工搬进神经网络,同时保持每一步可导,好用梯度下降训练。

结构。神经图灵机分 2 部分:

读写头不挑某一行,而是给 N 行一个权重分布 w,权重之和为 1。读操作是加权和 r = sum_i w(i) M(i)。写操作分两步:先用擦除向量 e 擦掉旧内容 M(i) = M(i) * (1 - w(i) e),再加上新内容 M(i) = M(i) + w(i) a。这些操作都可导。

寻址流程。权重 w 经过 4 步算出:

  1. 内容寻址:键向量 k 和每一行算余弦相似度,乘以强度 beta 后过 softmax。beta 越大,焦点越集中。
  2. 插值:门 g 在内容权重和上一步权重之间混合。g = 0 时完全沿用上一步的位置。
  3. 卷积移位:移位分布 s(例如定义在 -1、0、+1 上)对权重做循环卷积,让焦点前移或后移一格。
  4. 锐化:每个权重取 gamma 次方再归一化,抵消卷积带来的模糊。

内容寻址回答"找哪条记录",移位回答"下一条在哪"。两者结合,模型既能按内容查找,也能像指针一样顺序遍历。

结果。论文测试了 5 个任务:复制、重复复制、联想回忆、动态 N 元语法和优先级排序。复制任务的输入是长度 1 到 20 的随机 8 位二进制向量序列。神经图灵机比 LSTM 收敛快,最终误差也更低。测试长度增加到 120 时,神经图灵机仍能大体正确地复制,LSTM 超过 20 后很快出错。作者把读写权重画出来,发现模型学到的过程很像一段程序:写入时读写头逐格前移,读出时先跳回起点,再逐格读出。

关键概念

控制器(Controller)
神经图灵机里负责计算的网络,可以是前馈网络或 LSTM。它决定读什么、写什么、往哪里移动读写头。
记忆矩阵(Memory Matrix)
N × M 的外部存储,N 是单元个数,M 是每个单元的向量长度。它的大小和控制器参数量无关。
内容寻址(Content-Based Addressing)
按键向量和记忆行的余弦相似度分配权重,类似按关键词查找记录。思路与注意力中的 Q 和 K 匹配相同。
位置寻址(Location-Based Addressing)
通过插值门和循环卷积移位,把焦点从上一个位置移到相邻位置。它让模型能顺序遍历记忆。
擦除与添加(Erase and Add)
写操作的两步:先按权重和擦除向量把旧值按比例清掉,再按权重加上新向量。拆成两步后整体仍然可导。
锐化(Sharpening)
把权重取 gamma 次方再归一化,gamma ≥ 1。卷积移位会把焦点摊开,锐化把它重新收拢到少数几行。

历史位置:为什么值得读

神经图灵机发表于 2014 年 10 月,作者来自 DeepMind。Graves 此前在手写生成中用过基于位置的软注意力。同一个月,Facebook 的 Weston 等人发表了记忆网络(Memory Networks)。两篇论文从不同方向提出同一个想法:给神经网络加外部记忆。

后续工作沿 3 个方向展开:

和清单的关系:第 15 天的注意力在只读的编码器状态上做软选择,神经图灵机把这种软选择用到可写的记忆上。第 16 天的处理块多次读取一组记忆,第 20 天的关系 RNN 让记忆单元之间用注意力交互。

学前准备

在原仓库怎么学

  1. 读 README.md,找到寻址流程对应的论文第 3.3.1 节。
  2. 对照 paper_notes.md 读原论文第 3 节,把公式 2 到公式 9 抄在纸上。
  3. 读 implementation.py,依次看 NTMMemory、NTMHead 和 NTM 3 个类。
  4. 做 exercises/ 里的 5 个练习:exercise_01_addressing.py 写内容寻址(公式 5),exercise_02_shift.py 写循环卷积移位(公式 8),exercise_03_memory.py 写擦除和添加(公式 3、4),exercise_04_controller.py 准备控制器输入,exercise_05_sharpening.py 写锐化(公式 9)。答案在 exercises/solutions/。
  5. 读 data/README.md 了解复制任务的序列格式,然后运行 train_minimal.py 训练复制任务。
  6. 用 visualization.py 画读写权重随时间的变化,对照论文的复制任务图。
  7. 用 notebook.ipynb 串一遍,用 CHEATSHEET.md 复习公式。

今天再看

神经图灵机本身今天很少直接使用。它训练不稳定,速度慢,也难以扩展到大规模数据。DNC 也停留在研究阶段。但它的几个思想活了下来:

容易卡住的地方

延伸阅读