58、深度学习-自学之路-自己搭建深度学习框架-19、RNN神经网络梯度消失和爆炸的原因(从公式推导方向来说明),通过RNN的前向传播和反向传播公式来理解。

news2025/3/6 20:15:05

一、RNN神经网络的前向传播图如下:

时间步 t=1:
x₁ → (W_x) → [RNN Cell] → h₁ → (W_y) → y₁
           ↑ (W_h)
          h₀ (初始隐藏状态)

时间步 t=2:
x₂ → (W_x) → [RNN Cell] → h₂ → (W_y) → y₂
           ↑ (W_h)
          h₁

时间步 t=3:
x₃ → (W_x) → [RNN Cell] → h₃ → (W_y) → y₃
           ↑ (W_h)
          h₂

过程解释

时间步 t=1:

  1. 输入

    • 输入 x₁ 是第一个时间步的输入数据(例如,一个词向量或时间序列数据点)。

  2. 权重作用

    • 输入 x₁ 通过权重矩阵 W_x 进行线性变换:

                W_x · x₁

               2. 初始隐藏状态 h₀ 通过权重矩阵 W_h 进行线性变换:

                W_h · h₀        

   3.RNN Cell 计算

  • 将变换后的输入和隐藏状态相加,并加上偏置项 b_h,然后通过激活函数 σ(如 tanh 或 ReLU):

        h₁ = σ(W_h · h₀ + W_x · x₁ + b_h)    

  h₁ 是第一个时间步的隐藏状态,包含了当前输入 x₁ 和前一个隐藏状态 h₀ 的信息。

4.输出计算

  • 隐藏状态 h₁ 通过权重矩阵 W_y 进行线性变换,并加上偏置项 b_y,然后通过激活函数 σ

        y₁ = σ(W_y · h₁ + b_y)

  • y₁ 是第一个时间步的输出(例如,预测的下一个词或时间序列值)。

时间步 t=2:

x₂ → (W_x) → [RNN Cell] → h₂ → (W_y) → y₂
           ↑ (W_h)
          h₁

过程解释

  1. 输入

    • 输入 x₂ 是第二个时间步的输入数据。

  2. 权重作用

    • 输入 x₂ 通过权重矩阵 W_x 进行线性变换:

      W_x · x₂

    • 前一个隐藏状态 h₁ 通过权重矩阵 W_h 进行线性变换:

      W_h · h₁

  3. RNN Cell 计算

    • 将变换后的输入和隐藏状态相加,并加上偏置项 b_h,然后通过激活函数 σ

      h₂ = σ(W_h · h₁ + W_x · x₂ + b_h)

    • h₂ 是第二个时间步的隐藏状态,包含了当前输入 x₂ 和前一个隐藏状态 h₁ 的信息。

  4. 输出计算

    • 隐藏状态 h₂ 通过权重矩阵 W_y 进行线性变换,并加上偏置项 b_y,然后通过激活函数 σ

      y₂ = σ(W_y · h₂ + b_y)

    • y₂ 是第二个时间步的输出。

时间步 t=3

复制

x₃ → (W_x) → [RNN Cell] → h₃ → (W_y) → y₃
           ↑ (W_h)
          h₂
过程解释
  1. 输入

    • 输入 x₃ 是第三个时间步的输入数据。

  2. 权重作用

    • 输入 x₃ 通过权重矩阵 W_x 进行线性变换:

      W_x · x₃

    • 前一个隐藏状态 h₂ 通过权重矩阵 W_h 进行线性变换:

      W_h · h₂

  3. RNN Cell 计算

    • 将变换后的输入和隐藏状态相加,并加上偏置项 b_h,然后通过激活函数 σ

      h₃ = σ(W_h · h₂ + W_x · x₃ + b_h)

    • h₃ 是第三个时间步的隐藏状态,包含了当前输入 x₃ 和前一个隐藏状态 h₂ 的信息。

  4. 输出计算

    • 隐藏状态 h₃ 通过权重矩阵 W_y 进行线性变换,并加上偏置项 b_y,然后通过激活函数 σ

      y₃ = σ(W_y · h₃ + b_y)

    • y₃ 是第三个时间步的输出。

通过上面的公式的观察,大家可以看到一个问题就是:

一共有3个时间步,也就是信息向前传播了三次,然后每次传播使用的输入的权重层是同一个权重、隐藏层对应的权重层是是同一个权重值。

第一个神经网络输出的隐藏层h1给到第二个神经网络,

第二个神经网络的输出隐藏层h2给到第三个神经网络。

第三个神经网络的输出隐藏层h3应该会给到第四个神经网络,如果有的话。

然后每一个神经网络都会有一个预测值y1 y2 y3

如果我们的输出方式是多输入多输出,那么我们每一个预测值y1 y2 y3都会对应一个真实值ture1、ture2、ture3

