2021斯坦福CS224N课程笔记~6

6. 简单 RNN、GRU RNN 和 LSTM RNN

参考文献:

https://zhuanlan.zhihu.com/p/427092771

https://zhuanlan.zhihu.com/p/147322349 【简易】

https://www.showmeai.tech/article-detail/239

https://zhuanlan.zhihu.com/p/61893429

https://zhuanlan.zhihu.com/p/111290767

https://blog.csdn.net/qq_29216461/article/details/126156663

讲座计划

\1. RNN 语言模型(25 分钟,复习)

\2. RNN 其他用途(8 分钟)

\3. 梯度爆炸和消失(15 分钟)

\4. LSTM(20 分钟)

\5. 双向和多层 RNN(12 分钟)

image-20230314211619930

前言

• 上一课我们学到:语言模型、n-gram 语言模型和循环神经网络 (RNN)

• 今天我们将学习如何让 RNN 为您服务

• 训练 RNN

• RNN 的使用

• RNN 的问题(梯度爆炸和消失)以及如何解决这些问题

​ • 这些问题激发了更复杂的 RNN 架构:LSTM

​ • 以及其他更复杂的 RNN :双向 RNN 和多层 RNN

• 下一课我们将学习:如何使用基于 RNN 架构进行神经机器翻译(NMT),即有注意力的序列到序列

6.1.简单 RNN

6.1.1. 简单 RNN 概览

​ 我们在第 5.5 节已经介绍过简单 RNN,为了文章的连贯性和可读性,现引用图 5.19 当作本章图 6.0,“一图胜千文”,勿须赘言。

image-20230314163953347

6.1.2. 梯度爆炸和梯度消失的问题

  • 梯度消失和梯度爆炸?
image-20230315135336317

我们称这个经典的RNN结构,为vanilla RNN或者simple RNN,这个vanilla的意思是“普通的,毫无特色的”,在论文中我们会经常看到。

image-20230315135435214

可以看出,「当W很小或者很大,同时i和j相差很远的时候」,由于公式里有一个**「指数运算」**,这个梯度就会出现异常,变得超大或者超小,也就是所谓的“梯度消失/梯度爆炸”问题

  • 那梯度消失和梯度爆炸时分别有什么问题呢?

    • **「梯度消失」**时,会让RNN在更新的时候,只更新邻近的几步,远处的步子就更新不了。所以遇到“长距离依赖”的时候,这种RNN就无法handle了。
    • 「梯度爆炸」时,会导致在梯度下降的时候,每一次更新的步幅都过大,这就使得优化过程变得十分困难。
  • 如何解决vanilla RNN中的梯度消失、爆炸问题

    • 梯度爆炸问题的解决
      • 梯度爆炸,带来的主要问题是在梯度更新的时候步幅过大。那么最直接的想法就是限制这个步长,或者想办法让步长变短。因此,我们可以使用“梯度修剪(gradient clipping)”的技巧来应对梯度爆炸。
    • 梯度消失问题的解决
      • 梯度消失带来的最严重问题在于,在更新参数时,相比于临近的step,那些较远的step几乎没有被更新。从另一个角度讲,每一个step的信息,由于每一步都在被反复修改,导致较远的step的信息难以传递过来,因此也难以被更新。
      • 既然vanilla RNN无法很好地保存历史信息,那么我们能不能想办法把这个“历史的记忆”进行保存日后使用呢?————当然是可以的,**LSTM**就是干这事儿!

​ 回想一下,RNN 的目标是通过长距离的时间步来传播上下文信息,即从一个时间步传播权值矩阵到下一个时间步。例如,考虑以下两个句子:

image-20230314212128837

