【学习笔记】Understanding LSTM Networks

Understanding LSTM Networks

  • 前言
  • Recurrent Neural Networks
  • The Problem of Long-Term Dependencies
    • LSTM Networks
  • The Core Idea Behind LSTMs
  • Step-by-Step LSTM Walk Through
    • Forget Gate Layer
    • Input Gate Layer
    • Output Gate Layer
  • Variants on Long Short Term Memory
  • Conclusion

前言

最近在整理LSTM相关的工作,看到了一篇非常经典的博客,遂沿着该博客的思路过了一遍LSTM,收获颇丰,故写下此篇笔记以帮助NLP初学者理解LSTM这个经典的模型,当然要想深入学习,还是看英文原版博客更合适。


Paperhttps://colah.github.io/posts/2015-08-Understanding-LSTMs
Codehttps://github.com/nicodjimenez/lstm
Fromcolah’s blog

Recurrent Neural Networks

人类总是依赖上下文进行思考的,因为你的思想存在延续性,但是传统的神经网络做不到这一点,它无法将先验知识添加进来帮助模型理解当前的场景。因此RNN应运而生,RNN作为特殊的神经网络,保留了之前学习到的内容,引入了隐状态的概念,它可以对序列信息抽取特征,作为先验信息传递下去。
image.png
上图就是一块RNN模块,输入 X t X_t Xt到模块中,输出 h t h_t ht,同时模块中的loop允许信息从该模块传递下去。从这个角度来看,RNN又更像神经网络了。
image.png
具体来说,RNN模块以链式结构连接在一起,如上图所示,这种链式的结构将上游的信息传递下去,从而使得模型能够将先验知识利用起来。RNN在语音识别、语言建模、翻译和图像识别等领域都取得了巨大的成功,不过其中最大的功臣还是LSTM,下面将讲述普通的RNN所遇到的瓶颈。

The Problem of Long-Term Dependencies

理论上,RNN利用上之前的信息可以解决当前的问题,但是这取决于序列的长短。当序列很短时,比如一句话“the clouds are in the”,模型很容易知道下一个要输出的单词是“sky”。
image.png
可是当序列很长时,比如一段文本“I grew up in France… I speak fluent _”,中间省略的部分包含大量的文本内容,对于人来说,由于一开始提及了France,如果多加注意,那么这里大概率会填写“French”,但是对于普通的RNN模型来说,很难将这二者关联起来。这就是长程依赖问题。
总结一下, RNN具有如下的局限性:

  1. 梯度消失。随着模型网络层次加深,小于1的梯度传递下去会越来越小,造成梯度消失,因此RNN只具有短时记忆。
  2. 梯度爆炸。本质上也是和模型深度有关,大于1的梯度会随着模型加深而爆炸式增大。

LSTM Networks

LSTM,即长短期记忆网络,是RNN的一个特例,它可以学习长程依赖,并被广泛使用。一个普通的RNN模型可以由下面的结构图表示:
image.png
LSTM在此链式结构基础上添加了三道门控机制,使得之前单一的网络变为了四层相互作用的网络,如下图所示:
image.png
为了详细分析LSTM模型的结构,这里将介绍常用的符号及其表示:
image.png
在上面的图表中,每条线都传递着一个向量,从一个节点输出,再输入到另一个节点中;粉色的圆圈表示逐点操作,如点乘或者点加;合并的箭头表示将两个向量进行拼接(concatenation),分开的箭头表示将一个向量进行复制,然后输入到不同的节点中。

The Core Idea Behind LSTMs

LSTMs的关键在于cell的状态,即下图中加粗的水平横线。
image.png
cell的状态类似一种传输带,它横穿整个链,只做了少量的线性操作。这种结构可以轻松实现信息不变传递。当然,LSTM也具有向cell移出、添加信息的能力,由门的结构来实现。
门让信息可选通过,它通过sigmod激活函数和点乘操作实现。
image.png
sigmoid激活函数让输入的信息的值限定在0到1的范围,决定了允许多少比例的信息流出,0即不允许信息流出,1即让所有信息传递下去。一个LSTM具有三种不同结构的门,分别是遗忘门、 输入门和输出门,用于保护和控制cell的状态。

Step-by-Step LSTM Walk Through

Forget Gate Layer

第一个门是遗忘门,决定多少信息可以继续通过这个cell,输入是 x t x_t xt h t − 1 h_{t-1} ht1,输出是每个数值都在0-1范围的向量,其长度和cell状态 C t − 1 C_{t-1} Ct1一致,表示让多少上游信息继续传递下去。
image.png

Input Gate Layer

接着下一步,对于当前的新信息,决定有哪些需要存储到cell状态中。它分为两个部分:

  1. 输入门的sigmoid层决定哪些信息需要更新
  2. 输入门的tanh层创建候选向量 C ~ t \tilde{C}_{t} C~t,用于作为新信息加入到cell状态中。

