LSTM原理图解

2023-11-11

在解释LSTM原理前先来理解一下RNN的原理

RNN基本原理

原理简介

当我们处理与事件发生的时间轴有关系的问题时,比如自然语言处理,文本处理,文字的上下文是有一定的关联性的;时间序列数据,如连续几天的天气状况,当日的天气情况与过去的几天有某些联系;又比如语音识别,机器翻译等。在考虑这些和时间轴相关的问题时,传统的神经网络就无能为力了,因此就有了RNN(recurrent neural network,循环神经网络)。

循环神经网络的训练类似于传统神经网络的训练。我们也使用反向传播算法,但是有所变化。因为循环神经网络在所有时刻的参数是共享的,但是每个输出的梯度不仅依赖当前时刻的计算,还依赖之前时刻的计算。例如,为了计算时刻 t = 4 的梯度,我们还需要反向传播3步,然后将梯度相加。这个被称为Backpropagation Through Time(BPTT)。

这与我们在深度前馈神经网络中使用的标准反向传播算法基本相同。主要的差异就是我们将每时刻 W 的梯度相加。在传统的神经网络中,我们在层之间并没有共享参数,所以我们不需要相加。

RNN的缺点

RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。但是当相关信息和当前预测位置之间的间隔变得非常大,RNN 会丧失学习到连接如此远的信息的能力。我们仅仅需要明白的是利用BPTT算法训练出来的普通循环神经网络很难学习长期依赖(例如,距离很远的两步之间的依赖),原因就在于梯度消失/发散问题。但是RNN 绝对可以处理这样的长期依赖问题,人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 肯定不能够成功学习到这些知识。训练和参数设计十分复杂。LSTM就是专门设计出来解决这个问题的。

LSTM

LSTM网络

long short term memory,即我们所称呼的LSTM,是为了解决长期以来问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。
在这里插入图片描述

图1.RNNcell
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

在这里插入图片描述

图2.LSTMcell

LSTM核心思想

LSTM的关键在于细胞的状态整个(绿色的图表示的是一个cell),和穿过细胞的那条水平线。

细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

在这里插入图片描述

图3.LSTMcell内部结构图
若只有上面的那条水平线是没办法实现添加或者删除信息的。而是通过一种叫做 门(gates) 的结构来实现的。

门 可以实现选择性地让信息通过,主要是通过一个 sigmoid 的神经层 和一个逐点相乘的操作来实现的。

在这里插入图片描述

图6.信息节点
sigmoid 层输出(是一个向量)的每个元素都是一个在 0 和 1 之间的实数,表示让对应信息通过的权重(或者占比)。比如, 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”。

LSTM通过三个这样的基本结构来实现信息的保护和控制。这三个门分别是输入门、遗忘门和输出门

深入理解LSTM

遗忘门

在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取ht−1和xt,输出一个在 0到 1之间的数值给每个在细胞状态Ct−1中的数字。1 表示“完全保留”,0 表示“完全舍弃”。

在这里插入图片描述
其中ht−1表示的是上一个cell的输出,xt表示的是当前细胞的输入。σ表示sigmod函数。

输入门

下一步是决定让多少新的信息加入到 cell 状态 中来。实现这个需要包括两个 步骤:首先,一个叫做“input gate layer ”的 sigmoid 层决定哪些信息需要更新;一个 tanh 层生成一个向量,也就是备选的用来更新的内容,C^t 。在下一步,我们把这两部分联合起来,对 cell 的状态进行一个更新。
在这里插入图片描述

现在是更新旧细胞状态的时间了,Ct−1更新为Ct。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。

我们把旧状态与ft相乘,丢弃掉我们确定需要丢弃的信息。接着加上it∗C~t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

输出门

最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

在这里插入图片描述

实现

keras.layers.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)

参数

