乐趣区

深度学习之增强递归神经网络来了

作者|Olah & Carter
编译|CDA 数据分析师

循环神经网络是深度学习的主要内容之一,允许神经网络处理文本,音频和视频等数据序列。它们可用于将序列分解为高级理解,注释序列,甚至从头开始生成新序列!

基本的 RNN 设计与较长的序列相悖,但是一种特殊的变体 –“长期短期记忆”网络 – 甚至可以使用这些。已经发现这样的模型非常强大,在许多任务中实现了显着的结果,包括翻译,语音识别和图像字幕。结果,在过去几年中,递归神经网络变得非常普遍。

在发生这种情况时,我们已经看到越来越多的尝试用新属性来增强 RNN。四个方向特别令人兴奋:

单独地,这些技术都是 RNN 的有力扩展,但真正引人注目的是它们可以组合在一起,而且似乎只是在更广阔的空间中得分。此外,它们都依赖于相同的潜在技巧 – 一种叫做注意力的工作。

我们的猜测是,这些“增强型 RNN”将在未来几年扩展深度学习能力方面发挥重要作用。

神经图灵机

神经图灵机将 RNN 与外部存储器组合在一起。由于向量是神经网络的自然语言,因此内存是向量数组:

但阅读和写作如何运作?挑战在于我们希望使它们具有差异性。特别是,我们希望使它们在我们读取或写入的位置方面具有可区分性,以便我们可以了解读写的位置。这很棘手,因为内存地址似乎基本上是离散的。NTM 为此采取了一个非常聪明的解决方案:每一步,它们在任何地方读写,只是在不同程度上。

作为一个例子,让我们专注于阅读。RNN 不是指定单个位置,而是输出“注意力分布”,描述我们如何分散我们关心不同记忆位置的量。因此,读取操作的结果是加权和。

同样,我们一次到不同程度地写到处。同样,注意力分布描述了我们在每个位置写了多少。我们通过使存储器中的位置的新值成为旧存储器内容和写入值的凸起组合来实现这一点,其中两者之间的位置由注意力量决定。

但是,NTM 如何决定将记忆中的哪些位置集中注意力?它们实际上使用两种不同方法的组合:基于内容的注意力和基于位置的注意力。基于内容的关注允许 NTM 搜索他们的内存并专注于与他们正在寻找的内容匹配的位置,而基于位置的注意允许内存中的相对移动,使 NTM 循环。

这种读写功能允许 NTM 执行许多以前超出神经网络的简单算法。例如,他们可以学习在内存中存储一个长序列,然后循环遍历它,重复重复它。当他们这样做时,我们可以看到他们读写的地方,以便更好地了解他们正在做的事情:

他们还可以学习模仿查找表,甚至学习排序数字(尽管他们有点欺骗)!另一方面,他们仍然不能做很多基本的事情,比如加或加数。

自最初的 NTM 论文以来,已有许多令人兴奋的论文探索类似的方向。神经 GPU 克服了 NTM 无法增加和增加数字的问题。Zaremba 和 Sutskever 训练 NTM 使用强化学习而不是原始使用的可微分读 / 写。神经随机存取机基于指针的工作。一些论文探讨了可区分的数据结构,如堆栈和队列。和内存网络是另一种攻击类似问题的方法。

在某种客观意义上,这些模型可以执行的许多任务 – 例如学习如何添加数字 – 并不客观地难以实现。传统的节目综合社区将在午餐时吃它们。但是神经网络还有许多其他功能,像神经图灵机这样的模型似乎已经对他们的能力产生了极大的限制。

代码

这些模型有许多开源实现。神经图灵机的开源实现包括 Taehoon Kim(TensorFlow),Shawn Tan(Theano),Fumin(Go),Kai Sheng Tai(火炬)和 Snip(Lasagne)。神经 GPU 出版物的代码是开源的,并放在 TensorFlow 模型库中。Memory Networks 的开源实现包括 Facebook(Torch / Matlab),YerevaNN(Theano)和 Taehoon Kim(TensorFlow)。

注意接口

当我翻译一个句子时,我特别注意我正在翻译的这个词。当我正在录制录音时,我会仔细聆听我正在积极写下的片段。如果你让我描述我正坐在那里的房间,我会瞥一眼我正在描述的物体。

神经网络可以使用注意力实现相同的行为,专注于他们给出的信息子集的一部分。例如,RNN 可以通过另一个 RNN 的输出参加。在每个时间步,它侧重于其他 RNN 中的不同位置。

