RNN/LSTM/GRU 学习笔记
文章目录
- RNN/LSTM/GRU
- 一、RNN
- 1、为何引入RNN?
- 2、RNN的基本结构
- 3、各种形式的RNN及其应用
- 4、RNN的缺陷
- 5、如何应对RNN的缺陷?
- 6、BPTT和BP的区别
- 二、LSTM
- 1、LSTM 简介
- 2、LSTM如何缓解梯度消失与梯度爆炸?
- 三、GRU
- 四、参考文献
RNN/LSTM/GRU
一、RNN
1、为何引入RNN?
循环神经网络(Recurrent Neural Network,RNN) 是用来建模序列化数据的一种主流深度学习模型。我们知道,传统的前馈神经网络一般的输入都是一个定长的向量,无法处理变长的序列信息,即使通过一些方法把序列处理成定长的向量,模型也很难捕捉序列中的长距离依赖关系。RNN则通过将神经元串行起来处理序列化的数据。由于每个神经元能用它的内部变量保存之前输入的序列信息,因此整个序列被浓缩成抽象的表示,并可以据此进行分类或生成新的序列1。
2、RNN的基本结构
RNN的朴素形式可分别由如下两幅图表示2:

其中 x 1 , x 2 , ⋯ , x T x_1,x_2,\cdots,x_T x1,x2,⋯,xT 是输入,每一个位置是一个实数向量; U U U、 V V V、 W W W 是权重矩阵,通常在模型初始化时随机生成,通过梯度下降进行优化; h t h_t ht 是位于隐藏层上的活性值,很多文献上也称为状态(State)或隐状态(Hidden State); p t p_t pt 表示第 t t t 个位置上的输出。
h t h_t ht、 p t p_t pt 可由下列公式得出( b b b 是偏置项):
h t = tanh ( U ⋅ h t − 1 + W ⋅ x t + b ) h_t=\tanh\left(U\cdot h_{t-1}+W\cdot x_t+b\right) ht=tanh(U⋅ht−1+W⋅xt+b)
p t = s o f t m a x ( V ⋅ h t + c ) p_t=\mathrm{softmax}(V\cdot h_t+c) pt=softmax(V⋅ht+c)
3、各种形式的RNN及其应用
(图片来自于cs231n)