​ 在这两个句子中,根据上下文,人们可以分辨出两个空白处的答案很可能是“John”。重要的是,RNN 将下一个单词预测为“John”,即在两种情况下都出现了几个时间步后的第二个人。理想情况下,鉴于我们目前对 RNN 的了解,这应该是可能的。然而,在实践中,结果证明 RNN 更可能正确预测句子 1 中的空白处而不是句子 2。这是因为==在反向传播阶段梯度值的贡献随着它们传播到更早的时间步而逐渐消失==,正如我们将在下面展示的。因此,对于长句子,“John”被识别为下一个单词的概率随着上下文的大小而降低。

image-20230314212652646

image-20230314212845847

  • 在实验的过程中,一旦梯度的值变得非常大,会导致在运行过程中容易检测到其引起的溢出(即 NaN);这样的问题称为梯度爆炸问题
  • 然而,梯度接近为 0 的时候梯度近乎不再存在,同时降低模型对语料库中的远距离的单词的学习质量;这样的问题称为梯度消失问题

如果想对梯度消失问题的有更直观的了解,你可以访问这个样例网站:http://cs224d.stanford.edu/notebooks/vanishing_grad_example.html。

6.1.2.1. 梯度爆炸的问题

image-20230314213425557

6.1.2.2. 梯度消失的问题

​ 下面详细描述梯度消失的问题,见图 6.1:

image-20230314214034065

​ 以下是梯度消失的另一种快速证明,见图 6.2:

image-20230314214107817

​ 下面,我们来看看梯度消失对 RNN-LM 的影响,以语言模型的任务(相当于英语考试的完型填空)为例,见图 6.3:

image-20230314214326301

​ 由于梯度消失,RNN-LM更擅长从顺序近因中学习而不是从句法近因中学习因此它们比我们想像的更频繁地产生这种类型的错误[Linzen等人2016]

6.1.3. 梯度爆炸和梯度消失的方案

6.1.3.1. 梯度爆炸的解决方案:梯度裁剪

​ 上面我们对梯度消失问题的性质以及它如何在深度神经网络中表现有了直观的了解,下面让我们专注于解决梯度爆炸问题的简单实用的启发式方法。

​ 为了解决梯度爆炸的问题,Thomas Mikolov 首先引入了一个简单的启发式解决方案,它在梯度爆炸时将梯度剪裁为一个小数字。也就是说,每当它们达到某个阈值时,它们就会被设置回一个较小的数字

​ 简单地说:如果梯度的范数大于某个阈值,则在应用 SGD 更新之前将其缩小.(即梯度裁剪)

​ 直觉地说:同一个方向迈出一步,但步子更小。如图 6.4 所示:

image-20230314215014477

​ 图 6.5 显示了梯度裁剪的效果。它显示了一个小型循环神经网络关于其 W 矩阵及其偏置项 b 的决策面。 该模型由运行少量时间步的单个循环神经网络单元组成; 实线箭头表示每个梯度下降步骤的训练进度。 当梯度下降模型遇到目标函数中的高误差壁时,梯度会被推到决策面上的较远位置。剪裁模型生成虚线,在那里反而将误差梯度拉回到接近原始梯度景观的某个地方

​ 在实践中,记住裁剪梯度很重要。

​ 但总的来说,梯度爆炸是一个容易解决的问题

6.1.3.2. 梯度消失的解决方案:LSTM 和 GRU

传统的 RNN 在训练长期依赖关系时会遇到很多困难,最常见的便是梯度消失问题。

梯度消失的主要问题是 RNN 很难学会在多个时间步长上保存信息

image-20230315123941431

6.1.4. 简单 RNN 的应用:翻译模型

​ 传统的翻译模型相当复杂;它们由应用于语言翻译管道不同阶段的众多机器学习算法组成。在本节中,我们将讨论采用 RNN 替代传统翻译模块的潜力。RNN 示例模型见图 6.6:

image-20230315124046728

​ 在图 6.6 中,前三个 RNN 隐藏层是源语言模型编码器,后两个 RNN 是目标语言模型解码器。德语短语 Echt dicke Kiste 被翻译为 Awesome sauce。前三个隐藏层时间步将德语单词编码为一些语言单词特征(h3)。最后两个时间步将 h3 解码为英文单词输出。

