理解LSTM网络(翻译)

2023-11-11

Translated on December 19, 2015


Recurrent Neural Networks

人们思考问题时,不会在每一秒都从头开始想,而不考虑以往的记忆和经验。比如,读这篇文章的时候,你每读一个词都会结合前面读到的几个词来理解当前这个词的意思,而不会把前面看到的几个词忘掉然后单独考虑这个词的意思。也就是说,你的思考是有持续性的。

传统的神经网络不能做到这种持续性,这似乎是它最大的一个缺陷。举个栗子,假设你想对一部电影中的每一帧正在发生的事件做分类。用传统的神经网络的话,你很难搞清楚,它怎样才能把之前发生的事件的信息提供给这一帧正在发生的事件,以帮助其作出正确的分类。

循环神经网络(RNN)刚好解决了这个问题,这种类型的网络中存在环,能够使信息保存其中。


RNN-rolled

RNN存在环

上图是RNN的一部分, A 的输入是 xi , 输出为值 hi . 这个环能够允许信息从神经网络中的一步传递到另一步。

这些环让循环神经网络看起来似乎有些难以理解。但是你稍微想一下就能发现,它其实跟传统神经网络并没有太大的区别。一个循环神经网络可以被看作由同一个网络多次复制得到,每次都将信息传递给后续网络。我们将环展开就能看出来了。


RNN-rolled

展开的RNN

这种链式的本质,揭示出它和序列以及列表有着紧密的联系。它们是处理这类数据的网络结构的自然选择。

并且它们确实是被用上了!在过去的几年里,RNN被应用在各种各样的任务中,并且取得巨大的成功。比如在:语音识别、语言模型建模、机器翻译、图片加标题等等。而且这个列表还在继续扩大。我们不在这里继续讨论RNN的牛逼之处,你可以在Andrej Karpathy的博客:The Unreasonable Effectiveness of Recurrent Neural Networks 中找到。RNN的确是丧心病狂的好!

这些成功的核心就是它们都使用了LSTM,LSTM是RNN的一个变种。对许多任务来说,使用LSTM比标准的RNN效果要好很多。几乎所有激动人心的结果都是在基于这种类型的RNN上实现的。这种类型的RNN也是我们这篇文章所要讨论的内容。

长距离依赖的问题

RNN有一个吸引人的一点就是它能够将之前的信息整合到当前的任务当中,比如利用视频之前出现的帧的信息来理解当前这一帧。如果真的RNN能做到这一点,那的确是非常有用的,但是它能吗?不一定。

有时候,我们只需要利用到比较近的信息来处理当前的任务。比如,假设我们尝试利用一个语言模型来根据之前出现的几个单词预测接下来的一个单词。假设我们想要预测句子 “the clouds are in the sky“,我们不需要有更多的上下位了,因为已经非常明显了,跟在后面的单词是 sky。预测所需要的相关信息所在的位置和目标单词的距离比较小,像这样的话RNN是可以利用到这些过去信息。


RNN-rolled

但是,有时候我们需要更多的上下文。假设我们想要预测这段文本的最后一个单词 “I grew up in France… I speak fluent French “。如果只知道很近的几个单词,我们能猜测出目标单词代表着一种语言,但是想要确定具体代表哪种语言的话,就得知道更久之前的信息,到Frence附近才行。像这种所要利用的信息离目标单词的距离很远的情况是很有可能会发生的。

不幸的是,随着距离的增大。RNN越来越难将这种长距离的信息利用起来。


RNN-rolled

从理论上讲,RNN绝对能够处理像这种”长距离依赖“的问题。我们可以人为的仔细挑选出一些参数来解决长距离依赖问题中较简单的任务。但遗憾的是,在实践中,RNN似乎不能自主的去学习处理这类任务。这个问题 Hochreiter (1991) [German]Bengio, et al. (1994) 已经深度的探讨过,他们找了这类问题很难解决的本质原因。

幸运的是,LSTMs不存在这个问题!

LSTM网络

长短期记忆网络-通常也被简称为“LSTMs”- 是一种特殊类型的RNN,能够学习长期的依赖关系。这种网络是由 Hochreiter & Schmidhuber 在1997年发明,被后续很多人完善和普及。LSTMs在许多任务上都表现极好,被广泛使用。

LSTMs被明确设计出来解决长期依赖问题。记忆长效信息是它们默认的自发行为,不是努力去学习的!