我们希望注意力是可以区分的,这样我们就可以学会在哪里集中注意力。要做到这一点,我们使用神经图灵机使用的相同技巧:我们专注于各处,只是不同程度。

注意力分布通常是基于内容的注意力产生的。出席的 RNN 生成描述其想要关注的内容的查询。每个项目都使用查询进行点生成,以生成分数,描述它与查询的匹配程度。将得分输入 softmax 以产生注意力分布。

RNN 之间关注的一个用途是翻译。传统的序列到序列模型必须将整个输入分解为单个向量,然后将其扩展回来。注意通过允许 RNN 处理输入传递关于它看到的每个单词的信息来避免这种情况,然后 RNN 生成输出以在它们变得相关时关注单词。

RNN 之间的这种关注还有许多其他应用。它可以用于语音识别,允许一个 RNN 处理音频,然后让另一个 RNN 略过它,在生成成绩单时关注相关部分。

这种关注的其他用途包括解析文本,它允许模型在生成解析树时浏览单词,以及进行对话建模,它让模型在生成响应时关注对话的前面部分。

注意也可以用在卷积神经网络和 RNN 之间的接口上。这允许 RNN 每一步都查看图像的不同位置。这种关注的一种流行用途是用于图像字幕。首先,conv 网络处理图像,提取高级特征。然后运行 RNN,生成图像的描述。由于它在描述中生成每个单词,RNN 侧重于 conv 网对图像相关部分的解释。我们可以明确地想象这个:

更广泛地说,只要想要与其输出中具有重复结构的神经网络接口,就可以使用注意界面。

已经发现注意界面是一种非常通用且功能强大的技术,并且正变得越来越普遍。

自适应计算时间

标准 RNN 对每个时间步进行相同的计算量。这似乎不直观。当事情艰难时,人们应该多考虑一下吗?它还限制 RNN 对长度为 n 的列表进行 O(n)运算。

自适应计算时间是 RNN 每步执行不同计算量的一种方法。全局的想法很简单:允许 RNN 为每个时间步进行多个计算步骤。

为了让网络了解要执行的步骤数,我们希望步数可以区分。我们使用之前使用的相同技巧实现了这一点:我们不是决定运行一系列离散步骤,而是通过运行步骤数来分配注意力。输出是每个步骤的输出的加权组合。

还有一些细节,在上图中省略了。这是一个包含三个计算步骤的时间步骤的完整图表。

这有点复杂,所以让我们一步一步地完成它。在高级别,我们仍在运行 RNN 并输出状态的加权组合:

每个步骤的重量由“停止神经元”决定。它是一个 S 形神经元,它看着 RNN 状态并给出一个停止的重量,我们可以将其视为我们应该在该步骤停止的概率。

暂停权重为 1 的总预算,因此我们跟踪顶部的预算。当它达到低于 epsilon 时,我们停止。

当我们停下来时,可能会有一些剩余的预算停止,因为当它达到低于 epsilon 时停止。我们该怎么办呢?从技术上讲,它将被用于未来的步骤,但我们不想计算这些步骤,因此我们将其归因于最后一步。

在训练自适应计算时间模型时,可以在成本函数中添加“思考成本”项。这会使模型对其使用的计算量进行惩罚。你使用这个术语越大,就越需要权衡性能以降低计算时间。

自适应计算时间是一个非常新的想法,但我们相信它和类似的想法将是非常重要的。

代码

目前唯一的自适应计算时间的开源实现似乎是 Mark Neumann(TensorFlow)。

神经编辑器

神经网络在许多任务中都很出色,但它们也很难做一些基本的事情,比如算法,这在普通的计算方法中是微不足道的。有一种方法可以将神经网络与正常编程融合在一起,并获得两全其美的效果。

神经程序员是一种方法。它学会创建程序以解决任务。实际上,它学会了生成这样的程序 而不需要正确程序的例子。它发现如何制作程序作为完成某项任务的手段。

本文中的实际模型通过生成类似 SQL 的程序来查询表来回答有关表的问题。然而,这里有许多细节使它有点复杂,所以让我们首先想象一个稍微简单的模型,给出一个算术表达式并生成一个程序来评估它。

生成的程序是一系列操作。每个操作都被定义为对过去操作的输出进行操作。因此,操作可能类似于“在前两步添加操作的输出和在步骤前添加操作的输出。”它更像是一个 Unix 管道,而不是一个带有变量分配和读取的程序。