image-20230315124656620

image-20230315125303318

image-20230315125511031

6.2.长短期记忆(LSTM)RNN★★★

​ Hochreiter 和 Schmidhuber 在 1997 年提出的一种 RNN,作为梯度消失问题的解决方案。每个人都引用了那篇论文,但现代 LSTM 的一个关键部分来自 Gers 等人(2000)。

结合图6.9+以下知识点+“LSTM 的架构以及这个架构背后的意义”去理解LSTM★★

  • 在RNN的经典结构中,每一步都会有一个隐层状态,即hidden state,我们记第t步的hidden state为h(t)在LSTM中,作者增加了一个cell state,记为c(t)

    • 二者是长度相同的**「向量」**,长度是一个超参数,即神经网络中的number of units;
    • cell state中可以存储长距离的信息(long-term information);
    • LSTM的内部机制,可以对cell state中的信息进行擦除、写入和读取(erase,write,read).
  • 那LSTM是怎么实现对cell state中的信息的擦除、写入和读取呢?——有“门儿”! LSTM有仨门儿,分别对应这三种操作。这些门有一些公共的性质:

    • 门(gate)有什么特点呢? —— 它可以“开”和“关”,用符号表示就是1和0,当然也可以半开半关,那就是介于1和0之间。
    • 如何对用向量表示的信息进行“开关”呢? —— 「门也采用向量的形式」,相当于一排门,来控制各个维度的信息。
    • 如何决定“开”还是“关”呢? —— 门的状态是动态的,根据当前的上下文来决定
  • LSTM的三个门分别是:遗忘门(forget gate)、输出门(input gate)和输出门(output gate)。

    • 「遗忘门」:这个门,根据上一个单元的隐层状态和当前一步的输入,来“设置遗忘门的开合情况”,然后对cell state中的信息进行**「选择性遗忘」**;
    • 「输入门」:这个门,也是根据上个单元的隐层状态和当前的输入,来“设置输入门的开合情况”,然后决定往cell state中输入哪些信息,即**「选择性输入」**;
    • 输出门」:这个门,还是根据上个单元的隐层状态和当前输入,来“设置输出门的开合情况”,然后决定从cell state中输出哪些信息,即**「选择性输出」**,输出的,就是当前这一步的隐层状态。
  • 从上面的公式、我的描述以及图示中,我们可以发现,虽然LSTM结构复杂,但是**「很有规律」**的:

    • 三个门的输入都一样!都是前一步的隐层h(t−1)和当前的输入x(t);
    • 三个门都是针对cell state进行操作的,对上一步的cell state即c(t−1)进行“选择性遗忘”操作;对当前步产生的信息c~(t)“选择性输入”到该步的cell state c(t)中;最后从c(t)中“选择性输出”一些信息成为该步的hidden state h(t)
  • LSTM为何有用

    • RNN之所以存在梯度消失、无法处理长距离依赖的问题,是因为远处的信息经过多步的RNN单元的计算后,不断损失掉了。所以RNN一般只能考虑到较近的步骤对当前输出的影响。
    • LSTM相对于RNN,最大的特点就是==“增设了一条管道”——cell state==:
    image-20230315141102655
    • 这条管道,使得每个单元的信息都能够从这里直通其他遥远的单元,而不是一定要通过一个个单元的hidden states来传递信息。这相当于卷积神经网络中常用的“skip connection”技巧

    • 那么信息是如何通过cell state这个管道去往诗和远方呢?

      • 通过上面的学习,我们知道,只要信息在cell state中传递时,遗忘门常开(让信息顺利通过),输入门常闭(不让新的信息进入),那么这条信息就可以像做滑滑梯一样顺流直下三千尺,想跑多远跑多远;门的这些操作,使得信息进行长距离传递成为了可能。
      • 当然,上面说的情况比较极端,**实际上,这些门一般都不会完全打开或关闭,而是处于各种中间状态。**另外,是否让信息传递这么远,也是由当前的上下文决定的。所以,并不是说所有的信息都会传递老远,而是当信息真的需要进行长距离传输的时候,LSTM这种机制使得这个过程更加容易。
    • 实际上,LSTM不光是解决了长距离依赖的问题,它的各种门,使得模型的学习潜力大大提升,各种门的开闭的组合,让模型可以学习出自然语言中各种复杂的关系。比如遗忘门的使用,可以让模型学习出什么时候该把历史的信息给忘掉,这样就可以让模型在特点的时候排除干扰。

    • 另外,记住LSTM的各种门都是向量,长度跟hidden states一致。也就是说,这些门不是单纯对信息一刀切,而是对不同的信息的维度分别进行处理,这也就是我前面一直强调的“选择性”。