units: 正整数,输出空间的维度。
activation: 要使用的激活函数 (详见 activations)。 如果传入 None,则不使用激活函数 (即 线性激活:a(x) = x)。
recurrent_activation: 用于循环时间步的激活函数 (详见 activations)。 默认:分段线性近似 sigmoid (hard_sigmoid)。 如果传入 None,则不使用激活函数 (即 线性激活:a(x) = x)。
use_bias: 布尔值,该层是否使用偏置向量。
kernel_initializer: kernel 权值矩阵的初始化器, 用于输入的线性转换 (详见 initializers)。
recurrent_initializer: recurrent_kernel 权值矩阵 的初始化器,用于循环层状态的线性转换 (详见 initializers)。
bias_initializer:偏置向量的初始化器 (详见initializers).
unit_forget_bias: 布尔值。 如果为 True,初始化时,将忘记门的偏置加 1。 将其设置为 True 同时还会强制 bias_initializer=“zeros”。 这个建议来自 Jozefowicz et al.。
kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数 (详见 regularizer)。
recurrent_regularizer: 运用到 recurrent_kernel 权值矩阵的正则化函数 (详见 regularizer)。
bias_regularizer: 运用到偏置向量的正则化函数 (详见 regularizer)。
activity_regularizer: 运用到层输出(它的激活值)的正则化函数 (详见 regularizer)。
kernel_constraint: 运用到 kernel 权值矩阵的约束函数 (详见 constraints)。
recurrent_constraint: 运用到 recurrent_kernel 权值矩阵的约束函数 (详见 constraints)。
bias_constraint: 运用到偏置向量的约束函数 (详见 constraints)。
dropout: 在 0 和 1 之间的浮点数。 单元的丢弃比例,用于输入的线性转换。
recurrent_dropout: 在 0 和 1 之间的浮点数。 单元的丢弃比例,用于循环层状态的线性转换。
implementation: 实现模式,1 或 2。 模式 1 将把它的操作结构化为更多的小的点积和加法操作, 而模式 2 将把它们分批到更少,更大的操作中。 这些模式在不同的硬件和不同的应用中具有不同的性能配置文件。
return_sequences: 布尔值。是返回输出序列中的最后一个输出,还是全部序列。
return_state: 布尔值。除了输出之外是否返回最后一个状态。
go_backwards: 布尔值 (默认 False)。 如果为 True,则向后处理输入序列并返回相反的序列。
stateful: 布尔值 (默认 False)。 如果为 True,则批次中索引 i 处的每个样品的最后状态 将用作下一批次中索引 i 样品的初始状态。
unroll: 布尔值 (默认 False)。 如果为 True,则网络将展开,否则将使用符号循环。 展开可以加速 RNN,但它往往会占用更多的内存。 展开只适用于短序列。

原文链接:https://blog.csdn.net/weixin_44162104/article/details/88660003

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

LSTM原理图解 的相关文章

