当前位置: 首页 > article >正文

长短期记忆网络 (LSTM) 简介

文章目录

  • 一、说明
  • 二、传统 RNN 的问题
  • 三、为什么梯度消失?
  • 四、长短期记忆网络简介
  • 五、忘记门
  • 六、Update Gate (Input Gate)
  • 七、Output Gate
  • 八、数学上的内存
  • 九、从 LSTM 到 Transformer
  • 十、总结

一、说明

机器学习取得进步的领域之一是自然语言处理。对于用于机器翻译和类似任务的模型尤其如此。换句话说,对于可用于执行序列到序列学习的模型,其中一种序列(例如用英语编写的短语)被转换为另一种序列(例如用德语编写的短语)。

多年来,长短期记忆网络 (LSTM 网络) 一直是序列到序列学习中最先进的技术的一部分。在 2017 年 Transformer 突破之后(即 Vaswani 等人在 2017 年的工作)之后,它们被缓慢但肯定地取代了,它们在当今的许多 Seq2Seq 任务中仍然发挥着重要作用,尤其是在部署的模型中。

本文对 LSTM 进行了简要介绍。我们先看一下上下文。我们将介绍经典的递归神经网络,以及为什么训练它们是有问题的。随后,Hochreiter 和 Schmidhuber 在他们 1997 年的工作中介绍了长短期记忆网络。我们还将直观地介绍为什么 LSTM 解决了机器学习中传统上存在的循环段梯度消失问题。

还包括对当代 LSTM 架构的全面分析,其中包括一些变化,以改进基本的 LSTM。特别是,我们将研究如何将内存与隐藏状态、各种门(即 forget、input/update 和 output 门)分开。最后,我们还通过研究 Transformer 在过去几年中取代 LSTM 的原因来展望未来。

以下是阅读本文的要点:

找出经典递归神经网络的问题所在。
确定 LSTM 的工作原理以及它们解决梯度消失问题的原因。
看看当代 LSTM 架构、其组件及其变体。
了解为什么 Transformer 在序列到序列学习中缓慢但肯定地取代了 LSTM。
我们走吧!

二、传统 RNN 的问题

当人们谈论将机器学习应用于自然语言处理领域时,许多人很快就会遇到递归神经网络这个术语。在其基本形式中,即在其原始形式中,递归神经网络 (RNN) 可以通过以下方式可视化:
在这里插入图片描述

一个完全循环的网络。由 fdeloche 在维基百科上创建,许可为 CC BY-SA 4.0。未进行任何更改。
在对序列(例如短语)进行标记后,我们可以将单个标记(例如单词)提供给网络;此处的令牌由绿色圆圈x_t显示。这些是具有隐藏状态 h 的网络的 input ,该网络基于此隐藏状态生成输出令牌 o。此外,hidden state 的输出被传递回 hidden state。这样,我们既可以生成输出值,又可以拥有某种内存。

特别是当你展开这个结构,显示后续标记x_{t-1} 等的解析时,我们看到隐藏状态以从左到右的方式跨标记传递。每个令牌都可以使用前面步骤中的信息,因此在转译(例如翻译)令牌时受益于额外的上下文。

网络的结构类似于标准的多层感知器,区别在于我们允许与时间延迟相关的隐藏单元之间的连接。通过这些连接,模型可以保留有关过去的信息,使其能够发现数据中彼此相距甚远的事件之间的时间相关性。

Pascanu 等人 (2013)

虽然这是一个相对较大的进步,特别是对于较大的序列,但经典的RNNs并没有显示出比经典神经网络更大的改进,后者的输入是一组时间步长(即一次有多个标记),根据Hochreiter和Schmidhuber(1997)的说法。深入研究 Hochreiter 6 年前的论文工作,研究人员已经确定了梯度消失问题和当序列很大时必须经过的相对较大的距离误差流是此类模型性能不佳的主要原因之一。

梯度消失问题是指相反的行为,当长期分量以指数速度达到范数 0 时,使模型无法学习时间上遥远事件之间的相关性。