6.2.1. LSTM 方程组和结构图

首先,全面概览 LSTM 的方程组:

image-20230315133541140

其次,深入了解这个神经单元(unit,区别于细胞 cell)的设计架构,见图 6.8:

知道各模块流程及其走向即可

image-20230315133603970

我们可以通过以下步骤了解 LSTM 的架构以及这个架构背后的意义:

​ \1. 新记忆的生成:我们本质上使用输入词 xt 和过去的隐藏状态 ht-1 来生成一个新的记忆 ?෥ ?,其中包括新词 x (t) 的各个方面。

​ \2. 输入门:我们看到新记忆生成阶段在生成新记忆之前不会检查新单词是否重要——这正是输入门的功能。输入门使用输入词和过去的隐藏状态来确定输入是否值得保留,从而用于对新记忆进行门控。因此,它产生 it作为该信息的指示器。

​ 3.遗忘门:这个门类似于输入门,除了它不判断输入词的有用性——而是评估过去的记忆细胞对当前记忆细胞的计算是否有用。因此,遗忘门查看输入词和过去的隐藏状态并生成 ft。

​ 4.最终记忆的生成

    • 这个阶段首先接受遗忘门 ft的建议,并相应地忘记过去的记忆 ct-1
    • 类似地,它接受输入门 it 的建议,并相应地对新记忆~ct 进行门控
    • 然后将这两个结果相加以产生最终的记忆 ct。

​ \5. 输出/曝光门:

  • 它的目的是将最终记忆与隐藏状态分开
    • 最终记忆 ct 包含了很多信息,在隐藏状态下不一定需要保存
    • 隐藏状态用于 LSTM 的每个门,因此,该门评估了最终记忆 ct 的哪些部分需要暴露/存在于隐藏状态 ht
    • 它产生的信号表明这是 ot,用于选通最终记忆的逐点 tanh。

image-20230315135001889

image-20230315135025707

6.2.2. LSTM 如何解决梯度消失?

LSTM 如何解决消失的梯度?LSTM 架构使 RNN 可以更轻松地保存多个时间步的信息。[“增设了一条管道”,使得每个单元的信息都能够从这里直通其他遥远的单元]

例如,如果对于一个单元维度和输入,遗忘门设为 1,输入门设为 0,则该单元的信息将无限期保留。

相比之下,普通 RNN 更难学习在隐藏状态中保留信息的循环权重矩阵 Wh。

实际上,您会得到大约 100 个时间步而不是大约 7 个。

LSTM 不能保证没有梯度消失/爆炸,但它确实为模型学习长距离依赖关系提供了一种更简单的方法。

6.2.3. LSTM 在现实世界的成功

LSTM 在现实世界取得了以下成果:

(1)2013-2015 年,LSTM 开始取得最先进的成果。

​ • 成功的任务包括手写识别、语音识别、机器翻译、解析和图像字幕,以及语言模型

​ • LSTM 成为大多数 NLP 任务的主要方法

(2)2016~2021 年,其他方法(例如 Transformers)在许多任务中占据主导地位。

​ 例如,在 WMT(机器翻译会议和竞赛)中:

​ • 在 WMT 2016 中,摘要报告包含“RNN”44 次

​ • 在 WMT 2019 中:“RNN”7 次,“Transformer”105 次

6.2.4. 梯度爆炸/消失只是 RNN 的问题吗?

​ 梯度爆炸/消失问题不仅是 RNN 的问题,而且还是所有神经架构(包括前馈和卷积)的问题,尤其是深度网络(CNN)

​ 因为链式法则/非线性函数的选择,梯度在反向传播时会变得非常小(趋于消失),所以较低层的学习非常缓慢(难以训练)

​ 解决方案:许多新的深度前馈/卷积架构增加了更多的直接连接(从而允许梯度流动,不会消失),最常见的几个方法如下:

6.2.4.1. 高速网络(HighwayNet)

​ 高速网络即高速连接,又名“HighwayNet”(Srivastava 等人 2015)。

​ HighwayNet 受 RNN 中的 LSTM、GRU 的“门”机制的启发去掉每一层循环的序列输入,不需要遗忘历史信息,仍使用“门”来控制前一次输出与当前层激活函数之后的输出的融合比例,加入了称为信息高速公路(Information Highways)的捷径**(shortcut)连接,使得信息可以跨层直接原样传递**。这使得网络深度理论上几乎可以是无限。

image-20230315142813456

image-20230315142952241

意义:假设所有的门的均值为 0.5,则所有的原始信息一半激活,一半直接(不变)输入下一层,保留了很多信息反向传播时,可以让更多的(梯度)信息直接回流到输入,而不需要经过一个非线性转化。

6.2.4.2. 残差网络(ResNet)

​ 残差网络即残差连接,又名“ResNet”(He 等人 2015),也称为跳跃连接(ship-connections)。它的特点是恒等连接(identity connection)默认保留信息,这使得深度网络更容易训练

残差网络(ResNet)的简要概括

​ ResNet(Residual Neural Network)由微软研究院的 Kaiming He 等四名华人提出,通过使用 ResNet Unit 成功训练出了 152 层的神经网络,并在 ILSVRC2015 比赛中取得冠军,在 top5 上的错误率为 3.57%。ResNet 的结构可以极快的加速神经网络的训练,模型的准确率也有比较大的提升

​ ResNet 的主要思想是在网络中增加了直连通道,即 Highway Network 的思想此前的网络结构是对输入做一个非线性变换,而 Highway Network 则允许保留之前网络层的一定比例的输出。ResNet 的思想和 Highway Network 的思想也非常类似,允许原始输入信息直接传到后面的层中,见图 6.11:

image-20230315143535365

​ 在图 6.11 中,展示了(a)正常模块和(b)残差模块的对比,我们通过引入深度残差学习框架(残差模块)来解决退化问题。我们不是希望每几个堆叠层直接适合所需的底层映射,而是明确让这些层适合残差映射。正式地,将所需的底层映射表示为 H(x),我们让堆叠的非线性层拟合 F(x) := H(x)−x 的另一个映射。原始映射被重铸为 F(x)+x。 我们假设优化残差映射比优化原始的、未引用的映射更容易。在极端情况下,如果恒等映射是最优的,那么将残差推为零比通过一堆非线性层拟合恒等映射更容易。F(x) +x的公式可以通过具有“快捷连接”的前馈神经网络来实现(图 6.11(b))。快捷连接是那些跳过一层或多层的连接。在我们的例子中,快捷连接只是执行恒等映射,它们的输出被添加到堆叠层的输出中。恒等快捷方式连接既不增加额外参数,也不增加计算复杂度。整个网络仍然可以通过带有反向传播的 SGD 进行端到端的训练,并且可以使用通用库(例如 Caffe)轻松实现,而无需修改求解器

​ 在 ResNet 网络结构中会用到两种残差模块:一种是以两个 33 的卷积网络串接在一起作为一个残差模块,另外一种是 11、33、11 的三个卷积网络串接在一起作为一个残差模块,见图 6.12:

image-20230315143831268

​ ResNet 有不同的网络层数,比较常用的是 50-layer,101-layer,152-layer。它们都是由上述的残差模块堆叠在一起实现的。

​ 残差网络的创新点是提出残差学习的思想。传统的卷积网络或者全连接网络在信息传递的时候或多或少会存在信息丢失,损耗等问题,同时还有导致梯度消失或者梯度爆炸,导致很深的网络无法训练。ResNet在一定程度上解决了这个问题,通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络只需要学习输入、输出差别的那一部分,简化学习目标和难度

​ 残差网络的意义主要有两点:

​ (1) 残差结构就是给了输入 X 多一个选择,在神经网络学习到这层的参数是冗余的时候它可以选择直接走这条“跳接”曲线,跳过这个冗余层,而不需要再去拟合参数使得输出 H(X)等于 X。

​ (2) 我们知道残差网络可以表示成 H(X)=F(X)+X,这就说明了在求输出对输入 H(X)的倒数(梯度),也就是在反向传播的时候,H’(X)=F(X)’+1,其中常数 1 也能保证在求梯度的时候梯度不会消失。

6.2.4.3. 密集网络(DenseNet)

解决了深度网络的梯度消失问题 系列

​ 密集网络即密集连接,又名“DenseNet”(Huang 等人 2017),将每一层直接连接到所有未来的层

密集网络(DenseNet)的简要概括

​ DenseNet(Dense Convolutional Network)主要还是和 ResNet 网络做对比,思想上有借鉴最近几年神经网络提高效果的方向,要么深(比如 ResNet 网络,解决了深度网络的梯度消失问题)要么宽(比如Inception 网络)。而 DenseNet 则是从特征(Fature)入手,通过巧妙设计达到更好的效果。

​ 随着深度学习网络的加深,梯度消失问题会愈加明显,针对这个问题提出了几个解决方案,比如ResNet,HighwayNet 等,尽管这些算法的网络结构有差别,但是核心都在于:建立短的通道于前层到后层之间。延续这个思路,在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来。在普通的神经网络中,如果网络有 L 层,那么就会有 L 个连接;但是在 DenseNet 中,每一层的输入来自前面所有层的输出,会有 L(L+1)/2 个连接,见图 6.13:

image-20230315144624135

​ 图 6.13 展示了一个 5 层密集块,增长率为 k = 4。每一层都将所有前面的特征图作为输入。每一层都可以直接访问损失函数和原始输入信号的梯度,从而实现隐式的深度监督,可以减轻梯度消失现象.

image-20230315145004801

image-20230315145118985

6.3.门控循环单元(GRU)RNN

​ 除了迄今为止讨论的扩展方法之外,我们已经发现 RNN 通过使用更复杂的激活单元来获得表现更好。到目前为止,我们已经讨论了从隐藏状态 h(t−1)向 ht转换的方法,使用了一个仿射转换和逐点的非线性转换。在这里,我们讨论门激活函数的使用并修改 RNN 结构虽然理论上 RNN 能捕获长距离信息,但实际上很难训练网络做到这一点门控制单元可以让 RNN 具有更多的持久性内存,从而更容易捕获长距离信息。让我们从数学角度上讨论 GRU 如何使用 h(t−1)和 xt 来生成下一个隐藏状态 ht。然后再深入了解 GRU 架构。

GRU也是由“门”构成的网络,它只有两个门:更新门(update gate)和重置门(reset gate)。 它主要对LSTM简化了什么地方呢

  • GRU在表示当前的信息的时候,只使用了一个更新门,而LSTM则使用了一个遗忘门和一个输入门:
  • image-20230315153355789
  • GRU也是可以通过调整两个门的开合情况来控制历史信息的保留和当前信息的更新,从而让模型更好地应对长距离依赖和梯度消失的问题

6.3.1. GRU 的方程组和结构图