| 模式 | 描述 | 应用领域 |
|---|---|---|
| One to One | 单个输入对应单个输出 | 图像分类、回归任务 |
| One to Many | 单个输入生成序列输出 | 图像字幕生成、音乐生成 |
| Many to One | 序列输入生成单个输出 | 情感分析、时间序列分类 |
| Many to Many | 序列输入对应序列输出 | 机器翻译、语音识别 |
| Many to Many(同步) | 同步序列输入输出 | 视频帧分类、实时语音处理 |
4、RNN的缺陷
RNN通过在所有时间步共享相同的权重,使得可以在不同时间步之间传递和积累信息,从而更好地捕捉序列数据中的长期依赖关系,但是缺点也很明显:在RNN的学习过程中,由于共享权重 W W W,导致随着时间步的增加,权重矩阵 W W W 不断连乘,最终产生梯度消失(即 ∂ L t ∂ h k \frac{\partial \mathcal{L}_{t}}{\partial \boldsymbol{h}_{k}} ∂hk∂Lt 消失, 1 ≤ k ≤ t 1 \le k\le t 1≤k≤t )和梯度爆炸,具体解释如下:
首先由RNN前向传播公式:
h t = f ( W ⋅ h t − 1 + U ⋅ x t + b ) h_t=f(W\cdot h_{t-1}+U\cdot x_t+b) ht=f(W⋅ht−1+U⋅xt+b)
其中 f f f 为激活函数。
在反向传播时(BPTT),损失函数 L \mathcal{L} L 对某一时间步长的梯度涉及到时间上所有的前置状态,因此梯度会被多个矩阵连乘表示为:
∂ L ∂ h t = ∂ L ∂ h T ⋅ ∏ k = t T − 1 A k \frac{\partial\mathcal{L}}{\partial h_t}=\frac{\partial\mathcal{L}}{\partial h_T}\cdot\prod_{k=t}^{T-1}A_k ∂ht∂L=∂hT∂L⋅k=t∏T−1Ak
其中 A k = diag ( f ′ ( h k ) ) ⋅ W A_k=\operatorname{diag}(f^{\prime}(h_k))\cdot W Ak=diag(f′(hk))⋅W 。
显然若 W > 1 W>1 W>1,随着时间的增加,多个 W W W 连乘后结果会不断增大,最终导致梯度爆炸;
同理 W < 1 W<1 W<1,多个 W W W 连乘后结果会不断减小至趋于0,最终导致梯度消失。
而在CNN中,每一层的权重矩阵 W W W 是不同的,并且在初始化时它们是独立同分布的,因此最后可以相互抵消,不容易发生梯度爆炸或消失。
5、如何应对RNN的缺陷?
① 对于梯度爆炸,一般通过权重衰减(Weight Decay) 或梯度截断(Gradient Clipping) 来避免3。权重衰减,通过引入衰减系数来约束并避免权重矩阵元素过大,从而减少梯度连乘时的爆炸风险;梯度截断,直接将梯度大小进行限制以防止梯度爆炸,比如按值截断:在第 t t t 次迭代时,梯度为 g t g_t gt ,给定一个区间 [ a , b ] [a,b] [a,b] ,如果一个参数的梯度小于 a a a 时,就将其设为 a a a ;如果大于 b b b 时,就将其设为 b b b,公式如下:
g t = max ( min ( g t , b ) , a ) . \mathbf{g}_t=\max(\min(\mathbf{g}_t,b),a). gt=max(min(gt,b),a).
② 对于梯度消失,一个想法是改进激活函数,比如替换成 ReLU ,因为其右侧导数恒为 1 ,可以缓解梯度消失(不能杜绝,因为本质上是权重矩阵的问题)。缺点是不好解决梯度爆炸,从 RNN 的前向传播公式来看待这个问题,前向传播公式如下:
h t = f ( W ⋅ h t − 1 + U ⋅ x t + b ) h_t=f(W\cdot h_{t-1}+U\cdot x_t+b) ht=f(W⋅ht−1+U⋅xt+b)
使用 ReLU 激活函数后, h t h_t ht 可表达为:
h t = r e l u ( W ⋅ h t − 1 + U ⋅ x t + b ) h_t=\mathrm{relu}\left(W\cdot h_{t-1}+U\cdot x_t+b\right) ht=relu(W⋅ht−1+U⋅xt+b)
显然不管 h t − 1 h_{t-1} ht−1 怎么变化,前面始终要乘上一个权重矩阵 W W W ,因此替换激活函数后,并不能实质上解决由于权重矩阵 W W W 连乘而导致的梯度爆炸问题。
③ 使用合适的权重初始化方法,如 Xavier 初始化或 He 初始化,使 W W W 的特征值接近 1 。
如果从结构上来考虑,通过改变网络结构来减缓梯度消失或爆炸,长短期记忆网络(LSTM,Long Short-Term Memory) 就是基于这个想法诞生的。
6、BPTT和BP的区别
BP算法:只处理纵向层级间的梯度反向传播,适用于前馈神经网络。
BPTT算法:在训练RNN时,需要同时处理纵向层级间的反向传播(深度方向)和时间维度上的反向传播(时间方向)。
二、LSTM
1、LSTM 简介
LSTM 是循环神经网络的一个变体,可以有效地解决简单循环神经网络的梯度爆炸或消失问题。LSTM 网络结构如下:
在这里插入图片描述
LSTM 网络引入门控机制(Gating Mechanism) 来控制信息传递的路径,公式如下:
i t = σ ( U i ⋅ h t − 1 + W i ⋅ x t + b i ) f t = σ ( U f ⋅ h t − 1 + W f ⋅ x t + b f ) o t = σ ( U o ⋅ h t − 1 + W o ⋅ x t + b o ) c ~ t = tanh ( U c ⋅ h t − 1 + W c ⋅ x t + b c ) c t = i t ⊙ c ~ t + f t ⊙ c t − 1 h t = o t ⊙ tanh ( c t ) \begin{array}{c}\boldsymbol{i}_{t}=\sigma\left(\boldsymbol{U}_{i} \cdot \boldsymbol{h}_{t-1}+\boldsymbol{W}_{i} \cdot \boldsymbol{x}_{t}+\boldsymbol{b}_{i}\right) \\\boldsymbol{f}_{t}=\sigma\left(\boldsymbol{U}_{f} \cdot \boldsymbol{h}_{t-1}+\boldsymbol{W}_{f} \cdot \boldsymbol{x}_{t}+\boldsymbol{b}_{f}\right) \\\boldsymbol{o}_{t}=\sigma\left(\boldsymbol{U}_{o} \cdot \boldsymbol{h}_{t-1}+\boldsymbol{W}_{o} \cdot \boldsymbol{x}_{t}+\boldsymbol{b}_{o}\right) \\\tilde{\boldsymbol{c}}_{t}=\tanh \left(\boldsymbol{U}_{c} \cdot \boldsymbol{h}_{t-1}+\boldsymbol{W}_{c} \cdot \boldsymbol{x}_{t}+\boldsymbol{b}_{c}\right) \\\boldsymbol{c}_{t}=\boldsymbol{i}_{t} \odot \tilde{\boldsymbol{c}}_{t}+\boldsymbol{f}_{t} \odot \boldsymbol{c}_{t-1} \\\boldsymbol{h}_{t}=\boldsymbol{o}_{\boldsymbol{t}} \odot \tanh \left(\boldsymbol{c}_{t}\right)\end{array} it=σ(Ui⋅ht−1+Wi⋅xt+bi)ft=σ(Uf⋅ht−1+Wf⋅xt+bf)ot=σ(Uo⋅ht−1+Wo⋅xt+bo)c~t=tanh(Uc⋅ht−1+Wc⋅xt+bc)ct=it⊙c~t+ft⊙ct−1ht=ot⊙tanh(ct)
进一步可以简写成:
[ c ~ t o t i t f t ] = [ tanh σ σ σ ] ( W [ x t h t − 1 ] + b ) , c t = f t ⊙ c t − 1 + i t ⊙ c ~ t , h t = o t ⊙ tanh ( c t ) , \begin{aligned}\begin{bmatrix}\tilde{\boldsymbol{c}}_t\\\\\boldsymbol{o}_t\\\\\boldsymbol{i}_t\\\\\boldsymbol{f}_t\end{bmatrix}&=\begin{bmatrix}\tanh\\\\\sigma\\\\\sigma\\\\\sigma\end{bmatrix}\begin{pmatrix}\boldsymbol{W}\begin{bmatrix}\boldsymbol{x}_t\\\\\boldsymbol{h}_{t-1}\end{bmatrix}+\boldsymbol{b}\end{pmatrix},\\\\\boldsymbol{c}_t&=\boldsymbol{f}_t\odot\boldsymbol{c}_{t-1}+\boldsymbol{i}_t\odot\boldsymbol{\tilde{c}}_t,\\\boldsymbol{h}_t&=\boldsymbol{o}_t\odot\tanh\left(\boldsymbol{c}_t\right),\end{aligned} c~totitft ctht= tanhσσσ W xtht−1 +b ,=ft⊙ct−1+it⊙c~t,=ot⊙tanh(ct),
公式中有三个“门”,分别为输入门 i t \boldsymbol{i}_t it 、遗忘门 f t \boldsymbol{f}_t ft 和输出门 o t \boldsymbol{o}_t ot 。这三个门的作用为
- 遗忘门 f t f_t ft 控制上一个时刻的内部状态 c t − 1 \boldsymbol c_t-1 ct−1 需要遗忘多少信息。
- 输入门 i t \boldsymbol{i}_t it 控制当前时刻的候选状态 c ~ t \tilde{\boldsymbol{c}}_t c~t 有多少信息需要保存。
- 输出门 o t \boldsymbol{o}_t ot 控制当前时刻的内部状态 c t \boldsymbol{c}_t ct 有多少信息需要输出给外部状态 h t . \boldsymbol{h}_t. ht.
具体的可点击查看如下视频,很清晰易懂:
【【官方双语】LSTM(长短期记忆神经网络)最简单清晰的解释来了!】 https://www.bilibili.com/video/BV1zD421N7nA/?share_source=copy_web&vd_source=199a3f4e3a9db6061e1523e94505165a
2、LSTM如何缓解梯度消失与梯度爆炸?
LSTM的细胞状态更新机制(下图黄色部分)可以有效地存储长期的信息:

其更新公式如下:
C t = f t ⊙ C t − 1 + i t ⊙ C ~ t C_t=f_t\odot C_{t-1}+i_t\odot\tilde{C}_t Ct=ft⊙Ct−1+it⊙C~t
由于这一过程本质是线性操作(加权求和),相当于是所有候选路径的线性组合,故不会因为一个路径上梯度的消失,而导致整体梯度不断衰减。LSTM的细胞状态经过门控机制(通过或阻断,即 1 或 0)控制这个线性组合,达到缓解梯度消失的效果;而门控机制又可以通过调节输入输出,通过灵活地舍弃一些部分,来缓解梯度爆炸问题。
简言之,由于此线性组合会通过门控机制自主的调节,而非 RNN 那样直接连乘,因此可以达到减缓梯度消失和梯度爆炸的效果,并实现对信息的过滤,从而达到对长期记忆的保存与控制。
三、GRU
门控循环单元(GRU) 是对 LSTM 进行简化得到的模型。对于 LSTM 与 GRU 而言,它们效果相当,但由于 GRU 参数更少,所以 GRU 的收敛速度更快,计算效率更高。
与LSTM相比,GRU 仅有两个门——更新门(update gate)和重置门(reset gate),不使用记忆元。重置门有助于捕获序列中的短期依赖关系,更新门有助于捕获序列中的长期依赖关系,详细结构如下图:

四、参考文献
诸葛越, 葫芦娃, 百面机器学习, 北京:人民邮电出版社, 2018 ↩︎
李航. 机器学习方法[M]. 第一版. 清华大学出版社, 2022. ↩︎
邱锡鹏, 神经网络与深度学习, 北京:机械工业出版社, 2020 ↩︎
相关文章:
RNN/LSTM/GRU 学习笔记
文章目录 RNN/LSTM/GRU一、RNN1、为何引入RNN?2、RNN的基本结构3、各种形式的RNN及其应用4、RNN的缺陷5、如何应对RNN的缺陷?6、BPTT和BP的区别 二、LSTM1、LSTM 简介2、LSTM如何缓解梯度消失与梯度爆炸? 三、GRU四、参考文献 RNN/LSTM/GRU …...
音频录制一般在什么情况下会选择保存为PCM?什么情况会选择保存为WAV?
在音频开发中,选择保存为 PCM 或 WAV 格式取决于具体的应用场景和需求。以下是两种格式的特点以及适用场景的分析: PCM 格式 特点: 原始音频数据: PCM 是未压缩的原始音频数据,没有任何文件头或元数据。数据直接以二进…...
C#常用744单词
1.visual 可见的 2.studio 工作室 3.dot 点 4.net 网 5.harp 尖端的,锋利的。 6.amework 骨架,构架,框架 7.beta 测试版,试用版 8.XML(全称:eXtensible Markup Language)…...
如何理解算法的正确性?
循环不变式(Loop Invariant) 是算法设计和程序验证中的一个核心概念,用于证明循环的正确性。它是在循环的每次迭代开始和结束时均保持为真的一种条件或性质,帮助开发者确保循环按预期工作,最终达到目标状态。 循环不变…...
蓝桥杯试题:排序
一、问题描述 给定 nn 个正整数 a1,a2,…,ana1,a2,…,an,你可以将它们任意排序。现要将这 nn 个数字连接成一排,即令相邻数字收尾相接,组成一个数。问,这个数最大可以是多少。 输入格式 第一行输入一个正整数 nnÿ…...
实验十一 Servlet(二)
实验十一 Servlet(二) 【实验目的】 1.了解Servlet运行原理 2.掌握Servlet实现方式 【实验内容】 改造实验10,引入数据库,创建用户表,包括用户名和密码:客户端通过login.jsp发出登录请求,请求…...
第五天 初步了解ArkTS和ArkUI
初步了解ArkTS和ArkUI,可以从以下几个方面进行概述: 一、ArkTS简介 定义与关系: ArkTS是HarmonyOS(鸿蒙系统)优选的主力应用开发语言。它基于TypeScript(TS)进行扩展,兼容TS的所有特…...
java中的锁面试题
1、多线程中 synchronized 锁升级的原理是什么? synchronized 是JVM层面的锁,是 Java 关键字,通过 monitor 对象来完成,synchronized 的实现涉及到锁的升级,具体为无锁、偏向锁、自旋锁、重量级锁 synchronized 锁升级…...
ES6 变量解构赋值总结
1. 数组的解构赋值 1.1 基本用法 // 基本数组解构 const [a, b, c] [1, 2, 3]; console.log(a); // 1 console.log(b); // 2 console.log(c); // 3// 跳过某些值 const [x, , y] [1, 2, 3]; console.log(x); // 1 console.log(y); // 3// 解构剩余元素 const [first, ...re…...
知识蒸馏教程 Knowledge Distillation Tutorial
来自于:Knowledge Distillation Tutorial 将大模型蒸馏为小模型,可以节省计算资源,加快推理过程,更高效的运行。 使用CIFAR-10数据集 import torch import torch.nn as nn import torch.optim as optim import torchvision.tran…...
DeepSeek各版本说明与优缺点分析
DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列,其在不同版本的发布过程中,逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本,从版本的发布时间、特点、优势以及不足之处࿰…...
java进阶专栏的学习指南
学习指南 java类和对象java内部类和常用类javaIO流 java类和对象 类和对象 java内部类和常用类 java内部类精讲Object类包装类的认识String类、BigDecimal类初探Date类、Calendar类、SimpleDateFormat类的认识java Random类、File类、System类初识 javaIO流 java IO流【…...
kamailio-osp模块
该文档详细讲解了如何在Kamailio中配置和使用OSP模块(Open Settlement Protocol Module),以实现基于ETSI标准的安全多边对等互联(Secure Multi-Lateral Peering)。以下是核心内容的总结: 1. 模块功能 OSP模…...
【TensorFlow】T1:实现mnist手写数字识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 1、设置GPU import tensorflow as tf gpus tf.config.list_physical_devices("GPU")if gpus:gpu0 gpus[0]tf.config.experimental.set_memory_g…...
Rapidjson 实战
Rapidjson 是一款 C 的 json 库. 支持处理 json 格式的文档. 其设计风格是头文件库, 包含头文件即可使用, 小巧轻便并且性能强悍. 本文结合样例来介绍 Rapidjson 一些常见的用法. 环境要求 有如何的几种方法可以将 Rapidjson 集成到您的项目中. Vcpkg安装: 使用 vcpkg instal…...
【React】受控组件和非受控组件
目录 受控组件非受控组件基于ref获取DOM元素1、在标签中使用2、在组件中使用 受控组件 表单元素的状态(值)由 React 组件的 state 完全控制。组件的 state 保存了表单元素的值,并且每次用户输入时,React 通过事件处理程序来更新 …...
Ollama+deepseek+Docker+Open WebUI实现与AI聊天
1、下载并安装Ollama 官方网址:Ollama 安装好后,在命令行输入, ollama --version 返回以下信息,则表明安装成功, 2、 下载AI大模型 这里以deepseek-r1:1.5b模型为例, 在命令行中,执行&…...
DEEPSEKK GPT等AI体的出现如何重构工厂数字化架构:从设备控制到ERP MES系统的全面优化
随着深度学习(DeepSeek)、GPT等先进AI技术的出现,工厂的数字化架构正在经历前所未有的变革。AI的强大处理能力、预测能力和自动化决策支持,将大幅度提升生产效率、设备管理、资源调度以及产品质量管理。本文将探讨AI体(…...
阿莱(arri)mxf文件变0字节的恢复方法
阿莱(arri)是专业级的影视产品软硬件供应商,很多影视作品都是使用阿莱(arri)的设备拍摄出来的。总体上来讲阿莱(arri)的文件格式有mov和mxf两种,这次恢复的是阿莱(arri)的mxf,机型是arri mini,素材保存在一个8t的硬盘上,使用的是e…...
初识 Node.js
在当今快速发展的互联网技术领域,Node.js 已经成为了一个非常流行且强大的平台。无论是构建高性能的网络应用、实时协作工具还是微服务架构,Node.js 都展示了其独特的优势。本文将带您走进 Node.js 的世界,了解它的基本概念、核心特性以及如何…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...
