RNN 可用于根据过去每日洪水、潮汐和气象数据预测未来每日洪水水位。但是,RNN 也可以用于解决序数或时间问题,例如语言翻译、自然语言处理 (NLP)、情感分析、语音识别和图像字幕。
与传统神经网络(例如前馈神经网络和卷积神经网络 (CNN))一样,循环神经网络使用训练数据进行学习。区别在于它们的“记忆”,因为它们从先前的输入中获取信息,用于影响当前的输入和输出。
传统的深度学习网络假设输入和输出彼此独立,而循环神经网络的输出则取决于序列中的先验元素。虽然未来的事件也有助于确定给定序列的输出,但单向循环神经网络无法在其预测中解释这些事件。
我们用一个俗语来辅助解释 RNN,例如 “feeling under the weather” 通常用来形容某人生病了。为了赋予这个俗语意义,需要以特定的顺序来进行表达。因此,循环网络需要考虑俗语中每个单词的位置,并利用这些信息来预测序列中的下一个单词。
短语 “feeling under the weather” 中的每个单词都是序列的一部分,其中顺序很重要。RNN 通过在每个时间步长维护隐藏状态来跟踪上下文。通过将隐藏状态从一次性步骤传递到下一个步骤来创建反馈循环。隐藏状态充当存储有关先前输入的信息的记忆。在每个时间步长,RNN 都会处理当前输入(例如,句子中的单词)以及来自前一个时间步长的隐藏状态。这让 RNN 能够“记住”以前的数据点,并使用该信息来影响当前的输出。
循环网络的另一个显著特征是它们在网络的每一层共享参数。前馈网络在每个节点上具有不同的权重,而循环神经网络在网络的每一层内共享相同的权重参数。也就是说,这些权重仍然在反向传播和梯度下降过程中进行调整,以促进强化学习。
循环神经网络使用前向传播和通过时间的反向传播 (BPTT) 算法来确定梯度(或倒数),专门针对序列数据,因此与传统的反向传播略有不同。BPTT 的原理与传统的反向传播相同,即模型通过计算从输出层到输入层的误差进行自我训练。这些计算可支持我们适当调整和拟合模型的参数。BPTT 与传统方法的不同之处在于,BPTT 对每个时间步长的误差进行求和,而前馈网络不需要对误差进行求和,因为它们不会在每一层共享参数。
激活函数是一种数学函数,应用于网络中每一层神经元的输出,以便引入非线性,并支持网络阐明数据中的复杂模式。如果没有激活函数,RNN 将仅计算输入的转变,因此无法处理非线性问题。非线性对于学习和建模复杂模式至关重要,尤其是在 NLP、时间序列分析和序列数据预测等任务中。
激活函数控制神经元输出的幅度,将值保持在指定范围内(例如,介于 0 和 1 之间或 -1 和 1 之间),这样有助于防止值在向前和向后传递期间增长得过大或过小。在 RNN 中,激活函数在每个时间步长都应用于隐藏状态,控制网络如何根据当前输入和过去的隐藏状态更新其内部记忆(隐藏状态)。
常见的激活函数(如下图所示)包括:
Sigmoid 函数是将输出解释为概率或控制决定保留或忘记多少信息的门。然而,sigmoid 函数容易出现梯度消失问题(后文进行解释),使其不太适合更深度的网络。
Tanh(双曲正切)函数之所以经常使用,是因为它输出以零为中心的值,这有助于改善梯度流,更容易学习长期依赖关系。
ReLU(修正线性单元)由于其无约束的特性,可能会导致梯度爆炸的问题。不过,Leaky ReLU 和 Parametric ReLU 等版本已用于缓解其中一些问题。
如需进一步了解 RNN 的工作原理,请查看我们的循环神经网络深度探究。
前馈网络将输入和输出一对一进行映射,虽然我们在此之前的图中已经以这种方式可视化了循环神经网络,但它们没有这个约束。相反,它们的输入和输出长度可能各不相同,并且不同类型的 RNN 可用于不同的用例,例如音乐生成、情绪分类和机器翻译。热门的循环神经网络架构版本包括:
RNN 的最基础版本是每一时间步长的输出都取决于当前输入和上一时间步长的隐藏状态,它存在梯度消失等问题,因此很难学习长期依赖关系。它们擅长完成具有短期依赖性的简单任务,如预测句子中的下一个单词(对于简单的短句)或简单时间序列中的下一个值。
RNN 非常适合实时按序列处理数据的任务,例如处理传感器数据以检测短时间内的异常,此时一次接收一个输入,并需要根据最新的输入立即做出预测。
单向 RNN 只能从先前输入中抽取数据,做出有关当前状态的预测;而双向循环神经网络 (BRNN) 还可以拉取未来的数据,从而提高预测的准确性。回到前面“feeling under the weather”的示例,如果基于 BRNN 的模型知道序列中的最后一词是“weather”,它就更有可能预测词组中的第二个词是“under”。
LSTM 是一款热门的 RNN 架构,由 Sepp Hochreiter 和 Juergen Schmidhuber 提出,作为梯度消失问题的解决方案。这项工作解决了长期依赖的问题。也就是说,如果影响当前预测的先前状态不是最近的状态,则 RNN 模型可能无法准确预测当前状态。
例如,假设我们想要预测这句话中的斜体单词,“Alice 对坚果过敏。她不能吃花生酱。”坚果过敏的背景可以帮助我们预测不能吃的食物含有坚果。但是,如果这个背景来自再之前的几句话,那么 RNN 将难以甚至不可能连接信息。
为了解决这个问题,LSTM 网络在人工神经网络的隐藏层中设有“单元”,其中有 3 个门:输入门、输出门和遗忘门。这些门控制着预测网络输出所需的信息流。例如,如果第三人称代词(例如“她”)在前面的句子中多次重复出现,则可以将其从单元状态中排除。
GRU 类似于 LSTM,也可以解决 RNN 模型的短期记忆问题。但是它不使用“元胞状态”调节信息,而是使用隐藏状态;它使用 2 个门(而非 3 个门):一个重置门和一个更新门。类似于 LSTM 中的门,重置门和更新门控制要保留哪些信息以及保留多少信息。
由于其架构更简洁,GRU 计算效率更高,且需要的参数更少。这使得它们的训练速度更快,并且通常更适合某些实时或资源受限的应用程序。
这些通常用于序列到序列任务,如机器翻译。编码器将输入序列处理为固定长度的向量(上下文),解码器则使用该上下文生成输出序列。不过,固定长度的上下文向量可能会成为瓶颈,尤其是对于较长的输入序列。
RNN 在人工智能中的使用有所减少,特别实在转换器模型等架构中,但 RNN 并未过时。RNN 传统上在序列数据处理(例如,时间序列和语言建模)中很受欢迎,因为它们能够处理时间依赖性。
然而,RNN 在梯度消失和梯度爆炸问题上的弱点,以及 BERT 和 GPT 等转换器模型的兴起,导致了这种减少。转换器可以更有效地捕获远程依赖关系,更容易并行化,并且在 NLP、语音识别和时间序列预测等任务上性能更优。
尽管如此,RNN 仍在其序列性质和记忆机制发挥作用的特定环境中使用,特别是在较小、资源受限的环境中,或者用于数据处理优点于逐步递归的任务。
针对那些想尝试此类用例的人而言,Keras 是一个受欢迎的开源库,现已集成到 TensorFlow 库中,为 RNN 提供 Python 接口。该 API 专为易于使用和自定义而设计,以便用户能够使用自定义行为定义自己的 RNN 单元层。
深入了解神经网络、其基本功能以及构建神经网络的基础知识。
IBM Granite 是我们开放式、性能优异、值得信赖的 AI 模型系列,专门为企业量身定制,并经过优化,可以帮助您扩展 AI 应用程序。深入了解语言、代码、时间序列和护栏选项。
我们对 2,000 家组织进行了调查,旨在了解他们的 AI 计划,以发现哪些方法有效、哪些方法无效,以及如何才能取得领先。
了解如何自信地将生成式 AI 和机器学习融入您的业务中。