该程序由控制器 RNN 一次生成一个操作。在每个步骤,控制器 RNN 输出下一个操作应该是什么的概率分布。例如,我们可能非常确定我们想要在第一步执行添加,然后很难确定我们是否应该在第二步增加或分割,依此类推 ……

现在可以评估由此产生的操作分布。我们不是在每一步都运行单个操作,而是通常运行所有这些操作的注意技巧,然后将输出平均在一起,加权我们运行该操作的概率。

只要我们可以通过操作定义衍生品,程序的输出就可能性而言是可微的。然后我们可以定义一个损失,并训练神经网络以产生能够给出正确答案的程序。通过这种方式,神经程序员学会了在没有良好程序实例的情况下编写程序。唯一的监督是该计划应该产生的答案。

这是神经程序员的核心思想,但本文中的版本回答了有关表格的问题,而不是算术表达式。还有一些额外的巧妙技巧:

  • 多种类型:神经网络编程器中的许多操作都处理标量数以外的类型。某些操作输出表列的选择或单元格的选择。只有相同类型的输出才能合并在一起。
  • 引用输入:神经程序员需要回答“有多少城市人口超过 1,000,000?”这样的问题,给出一个有人口列的城市表。为了实现这一点,一些操作允许网络引用他们正在回答的问题中的常量或列的名称。这种引用以指针网络的风格引起注意。

神经网络编程器并不是神经网络生成程序的唯一方法。另一个可爱的方法是神经程序员 – 解释器这可以完成许多非常有趣的任务,但需要以正确程序的形式进行监督。

我们认为,弥合传统编程和神经网络之间差距的这个一般空间非常重要。虽然神经网络程序员显然不是最终解决方案,但我们认为从中可以学到很多重要的经验教训。

代码

用于问答的神经程序员的最新版本已由作者开源,并以 TensorFlow 模型的形式提供。Ken Morishita(Keras)还实现了神经程序员 – 解释器。

总结

从某种意义上说,拥有一张纸的人比没有纸的人聪明得多。具有数学符号的人可以解决他们本来无法解决的问题。访问计算机使我们能够获得令人难以置信的壮举,否则这些壮举将远远超出我们。

一般来说,似乎许多有趣的智力形式是人类的创造性启发式直觉与一些更加清晰细致的媒体(如语言或方程式)之间的相互作用。有时,媒体是物理存在的东西,为我们存储信息,防止我们犯错误,或者计算繁重。在其他情况下,媒体是我们操纵的头脑中的模型。无论哪种方式,它似乎对情报至关重要。

机器学习的最新成果已经开始具有这种风格,将神经网络的直觉与其他东西结合起来。一种方法是人们称之为“启发式搜索”。例如,AlphaGo 有一个 Go 如何工作的模型,并探讨游戏如何在神经网络直觉的指导下发挥作用。同样,DeepMath 使用神经网络作为操纵数学表达式的直觉。我们在本文中讨论的“增强型 RNN”是另一种方法,我们将 RNN 连接到工程媒体,以扩展其一般功能。

与媒体互动自然涉及制定一系列行动,观察和采取更多行动。这带来了一个重大挑战:我们如何了解采取哪些行动?这听起来像是强化学习问题,我们当然可以采用这种方法。但强化学习文献实际上正在攻击这个问题的最难版本,其解决方案很难使用。关注的奇妙之处在于它通过部分地采取不同程度的所有动作,为我们提供了一个更容易解决这个问题的方法。这是有效的,因为我们可以设计类似 NTM 内存的媒体 – 允许分数动作并且可以区分。强化学习让我们走一条路,并尝试从中学习。注意在 fork 的每个方向上,然后将路径合并在一起。

注意力的一个主要弱点是我们必须在每一步都采取一切“行动”。这会导致计算成本线性增长,就像增加神经图灵机中的内存量一样。你能想到的一件事就是让你的注意力稀少,这样你只需触摸一些记忆。然而,它仍然具有挑战性,因为你可能想要做一些事情,比如你的注意力取决于记忆的内容,并且天真地强迫你去看每个记忆。我们已经看到了一些初步尝试来解决这个问题,例如,但似乎还有很多工作要做。如果我们真的可以让这种亚线性时间注意力发挥作用,那将是非常强大的!

增强型复现神经网络以及潜在的注意力技术令人难以置信。我们期待看到接下来会发生什么!


搜索···进入···小程序,解锁···更多专业内容和优质资讯,不要错过哟!

退出移动版