​ GRU 是 LSTM 的简化版本,是 LSTM 的变体,它去除掉了细胞状态,使用隐藏状态来进行信息的传递。它只包含两个门:更新门和重置门

image-20230315151906995

​ 上面的方程可以被认为是 GRU 的四个基本操作阶段,使这个模型在智力上更加令人满意。

​ GRU 具有直观的解释:更新门类似于 LSTM 中的遗忘门和输入门,它决定要忘记哪些信息以及哪些新信息需要被添加。复位门用于决定遗忘先前信息(上一时刻的隐藏状态 ht−1)中的那些对当前时刻计算不重要的部分,用于计算当前的候选隐藏状态 ht。GRU 的概念结构见图 6.15:

image-20230315152058677 image-20230315152116821

image-20230315152723497

6.3.2. GRU 和 LSTM 的比较★

LSTM和GRU都是著名的RNN衍生结构,一个复杂,一个简单

  • 一般LSTM都应该作为我们默认的选择,因为它学习能力更强,所以当我们数据量足够,又不太在乎时间开销的话,LSTM是首选。
  • 但是,如果我们很在意模型大小,训练开销,那么就可以试试GRU

image-20230315152909996

​ LSTM 和 GRU 都有门操作,用来决定是否保留上时刻的状态、是否接收此时刻的外部输入,LSTM 是用遗忘门和输入门来做到的,GRU 则是只用了一个更新门。

​ 这样的设计有两个解释:

​ 第一种解释:网络是能很容易地记住长依赖问题对于前面很久之前出现过一个重要的特征如果遗忘门或者更新门选择不重写(overwritten)内部的记忆,那么网络就会一直记住之前的重要特征,即对当前或者未来继续产生影响。

​ 第二种解释:这种设计可以为不同状态之间提供一条捷径(shortcut),当梯度回传时不会消失得太快,因此减缓了梯度消失带来的难训练问题。

​ LSTM 和 GRU 的内部结构比较(电路视角),见图 6.17:

image-20230315153110553

6.4.双向和多层 RNN★

更多更好的RNNs

前面介绍的LSTM和GRU属于RNN单元内部的升级,在单元外部,我们可以设计一些更复杂的结构,来提高模型的综合效果。

  • 双向RNNs(Bidirectional RNNs)

    • RNN是按照顺序处理一个序列的,这使得**每个step我们都只能考虑到前面的信息,而无法考虑到后面的信息**。
    • 而很多时候我们理解语言的时候,需要同时考虑前后文。
    • 因此,我们可以将原本的RNN再添加一个相反方向的处理,然后两个方向共同表示每一步的输出
    • 需要注意的是,只有当我们在预测时可以拿到前后文的时候,才能使用双向的模型,所以对于语言模型(LM)我们就无法使用,因为在预测时我们只有前文。但是,但我们可以利用双向的时候,我们就应该这样做,考虑更充分当然会更好。
  • 多层RNN(Multi-layer RNNs)

    • Multi-layer RNNs也可以称为Stacked RNNs,就是**堆叠起来的一堆RNN**嘛。 这个更加无需更多解释,相当于神经网络加深
    • 神经网络加深,往往可以带来更好的效果,因为它的学习能力大大提高。而且,就跟CNN一样,不同层次的RNN也可以学习到语言的不同层次的特征。但是,RNN跟CNN不同的是,我们==无法使用太多层,一般2-4层就差不多了==。

6.4.1. 双向 RNN

​ 到目前为止,我们已经讨论了用 RNN 如何使用过去的词来预测序列中的下一个单词(RNN-LM)。同理,可以通过令 RNN 模型向反向读取语料库,根据未来单词进行预测。Irsoy 等人展示了一个双向深度神经网络;在每个时间步 t,这个网络维持两个隐藏层,一个是从左到右传播而另外一个是从右到左传播。为了在任何时候维持两个隐藏层,该网络要消耗两倍的存储空间来存储权值和偏置参数。最后的分类结果ŷ,是结合由两个 RNN 隐藏层生成的结果得分而产生的。双向网络架构见图 6.18:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XWGuWaIy-1678868386712)(null)]

