Photo by Hal Gatewood on Unsplash

机器学习中的循环神经网络

大多数类型的数据和信息,如文本、语音、时间序列数据等,可以用连续结构来表示。鉴于其广泛的用例和应用,研究人员一直对创建能够理解连续信息的AI模型感兴趣。循环神经网络(RNNs)是一类神经网络,旨在通过捕获随时间变化的依赖关系和模式来处理连续数据。它的基础和历史可以追溯到神经网络的早期发展和对连续信息进行有效建模和处理的愿望。

自然语言也是顺序信息,因为它由一系列以特定顺序排列的单词或字符组成,用于传达意义和表达思想、观点或指令。因此,循环神经网络(RNN)在自然语言处理领域也被广泛应用,并为现今的高级AI NLP模型铺平了道路。在本文中,我们将探讨RNN的内部细节,同时为更高级的神经网络做好准备。

神经网络中的记忆

为了理解和处理顺序数据,神经网络必须能够保持记忆并在时间上捕捉依赖关系,这对于涉及顺序数据处理的任务非常关键,比如语言建模、语音识别和时间序列分析。传统的神经网络包含输入层、多个隐藏层和输出层。这不允许它在时间上保持上下文,因为它只关心当前的输入,并使用隐藏层神经元生成所需的输出,这可以用于分类或预测目的。

RNN 的作用在于通过将隐藏层替换为循环连接层,来保持神经网络的上下文,这个循环连接层会保持过去输入的内部状态或记忆(也被称为隐藏状态),然后使用这个内部状态和新的输入来生成输出。这使得 RNN 能够将过去输入的记忆融入新的输出中,因此能够随时间保持上下文。

一个顺序输入通常被表示为在不同时间步骤上的一系列对象,第一个对象在时间步骤t1上,第二个对象在时间步骤t2上,依此类推。在本文的其余部分,我们经常会用时间步来提及输入、输出和内部状态。

RNN的内部状态,通常称为隐藏状态,是在每个时间步长上使用输入向量和先前隐藏状态进行更新的。此更新通过将一组权重和激活函数应用于输入和先前隐藏状态来完成。隐藏状态作为截至该点接收到的信息的摘要,并携带了先前时间步长的上下文和记忆。

一个基本的RNN如下所示

Image displaying the layout of a basic RNN. On the left we have the simple RNN architecture and on the right we have the same RNN showing its state at different time steps t-1, t and t+1 and so on, for a sequential input. x represents input state, h is the hidden state and o represents output state.

在上图中,您可以看到基本RNN的3层。主要的区别是隐藏层或循环连接层。让我们更仔细地看一下上述每个组件的含义。

权重(梯度)和偏差

就像传统的深度学习网络一样,循环神经网络(RNN)也有权重和偏差来控制对输入和隐藏状态的转换。这些权重是通过反向传播等训练过程中学习得到的。在上图中,U、V和W分别代表输入层、隐藏层和输出层的这些权重。

输入层

RNN 的输入层包含表示每个时间步输入特征的独立神经元或单元。

输入层的大小由每个时间步骤中用来表示输入的维度或特征数量决定。在语言建模的上下文中,常常使用单词作为输入,因此输入层的大小通常基于词嵌入或独热编码向量。

One-Hot 编码:如果使用 One-Hot 编码,词汇表中的每个词都表示为一个唯一的二进制向量,其大小等于词汇表的大小。因此,输入层的大小将与词汇表的大小相同。

词嵌入:如果使用了词嵌入,每个词都被表示为一个稠密向量,其维度固定,通常比词汇量小。在这种情况下,输入层的大小将由词嵌入的维度确定。

请注意,RNN 的输入层的大小是固定的,并且在所有时间步骤中保持不变。每个时间步骤接收一个输入向量,通常是一个独热编码向量或一个词嵌入表示,并通过循环连接与隐藏状态一起进行处理。

循环连接层(内部或隐藏状态)

在RNN中,循环连接是使网络能够保持记忆并捕捉序列数据依赖关系的基本组成部分。循环连接是通过将当前时间步的隐藏状态与先前时间步的隐藏状态相连接而建立的。换句话说,时间步t-1的输出或隐藏状态作为时间步t的网络的额外输入。这种连接在网络中形成一个循环,创建了一个反馈机制,使网络能够将信息从过去带到现在。