然后对应着三个误差值loss1 loss2 loss3,然后把loss1 + loss2 + loss3 =L

这个就是前向传播的过程。

二、RNN神经网络的反向传播:

反向传播我们从T=3开始往后传播:

首先:y₃ = σ(W_y · h₃ + b_y)

瞬时函数为L

(1)计算输出层的梯度

损失函数对输出 y_t 的梯度:这个里面的t 你可以认为是3,方便你理解。

        

损失函数对隐藏状态 h_t 的梯度:h_3方便你理解。

然后我们考虑一下,从L 到 h_3所经过的路线:

 L  --->  y3  --->h_3

上式子中:

:t=3

              :t=3

                   :T=3,前面传递的三个预测值和真实值之间的误差值之和

从L到h3 经过了L  --->  y3  --->h_3这个路径。

所以L 对h_3的求导为:

其实我们求导到最后应该要要对权重的求导,因为最后要通过修改权重来学习内容。

也就是:

第一个是误差对输入层权重的导数

第二个是误差对隐藏层权重的导数

第三个是误差对预测层权重的导数

然后我们先看一下误差对输入层权重的求导,

现在我们考虑一下L到Wx的路径有哪些,

第一条是:L --->y3 --->h3 --->Wx

第二条是:L --->y3 --->h3 --->h2 --->Wx

第三条是:L --->y3 --->h3 --->h2 --->h1 --->Wx

然后把第一条路径的导数加上第二条路径的导数再加上第三条路径的导数就是L对Wx的求导。

这个是我自己推导的,可能有些地方不够严谨,但是具体的过程是正确的,从最后的公式我们可以看到距离Y3 最远的X1的前面的值是激活函数的导数的三次方乘以隐藏层权重Wh的平方,那么如果权重的值远小于1,平方后再乘以激活函数的3次方肯定已经远小于1,非常接近0了,那么最后由x1能给L对Wx的导数的值提供的影响就大大减小了,那么x1对L的影响就大大减小了,那么就导致了梯度的消失。对x1信息的遗忘。所有RNN不能够处理很长文本的原因。

梯度爆炸是因为,如果Wh很大比如说是100,平方就是10000,激活函数是0.2,最后的结果就是

80,那么就是说x1对整体的影响可以达到80这么多。如果再传递一层,就更大了。这就导致了梯度爆炸,误差难以收敛。

还有L对Wh的导数

L对Wy的导数都是同样推导的。

不知道大家能不能理解。可以自己动手推导一下。然后就好理解了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

bge-large-zh-v1.5 与Pro/BAAI/bge-m3 区别

ge-large-zh-v1.5 和 Pro/BAAI/bge-m3 是两种不同的模型,主要区别在于架构、性能和应用场景。以下是它们的对比: 1. 模型架构 bge-large-zh-v1.5: 基于Transformer架构,专注于中文文本的嵌入表示。 参数量较大,适合处…

lamp平台介绍

一、lamp介绍 网站: 静态 动态 php语言 .php 作用:运行php语言编写动态网站应用 lamp Linux Apache MySQL PHP PHP是作为httpd的一个功能模块存在的 二、部署lamp平台 1、测试httpd是否可正常返回PHP的响应 2、测试PHP代码是否可正常连接数据…

Windows10系统构建本地安全私有化的个人知识库——采用DeepSeek+RAGFlow

一、为什么要构建本地私有化个人知识库 1.1、自身需求 1、需要相关隐私资料内容的安全保护可控; 2、需要根据自身的隐私资料内容构建出个性化的知识库; 一些常见的业务场景如:①希望我们的智能助手可以根据公司的管理制度回答问题,让员工可以随时了解公司相关制度内容信息;…

Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案

Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案 问题背景: 执行yum update出现如下报错 排查虚拟机是否联网: ping -c 4 www.baidu.com 可以看到网络链接没有问题 解决方案: 原因是国外的镜像源有问题&am…

Java 大视界 -- Java 大数据在智能金融反欺诈中的技术实现与案例分析(114)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

每日OJ_牛客_游游的字母串_枚举_C++_Java

目录 牛客_游游的字母串_枚举 题目解析 C代码 Java代码 牛客_游游的字母串_枚举 游游的字母串 描述: 对于一个小写字母而言,游游可以通过一次操作把这个字母变成相邻的字母。a和b相邻,b和c相邻,以此类推。特殊的&#xff0…

示例:在WPF中如何使用Segoe MDL2 Assets图标和使用该图标的好处

一、目的:分享在WPF中如何使用Segoe MDL2 Assets图标和使用该图标的好处 在WPF中使用Segoe MDL2 Assets字体,可以通过设置控件的FontFamily属性来实现。Segoe MDL2 Assets是一个包含许多图标的字体,通常用于Windows应用程序的图标显示。 二、…

