Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

高璇 张倩参与

将RNN内存占用缩小90%:多伦多大学提出可逆循环神经网络

循环神经网络(RNN)在处理序列数据方面取得了当前最佳的性能表现,但训练时需要大量内存。可逆循环神经网络提供了一个减少训练内存需求的路径,因为隐藏状态不需要存储,而是可以在反向传播过程中重新计算。本文首先展示了不需要存储隐藏激活的完全可逆 RNN 从根本上是有限制的,因为它们不能忘记隐藏状态的信息。然后,研究人员提供了一个存储少量比特的方案,使遗忘信息实现完全逆转。本文的方法实现了与传统模型相当的性能,但所需内存只占传统模型的 1/10 到 1/15。

循环神经网络(RNN)在语音识别 [1]、语言建模 [2,3] 和机器翻译 [4,5] 等多种任务上都取得了极优的性能。然而,训练 RNN 需要大量的内存。标准的训练算法是时间截断的反向传播(TBPTT)[6,7]。该算法将输入序列划分为较短的子序列 T,然后对每个子序列进行处理,并对梯度进行反向传播。如果模型隐藏状态的大小为 H,那么 TBPTT 所需的内存是 O(T H)。

减少 TBPTT 算法对内存的需求会增加被截断序列的长度 T,从而抓取更长的时间尺度上的相关性。也可以增加隐藏状态的大小 H,或者利用更深层的输入到隐藏、隐藏到隐藏或隐藏到输出转换,从而赋予模型更强的表达能力。增加这些转换的深度可以提高复调音乐预测、语言建模和神经机器翻译(NMT)的性能 [8,9,10]。

可逆循环网络架构提供了一种降低 TBPTT 内存需求的方法。可逆架构实现了在给定下一个隐藏状态和当前输入的当前时间步上的隐藏状态重建,这样无需在每个时间步上存储隐藏状态就能执行 TBPTT。代价就是要增加计算成本来重建反向传播过程中的隐藏状态。

本文首先介绍了广泛使用的门控循环单元(GRU)[11] 和长短期记忆(LSTM)[12] 架构的可逆相似架构。然后证明,任何不需要存储隐藏激活的完全可逆的 RNN,在一个简单的一步预测任务中都会失败。即使这个任务对于普通的 RNN 很简单,但在完全可逆模型中却失败了,因为它们需要记住输入序列才能完成任务。根据这一发现,研究人员扩展了 Maclaurin 等人 [13] 的高效内存反转法,在每个单元中存储少量的比特,以对遗忘信息的架构进行完全逆转。

研究人员在语言建模和神经机器翻译基准上评估了这些模型的性能。根据任务、数据集和所选架构,可逆模型(无注意力机制)所需内存只占传统模型的 1/10 到 1/15。可逆模型在 Penn TreeBank 数据集 [14] 上的词级语言建模任务中得到了与传统的 LSTM 模型和 GRU 模型相似的性能,在 WikiText-2 数据集 [15] 上比传统模型困惑度落后 2-5 个点。

使用基于注意力的循环序列到序列模型来节省内存是很困难的,因为为执行注意力机制,编码器的隐藏状态必须同时保存在内存中。对与嵌入词相连的隐藏状态的子集执行注意力机制,可以解决这一问题。使用这种技术后,可逆模型在神经机器翻译任务中取得了成功,在 Multi30K 数据集 [16] 上的性能优于基线 GRU 和 LSTM 模型,并在 IWSLT 2016[17] 基准上取得了很有竞争力的表现。使用该技术可以将内存在解码器中减少到原来的 1/10-1/15,在编码器中减少到原来的 1/5-1/10。

论文:Reversible Recurrent Neural Networks

论文链接:https://arxiv.org/pdf/1810.10999v1.pdf

摘要:循环神经网络(RNN)在处理序列数据方面取得了当前最佳的性能表现,但训练时需要大量的内存,限制了可训练的 RNN 模型的灵活性。可逆的 RNN-RNN 可以对其进行隐藏状态到隐藏状态的转换,提供了一个减少训练内存需求的路径,因为隐藏状态不需要存储,而是可以在反向传播过程中重新计算。我们首先展示了不需要存储隐藏激活的完全可逆 RNN,从根本上是有限制的,因为它们不能忘记隐藏状态的信息。然后,我们提供了一个存储少量比特的方案,使遗忘信息实现完全逆转。我们的方法实现了与传统模型相当的性能,同时激活内存开销变为原来的 1/10-1/15。然后我们将技术扩展到基于注意力的序列到序列模型,在这种模型中性能不变,但将内存开销在解码器中减少到原来的 1/10-1/15,在编码器中减少到原来的 1/5-1/10。