数学上,循环连接可以表示如下:

h(t) = f(Wx * x(t) + Wh * h(t-1) + b) h(t) = f(Wx * x(t) + Wh * h(t-1) + b) 保持HTML结构,将以下英文文本翻译为简体中文: h(t) = f(Wx * x(t) + Wh * h(t-1) + b)

在哪里:

  • h(t)是时间步t的隐藏状态。
  • x(t)是时间步骤t的输入向量。
  • U、V和W是控制输入、隐藏和输出状态转换的权重矩阵。
  • b是偏置向量。
  • f()是激活函数,例如sigmoid函数或双曲正切函数,用于给网络引入非线性。

在RNN中,隐藏状态的大小是在模型设计过程中定义的超参数。它确定了每个时间步中隐藏状态向量的维度或神经元数量。隐藏状态大小的选择基于诸如任务复杂性、可用训练数据量和模型的期望容量等因素。

较大的隐藏状态尺寸允许RNN捕获更复杂的模式和数据间的依赖关系,但这同时增加了计算资源的消耗和潜在的高训练要求。另一方面,较小的隐藏状态尺寸可能会限制RNN的表达能力。

在选择隐藏状态大小时保持平衡是很重要的,因为太小的大小可能导致欠拟合,即RNN无法捕捉到重要的模式,而太大的大小可能导致过拟合,即RNN对训练数据过于专业化,对新的未知示例表现不佳。

输出层

输出的大小取决于RNN模型的设计和需求,并且可能因具体任务而变化。

在语言建模的情况下,目标是根据先前的上下文来预测序列中的下一个单词,输出大小通常等于词汇量大小。输出数组中的每个元素表示词汇中的一个单词作为序列中的下一个单词的概率或可能性。

一个在Play中的简单例子

让我们考虑一个简单的例子,使用一个句子作为输入来训练传统的循环神经网络(RNN)。假设我们有一个由5个单词组成的句子“我喜欢猫和狗”。我们将假设一个基本的RNN架构,隐藏状态大小为3,词汇表中有唯一的单词。

1. 预处理

  • 标记化(Tokenization):将句子标记化为单独的词语:[“我”, “喜欢”, “猫”, “和”, “狗”]。
  • 词汇创建:通过为每个单词分配一个唯一的索引来创建词汇:{“我”: 0, “喜爱”: 1, “猫”: 2, “和”: 3, “狗”: 4}。

2. 输入表示

  • 一位热编码:句子中的每个单词都被表示为一位热编码向量。例如,第一个时间步的输入向量,代表单词“I”,将是 [1, 0, 0, 0, 0],因为它对应词汇表中的第一个单词。

3.向前传递:

  • 时间步骤1:- 输入:[1, 0, 0, 0, 0](表示“我”)- 上一个隐藏状态:[0, 0, 0](初始化)- 计算:— 隐藏状态:h(t) = f(Wx * x(t) + Wh * h(t-1) + b) — 在第一个时间步中,h(t-1)初始化为零。- 输出:[0.2, 0.4, 0.3](示例值)
  • 时间步骤2(以及后续步骤): - 输入:每个时间步骤对应单词的独热编码向量。 - 上一个隐藏状态:上一个时间步骤的隐藏状态输出。 - 计算: - 隐藏状态:h(t) = f(Wx * x(t) + Wh * h(t-1) + b) - 输出:基于隐藏状态在每个时间步骤生成。
  • 输出:RNN可以根据隐藏状态在每个时间步生成一个输出。具体的输出生成取决于任务。例如,在语言建模的情况下,输出可以是对词汇表的概率分布。

反向传播通过时间

在循环神经网络(RNN)中的反向传播是传统前馈神经网络中使用的反向传播算法的扩展。它被称为“通过时间的反向传播”(BPTT),旨在处理RNN架构中的循环连接。

BPTT算法用于递归神经网络(RNN)时会将递归连接在时间上展开,以创建一个类似于前馈神经网络的计算图。这个展开的图表示RNN作为一系列相互连接的层,其中每一层对应一个时间步。

