Apple 的 Siri 和 Google 的语音搜索都使用循环神经网络 (RNN),这是处理序列数据的最先进方法。它是第一个具有记住其输入的内部存储器的算法,非常适合解决机器学习中涉及顺序数据的问题。它是过去几年深度学习取得令人难以置信的进步的算法之一。在本文中,我们将讨论循环神经网络的基础知识,以及最紧迫的困难以及如何解决它们。
用于建模序列数据的深度学习方法是循环神经网络 (RNN)。在注意力模型出现之前,RNN 是处理序列数据的标准建议。深度前馈模型可能需要序列中每个元素的特定参数。它也可能无法推广到可变长度序列。
循环神经网络对序列的每个元素使用相同的权重,从而减少参数的数量并允许模型泛化到不同长度的序列。由于其设计,RNN 可以推广到除顺序数据之外的结构化数据,例如地理或图形数据。
与许多其他深度学习技术一样,递归神经网络相对较旧。它们最初是在 年代开发的,但直到最近我们才意识到它们的全部潜力。 年代长短期记忆 (LSTM) 的出现,加上计算能力的提高和我们现在必须处理的大量数据,确实将 RNN 推到了最前沿。
神经网络在人工智能、机器学习和深度学习领域模仿人脑的功能,使计算机程序能够识别模式并解决常见问题。
RNN 是一种可用于对序列数据进行建模的神经网络。RNN 由前馈网络形成,其行为类似于人类大脑。简单地说,循环神经网络可以以其他算法无法预测的方式预测顺序数据。
标准神经网络中的所有输入和输出都是相互独立的,但是在某些情况下,例如在预测短语的下一个单词时,前面的单词是必要的,因此必须记住前面的单词。因此,创建了 RNN,它使用隐藏层来克服这个问题。RNN 最重要的组成部分是隐藏状态,它记住有关序列的特定信息。
RNN 有一个内存,用于存储有关计算的所有信息。它对每个输入使用相同的设置,因为它通过对所有输入或隐藏层执行相同的任务来产生相同的结果。
RNN 是一种具有隐藏状态并允许将过去的输出用作输入的神经网络。他们通常是这样的:
RNN 架构可能因您要解决的问题而异。从具有单一输入和输出的那些到具有许多(之间有差异)的那些。下面是一些 RNN 架构示例,可以帮助您更好地理解这一点。
一对一:这里只有一对。传统的神经网络使用一对一的架构。
一对多: 一对多网络中的单个输入可能会导致大量输出。例如,在音乐制作中使用了太多网络。
多对一: 在这种情况下,通过组合来自不同时间步的许多输入来产生单个输出。情感分析和情感识别使用这样的网络,其中类标签由一系列单词确定。
多对多: 对于多对多,有很多选择。两个输入产生三个输出。机器翻译系统,例如英语到法语或反之翻译系统,使用多对多网络。
循环神经网络中的信息通过一个循环循环到中间隐藏层。
输入层x接收并处理神经网络的输入,然后将其传递到中间层。
在中间层h中可以找到多个隐藏层,每个隐藏层都有自己的激活函数、权重和偏差。如果不同隐藏层的各种参数不受前一层影响,则可以使用循环神经网络,即神经网络中没有记忆。
不同的激活函数、权重和偏差将由循环神经网络标准化,确保每个隐藏层具有相同的特征。它不会构建许多隐藏层,而是只创建一个并根据需要循环多次。
神经元的激活功能决定了它应该被打开还是关闭。非线性函数通常将神经元的输出转换为 到 或 - 到 之间的数字。
以下是一些最常用的功能:
Sigmoid:公式g(z) = /( + e ^- z)用于表达这一点。
Tanh:公式g(z) = (e^-z – e^-z)/(e^-z + e^-z)用于表达这一点。
Relu:公式g(z) = max( , z)用于表达这一点。
前馈神经网络只有一条信息流路径:从输入层到输出层,经过隐藏层。数据以直线路径在网络中流动,从不通过同一个节点两次。RNN 和前馈神经网络之间的信息流如下图所示。
前馈神经网络对接下来会发生什么的预测很差,因为它们对接收到的信息没有记忆。因为它只是分析当前输入,所以前馈网络不知道时间顺序。除了训练之外,它对过去发生的事情没有任何记忆。
信息通过一个循环在一个 RNN 循环中。在做出判断之前,它会评估当前输入以及从过去输入中学到的内容。另一方面,循环神经网络可能会由于内部记忆而回忆。它产生输出,复制它,然后将它返回到网络。
当我们将反向传播算法应用于以时间序列数据作为输入的循环神经网络时,我们称其为时间反向传播。
在正常的 RNN 中,一次将单个输入发送到网络中,并获得单个输出。另一方面,反向传播使用当前和先前的输入作为输入。这称为时间步长,一个时间步长将由同时进入 RNN 的多个时间序列数据点组成。
神经网络的输出用于计算和收集错误,一旦它在时间集上训练并给你一个输出。然后将网络回滚,并重新计算和调整权重以解决故障。
RNN 必须克服两个关键挑战,但为了理解它们,首先必须了解梯度是什么。
关于其输入,梯度是偏导数。如果您不确定这意味着什么,请考虑一下:梯度量化了当输入发生轻微变化时函数的输出变化的程度。
函数的斜率也称为梯度。斜率越陡,模型学习得越快,梯度就越高。另一方面,如果斜率为零,该模型将停止学习。梯度用于测量所有权重相对于误差变化的变化。
爆炸梯度:当算法无缘无故地赋予权重一个荒谬的高优先级时,就会发生梯度爆炸。幸运的是,截断或压缩梯度是解决这个问题的简单方法。
梯度消失:当梯度值太小时,会出现梯度消失,导致模型停止学习或花费太长时间。这在 年代是一个大问题,比爆炸梯度更难解决。幸运的是,Sepp Hochreiter 和 Juergen Schmidhuber 的 LSTM 概念解决了这个问题。