3 可逆循环架构

构建 RevNet 的技术可以与传统的 RNN 模型相结合,生成可逆的 RNN。在本节中,我们提出了类似 GRU 和 LSTM 的可逆架构。

3.1 可逆 GRU

我们首先回顾一下,在给定当前隐藏状态 h^(t) 和当前输入 x^(t)(省略偏差)时计算下一个隐藏状态 h^(t+1) 的 GRU 方程:

方程中的⊙表示元素的乘法。为了使更新可逆,我们将隐藏状态 h 分成两组,h = [h_1; h_2]。使用以下规则更新这些组:

注意,h_1^(t) 和非 h_1^(t-1) 用于计算 h_2^(t) 的更新。我们把这个模型称为可逆门控循环单元或 RevGRU。

3.2 可逆 LSTM

接下来构造一个可逆的 LSTM。该 LSTM 将隐藏状态分为输出状态 h 和单元状态 c,更新方程为:

我们不能直接使用我们的可逆方法,因为 h^(t) 的更新不是 h^(t-1) 的非零线性变换。尽管如此,可通过使用如下方程来实现可逆:

我们使用 c_1^(t) 和 h_1^(t),利用与上述等式相同的方式计算 c_2、h_2 的更新。我们将此模型称为可逆 LSTM 或 RevLSTM

3.3 有限精度算法的可逆性

我们已经定义了在精准算法中可逆的 RNN。但在实际中,由于数值精度有限,隐藏状态不能被完全地重建。考虑 RevGRU 方程 4 和 5,如果隐藏状态 h 存储在固定点中,则将 h 乘以 z(其条目小于 1)会破坏信息,从而阻止完全重建。例如,将隐藏单位乘以 1/2 相当于丢弃最低位字节,其值在反向计算中无法恢复。信息丢失的这些误差在时间步长上呈指数级累积,导致通过反转获得的初始隐藏状态与真实的初始状态相去甚远。同样的问题也会影响 RevLSTM 隐藏状态的重建。因此,我们发现遗忘是构建完全可逆的循环架构的主要障碍。

解决这一问题有两种可行途径。首先是移除遗忘步骤。对于 RevGRU,这意味着我们像以前一样计算 z_i^(t) 、 r_i^(t) 和 g_i^(t),并使用以下方法更新 h_i^(t):

我们将此模型称为无遗忘(No-Forgetting)RevGRU 或 NF-RevGRU。因为 NFRevGRU 的更新不会丢弃信息,所以在给定时间内的训练过程中,我们只需要在内存中存储一个隐藏状态即可。可以采用类似的步骤定义 NF-RevLSTM

第二种方法是接受一些内存使用,并将从隐藏状态中遗忘的信息存储在前向传播中。然后,我们可以在反向计算中将这些信息还原到隐藏状态,以实现完全重建。具体内容将在第 5 节中详细讨论。

4 No Forgetting 的不可能性

我们已经证明,如果不丢弃任何信息,可以构造出具有有限精度的可逆 RNN。我们无法找到能够在语言建模之类的任务上获得理想性能的架构。这与之前发现的遗忘对 LSTM 性能至关重要是一致的 [23,24]。在本节中,我们认为这是由不可遗忘可逆模型的一个基本限制造成的:如果任何隐藏状态都不能被遗忘,那么任何给定时间步上的隐藏状态必须包含足够的信息,来重建所有以前的隐藏状态。因此,在一个时间步长上存储在隐藏状态中的任何信息都必须保留在将来的所有时间步上,以确保精准重构,这超过了模型的存储容量。

图 1:在重复任务上展开完全可逆模型的反向计算,得到序列到序列的计算。左:重复任务本身,模型重复每个输入指令。右:展开反转。模型有效利用最终隐藏状态来重构所有输入指令,这意味着整个输入序列必须存储在最终隐藏状态中。

5 遗忘的可逆性