image-20230315154109398

​ 注意:双向 RNN 仅适用于您可以访问整个输入序列的情况它们不适用于语言建模,因为在 LM 中您只剩下可用的上下文。如果你有完整的输入序列(例如,任何类型的编码),双向性是强大的(你应该默认使用它)。例如,BERT(来自 Transformers 的双向编码器表示)是一个强大的基于双向性的预训练上下文表示系统。您将在下面几周内的课程里了解有关包括 BERT 在内的转换器的更多信息!

​ 单向和双向 RNN 进一步的详细结构信息,见图 6.19:

image-20230315154233088

6.4.2. 多层 RNN

​ RNN 已经在一个维上“深入”(它们在许多时间步上展开)。我们还可以通过应用多个 RNN 使它们在另一个维度“深入——这就是一个多层 RNN。多层 RNN 允许网络计算更复杂的表示。较低的 RNN应计算较低级别的特征,较高的 RNN 应计算较高级别的特征。多层 RNN 也称为堆叠 RNN

  • 图 6.20 显示了一个三多层双向 RNN,其中每个较低层都为下一层提供数据
    • 如图所示,在这个网络架构中,在时间步 t,每个中间神经元接收来自前一个时间步的一组参数**(在同一个 RNN 层中)**
    • ,以及来自前一个 RNN 隐藏层的两组参数:一个输入来自从左到右的 RNN,另一个来自从右到左的 RNN**(在不同RNN层中)**。

image-20230315155210401

​ 为了构建具有 L 层的深度 RNN,将上述关系修改为等式 22 和 23 中的关系,其中第 i 层每个中间神经元的输入是第 i-1 层 RNN 在同一时间步 t 的输出 。每个时间步的输出 ŷ 是通过所有隐藏层传播输入参数的结果:

image-20230315155419141

高性能 RNN 通常是多层的(但不如卷积或前馈网络深)。

例如:在 2017 年的一篇论文中,Britz 等人发现对于神经机器翻译,2 到 4 层最适合编码器 RNN,4 层最适合解码器 RNN。通常,需要跳跃连接/密集连接来训练更深的 RNN(例如,8 层)。

6.5.总结:一张图彻底搞懂 LSTM

本章有很多新信息!有哪些实用的要点?

​ (1) LSTM 很强大

​ (2) 裁剪梯度

​ (3) 尽可能使用双向 RNN

​ (4) 多层 RNN 更强大,但如果它很深,你可能需要跳跃连接

最后,作为总结,请看 LSTM 的全景图,见图 6.21:

image-20230315160418799

图(a)是简单 RNN 的基本概念:当前的ℎ?可以利用前面很多时间步的信息。

图(b)是 LSTM RNN 的基本概念:当前的ℎ?和??可以利用前面很多时间步的信息。

图©是把循环的两个变量拆开,分开两个时间步 t-1 和 t,变成ℎ(t−1)、c(t−1)、ℎt、ct四个变量;

c 变化慢,ct 是 ct-1加了一些东西;h 变化快,ht 和 ht-1可以非常不同。

图(d)是把方程组(四个参数 b 是可选项)的顺序重新排列(与计算图中的顺序一致),但不影响计算结果。

图(e)是根据方程组以集成电路的时序图方式来画计算图,尽量避免交叉,增强可读性。

你只要要记住两点:

(1)c变化慢,ct是ct-1加了一些东西;h变化快,ht和ht-1可以非常不同。

(2) LSTM就像四川省岷江的都江堰工程(它们的结构和功能都非常相似)!

LSTM的细胞信息能够保持远处信息而避免梯度消失

都江堰的内江分支能够保证引流灌溉而避免干旱缺水

猜你喜欢

转载自blog.csdn.net/mwcxz/article/details/129559545