介绍
这个讲座谈了快速权重(fast weight)的思想及其实现。这种快速权重可以被用于存储最近的临时记忆,并且它们提供了一种实现这种类型的对过去的注意(attention)的神经上可行的方法——近期它已被证明在序列到序列模型上是非常有帮助的。通过使用快速权重,我们可以不再需要存储神经活动模式的副本。
其中的基本思想是临时记忆(temporary memories)可以不通过添加活动神经元(active neurons)来存储,而是可以通过在一些已有神经元上进行一些修改来实现。
对于每一个神经元连接,与这个连接相关的权重都有两个组分。一是标准慢权重(standard slow weight),其代表了长期记忆,学习慢衰减也慢。另一个是快速权重,代表了短期记忆,学习快衰减也快。快速权重是真正存在的,比如:启动(priming)。假设你听到了一个带有大量噪声的词,如果这是你***次听到这个词,你可能无法识别它。但如果你在半个小时之前听过这个词,你就可以将其识别出来,这是因为你识别这个词的阈值(threshold)被你半小时之前的记忆降低了。一般而言,假设我们有一个局部表示(localist representation),为了实现上述效果,我们就可以临时降低某个特定词的阈值,而不是改变整个结构。你也可以从另一个角度来思考:假设你有一种活动模式,你可以改变活动模式之间的神经元的权重,以使其中一个特定的模式变成一个更强的吸引子(attractor,比如更容易识别一个词)。这是我们存储记忆的方式,我们通过改变权重来存储模式而不是直接存储模式。因为如果我们使用权重矩阵(weight matrix)而非活动向量(activity vector)来存储短期记忆,我们就能通过有限的神经元实现远远更大的容量。
存储临时知识的方式有两种:
长短期记忆(LSTM):在隐藏单元存储活动。它的容量非常有限。假设一个隐藏状态有 H 个单元,那么在关于当前序列的历史上,LSTM 就会受限于 O(H) 的短期记忆(吸引子)。除此之外,LSTM 将信息存储在其隐藏单元之中,从而使得该短期记忆与正在进行的过程无关。
快速权重:让你可以使用权重矩阵来存储短期记忆,这能带来更高的容量。除此之外,该短期记忆可以存储特定于当前序列的历史的信息,从而使得该信息可被用于影响正在进行的过程。
我们可以怎样应用快速权重的思想?
让我们从 ReLU RNN 开始。ReLU RNN 很易于训练,而且很擅长学习长期依赖(长期记忆)。下面的左图表示了普通的 RNN,右图则表示一个相同的 RNN(如果我们使用空矩阵进行了「隐藏→隐藏」权重初始化,如蓝色箭头所示)。为了应用快速权重的思想,这里使用了外积学习规则(outer product learning rule)来更新快速权重矩阵 A。
更新快速权重矩阵 A 的规则:每次我们在时间步骤 t 学习到一个隐藏状态 h(t),我们就将当前快速权重 A(t-1) 与权重衰减参数 λ 相乘,并且加上乘以学习率 η 的新学习到的隐藏状态 h(t) 的外积(outer product)。这个更新函数如下所示。其快速权重即为过去的贡献(contribution)与随时间衰减的贡献的总和。在数学上,该贡献即为该隐藏状态的外积 h(t)h(t)^T。
A(t) = λA(t − 1) + ηh(t)h(t)^T
hs+1(t + 1) = f([Wh(t) + Cx(t)] + A(t)hs(t + 1))
增加层归一化(LN)技巧使其效果更好。
在标准 RNN 中,循环单元(recurrent units)的输入总和的平均幅度有一个趋势——每一个时间步骤要么会增大、要么会减小,这会导致梯度爆炸或消失。LN 则是在向隐藏单元所接收到的总输入向量应用非线性(ReLU)之前,将该向量归一化到零均值和单位方差。在一个层归一化的 RNN 中,其归一化项使其在该层的所有输入的总和的规模调整时保持不变,这能得到远远更加稳定的隐藏到隐藏动态(hidden-to-hidden dynamics)?
这样有效吗?
任务 1:联想任务
- 假设有一个任务,其多个关键值对(key-value pairs)被表示一个序列,该序列作为输入
- 将该序列转换成一个 R 维度向量,用作该循环隐藏单元的输入
- 检查这个任务的误差率
- 结果表说明 RNN 可以通过 100 个暗隐藏单元(dim hidden unit)解决这个问题,LSTM 可以使用 50 个暗隐藏单元解决它,而快速权重 RNN 只需要 20 个即可。这并不令人惊奇,因为在 FW RNN 中的 20 个暗隐藏单元能比普通 RNN 实现远远更大的容量。问题在于:它能够学习怎么使用这种记忆容量吗?是的,因为 FW RNN 在 R=20 时能达到 1.18% 的误差率。
任务 2 :使用快速权重结合 glimpse
- 视觉注意模型:注意模型已经展现出了能克服 ConvNet 一些缺陷的能力:一是理解 ConvNet 注意的地方;二,注意模型能有选择的关注图像的重要部分。注意模型如何工作?给定一张输入图像,视觉注意模型计算一系列的 glimpse,每个 glimpse 对应图像的一个小区域。视觉注意模型能学习找到图像中的不同物体并对他们进行分类,但它使用的计算 glimpse 的方法过于简化:它使用单尺度的 glimpse,并按照特定的顺序扫描整个图像。然而,人类的眼睛能够在不同的尺度上注意图像的不同部分,并结合整个观察做出正确的决定。改进模型记忆近期 glimpse 的能力,应该可以帮助视觉注意模型发现意义重大的 glimpse 策略。快速权重能学习一个序列中的所有 glimpse,因此隐态可被用于决定如何融合视觉信息,并检索合适的记忆。
- 为了观察快速权重是否有效,想象一个简单的循环视觉注意模型,它不能预测该注意哪里,但却能从不同层级中获得位置的固定序列。该注意模型需要融合 glimpse 信息,从而成功的完成任务。快速权重可使用一个临时缓存来存储 glimpse 计算,而且同一模型的慢权重能融合 glimpse 信息。
- 在 MINST 上评估多级视觉注意模型
- Table 2 展现了带有多级 glimpse 的 ReLU RNN 和带有同样 glimpse 序列的 LSTM 的结果。结果表明在隐藏单元数量有限的情况下,快速权重有更强的记忆能力,也因此表现比 LRNN 和 LSTM 更好。此外,LSTM 也不擅长融合 glimpse,因为 LSTM 有序的处理 glimpse。改变 glimpse 的序列不能改变物体的意义。不像必须要融合一系列 glimpse 的模型,ConvNet 并行处理所有的 glimpse,并使用隐藏单元的层来留取所有的融合,所以它的表现要比序列模型更好。
实现:
https://github.com/jiamings/fast-weights
Hugo Larochelle
所做笔记:
http://www.shortscience.org/paper?bibtexKey=journals/corr/1610.06258#hlarochelle
思考
- 该快速联想记忆模型结合了来自神经科学的思路。
- 该论文没有提到模型在语言相关的任务上的表现,因此在语言任务中用快速权重 RNN 取代 LSTM 会很有趣。
- 该论文表明不能使用 mini-batch,因为每个序列的快速权重矩阵都不同,但与一系列存储的隐藏向量相比却允许 mini-batch。mini-batch 确保我们能利用 GPU 计算能力的优势,但该快速权重模型如何使用 mini-batch 的思路还很模糊。
【本文是51CTO专栏机构机器之心的原创文章,微信公众号“机器之心( id: almosthuman2014)”】