深度学习知识点:循环神经网络(RNN)、长短期记忆网络(LSTM)、门控循环单元(GRU)

深度学习知识点:循环神经网络(RNN)、长短期记忆网络(LSTM)、门控循环单元(GRU)

  • 前言
  • 循环神经网络(RNN)
    • RNNs(循环神经网络)训练和传统ANN(人工神经网络)训练异同点?
    • 为什么RNN 训练的时候Loss波动很大?
    • RNN中为什么会出现梯度消失?
    • 如何解决RNN中的梯度消失问题?
    • CNN VS RNN
    • Keras搭建RNN
  • 长短期记忆网络(LSTM)
    • LSTM结构推导,为什么比RNN好?
    • 为什么LSTM模型中既存在sigmoid又存在tanh两种激活函数,而不是选择统一一种sigmoid或者tanh?
    • LSTM中为什么经常是两层双向LSTM?
    • RNN扩展改进
      • Bidirectional RNNs
      • CNN-LSTMs
      • Bidirectional LSTMs
      • 门控循环单元(GRU)
    • LSTM、RNN、GRU区别?
    • LSTM是如何实现长短期记忆功能的?
    • LSTM的原理、写LSTM的公式、手推LSTM的梯度反向传播

前言

  • 本文是个人收集、整理、总结的一些人工智能知识点,由于本人水平有限,难免出现错漏,敬请批评改正。
  • 由于本文是对知识点的收集和整理,图片基本来源于网络,图片若侵权,可联系删除。
  • 更多精彩内容,可点击进入人工智能知识点专栏、Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

循环神经网络(RNN)

  • 核心思想:像人一样拥有记忆能力。用以往的记忆和当前的输入,生成输出。

  • RNN 和 传统神经网络 最大的区别:
    在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。
    在这里插入图片描述

  • RNN应用场景:
    1.文本生成 2.语音识别 3.机器翻译 4.生成图像描述 5.视频标记
    在这里插入图片描述

  • 缺点:
    RNN 有短期记忆问题,无法处理很长的输入序列
    训练 RNN 需要投入极大的成本

  • RNN 是一种死板的逻辑,越晚的输入影响越大,越早的输入影响越小,且无法改变这个逻辑。

RNNs(循环神经网络)训练和传统ANN(人工神经网络)训练异同点?

相同点:都使用BP误差反向传播算法。
不同点:
RNNs网络参数W,U,V是共享的,而传统神经网络各层参数间没有直接联系。
对于RNNs,在使用梯度下降算法中,每一步的输出不仅依赖当前步的网络,还依赖于之前若干步的网络状态。

为什么RNN 训练的时候Loss波动很大?

​ 由于RNN特有的memory会影响后期其他的RNN的特点,梯度时大时小,学习率lr没法个性化的调整,导致RNN在train的过程中,Loss会震荡起伏,为了解决RNN的这个问题,在训练的时候,可以设置临界值,当梯度大于某个临界值,直接截断,用这个临界值作为梯度的大小,防止大幅震荡。

RNN中为什么会出现梯度消失?

梯度消失现象:累乘会导致激活函数导数的累乘,如果取tanh或sigmoid函数作为激活函数的话,那么必然是一堆小数在做乘法,结果就是越乘越小。随着时间序列的不断深入,小数的累乘就会导致梯度越来越小直到接近于0,这就是“梯度消失“现象。
实际使用中,会优先选择tanh函数,原因是tanh函数相对于sigmoid函数来说梯度较大,收敛速度更快且引起梯度消失更慢。

如何解决RNN中的梯度消失问题?

1.选取更好的激活函数,如Relu激活函数。ReLU函数的左侧导数为0,右侧导数恒为1,这就避免了“梯度消失“的发生。但恒为1的导数容易导致“梯度爆炸“,但设定合适的阈值可以解决这个问题。
2.加入BN层,其优点:加速收敛.控制过拟合,可以少用或不用Dropout和正则。降低网络对初始化权重不敏感,且能允许使用较大的学习率等。
3.改变传播结构,LSTM结构可以有效解决这个问题。

CNN VS RNN

在这里插入图片描述

不同点
1.CNN空间扩展,神经元与特征卷积;RNN时间扩展,神经元与多个时间输出计算
2.RNN可以用于描述时间上连续状态的输出,有记忆功能,CNN用于静态输出。