h5 IOS端渐变的兼容问题 渐变实现弧形效果

IOS端使用渐变的时候有兼容问题 以下是问题效果,图中黑色部分期望的效果应该是白色的。但是ios端是下面的样子…… 安卓pc 支持: background-image: radial-gradient(circle 40rpx at 100% 0, #f3630c 40rpx, rgb(255, 255, 255) 50%);安卓pc ios支持…

Libgdx游戏开发系列教程(4)——显示中文文字

目录 2种方法优缺点 BitmapFont FreeTypeFont 方法1 使用BitmapFont 1.下载hiero工具 2.生成fnt文件 3.代码使用 测试效果 方法2 使用FreeType 1.依赖引入 2.代码使用 测试效果 使用疑问点 这里主要介绍关于在Libgdx显示文字的2种方法 本文代码示例采用kotl…

自然语言处理:朴素贝叶斯

介绍 大家好,博主又来和大家分享自然语言处理领域的知识了。按照博主的分享规划,本次分享的核心主题本应是自然语言处理中的文本分类。然而,在对分享内容进行细致梳理时,我察觉到其中包含几个至关重要的知识点,即朴素…

UltraScale系列FPGA实现SDI转PCIE3.0采集卡,基于UltraScale GTH+XDMA架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案我已有的PCIE方案本博客方案的PCIE2.0版本本博客方案的RIFFA版本 3、详细设计方案设计原理框图SDI 输入设备LMH1219RTWR 均衡器UltraScale …

Linux系列:如何调试 malloc 的底层源码

一:背景 1. 讲故事 上一篇我们聊过 C# 调用 C 的 malloc 代码来演示heap的内存泄露问题,但要想深入研究得必须把 malloc 的实现库 libc.so 给调试起来,大家都知道在Linux 上 libc 和 Windows 的 Win32 API 是一个层级的,由于 Li…

深入 PipeWire

简介 随着它的成熟,PipeWire 项目正在慢慢地变得流行。它的文档依然相对稀少,但正在逐渐增长。然而,让项目外部的人尝试用他们自己的语言来理解和解释它总是一个好主意,重申想法,从他们自己的角度来看待它。 在之前的…

20250304笔记-阅读论文

文章目录 前言一、寻找论文1.1寻找有代码的论文方法一:浏览器扩展1.1.1使用流程 方法二:使用Papers with Code 1.2大量搜索代码 二、阅读论文所用软件 三、引用文献格式总结 前言 一、寻找论文 1.1寻找有代码的论文 方法一:浏览器扩展 浏览…

线程POSIX信号量/基于环形队列的⽣产消费模型

一,POSIX线程信号量 信号量的本质就是一个计数器,也是对资源的预定机制,POSIX信号量和SystemV信号量作⽤相同,都是⽤于同步操作,达到⽆冲突的访问共享资源⽬的。但 POSIX可以⽤于线程间同步。 1,初始化信…

C# 类库打包dll文件

目录 前言操作流程注意事项 前言 在C#中,有多种方式可以对代码进行加密,以保护源代码不被轻易查看或修改,这篇文章主要介绍将C# cs类文件加密为dll文件的方式进行保护。 操作流程 在 Visual Studio 中,选择“创建新项目”。 选…

DELL EMC Unity存储如何让控制器进入service mode和退出service mode

近期遇到好几个关于DELL EMC unity (VNXe)存储系统挂掉的案例,都是很后期才寻找支持到我们这里,然后再看问题,已经变得很复杂,几乎都是从一个相对简单的问题搞成了一锅粥甚至最后丢数据的情况。 为此&…

【微知】如何通过mlxlink查看Mellanox网卡和光模块相关的信息?( mlxlink -d 01:00.0 -m)

背景 通过mlxlink可以查看Mellanox网卡的一些链路信息和硬件信息,也可以查看所插入的光模块的一些信息。 兄弟篇通过ethtool查看的方法:如何查看Mellanox网卡上的光模块的信息? 命令 mlxlink -d 01:00.0 -mman手册介绍: 如果…

Linux系列:如何用 C#调用 C方法造成内存泄露

一个简单的非托管内存泄露 1. 构建 so 文件 在 Windows 平台上我们会通过 MSVC 编译器将 C代码编译出一个成品 .dll,在 Linux 上通常会借助 gcc 将 c 编译成 .so 文件,这个.so 全称 Shared Object,为了方便讲解,先上一段简单的代码…

C# 数据类型相关

分类 按照数据复杂程度 按照数据存储 类型转换 隐式转换 隐式转换无法完成由精度高的数据类型向精度低的数据类型转换 显式转换 又称为强制类型转换,显示转换不一定总是成功,且转换过程中可能出现数据丢失 int num 666;float result (float)num; …