随机推荐

  • KITTI数据集解析

    KITTI 数据集解析 本文主要是对于3D目标检测中 KITTI数据集的分析 数据下载 KITTI 官网链接 下载的主要有 left color images velodyne point clouds camera calibration
  • 云备份项目

    云备份项目 1 云备份认识 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中 并且能够随时通过浏览器进行查看并且下载 其中下载过程支持断点续传功能 而服务器也会对上传文件进行热点管理 将非热点文件进行压缩存储 节省磁盘空间 2
  • 数据结构--回顾数据结构基本概念、数据结构三要素

    目录 什么是数据 数据元素 什么是数据对象 什么是数据结构 数据结构的三要素 逻辑结构 1 集合 2 线性结构 编辑 3 树形结构 4 图结构 数据的运算 物理结构 也叫做存储结构 1 顺序存储 2 链式存储 3 索引存储 借助索引表 4
  • CMOS芯片制造全工艺流程(后端基础第一篇)

    芯片制造全工艺流程详情 我们每天运行程序的芯片是这样造出来的 放大后的芯片机构 无与伦比的美 在如此微观世界 人类科技之巅 芯片一般是指集成电路的载体 也是集成电路经过设计 制造 封装 测试后的结果 通常是一个可以立即使用的独立的整体 如果
  • Windows7下安装docker记录

    docker火了也那么好几年了 偶才开始学习docker 说来真是落后主潮流太久 不过落后有落后的好处 因为大多数的坑都已经有人填过 所以遇见问题解决问题那也是相当的迅速 但就算是相当的迅速 这windows7下安装docker 也花了我大
  • java 算数

    public class Arith 提供精确加法计算的add方法 param value1 被加数 param value2 加数 return 两个参数的和 public static double add double value1
  • Spring cloud系列十五 使用线程池优化feign的http请求组件

    1 概述 在默认情况下 spring cloud feign在进行各个子服务之间的调用时 http组件使用的是jdk的HttpURLConnection 没有使用线程池 本文先从源码分析feign的http组件对象生成的过程 然后通过为fe
  • 深入理解web安全攻防策略

    前言 互联网时代 数据安全与个人隐私信息等受到极大的威胁和挑战 本文将以几种常见的攻击以及防御方法展开分析 1 XSS 跨站脚本攻击 定义 通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种
  • VS视图菜单中找不到服务器资源管理器怎么办?

    http www cnblogs com SissyNong archive 2011 06 18 1981970 html 前几天同事安装了VS2010后 发现视图菜单中根本就没有服务器管理器这一项 如果想打开服务器管理器 都要使用快捷键
  • 区块链共识算法的发展现状与展望

    区块链共识算法的发展现状与展望 袁勇等 1 传统分布式一致性算法 2 主流区块链共识算法 3 共识算法的模型与分类 4 区块链共识算法的新进展 4 1 主线 1 PoW 与 PoS 算法的有机结合 4 2 主线 2 原生 PoS 算法的改进
  • 翻转数组

    题目描述 给定一个长度为n的整数数组a 元素均不相同 问数组是否存在这样一个片段 只将该片段翻转就可以使整个数组升序排列 其中数组片段 l r 表示序列a l a l 1 a r 原始数组为 a 1 a 2 a l 2 a l 1 a l
  • 数据挖掘顶级比赛---综合整理

    整理所有可以参加的数据挖掘顶级比赛 1 DrivenData https www drivendata org 2 CrowdANALYTIX https www crowdanalytix com solutions community
  • loss-FSCE 小样本识别

    FSCE Few Shot Object Detection via Contrastive Proposal Encoding 以Faster RCNN 作为小样本目标检测的基本框架 采用两阶段的训练方法 第一阶段的训练集是大量标注的基本
  • OpenCV4 视频目标检测 场景文本检测 手写数字识别 案例

    转载 一直想找本书 能在机器学习复杂的算法原理和高效的编程实战之间达到合适的平衡 让感兴趣的同学拿到就有能用的代码 还有基本原理的介绍 因为了解原理才知道什么时候用什么算法最合适 以及如何调整参数 一直没找到合适的 所以动手写了一本 p 拖
  • 片内外设、片上外设和片外外设的区别

    片内外设就是片上外设 同一种意思不同说法而已 片内外设和片外外设的区别 片内 外设是两个概念 片内指做成芯片的集成电路内部 简称片内 片外同理显而易见 外设是外部设备的简称 是指集成电路芯片外部的设备 集成电路芯片与外部设备的连接一般需要专
  • 2023.6.3 华为机试题小记(附c++题解)

    华为机试小记 导语 进阶题 堆积木 200分 思路 代码 基础题一 寻找最后一个匹配子序列的下标 100分 思路 代码 基础题二 种植白杨树 100分 思路 导语 机试一共三个题 分为两个基础题和一个进阶题 两个基础题各100分 进阶题20
  • 数字统计 题解(c++)

    先看题目 当然 你可以看原题 题目描述 请统计某个给定范围 L R L R L R 的所有整数中 数字 2 2 2 出现的次数 比如给定范围 2 22 2 22 2 22 数字 2 在数 2 中出现了 1 1 1 次 在数 12 中出现 1
  • matlab获取矩阵的行数与列数

    matlab里面与其他高级语言里面获取数据的长度length方法不一样 matlab里面通过size 矩阵变量 返回一个 行数m 列数n 比如一个m n的矩阵A 通过size A 可以得到 m n 通过size A 1 可以得到行数m 通过
  • 关于如何使用neo4j-admin工具批量导入已处理好的csv数据(neo4j 社区版 5.5)

    数据格式有两种 一个是节点 一个是关系 节点类型数据头格式 xxx ID name LABEL 关系类型数据头格式 START ID END ID TYPE 这里不多赘述关于csv数据处理的问题 可以通过搜索找相关资料 本文主要解决的问题是
  • LSTM原理图解

    在解释LSTM原理前先来理解一下RNN的原理 RNN基本原理 原理简介 当我们处理与事件发生的时间轴有关系的问题时 比如自然语言处理 文本处理 文字的上下文是有一定的关联性的 时间序列数据 如连续几天的天气状况 当日的天气情况与过去的几天有