所有的循环神经网络都有链式的重复模块。在标准的RNN中,这种重复模块包含一个简单的结构,比如一个单层 tanh层。


RNN-rolled

标准RNN的重复模块包含一个单层网络

LSTMs同样有这种链式结构,但是它们的重复模块不同。一个四层的网络代替了原来的单层网络,这四层网络用一种特殊的方式进行交互。


RNN-rolled

LSTM网络的重复模块包含一个四层的交互网络

我们不用担心这些细节。我们将对上面的LSTM图进行一步一步的梳理。现在,让我们来熟悉一下一会儿将会用到的一些表示符号~

RNN-rolled

在上面的图表中,每一条线代表着一整个向量,从一个结点的输出到另一个结点的输入。粉红色的圆圈代表按位操作,比如向量加法。黄色的方块代表学习的神经网络。线的合并代表连接,分叉表示复制。

LSTMs背后的核心思想

LSTMs的关键是cell的状态,就是图表顶端水平向右的那条线。

cell的状态就像是一种传送带。它的状态沿着整条链传送,只有少数地方有一些线性交互。信息在传送过程中很容易就能保持不变。


RNN-rolled

通过一种叫做‘门’的结构的控制,LSTM能够在cell的状态中增加或者移除信息。

门是一种有选择的的让信息通过的方法。门是由一个sigmoid网络层和一个按位乘的操作组成的。


RNN-rolled

sigmoid层的输出是一个0到1之间的数值,表示每个部分有多少信息能够通过。0代表不让信息通过,而1表示让信息全部通过。

LSTM有三个这种门,保护和控制着cell的状态。

一步一步解读LSTM

LSTM的第一步就是决定我们应该从cell的状态中扔掉哪些信息。这个决定是由sigmoid层中的“遗忘门”来完成的。它的输入是 ht1 xt ,输出为一个0到1之间的数。其中1代表着完全保留,而0意味着全部扔掉。

我们回到刚才提到的语言模型的例子,即:用之前出现的单词来预测接下来的一个单词。在这样一个问题中,cell状态可能会考虑到当前主语的性别,这样才能找到正确的代词。当我们看到一个新的主语时,我们就希望忘记旧主语的性别。


RNN-rolled

下一步就是要决定什么样新的信息应该被存储在cell的状态里。这分为两步。首先,一个被称为”输入门”的sigmoid层决定我们需要更新哪些值。然后,tanh层生成一了一个候选向量 Ci~ ,它能够被加到状态中。最后一个步骤,我们将这两个值结合起来更新cell状态。

在我们的语言模型的例子中,我们希望能将新主语的性别信息加入到cell的状态中,替换需要忘记的旧信息。


RNN-rolled

现在是时候去更新旧的cell状态了,把 Ct1 加入到cell 状态 Ct 中。前面几步已经确定了该怎么做,现在只需要去执行就行了。

我们将旧状态乘以 ft ,把我们之前觉得该忘的东西忘掉,然后加上 itCi~ 。 这就是新的候选值,按我们决定的比例进行缩放。

在语言模型的例子中,这就是真正丢掉关于旧主语性别的例子然后加入新信息的过程,就像我们前几步中决定的那样。


RNN-rolled

最后,我们需要决定我们最终输出什么。这个输出结果将会基于我们的cell状态,但是会是一个过滤的版本。首先,我们会运行一个sigmoid层来决定cell状态的那一部分来输出。接着,我们将cell 状态通过tanh函数(使输出值保持在-1到1之间),然后乘以sigmoid门的输出,这样我们就输出了我们希望输出的那部分。

对于语言模型的例子,因为它只看到了一个主语,所以可能会输出跟动词相关的信息。比如,它可能会输出主语是单数还是复数,这样的话如果接下来的单词真的是动词,我们就能找到动词正确的形式了。


RNN-rolled

LSTM的各种变种

到目前为止,我们介绍的RNN都是一些比较正规的LSTM。但是,并不是所有的LSTMs都跟上面介绍的一样。事实上,基本上每一篇涉及到LSTM的论文都出现一个有小改动的版本的LSTMs。这些变化很小,但是值得提出来。

一种比较流行的LSTM的变种是由Gers & Schmidhuber (2000)
提出的。就是加上”窥探孔连接”。这就意味着门连接层能够接收到cell的状态信息。


RNN-rolled