image.png
上面两层输出相乘即得到需要更新到状态的信息。旧状态 C t − 1 C_{t-1} Ct1 f t f_{t} ft相乘再和需要更新的新状态想相加,就得到了更新后当前cell的状态。如下图所示:
image.png

Output Gate Layer

最后,对于当前的模块,我们需要决定输出什么样的值。这个输出主要依赖于cell的状态 C t C_{t} Ct。首先需要一个sigmoid层来决定 C t C_{t} Ct中的哪些信息会被输出,接着把 C t C_{t} Ct通过一个Tanh层,将该层的输出与sigmoid层的权重相乘,得到了最后的输出结果。
image.png

Variants on Long Short Term Memory

在LSTM出现之后,又涌现出很多LSTM的变体。一个变体来自Gers & Schmidhuber (2000),它加入了“peephole connections”层,意思是让所有的门层都看向cell状态。
image.png
另一个变体将遗忘门和输入门连接起来,当需要遗忘和输入新信息时,同时做出决定。这比较符合人类的认知,当我们输入新的东西时我们才会遗忘,当我们遗忘旧的知识时,就需要新的知识来补充。
image.png

最经典的变体当然还是GRU,它只有两个门:重置门和更新门,重置门即 r t r_{t} rt,它决定是否重置上一时刻信息,更新门 z t z_{t} zt相当于将LSTM的遗忘门和输入门合并到了一起,它将当前的信息和上一时刻的信息进行合并。
image.png
GRU与LSTM有如下的对比:

  1. GRU少一个门,同时少了cell状态。
  2. LSTM通过遗忘门和输入门来控制信息的传输,而GRU通过重置门来决定是否保留原来的隐藏状态。

Conclusion

LSTM在许多任务上都取得了显著的成功,但是注意力机制的出现进一步吸引科研人员的目光,它可以对更长的序列进行建模,并且支持并行计算,大大提高了模型的效率,这也就是后来的基于Transformer的一系列模型,如今Transformer的影响已经涉及到AI的各个领域,LLM的出现又进一步推动了AIGC的发展。正所谓星星之火可以燎原,谁能想到,当年RNN的一小步,竟然造就了AI如此辉煌的今天!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/136513.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java--JDBC学习

文章目录 今日内容0 复习昨日1 JDBC概述2 JDBC开发步骤2.1 创建java项目2.2 导入mysql驱动包2.2.1 复制粘贴版本2.2.2 idea导入类库版本 2.3 JDBC编程 3 完成增删改3.1 插入3.2 更新3.3 删除 4 查询结果集ResultSet【重要】5 登录案例【重要】6 作业 今日内容 0 复习昨日 1 JDB…

二十五、城市建成区结果制图——复杂图的制作

一、前言 有些时候看到一些参考文献中有些很复杂的图,例如多幅合并在一起,其实这种图本质上就是单一的图合并在一起,然后将其导出即可。 二、具体操作 其实对于制图必备要素的添加就不过多介绍,主要介绍有什么办法保持图形之间一致性,例如,其图例、指北针、比例尺统一…

vColorPicker与vue3-colorPicker——基于 Vue 的颜色选择器插件

文章目录 前言样例特点 一、使用步骤?1. 安装2.引入3.在项目中使用 vcolorpicker 二、选项三、事件四、问题反馈问题所在安装引入例子效果图 前言 vColorPicker——官网 vColorPicker——GitHub 样例 vColorPicker是基于 Vue 的一款颜色选择器插件,仿照…

自定义Graph Component:1-开发指南

可以使用自定义NLU组件和策略扩展Rasa,本文提供了如何开发自己的自定义Graph Component指南。   Rasa提供各种开箱即用的NLU组件和策略。可以使用自定义Graph Component对其进行自定义或从头开始创建自己的组件。   要在Rasa中使用自定义Graph Component&#x…

Oracle(2-1) Networking Overview

文章目录 一、基础知识1、Network Environ Challenges 网络环境挑战2、Simple Network :2-Tier 简单的两层网络3、Simple to Complex : N-Tier 简单到复杂:N层网络4、Oracle Network Solutions Oracle网络解决方案5、Key Features of Oracle Net Oracle Net的主要功…

Linux必备:这十个流程图让你变的更强!

图是我们与信息联系并处理其重要性的绝佳方法;它们有助于传达关系和抽取信息,并使我们能够可视化概念。 从基本工作流程图到复杂的网络图,组织图,BPMN(业务过程模型和符号),UML图等等&#xff0…

关于值传递和引用传递的问题记录

目录 1. 问题概述 1.1 测试 1.2 结果 2. ArrayList和Arrays.ArrayList 1. 问题概述 最近忙着写论文很久没更新了&#xff0c;趁现在有时间简单记录一下最近遇到的一个坑。 对于Java中的List<>类型的对象&#xff0c;按我以前理解是引用传递&#xff0c;但有一点要注…