BPTT在RNN中的基本步骤如下:

  1. 前向传播:按照之前的描述,通过RNN对输入序列进行前向传播。在每个时间步骤中计算隐藏状态和输出。
  2. 计算损失:计算的输出与期望输出(目标)进行比较,以计算损失。损失函数的选择取决于具体的任务和输出类型。
  3. 反向传播:从最后一个时间步开始,计算与网络参数相关的梯度。梯度捕捉到每个参数对最终损失函数的影响。梯度的计算使用链式法则,类似于传统的反向传播。
  4. 渐变更新:渐变被用于更新网络的参数,诸如权重矩阵和偏差,朝着最小化损失的方向进行。通常,这个更新步骤使用梯度下降或其变体等优化算法来完成。

传统的反向传播和BPTT之间的关键区别在于对循环连接的处理。BPTT通过时间展开网络,允许梯度流经展开的图形。这样,可以计算出梯度,并通过循环连接传播回去,捕获RNN的依赖关系和记忆。

梯度消失和梯度爆炸问题

在训练循环神经网络(RNN)时,消失梯度和爆炸梯度问题是普遍的挑战,这可能对其在实际应用中的使用产生重要影响。

  1. 渐变消失:在RNN中,当反向传播过程中计算的梯度随时间后向传播而指数级衰减时,就会出现渐变消失。这意味着梯度变得非常小,导致学习缓慢或训练过程停滞。这种情况发生在网络中的循环连接反复相乘小梯度值,使其指数级收缩的时候。
  2. 爆炸梯度:相反地,当梯度在时间上倒传递时呈指数增长,就会发生梯度爆炸。这导致非常大的梯度值,在训练过程中可能导致数值不稳定,并使模型的参数以大而不定的步骤进行更新。

无论是梯度消失还是梯度爆炸都会阻碍循环神经网络(RNNs)的训练,使得有效更新网络参数并收敛到最优解变得困难。这可能对实际应用产生几个影响:

  1. 长期依赖关系:循环神经网络(RNNs)旨在捕捉序列数据中的长期依赖关系。然而,消失的梯度可能使得RNN难以有效地对长序列中的这些依赖关系进行建模和捕捉,从而限制了它们从远处的历史信息中进行学习和泛化的能力。
  2. 训练稳定性:爆炸梯度可能导致训练过程不稳定和难以预测,使得收敛到最优解变得困难。这种不稳定性可能导致参数更新不规则,使得可靠地训练循环神经网络变得更加困难。
  3. 梯度优化:梯度消失或梯度爆炸的存在可能阻碍梯度优化算法(如梯度下降)的有效性。这些算法依赖于稳定且适当缩放的梯度来进行权重更新。为了缓解这个问题,可能需要使用额外的技术,如梯度剪切、正则化方法或更高级的循环神经网络结构(如LSTM或GRU)。
  4. 内存和上下文:RNNs(循环神经网络)对于需要捕捉连续信息、维持内存或上下文的任务特别有用。然而,梯度消失的存在可能限制它们在长序列中保留和传播相关信息的能力,从而可能影响模型的理解和上下文推理能力。

解决梯度消失和梯度爆炸问题一直是一个活跃的研究领域。诸如梯度裁剪、权重初始化策略以及更先进的带有门控机制的RNN架构(如LSTM和GRU)等技术已经被开发出来,以缓解这些问题,并在实际应用中实现RNN的更稳定和有效的训练。

循环神经网络(RNN)对现代人工智能模型的发展做出了重要贡献,如Transformer和GPT(生成式预训练Transformer)等。RNN引入了序列建模,实现了具有时间依赖性的数据处理和生成。它们捕捉了长期依赖性,改善了语言建模,并引入了像LSTM和GRU这样的门控机制。这些RNN的进展为Transformer模型铺平了道路,该模型通过自注意机制实现了并行处理和捕捉全局依赖性,从而在自然语言处理方面开创了新局面。转而,Transformer成为了像GPT这样的模型的基础,利用大规模预训练和微调,在各种与语言相关的任务中实现了最先进的性能。

如果您喜欢这篇文章,请务必在下方鼓掌推荐,并如有任何问题,请在评论区留言,我会尽力回答。

为了更加了解机器学习的世界,请跟随我。这是发现我写更多类似文章的最佳方式。

您还可以在 Twitter 上关注我,或在 LinkedIn 上找到我。我很想听到您的消息。

就这些,祝您有个愉快的一天 :)

2023-12-27 04:19:48 AI中文站翻译自原文