上图就是在每个门上都加上窥探孔连接后的结果,但是并不是所有论文都会把连接全,有的会少连一些。

另一个变种就是用一对遗忘门和输入门。原来是先决定遗忘什么,然后再决定应该加入什么新信息,现在是两个决定一起完成。
我们只有在将要加入新信息时才会开始遗忘。也只有在遗忘旧信息同时才会加入新的信息到状态中。


RNN-rolled

LSTM一个稍微比较引人注目的变种是 Gated Recurrent Unit,或者简写为GRU。是由Cho, et al. (2014) 引入的。他把遗忘门和输入门结合起来构成更新门。将cell 状态和隐藏层状态合并,然后还有一些其他的小的改动。得到的模型比标准的LSTM模型简单一些,所以变得越来越流行了。


RNN-rolled

这只是比较出名的LSTM变种中少数几个,还有很多其他的。比如 Yao, et al. (2015) 的 Depth Gated RNNs。 还有一些比其他用完全不同的方法来处理长期依赖问题的,比如 Koutnik, et al. (2014) 的 Clockwork RNNs。

哪种变种是最好的呢?到底这些变化重要么?Greff, et al. (2015) 对比较流行的几种变种做了一个很好的对比,发现它们基本上都差不多。Jozefowicz, et al. (2015) 测试了超过一万种RNN结构,发现有一些能够在特定任务上超过LSTMs。

总结

之前,我提到了很多人用RNN取得了很好的效果。基本上,所有的这些RNN都是基于LSTM的。它们的确是在许多任务上都表现不俗!

写了一大推公式,让LSTMs看起来挺吓人的。但是希望,我们这样一步一步走下来能让你对LSTMs更了解一些,让它看起来更亲切。

LSTMs对于RNN来说是一个大的飞跃,有了LSTMs后越来越多的任务都用RNN来解决。很自然地,我们想是否还有下一个飞跃?研究者们普遍认同的一个观点是:”yes!的确有下一个飞跃,就是Attention!“这个观点就是在RNN的每一步都从大的信息集合中挑选出部分来关注。比如,如果你用RNN来产生描述图片的标题,对于每一个要输出的标题,它可能只关注图片的一部分。事实上,就是这样做的。如果你想探索attention,这可能是一个比较有意思的出发点。使用attention的RNN已经取得了许多激动人心的结果,而且似乎越来越多的好结果即将出现…….

RNN领域中不止是有attention这一个有趣的研究方向。比如,Grid LSTM 看起来也很有前景。在生成模型中使用RNN同样很有趣。过去几年RNN发展的很红火,那接下来几年更会是如此!

致谢

对于那些帮助我更好得理解LSTMs的人表示感谢,他们有的是面对面提出建议和评论,有的是在博客上进行反馈~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解LSTM网络(翻译) 的相关文章