Keras搭建RNN

在这里插入图片描述

长短期记忆网络(LSTM)

  • 长短期记忆网络(Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。

  • 三个门(遗忘门,输入门,输出门),两个状态(Ct,ht)
    在这里插入图片描述

    • 遗忘门
      ​ 作用对象:细胞状态 。
      ​ 作用:将细胞状态中的信息选择性的遗忘。
      Ft和Ct-1做点积操作,Ft确保Ct-1有哪些东西需要被遗忘掉
      在这里插入图片描述

    • 输入层门
      作用对象:细胞状态
      ​ 作用:将新的信息选择性的记录到细胞状态中。
      ​ 操作步骤:
      ​ 步骤一:sigmoid 层称 “输入门层” 决定什么值我们将要更新
      ​ 步骤二,tanh 层创建一个新的候选值向量加入到状态中
      在这里插入图片描述

    • 输出层门
      ​ 作用对象:隐层ht 作用:确定输出什么值。
      ​ 操作步骤:
      ​ 步骤一:通过sigmoid 层来确定细胞状态的哪个部分将输出。
      ​ 步骤二:把细胞状态通过 tanh 进行处理,并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
      在这里插入图片描述

LSTM结构推导,为什么比RNN好?

推导forget gate,input gate,cell state, hidden information等的变化;因为LSTM有进有出且当前的cell information是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸。

为什么LSTM模型中既存在sigmoid又存在tanh两种激活函数,而不是选择统一一种sigmoid或者tanh?

sigmoid用在了各种gate上,产生0~1之间的值,一般只有sigmoid最直接了;
tanh用在了状态和输出上,是对数据的处理,这个用其他激活函数或许也可以。

LSTM中为什么经常是两层双向LSTM?

有些时候预测需要由前面若干输入和后面若干输入共同决定,这样会更加准确。

RNN扩展改进

Bidirectional RNNs

​ 将两层RNNs叠加在一起,当前时刻输出(第t步的输出)不仅仅与之前序列有关,还与之后序列有关。例如:为了预测一个语句中的缺失词语,就需要该词汇的上下文信息。Bidirectional RNNs是一个相对较简单的RNNs,是由两个RNNs上下叠加在一起组成的。输出由前向RNNs和后向RNNs共同决定。
在这里插入图片描述

CNN-LSTMs

该模型中,CNN用于提取对象特征,LSTMs用于预测。CNN由于卷积特性,其能够快速而且准确地捕捉对象特征。LSTMs的优点:能够捕捉数据间的长时依赖性。
在这里插入图片描述

Bidirectional LSTMs

有两层LSTMs。 一层处理过去的训练信息,另一层处理将来的训练信息。
通过前向LSTMs获得前向隐藏状态,后向LSTMs获得后向隐藏状态,当前隐藏状态是前向隐藏状态与后向隐藏状态的组合。
在这里插入图片描述

门控循环单元(GRU)

(14年提出)是一般的RNNs的变型版本,其主要是从以下两个方面进行改进。
1.以语句为例,序列中不同单词处的数据对当前隐藏层状态的影响不同,越前面的影响越小,即每个之前状态对当前的影响进行了距离加权,距离越远,权值越小。
2.在产生误差error时,其可能是由之前某一个或者几个单词共同造成,所以应当对对应的单词weight进行更新。GRUs的结构如下图所示。GRUs首先根据当前输入单词向量word vector以及前一个隐藏层状态hidden state计算出update gate和reset gate。再根据reset gate、当前word vector以及前一个hidden state计算新的记忆单元内容(new memory content)。当reset gate为1的时候,new memory content忽略之前所有memory content,最终的memory是由之前的hidden state与new memory content一起决定。
在这里插入图片描述
GRU(门控循环单元)也是一种循环神经网络(RNN)的变体,用于处理序列数据。与LSTM相比,GRU的结构相对简单,但它仍然能够有效地捕获序列数据中的长期依赖关系。

GRU的结构由两部分组成:更新门和重置门。更新门用于控制上一时刻隐藏状态对当前时刻隐藏状态的贡献程度,而重置门用于控制当前输入对当前时刻隐藏状态的更新程度。

在GRU中,更新门的作用类似于LSTM中的遗忘门和输入门,它决定了上一时刻隐藏状态对当前时刻隐藏状态的影响程度。重置门则控制着当前输入对当前时刻隐藏状态的更新程度。

GRU的公式如下:

  1. 更新门: z t = σ ( W z ∗ [ h t − 1 , x t ] + b z ) z_t = σ(W_z * [h_{t-1}, x_t] + b_z) zt=σ(Wz[ht1,xt]+bz)
  2. 重置门: r t = σ ( W r ∗ [ h t − 1 , x t ] + b r ) r_t = σ(W_r * [h_{t-1}, x_t] + b_r) rt=σ(Wr[ht1,xt]+br)
  3. 候选隐藏状态: h t ′ = t a n h ( W ∗ [ r t ∗ h t − 1 , x t ] + b ) h'_t = tanh(W * [r_t * h_{t-1}, x_t] + b) ht=tanh(W[rtht1,xt]+b)
  4. 最终隐藏状态: h t = ( 1 − z t ) ∗ h t − 1 + z t ∗ h t ′ h_t = (1 - z_t) * h_{t-1} + z_t * h'_t ht=(1zt)ht1+ztht

其中, W z 、 W r W_z、W_r WzWr是权重矩阵, b z 、 b r b_z、b_r bzbr是偏置项, σ σ σ是sigmoid激活函数, t a n h tanh tanh是双曲正切激活函数。

与LSTM类似,在训练过程中,我们需要计算损失函数(loss function)的值,然后通过反向传播算法(backpropagation)来更新权重和偏置项。GRU的梯度反向传播过程也涉及复杂的计算和动态规划技巧。

需要注意的是,虽然GRU相对于LSTM在结构上更为简单,但在某些任务上可能表现不如LSTM。因此,在实际应用中,选择LSTM或GRU应该根据具体任务和数据的特点来进行决策。

LSTM、RNN、GRU区别?

在这里插入图片描述

与LSTM相比,GRU内部少了一个”门控“,参数比LSTM少,但是却也能够达到与LSTM相当的功能。考虑到硬件的计算能力和时间成本,因而很多时候我们也就会选择更加实用的GRU。

LSTM是如何实现长短期记忆功能的?

LSTM(长短期记忆网络)通过引入门控机制来实现长期记忆功能。这些门控机制允许LSTM有选择地遗忘、更新和输出信息,从而有效地管理信息的流动。

具体来说,LSTM包含三个门控:遗忘门、输入门和输出门。遗忘门控制着输入x和上一层隐藏层输出h被遗忘的程度大小,即决定是否保留之前的信息。当输入的序列中没有重要的信息时,LSTM的遗忘门的数值接近于1,更新门的数据接近于0,此时过去的记忆会被保存,从而实现了长期的记忆功能。当输入的序列中出现了重要的信息时,LSTM应该把其存入记忆时,此时更新门的数值将接近于1。

输入门控制着输入x和当前计算的状态更新到记忆单元的程度大小。它由输入门(input gate)与tanh神经网络层和一个按位乘操作构成。记忆门决定了当前时刻的记忆状态有多少来自于之前的记忆。

输出门控制着输入x和当前输出取决于当前记忆单元的程度大小。输出门(output gate)与函数以及按位乘操作共同作用将细胞状态和输入信号传递到输出端。

总之,LSTM通过精心设计的门控机制来实现长期记忆功能,使得模型能够更好地捕捉序列数据中的长期依赖关系。

LSTM的原理、写LSTM的公式、手推LSTM的梯度反向传播

LSTM是一种特殊的循环神经网络(RNN),用于处理具有长期依赖关系的序列数据。它的核心思想是通过引入门控机制来控制信息的流动,从而避免长期依赖问题。LSTM的结构由细胞状态和输出向量两部分组成,通过遗忘门、输入门和输出门来控制信息的传递。

LSTM的公式如下:

  1. 遗忘门: f t = σ ( W f ∗ [ h t − 1 , x t ] + b f ) f_t = σ(W_f * [h_{t-1}, x_t] + b_f) ft=σ(Wf[ht1,xt]+bf)
  2. 输入门: i t = σ ( W i ∗ [ h t − 1 , x t ] + b i ) i_t = σ(W_i * [h_{t-1}, x_t] + b_i) it=σ(Wi[ht1,xt]+bi)
  3. 更新单元: c t = f t ∗ c t − 1 + i t ∗ t a n h ( W c ∗ [ h t − 1 , x t ] + b c ) c_t = f_t * c_{t-1} + i_t * tanh(W_c * [h_{t-1}, x_t] + b_c) ct=ftct1+ittanh(Wc[ht1,xt]+bc)
  4. 输出门: o t = σ ( W o ∗ [ h t − 1 , x t ] + b o ) o_t = σ(W_o * [h_{t-1}, x_t] + b_o) ot=σ(Wo[ht1,xt]+bo)
  5. 隐藏状态: h t = o t ∗ t a n h ( c t ) h_t = o_t * tanh(c_t) ht=ottanh(ct)

其中, W f 、 W i 、 W c W_f、W_i、W_c WfWiWc W o W_o Wo是权重矩阵, b f 、 b i 、 b c b_f、b_i、b_c bfbibc b o b_o bo是偏置项, σ σ σ是sigmoid激活函数, t a n h tanh tanh是双曲正切激活函数。

在训练过程中,我们需要计算损失函数(loss function)的值,然后通过反向传播算法(backpropagation)来更新权重和偏置项。LSTM的梯度反向传播过程如下:

  1. 根据当前输入x和前一时刻的隐藏状态 h t − 1 h_{t-1} ht1,计算当前时刻的各个门控值和隐藏状态 h t h_t ht
  2. 根据损失函数和隐藏状态 h t h_t ht,计算损失对权重和偏置项的梯度。
  3. 使用梯度下降或其他优化算法来更新权重和偏置项。
  4. 重复步骤1-3,直到达到收敛或指定的训练轮数。

需要注意的是,LSTM的梯度反向传播过程可能会涉及到复杂的计算和动态规划技巧,因为每个时间步的梯度都依赖于前面时间步的计算结果。在实际应用中,可以使用成熟的深度学习框架(如TensorFlow或PyTorch)来实现LSTM的训练和推断过程。

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入人工智能知识点专栏、Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

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

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

相关文章

Golang操作Redis

一. Redis介绍 1.1 简介 Redis是完全开源免费的,遵循BSD协议,是一个高性能的key-value数据库。 Redis与其它的key-value缓存产品有以下三个特点: Redis支持数据持久化,可以见内存中的数据报错在磁盘中,重启的时候可以…

从Kafka的可靠性设计体验软件设计之美

目录 1. Kafka可靠性概述 2. 副本剖析 2.1 什么是副本 2.2 副本失效场景 2.3 数据丢失场景 2.4 解决数据丢失方案 3. 日志同步机制 4. 可靠性分析 1. Kafka可靠性概述 Kafka 中采用了多副本的机制,这是大多数分布式系统中惯用的手法,以此来实现水平扩…

webpack热更新原理详解

文章目录 前言基础配置创建项目HMR配置 HMR交互概览HMR流程概述HMR实现细节初始化注册监听编译完成事件启动服务监听文件代码变化服务端发送消息客户端收到消息热更新文件请求热更新代码替换 问题思考 前言 刷新分为两种:一种是页面刷新,不保留页面状态…

品鉴中的文化传承:如何理解红酒在历史与文化中的地位

红酒不仅是产品,更是一种文化和历史的传承。在品鉴雷盛红酒的过程中,了解红酒背后的历史和文化,能够更好地理解其风格和特点,提升品鉴体验。 红酒的历史可以追溯到公元前6000年左右的古埃及时期。自那时起,红酒就成为了…

新手Pytorch入门笔记-transforms.Compose()

我使用的图片是上图,直接下载即可 transforms.Compose 是PyTorch中的一个实用工具,用于创建一个包含多个数据变换操作的变换对象。这些变换操作通常用于数据预处理,例如图像数据的缩放、裁剪、旋转等。使用transforms.Compose 可以将多个数据…

Linux系统编程---线程同步

一、同步概念 同步即协同步调,按预定的先后次序运行。 协同步调,对公共区域数据【按序】访问,防止数据混乱,产生与时间有关的错误。 数据混乱的原因: 资源共享(独享资源则不会)调度随机(意味着数据访问会出现竞争)线…

监控员工上网用什么软件比较好 八款电脑监控神器送给你

监控员工上网用什么软件比较好 八款电脑监控神器送给你 监控员工上网行为的软件有多种,每款软件都有其独特的功能和优势。现在让我们一起来探寻最佳员工上网监控神器! 想知道哪款电脑监控软件最炫酷、最实用吗?来看看这里,为你揭…

36.WEB渗透测试-信息收集-企业信息收集(3)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:35.WEB渗透测试-信息收集-企业信息收集(2) 重要信息收集&#xf…

Python 中的递归排列

在 Python 中使用递归计算排列,适合绝对初学者 介绍 有些人发现很难理解递归算法。 这个技巧向绝对初学者展示了如何使用递归查找排列。Python 背景 这个技巧的想法来自一个问答问题:可怜的 OP 花了三天时间“翻头”,试图弄清楚一小段代码如何能够生成输入列表项的所有排列。…

ROS_第一个程序_Hello_world

ROS的第一个项目:输出Hello World 我们将学习如何创建一个简单的ROS(Robot Operating System)项目,该项目将在终端中输出"Hello World"。我们将使用Python语言进行编程。 环境准备 首先,确保你的计算机已…

【目标检测】基于深度学习的布匹表面缺陷检测(yolov5算法,4类,附代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内) 路虽远,行则将至;事虽难,做…

硬件24、嘉立创EDA丝印的优化和调整

1、调整全部丝印的属性 先选中一个丝印,然后右键点击它,选择查找,然后选择查找全部 选择查找全部这个时候可以设置所有丝印在元件的位置了,布局-》属性位置,位号,属性位置设置为上边,这时丝印就…

全志ARM-网络链接

命令扫描周围的WIFI热点 nmcli dev wifi 命令接入网络 nmcli dev wifi connect (WiFi名,不要有空格)password (WiFi密码) 查看IP地址 ip addr show wlan0或ifconfig 出现successfully就连接成功了

计应2班01

public class Demo {public void sum(double num1 , double num2){System.out.println(num1 num2);} }import org.junit.Test;public class Test1 { // 定义方法 // test sum // testSum // public void // TestTestpublic void testSum(){Demo de…

如何通过文件下发平台,让数据发挥其真正的价值?

银行网点文件下发平台是专门设计用于银行系统内部或与外部机构之间安全、高效地传输和分发文件的系统。目前使用较多的方式是FTP、邮件、物理媒介等,但都存在一定问题: 1、物理媒介:如U盘、光盘等,通过快递服务发送给分支机构&…

面向对象设计与分析(42)工厂方法模式

文章目录 定义示例实际应用 定义 工厂方法模式,定义一个用于创建对象的接口(工厂方法),返回对象基类,让子类去实现该接口,从而返回具体的子类对象。 结构 工厂方法模式包含以下主要角色: 抽象…

观成科技:蔓灵花组织加密通信研究分析总结

1.概述 蔓灵花,又名"Bitter",常对南亚周边及孟加拉湾海域的相关国家发起网络攻击,主要针对巴基斯坦和中国两国。其攻击目标主要包括政府部门、核工业、能源、国防、军工、船舶工业、航空工业以及海运等行业,其主要意图…

【学习笔记】Python 使用 matplotlib 画图

文章目录 安装中文显示折线图、点线图柱状图、堆积柱状图坐标轴断点参考资料 本文将介绍如何使用 Python 的 matplotlib 库画图,记录一些常用的画图 demo 代码 安装 # 建议先切换到虚拟环境中 pip install matplotlib中文显示 新版的 matplotlib 已经支持字体回退…

Django框架之python后端框架介绍

一、网络框架及MVC、MTV模型 1、网络框架 网络框架(Web framework)是一种软件框架,用于帮助开发人员构建Web应用程序和Web服务。它提供了一系列预先编写好的代码和工具,以简化开发过程并提高开发效率。网络框架通常包括以下功能…

go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件

前言 在上一篇文章中,我们实现了通过etcd来同时指定多个不同的有关分区与日志文件的路径,但是锁着一次读取配置的增多,不可避免的出现了一个问题:我们如何来监控多个日志文件,这样原来的tailFile模块相对于当下场景就…