Pascanu 等人 (2013)

三、为什么梯度消失?

经典 RNN 中出现梯度消失问题是因为它们使用一种称为时间反向传播的反向传播变体 (BPTT;维基百科,2010 年)。要了解 BPTT 的工作原理,我们必须再次了解递归神经网络。在下图中,我们可以看到一个循环网络,处理a_t f或某个时间步长的输入,并为下一个时间步长生成一个预测 y_{t+1}。前一次尝试的隐藏状态也被传递给网络,并且通常是 t = 0 处的零向量(Wikipedia, 2010)。

当在时间中展开时,我们可以看到输入a_t在整个时域中的链式通道。我们还看到 hidden 状态随时间变化,不断用于生成后续输入。实际上,我们正在 “复制” 网络,但网络的每个副本都有相同的参数(Wikipedia, 2010)。然后,我们可以简单地应用反向传播来计算梯度,就像我们习惯的那样。
在这里插入图片描述

资料来源:Headlessplatt(维基百科)。已获得公共领域的许可。
现在问题来了。传统上,为了确保神经网络能够学习处理非线性数据,网络中添加了非线性激活函数。Sigmoid 一直是一种激活函数,曾经是神经网络中应用的标准函数之一。下图完美地说明了如果反向传播必须经过的 “副本 ”链很长,梯度会消失的原因:Sigmoid 导数的最大值< 0.3。

换句话说,如果我们必须将 Sigmoid 的导数跨三个时间步长链接起来,我们的梯度很快就会接近零。特别是上游层,即上游时间步长,受到这个问题的严重打击,因为当序列变得太长时,它们会停止学习。向梯度消失问题问好!
在这里插入图片描述

四、长短期记忆网络简介

在他们1997年的工作中,Hochreiter和Schmidhuber引入了长短期记忆,或LSTM。在这项工作中,作者探讨了 Hochreiter 1991 年的论文,该论文研究了经典 RNN 中梯度消失的问题。他们探讨了它们发生的原因并确定了解决方案:所谓的常差旋转云母 (CEC)。我们稍后将更详细地探讨为什么它会解决消失的梯度,但归结为一件事:因为内存是使用线性运算构建的,所以导数始终为 1.0(因为 f = c x x 的导数等于 1.0)。

当代 LSMT 架构
但是,让我们首先看一下当代 LSTM 网络的架构。下面,您将看到一个乍一看似乎很复杂的可视化。然而,当我们更谨慎地看待它时,情况就不一定如此了。更具体地说,我们可以将各种构建块分为四个主要类别:

内存和输出状态之间的分离。
一个忘记门,帮助我们从内存中删除某些东西。
一个更新(或输入)门,帮助我们向内存添加某些东西。
一个输出门,帮助我们根据输入和现有内存(即基于输入和更新的上下文)生成输出预测。
LSTM 中的所有功能都被分组到一个称为存储单元的单元状结构中。与经典的循环网络类似,当下一次预测发生时,Cell 的输出会流回 Cell。或者,当展开时,就像上面的循环网络一样,相同 cell 的一个副本的输出将传递给该 cell 的另一个副本。在下图中,这由输出 h[t] 和内存 c[t] 的水平流可视化。
在这里插入图片描述

具有 Forget Gate、Update Gate 和 Output Gate 的 LSTM 存储单元。
分离内存和输出状态
经典递归神经网络和 LSTM 之间的第一个关键区别是内存与输出是分开的。在经典网络中,这些是紧密集成的,正如我们在上面可视化的展开循环网络中看到的那样。

在经典网络中,输出用于为下一个预测提供上下文。对于 LSTM 来说,情况不再如此。至少,由于 memory 和 output state 之间的这种分离,不再仅适用于 LSTM。

这在上图中可见:

在这里,LSTM 在任何时间点的输入都显示为 x[t]。
输出可视化为 h[t]。事实上,它是递归的,因为它接受来自前一个 cell 的输出(或者更准确地说,相同 cell 的另一个副本)并将其传递给下一个 cell。
内存 c[t] 也是如此,它是新近可用的,在以前的网络中不可用。
这里的想法是,虽然输出可以提供相当多的关于之前发生的事情的背景,但长期记忆对于提供额外的(即长期)背景是必要的。这就是为什么 output 和 memory 不再与 LSTM 紧密集成的原因。现在,将内存与 cell 输出分离的缺点是您必须使两者保持同步。

保持它们同步意味着我们必须忘记从以前的输出中可以忘记的内容,给定当前的输出。这也意味着我们必须记住,给定之前的输出,必须记住当前 1 中的内容。否则,内存就没用了,不是吗?

因此,LSTM 带有门。下面,我们将描述Gers等人(1999)提出的当代变体,作为Hochreiter和Schmidhuber(1997,提出的原始LSTM的扩展。它有三个门,分别是忘记门、更新门和输出门。他们都发挥着独特但重要的作用。现在让我们看看每个单独的门是如何使内存保持同步的。

五、忘记门

假设你正在将序列提供给模型,其中句子已被标记化(当然,通过生成一些词汇表,可以将其转换为整数等价物)。I am going to the gym

在上一次运行中,您已将 LSTM 模型应用于 ,现在将处理 。这意味着您将拥有以下设置:

x[t] 的值将是 的分词化版本。
h[t-1] 的值将是 的(转换的)分词化输出。
c[t-1] 的值将是长期记忆的某种表示形式,此时它仅包括 的(部分)表示。
为什么它可能只是表示的一部分,是因为分词化的输入将同时影响输出 h[t] 和内存 c[t]。

发生这种情况的第一种方式是通过 forget gate,它已在下面以绿色选中。该门由多个组件组成,从上到下:

一个块,它将前一个时间步的内存与忘记门的输出相乘。
一个 Sigmoid 函数,用作决定要忘记什么的机制。
前一个输出和当前输入作为忘记门的输入。
在这里插入图片描述

在将(学习的)权重矩阵应用于两个输入之后,首先通过矩阵加法将先前的输出 h[t-1] 和当前输入 x[t] 相加。这些学习的权重通过更多地关注当前输入或先前的输出来确定忘记门的强度。然后将结果添加到 Sigmoid 激活函数中,我们知道该函数将所有输入映射到 0.0 到 1.0 之间的值。

换句话说,当前和以前的输入以及学习的权重决定了必须“遗忘”的内容,因为当矩阵中作为加法结果的某些元素< 0 时,它们可能会更容易被遗忘(因为 Sigmoid 激活的输出更接近 0.0 而不是 1.0)。相反,如果结果为 >= 0,则更有可能在删除过程中省略它们。

删除或遗忘过程本身是通过 Hadamard 矩阵乘法进行的。记忆矩阵是 Hadamard 乘以 Sigmoid 激活矩阵的结果,这意味着所有应该降低强度的元素都被减少,所有必须保留的元素都不会受到显着影响。换句话说,这个门允许我们根据先前输出和当前输入的某些组合来学习要忘记什么。
在这里插入图片描述

六、Update Gate (Input Gate)

接下来是更新门(也称为输入门),在下面以绿色显示。与忘记门的任务是从内存中删除信息相反,更新门的任务是将信息添加到内存中。

门本身比忘记门要复杂一些,但别担心,只要有一些解释,也很容易掌握这里发生的事情。

回想一下,这是我们的时间点:

x[t] 的值将是 的分词化版本。
h[t-1] 的值将是 的(转换的)分词化输出。
c[t-1] 的值将是长期记忆的某种表示形式,此时它仅包括 的(部分)表示。
如您所见,它由两个部分组成:一个基于前一个输出 h[t-1] 和当前输入 x[t] 的联合学习加权输入的 Sigmoid 激活n,以及一个接受基于两个输入的另一个联合学习加权输入的 Tanh 激活。这些激活的结果首先被 Hadamard 矩阵相乘,然后通过矩阵加法添加到内存中。
在这里插入图片描述

我可以想象这里发生的事情仍然有点模糊。让我们进一步分解。以下是 Sigmoid 和 Tanh 函数及其导数的绘图。

在这里插入图片描述
在这里插入图片描述

我们首先看一下 Tanh 函数。正如我们所看到的,该函数将所有输入映射到 -1.0 到 +1.0 之间的值。换句话说,它将任何输入标准化为 [-1.0, 1.0] 范围。因此,将先前输出和当前输入的连接加权组合馈送到 Tanh 可确保输入值的一些标准化。这有利于训练过程的稳定性。然而,它并不能真正作为更新,因为使用 Tanh,所有新信息都会被添加。

这就是为什么在这里我们也应用了一个 Sigmoid 函数。正如我们所知,它映射到 0.0 到 +1.0,我们可以看到它学习选择先前输出和当前输入组合的最重要方面。Sigmoid 激活的结果是 Hadamard 矩阵乘以 Tanh 结果,然后将其添加到内存中。

换句话说,Hadamard 矩阵将 Sigmoid 激活结果和 Tanh 激活结果相乘的组合确保 (1) 在给定当前输入的情况下,只有重要的方面才会被添加到内存中;(2) 它们的添加方式在数值上稳定了训练过程。

好东西!

七、Output Gate

最后但并非最不重要的一点是 output gate,它在下面以绿色显示。

它的唯一职责是给定前一个输出和当前输入 h[t-1] 和 x[t] 来制定存储单元的输出 h[t]。然而,这个门真的很重要,因为它将决定预测的正确性(即输出)和所有后续生产的稳定性,仅仅因为它的预测在下一个预测中被重用。

我们再次看到 Tanh 和 Sigmoid 激活的 Hadamard 矩阵乘法。不过,这一次,输入来自不同的方向。

Sigmoid 激活的输入从前一个输出和当前输入流出。与迄今为止的所有 Sigmoid 一样,使用单独的权重矩阵进行加权,此 Sigmoid 激活提供了关于当前输入和先前输出中最重要的内容(用于转导任务)的学习表示。
Tanh 激活的输入从内存流出(通过忘记和添加新信息进行更新),并从本质上标准化内存值,从而稳定训练过程。
通过 Hadamard 矩阵乘法,它们一起产生我们希望正在寻找的输出标记。
在这里插入图片描述

为什么 LSTM 不会受到梯度消失的影响
我们知道,经典的 RNN 在训练过程中面临着梯度消失的困难,但 LSTM 没有梯度消失。

但为什么会这样呢?

现在我们了解了 LSTM 的工作原理,并且它们通过门将内存和以前的输出分开,答案很简单:梯度可以在同一存储单元的副本之间自由、持续地流动(即梯度 = 1.0)。

此外,由于使用了 Sigmoid 和 Tanh 激活函数,单元组件内的梯度可以是任何值,因此单元将能够学习如何适应与忘记、更新和输出门相关的矩阵的权重。

我可以想象这很难理解,所以让我们再次将其分解为单独的组件。
在这里插入图片描述

八、数学上的内存

让我们仔细看看首先在一次 token pass 中更新内存的方式。简单地说,它是一个线性运算,数学上写成如下:
在这里插入图片描述

这里,f_t 表示遗忘门的激活值,它是 Hadamard 矩阵乘以 c[t-1] 的值(我们从上面知道)。

这里,i_t \circ \tilde{c}_t 是更新门的 Sigmoid 激活和 Tanh 激活输出之间的 Hadamard 矩阵乘法,然后简单地将矩阵添加到内存中。

换句话说,它代表了我们上面直观地理解的操作。

记忆激活函数是恒等函数
此外,该记忆流中不存在非线性激活函数,这与经典的 RNN 相反,后者通常是 Sigmoid 激活的。换句话说:激活函数可以描述为恒等函数,或 f(x) = x (Maniac Malko, n.d.)。由于它的梯度为 1.0,我们可以看到误差可以在消失的同一存储单元的副本之间自由流动(就像当梯度< 1.0 时发生的那样,例如在 Sigmoid 情况下)。

与传统 RNN 相比,这一变化解决了 LSTM 中的梯度消失问题。

九、从 LSTM 到 Transformer

在这里插入图片描述

在 2010 年代,LSTM 是序列到序列学习活动(如机器翻译)的首选网络类型。

然而,还有一个 LSTM 没有解决的瓶颈:处理必须按顺序进行。

序列的每个部分都必须按顺序馈送到网络,然后基于每个标记计算转导。

这会不必要地减慢训练过程。

在他们的突破性工作中,Vaswani et al. (2017) 提出了 Transformer 架构,它通过剥离架构中反复出现的方面来实现并行。对 Transformers 的兴趣大幅增长确保了 LSTM 已被从基座上移除;它们不再被认为是 NLP 中的最先进的。

尽管如此,它们今天仍在继续使用,即使选择了“自 55.000 年以来”选项,在 Google Scholar 中也有大约 2020 次点击。涵盖了多种应用,其中包括 COVID-19 预测、空气质量预测和产水预测。

这就是为什么 LSTM 不能被丢弃,而是要小心应用。

十、总结

在本文中,我们研究了长短期记忆网络 (LSTM),这是过去几年 NLP(或更普遍地说,时间序列)机器学习中最先进的方法,然后被 Transformer 网络取代。在此过程中,我们首先看到了在训练经典 RNN 时会出现哪些问题,主要是梯度消失问题。我们还看到,发生这种情况是因为像 Sigmoid 这样的经典激活函数产生的导数充其量只能< 1,从而在改进时产生梯度消失。

我们看到,LSTM 通过引入所谓的恒定误差轮播来克服了这个问题。通过将内存与隐藏的非线性激活输出分离,他们可以确保内存的梯度始终为 1.0 — 确保梯度既不会爆炸也不会消失,同时它们可以在时间步之间自由流动。通过三个门,即遗忘门、输入/更新门和输出门,当前输入和以前的预测可以通过删除可以丢弃的内容、添加必须保留的内容来更新内存,最后根据输入和当前内存生成输出。

尽管 LSTM 取得了好处,但它们不再被认为是最先进的方法。这主要是由于 Transformer 网络的诞生,它还有一个额外的好处,即序列不必按顺序处理,而是并行处理。尽管如此,LSTM 仍然被广泛应用,因此不能从研究和工程活动中丢弃。


http://www.kler.cn/a/416083.html

相关文章:

  • 多头注意力机制:从原理到应用的全面解析
  • Cause: java.sql.SQLException: No value specified for parameter 4
  • 软件测试常问面试问题及项目流程相关概念
  • 【计算机视觉算法与应用】模板匹配、图像配准
  • Django 路由层
  • DM-VIO(ROS)+t265配置运行记录(ubuntu18.04+ros melodic)
  • 基于Java Springboot蛋糕商城
  • 开源测试_log4net
  • C语言数据结构——详细讲解《队列》
  • uniapp App端在renderjs层渲染echarts获取不到service层id的问题
  • 数字化转型背景下,高职院校计算机网络应用的革新策略
  • C++算法练习-day49——108.将有序数组转换为二叉搜索树
  • 【人工智能基础】计算机视觉
  • ElementUI:el-drawer实现在父组件区域内打开抽屉组件非全屏
  • git如何创建一次没有修改的commit
  • windows C#-取消任务列表(下)
  • python画图plt.close()一直闪烁
  • webpack5提升打包构建速度(四)
  • 详解 YOLOv5 模型运行参数含义以及设置及在 PyCharm 中的配置方法
  • uniapp首页样式,实现菜单导航结构
  • 【LeetCode热题100】优先级队列
  • 微软要求 Windows Insider 用户试用备受争议的召回功能
  • 显卡驱动更新无法更新怎么办 显卡驱动无法更新原因及解决
  • Java知识及热点面试题总结(一)
  • 嵌入式 FPGA开发
  • GAMIT 单北斗sV antenna offsets for SVN c232 not found in antmod.dat