由于零遗忘不可能实现,我们不得不探索实现可逆性的第二种方案:在前向计算中存储隐藏状态丢失的信息,在反向计算中恢复信息。最开始我们研究了只允许遗忘一个整数位的离散遗忘。这导致:如果前向传递中遗忘了 n 位字节,我们可以将这 n 位字节存储在堆栈中,在重构期间弹出并恢复到隐藏状态。但是,与基线模型相比,限制我们的模型仅仅遗忘整数位字节就会导致性能大幅下降。本文接下来的内容会侧重只遗忘一小部分字节的部分遗忘。

5.2 注意力机制下的内存节省

图 2:NMT 的注意力机制词嵌入、编码器隐藏状态和解码器隐藏状态分别用橙色、蓝色和绿色表示;编码器隐藏状态的条纹区域表示为注意力机制而存储在内存中的部分。用于计算上下文向量的最后几个向量连接了词嵌入和编码器隐藏状态。

6 实验

表 1:Penn TreeBank 词级语言建模上的验证困惑度(内存节省)。在没有限制的情况下,当遗忘被限制在 2 位、3 位和 5 位比特时,每个隐藏单元每个时间步的结果显示如表。

表 2: WikiText-2 词级语言建模上的验证困惑度。在没有限制的情况下,当遗忘被限制在 2 位、3 位和 5 位比特时,每个隐藏单元每个时间步的结果显示如表。

表 3:不同的遗忘限制下 Multi30K 数据集的性能。P 为测试 BLEU 分数;M 表示编码器在训练期间平均节省的内存。

理论RNN
4
相关数据
重构技术

代码重构(英语:Code refactoring)指对软件代码做任何更动以增加可读性或者简化结构而不影响输出结果。 软件重构需要借助工具完成,重构工具能够修改代码同时修改所有引用该代码的地方。在极限编程的方法学中,重构需要单元测试来支持。

神经机器翻译技术

2013 年,Nal Kalchbrenner 和 Phil Blunsom 提出了一种用于机器翻译的新型端到端编码器-解码器结构 [4]。该模型可以使用卷积神经网络(CNN)将给定的一段源文本编码成一个连续的向量,然后再使用循环神经网络(RNN)作为解码器将该状态向量转换成目标语言。他们的研究成果可以说是神经机器翻译(NMT)的诞生;神经机器翻译是一种使用深度学习神经网络获取自然语言之间的映射关系的方法。NMT 的非线性映射不同于线性的 SMT 模型,而且是使用了连接编码器和解码器的状态向量来描述语义的等价关系。此外,RNN 应该还能得到无限长句子背后的信息,从而解决所谓的「长距离重新排序(long distance reordering)」问题。

基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

词嵌入技术

词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。

注意力机制技术

我们可以粗略地把神经注意机制类比成一个可以专注于输入内容的某一子集(或特征)的神经网络. 注意力机制最早是由 DeepMind 为图像分类提出的,这让「神经网络在执行预测任务时可以更多关注输入中的相关部分,更少关注不相关的部分」。当解码器生成一个用于构成目标句子的词时,源句子中仅有少部分是相关的;因此,可以应用一个基于内容的注意力机制来根据源句子动态地生成一个(加权的)语境向量(context vector), 然后网络会根据这个语境向量而不是某个固定长度的向量来预测词。

机器翻译技术

机器翻译(MT)是利用机器的力量「自动将一种自然语言(源语言)的文本翻译成另一种语言(目标语言)」。机器翻译方法通常可分成三大类:基于规则的机器翻译(RBMT)、统计机器翻译(SMT)和神经机器翻译(NMT)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

门控循环单元技术

门控循环单元(GRU)是循环神经网络(RNN)中的一种门控机制,与其他门控机制相似,其旨在解决标准RNN中的梯度消失/爆炸问题并同时保留序列的长期信息。GRU在许多诸如语音识别的序列任务上与LSTM同样出色,不过它的参数比LSTM少,仅包含一个重置门(reset gate)和一个更新门(update gate)。

语音识别技术

自动语音识别是一种将口头语音转换为实时可读文本的技术。自动语音识别也称为语音识别(Speech Recognition)或计算机语音识别(Computer Speech Recognition)。自动语音识别是一个多学科交叉的领域,它与声学、语音学、语言学、数字信号处理理论、信息论、计算机科学等众多学科紧密相连。由于语音信号的多样性和复杂性,目前的语音识别系统只能在一定的限制条件下获得满意的性能,或者说只能应用于某些特定的场合。自动语音识别在人工智能领域占据着极其重要的位置。

序列到序列技术

推荐文章
暂无评论
暂无评论~