随机推荐

  • 合天Weekly第二十一周

    分析代码可以看出是sql注入 首先使用order by 看下有几列 这里空格被过滤使用 绕过 当输入4的时候不回显所以为3列 提示flag在 falg 表里构造payload 1 union select 1 flag 3 from fla
  • mybatis.type-aliases-package的作用和用法

    第一种在mapper xml文件中的resultMap的type或者parameterType会用到自定义的POJO 其中resultType User 中 User就是自定义的POJO 此时可以使用完全限定名来指定这些POJO的引用 第二
  • lambda 和 Predicate 的妙用示例

    1 过滤集合数据的多种常用方法 public class DemoTest1 public static void main String args List
  • 数据挖掘和机器学习之间,主要有什么区别和联系?

    数据挖掘和机器学习的区别和联系 周志华有一篇很好的论述 机器学习和数据挖掘 可以帮助大家理解 数据挖掘受到很多学科领域的影响 其中数据库 机器学习 统计学无疑影响最大 简言之 对数据挖掘而言 数据库提供数据管理技术 机器学习和统计学提供数据
  • 手势识别Python-OpenCV

    目录 一 选题背景 5 二 设计理念 5 2 1 搭建平台 5 2 2 问题描述 5 2 3 过程概述 6 三 过程论述 6 3 1 数据集生成 6 3 1 1 标准化图片的采集 6 3 1 2肤色检测 7 3 1 3 特征提取 8 3 1
  • Linux系统基础命令

    Linux系统常用基本命令 ls 查看当前目录下所有文件 注 蓝色 文件夹 白色 普通文件 绿色 拥有执行权限的文件 红色 压缩文件 touch 示例 touch filename txt 在当前目录下创建一个文件 注 文件名区分大小写 文
  • 【LeetCode】83. 删除排序链表中的重复元素

    83 删除排序链表中的重复元素 简单 方法 一次遍历 思路 由于给定的链表是排好序的 因此重复的元素在链表中出现的位置是连续的 因此我们只需要对链表进行一次遍历 就可以删除重复的元素 从指针 cur 指向链表的头节点 随后开始对链表进行遍历
  • 【时间序列数据挖掘】ARIMA模型

    目录 0 前言 一 移动平均模型MA 二 自回归模型AR 三 自回归移动平均模型ARMA 四 自回归移动平均模型ARIMA 总结 0 前言 传统时间序列分析模型 ARIMA模型是一个非常灵活的模型 对于时间序列的好多特征都能够进行描述 比如
  • MYSQL数据库测评及整改

    1 查询数据库版本 select version 2 查询已安装的插件 show plugins 3 查询插件安装的位置 show variables like plugin dir 4 查询用户 选择数据库 select host use
  • 阿里云OCR图片识别

    阿里云OCR图片识别 请求参数 Body 请求示例 java 正常返回示例 错误码定义 阿里云OCR图片识别 单字识别 表格识别 旋转功能 准备条件 阿里云OCR图片识别API购买 初次购买1分钱500次接口调用 请求参数 Body 图像数
  • Java多线程——为什么弃用stop、suspend、resume方法

    初始的Java版本定义了一个stop方法用来终止一个线程 以及一个suspend方法用来阻塞一个线程直至另一个线程调用resume stop和suspend方法有一些共同点 都试图控制一个给定线程的行为 stop suspend和resum
  • 利用Python写Api

    初学者 仅作笔记参考 因为没使用web框架 采用的原生sql进行数据查询有点呆板 from mysql Database import Demo from utils tools import Tools import flask json
  • 运行快捷指令_iOS 13 快捷指令无法运行的解决办法

    升级 iOS13 以后 快捷指令 App 也迎来全新版本 新设计的快捷指令 App 有诸多不同 尤其在权限控制上更为严格 这导致部分快捷指令打开时报错的问题 首次添加快捷指令规则后 运行时提示 无法打开 XXX 这个问题其实很容易解决 方法
  • linux 下 redis 设置密码

    在服务器上 这里以linux服务器为例 为redis配置密码 1 第一种方式 当前这种linux配置redis密码的方法是一种临时的 如果redis重启之后密码就会失效 1 首先进入redis 如果没有开启redis则需要先开启 root
  • matlab函数结果,从Matlab函数返回多个输出变量

    一些选择 添加一个参数以指定控制台的详细输出 但默认情况下将其设置为false function A B C test x y z verbose if nargin 3 verbose false end A 2 x B 2 y C 2
  • JavaScript基础--es6新增的数组方法

    今天给大家介绍一些es6新增的常用数组方法 1 映射数组 map 方法 目的 为了操作原数组 但不改变原数组的值 作用 map 方法返回一个新数组 数组中的元素为原始数组元素调用函数处理后的值 不会对空数组进行检测 返回值 新数组 一定和原
  • 欧拉角的理解

    1 欧拉角概念 百度百科 欧拉角 用来确定定点转动刚体位置的3个一组独立角参量 欧拉角由章动角 旋进角 即进动角 和自转角 组成 欧拉角为欧拉首先提出而得名 维基百科 Euler angles 莱昂哈德 欧拉用欧拉角来描述刚体在三维欧几里得
  • 【100%通过率 】【华为OD机试真题 c++/java】关联端口组合并【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 有M 1 lt M lt 10 个端口组 每个端口组是长度为N 1 lt N lt 100 的整数数组 如果端口组间存在2个及以上不同端口相同
  • pycharm 退出scientific mode科学模式

    之前工作需要进入scientific mode将pycharm调成科学模式 后来使用bert模型发现一直报错 也没改动代码 困惑了大半天 偶然的机会 退出scientific mode发现不报错了 这里记录一下 我用的是pycharm社区版
  • 理解LSTM网络(翻译)

    Translated on December 19 2015 本文为博客 Understanding LSTM Networks 的翻译文章 原文链接 http colah github io posts 2015 08 Understan