循环神经网络(RNN)是深度学习的核心组成部分,能够处理文本、音频和视频等序列数据。它们可以将序列压缩为高级理解、对序列进行标注,甚至从头生成新序列。然而,基础RNN设计在处理长序列时存在局限,而长短期记忆网络(LSTM)1 能够有效应对这一挑战,在翻译、语音识别和图像标注等任务中取得显著成果。
近年来,出现了多种增强RNN的新方法,其中四个方向尤为突出:
这些技术都是RNN的强大扩展,但最引人注目的是它们可以组合使用,并且似乎只是一个更广阔空间中的点。更重要的是,它们都依赖于相同的底层技巧——注意力机制。
神经图灵机(NTM)2 将RNN与外部存储库结合。由于向量是神经网络的天然语言,存储库是一个向量数组:
读写操作如何工作?关键是要使其可微分,特别是对于读写位置的可微分,以便学习读写位置。NTM采用了一种巧妙的解决方案:每一步都进行全局读写,只是程度不同。
以读取为例,RNN输出一个"注意力分布",描述如何分配对不同存储位置的关注程度。读取结果是加权和。
写入操作同样全局进行,注意力分布描述每个位置的写入程度。存储位置的新值是旧内存内容与写入值的凸组合,由注意力权重决定。
NTM通过两种方法决定关注哪些内存位置:基于内容的注意力和基于位置的注意力。基于内容的注意力允许NTM搜索内存并聚焦于匹配内容,而基于位置的注意力允许在内存中相对移动,使NTM能够循环。
这种读写能力使NTM能够执行许多简单算法,例如学习存储长序列并循环回放。它们还可以学习模拟查找表甚至排序数字(虽然有些取巧!)。
自原始NTM论文以来,出现了许多令人兴奋的研究方向。神经GPU 4 克服了NTM无法进行数字加减乘除的局限。Zaremba和Sutskever 5 使用强化学习而不是可微分读写来训练NTM。神经随机访问机器 6 基于指针工作。还有一些研究探索了可微分数据结构,如堆栈和队列 7,8。记忆网络 9,10 是解决类似问题的另一种方法。
在翻译句子时,会特别关注当前正在翻译的词语;在转录音频时,会仔细聆听正在记录的部分;描述所在房间时,会扫视正在描述的物体。
神经网络可以通过注意力实现相同行为,聚焦于给定信息的子集。例如,一个RNN可以关注另一个RNN的输出,在每个时间步聚焦于另一个RNN的不同位置。
为了使注意力可微分,使用与NTM相同的技巧:全局聚焦,只是程度不同。
注意力分布通常通过基于内容的注意力生成。参与注意的RNN生成描述想要关注内容的查询,每个项目与查询进行点积产生匹配分数,分数通过softmax转换为注意力分布。
RNN间注意力的一个应用是翻译 11。传统序列到序列模型必须将整个输入压缩为单个向量再扩展出来,而注意力通过允许处理输入的RNN传递每个词语的信息,并在生成输出时关注相关词语来避免这一问题。
这种RNN间注意力还有多种其他应用:可用于语音识别 12,允许一个RNN处理音频,另一个RNN在生成转录时浏览并关注相关部分;可用于文本解析 13,让模型在生成解析树时查看词语;还可用于对话建模 14,让模型在生成响应时关注对话的先前部分。
更广泛地说,只要需要与具有重复输出结构的神经网络接口,就可以使用注意力接口。注意力接口已被证明是一种极其通用和强大的技术,正变得越来越普及。
标准RNN每个时间步进行相同量的计算,这似乎不直观。显然,困难时应该思考更多?这也将RNN限制为对长度为n的列表进行O(n)操作。
自适应计算时间 15 是RNN每个步骤进行不同计算量的方法。总体思路简单:允许RNN每个时间步进行多个计算步骤。
为了使网络学习需要多少步骤,希望步骤数可微分。通过与之前相同的技巧实现:不是决定运行离散数量的步骤,而是对要运行的步骤数具有注意力分布。输出是每个步骤输出的加权组合。
每个步骤的权重由"停止神经元"确定。这是一个sigmoid神经元,查看RNN状态并给出停止权重,可视为在该步骤停止的概率。
总停止权重预算为1,沿顶部跟踪该预算。当预算小于epsilon时停止。停止时可能剩余一些停止预算,因为预算小于epsilon时停止,技术上这些预算分配给未来步骤但不计算,因此将其归因于最后一步。
训练自适应计算时间模型时,在成本函数中添加"思考成本"项,惩罚模型使用的计算量。该项越大,模型越会权衡性能与降低计算时间。
自适应计算时间是一个非常新的想法,但我们相信它及类似想法将非常重要。
神经网络擅长许多任务,但在算术等基础操作上表现不佳,而这些在传统计算方法中很简单。能够将神经网络与正常编程融合,获得两者优势将非常好。
神经程序员 16 是一种解决方法。它学习创建程序来解决任务,实际上不需要正确程序的示例就能学习生成程序,通过发现如何生成程序作为完成任务的手段。
论文中的实际模型通过生成类似SQL的程序查询表格来回答关于表格的问题。但有许多细节使其复杂,因此首先想象一个更简单的模型:给定算术表达式,生成评估程序。
生成的程序是操作序列。每个操作定义对过去操作输出进行操作,例如"将2步前操作输出和1步前操作输出相加"。更像Unix管道而不是分配和读取变量的程序。
程序由控制器RNN逐步生成。每一步,控制器RNN输出下一个操作的概率分布。例如,第一步可能非常确定要执行加法,第二步可能难以决定是乘法还是除法,等等。
产生的操作分布现在可以评估。不是每步运行单个操作,而是通过注意力技巧运行所有操作,然后按运行该操作的概率加权平均输出。
只要能够定义通过操作的导数,程序输出对概率就可微分。然后可以定义损失,并训练神经网络产生给出正确答案的程序。这样,神经程序员学习生成程序而无需优秀程序示例,唯一监督是程序应产生的答案。
这是神经程序员的核心思想,但论文中的版本回答关于表格的问题而不是算术表达式。还有一些额外技巧:
神经程序员不是让神经网络生成程序的唯一方法。另一个可爱的方法是神经程序员解释器 18,可以完成许多非常有趣的任务,但需要正确程序形式的监督。
我们认为这个 bridging 传统编程与神经网络之间差距的广阔空间极其重要。虽然神经程序员显然不是最终解决方案,但我们认为从中可以学到许多重要教训。
拥有纸张的人类在某种意义上比没有时更聪明;拥有数学符号的人类能够解决原本无法解决的问题;使用计算机使我们能够完成原本远超出能力范围的壮举。
许多有趣的智能形式似乎是人类创造性启发式直觉与某种更清晰谨慎媒介(如语言或方程)之间的交互。有时,媒介是物理存在的东西,为我们存储信息,防止我们犯错或进行计算繁重工作;其他时候,媒介是我们操作的心理模型。无论哪种方式,这似乎是智能的基础。
机器学习的最新结果开始具有这种风格,将神经网络直觉与其他东西结合。一种方法可称为"启发式搜索",例如AlphaGo 19 拥有围棋工作原理模型,并在神经网络直觉指导下探索游戏可能展开方式。类似地,DeepMath 20 使用神经网络作为操作数学表达式的直觉。本文讨论的"增强RNN"是另一种方法,将RNN连接到工程化媒介以扩展其通用能力。
与媒介交互自然涉及一系列采取行动、观察和采取更多行动的过程。这带来了重大挑战:如何学习应采取哪些行动?这听起来像强化学习问题,当然可以采用这种方法。但强化学习文献真正攻击的是这个问题的最难版本,其解决方案难以使用。注意力的美妙之处在于,它通过不同程度地部分采取所有行动,为这个问题提供了更简单的出路。这是因为我们可以设计媒介(如NTM内存)来允许分数行动并可微分。强化学习让我们采取单一路径并尝试从中学习,而注意力在岔路口走向每个方向,然后将路径合并回来。
注意力的一个主要弱点是每一步必须采取每个"行动",这导致计算成本随着增加NTM内存等操作而线性增长。可以想象让注意力稀疏,只接触某些内存,但这仍然具有挑战性,因为可能希望让注意力依赖于内存内容,而天真地这样做会强制查看每个内存。我们已经看到一些初步尝试攻击这个问题,如 21,但似乎还有很多工作要做。如果真能使这种次线性时间注意力工作,那将非常强大!
增强循环神经网络及其底层注意力技术令人极其兴奋,我们期待看到接下来的发展!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。