第一百七十回 Material3中的IconButton

文章目录 1. 概念介绍2. 使用方法2.1 filled风格2.2 filledTonal风格2.3 outlined风格 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"如何修改NavigationBar组件的形状"相关的内容&#xff0c;本章回中将 介绍IconButtion组件.闲话休…

【入门Flink】- 10基于时间的双流联合(join)

统计固定时间内两条流数据的匹配情况&#xff0c;需要自定义来实现——可以用窗口&#xff08;window&#xff09;来表示。为了更方便地实现基于时间的合流操作&#xff0c;Flink 的 DataStrema API 提供了内置的 join 算子。 窗口联结&#xff08;Window Join&#xff09; 一…

数据结构—内部排序(上)

文章目录 8.内部排序(上)(1).排序基础#1.为什么是内部排序#2.排序的稳定性 (2).冒泡排序#1.算法思想#2.代码实现#3.稳定性与时间复杂度分析 (3).选择排序#1.算法思想#2.代码实现#3.稳定性与时间复杂度分析 (4).插入排序#1.算法思想#2.代码实现#3.稳定性与时间复杂度分析 (5).希…

vue+mongodb+nodejs实现表单增删改查

ExpressMongodbVue实现增删改查 效果图 前言 最近一直想学下node,毕竟会node的前端更有市场。但是光看不练&#xff0c;感觉还是少了点什么&#xff0c;就去github上看别人写的项目&#xff0c;收获颇丰&#xff0c;于是准备自己照葫芦画瓢写一个。 作为程序员&#xff0c;一…

Flutter:改变手机状态栏颜色,与appBar状态颜色抱持一致

前言 最近在搞app的开发&#xff0c;本来没怎么注意appBar与手机状态栏颜色的问题。但是朋友一说才注意到这两种的颜色是不一样的。 我的app 京东 qq音乐 这样一对比发现是有的丑啊&#xff0c;那么如何实现呢&#xff1f; 实现 怎么说呢&#xff0c;真不会。百度到的一些是…

Android开发之apk瘦身计划

为什么apk越来越大&#xff1f; 1.项目不断发展&#xff0c;功能越多&#xff0c;代码量增加的同时&#xff0c;资源文件也在不断的增多。 2.app支持的主流dpi越来越多&#xff0c;如ldpi、mdpi、hdpi、xh xxh xxxh等等&#xff0c;间接导致资源增多。 3.引入的第三方sdk或开…

软件测试面试-银行篇

今天参加了一场比较正式的面试&#xff0c;汇丰银行的视频面试。在这里把面试的流程记录一下&#xff0c;结果还不确定&#xff0c;但是面试也是自我学习和成长的过程&#xff0c;所以记录下来大家也可以互相探讨一下。 请你做一下自我介绍&#xff1f;&#xff08;汇丰要求英…

从系统层到应用层,vivo 已在安全生态层

你每隔多久就会使用一次手机&#xff1f;调研结果也许会让你大吃一惊。 权威报告数据显示&#xff0c;2022年&#xff0c;24.9%的受访者每日使用手机时长超过10小时&#xff0c;其中3.8%的受访者“机不离手”&#xff0c;每日使用时长超过15小时。而真正让手机化身为时间吞金兽…

go学习之接口知识

文章目录 接口1.接口案例代码展示2.基本介绍3.基本语法4.应用场景介绍5.注意事项和细节6.接口编程经典案例7.接口与继承之间的比较8.面向对象编程--多态1&#xff09;基本介绍2&#xff09;快速入门3&#xff09;接口体现多态的两种形式 9.类型断言1&#xff09;先看一个需求2&…

【第六章】软件设计师 之 数据结构与算法基础

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 1、数据结构与算法基础 2、数据 3、稀疏矩阵…

分享一下关于“vcruntime140_1.dll丢失的5种解决方法

今天我来给大家分享一下关于“vcruntime140_1.dll丢失的5种修复方法”的分享。首先&#xff0c;我们来了解一下vcruntime140_1.dll丢失的原因。 病毒感染&#xff1a;病毒或恶意软件可能损坏或删除vcruntime140_1.dll文件。 系统更新或软件安装&#xff1a;在进行系统更新或安…

每日一练:使用Python计算从m到n的累加和

设计思路 可以定义一个函数来计算从m到n的整数累加和&#xff0c;这个函数会接受两个参数&#xff1a;m和n&#xff0c;然后通过使用for循环和range函数&#xff0c;遍历从m到n&#xff08;包括n&#xff09;的所有整数&#xff0c;并将它们加起来。 代码实现 def sum_of_nu…

链表的实现(文末附完整代码)

链表的概念及结构 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 我们在上一篇文章所学习的顺序表是连续存储的 例如&#xff1a; 顺序表就好比火车上的一排座位&#xff0c;是连续的 而链表就好比是火车…