循环神经网络RNN及其变体LSTM、GRU

news2025/1/17 22:54:37

1. 背景

RNN(Recurrent Neural Networks)

CNN利用输入中的空间几何结构信息;RNN利用输入数据的序列化特性。

2. SimpleRNN单元

        传统多层感知机网络假设所有的输入数据之间相互独立,但这对于序列化数据是不成立的。RNN单元用隐藏状态或记忆引入这种依赖,以保存当前的关键信息。任一时刻的隐藏状态值是前一时间步中隐藏状态值和当前时间步中输入值的函数 h_{t}=f(h_{t-1}, x_{t})

        在所有时间步上共享相同的权重向量(U、V、W),极大地减少了RNN网络需要学习的参数个数。其t时间步输出 y_{t}=softmax(Vh_{t})

h_{t}=tanh(Wh_{t-1}+Ux_{t})

        选择tanh作为激活函数,是因为它的二阶导数衰减到0非常缓慢,这保持了激活函数的线性域的斜度,并帮助防止梯度消失问题。

 3. 梯度消失与梯度爆炸

3.1 产生原因

         时延反向传播BPTT(Backpropagation Through Time):因为参数是所有时间步共享的,所以每个输出的梯度不只依赖当前的时间步,也依赖之前的时间步。

在正向传播中,网络在每个时间步产生预测,并将它与标签比较,来计算损失L(t);
在反向传播中,关于参数U、V和W的损失梯度在每个时间步上计算,并用梯度之和来更新参数。

        一个隐藏状态关于它前一个隐藏状态的梯度小于1,跨多个时间步反向传播后,梯度的乘积就会变得越来越小,这就导致了梯度消失问题的出现;反之,梯度比1大很多,会导致梯度爆炸。

3.2 影响

        (1)梯度消失的影响是:相距较远的时间步上的梯度对学习过程没有任何用处,因此RNN不能进行大范围依赖的学习。梯度消失问题在传统NN上也会发生,只是对于RNN网络可见性更高,因为RNN趋于拥有更多的层(时间步),而反向传播在这些层是必然发生的

        (2)梯度爆炸更容易被检测到,梯度会变得非常大以至于不再是数字,训练过程也将崩溃。

3.3 解决方案

(1)缓解梯度消失问题的方法:

1. W权重向量的适当初始化;
2. 使用ReLU替代tanh层;
3. 使用非监督方法与训练网络;
4. 使用LSTM或GRU架构。

(2)梯度爆炸问题可以通过在预定义的阈值上进行梯度裁剪来控制。

4. LSTM长短期记忆网络

        LSTM机构被设计成处理梯度消失问题以及更高效的学习长期依赖。LSTM时间步t隐藏状态的转换(4个层:3个门(i,f,o)+内部隐藏状态g),如下图所示:

遗忘门定义了前一状态 h_{t-1} 的多少部分可以通过;
输入门定义了当前输入 x_{t} 新计算出的状态的多少部分可以通过;
输出门定义了当前状态的多少部分传递给下一层;

5. GRU门控循环单元网络

        GRU是LSTM的一个变体,它保留了LSTM对梯度消失问题的抗力,但它内部结构更加简单,更新隐藏状态时需要的计算也更少,因此训练的更快。GRU单元的门如下:

更新门z定义了保留多少部分上一记忆;
重置门r定义了如何把新的输入和上一记忆结合起来;
和LSTM不同,GRU没有持久化的单元状态。

        GRU和LSTM具有同样出色的性能,GRU训练起来更快并且需要较少的数据就可以泛化
但在数据充足的情况下,LSTM卓越的表示能力可能会产生更好的结果。

6. 双向RNN

        双向RNN是彼此互相堆叠的两个RNN,它们从相反的方向读取输入。每个时间步的输出将
基于两个RNN的隐藏状态。

7. 有状态RNN

        RNN可以是有状态的,它能在训练中维护跨批次的状态信息,即为当前批次的训练数据计算
的状态值,可以用作下一批次训练数据的初始隐藏状态。

优点:更小的网络或更少的训练时间;
缺点:需要负责使用反映数据周期性的批大小来训练网络,并在每个训练期后重置状态。

        另外,因为数据呈现的顺序与有状态网络相关,在网络训练期间数据不能被移动。

1. 需要选择一个反映数据周期性的批大小,因为有状态RNN会将本批数据和下一批排列对齐,所以选择合适的批大小会让网络学得更快。
2. 需要手动控制模型、循环训练模型至要求的轮数。每次迭代训练模型一轮,状态信息跨批次保留。每轮训练后,模型的状态需要手动重设。

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

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

相关文章

2024美赛数学建模资料---100%获奖资料

很好的教程了 一共二十四章 每一章都是一个模型 并且有matlab编程编码 第一章 线性规划 第二章 整数规划 第三章 非线性规划 第四章 动态规划 第五章 图与网络 第六章 排队论 第七章 对策论 第八章 层次分析法 第九章 插值与拟合 第十章 数据的统计描述和分析 第十一章…

小心处理 C++ 静态变量中的陷阱

小心处理 C 静态变量中的陷阱 函数中的 static 变量 static 变量的作用 C 中 static 关键字的最后一个用途是在函数内创建局部变量,这些变量在其作用域内退出和进入时保持其值。函数内的 static 变量类似于只能从该函数访问的全局变量。static 变量的一个常见用途…

JS前端逆向

前言 js逆向一直没有相关了解,虽然目前渗透遇见的不是很多,大多数遇见的要么不加密,要么无法实现其加密流程,不过最近看到了一个较为简单的站点正好能够逆向出来,就做了简单记录。本文旨在介绍js逆向的一些基础思路&am…

超硬核解析Mybatis动态代理原理!只有接口没实现也能跑?

文章目录 前言Mybatis dao层两种实现方式的对比原始Dao开发原始Dao开发的弊端 基于Mapper动态代理的开发方式 Mybatis动态代理实现方式的原理解析动态代理调用链路解析先给出链路调用结果1、调用方法的开始:session.getMapper2、DeaultSqlSession的getMapper3、Conf…

JavaWeb 带条件的分页查询

最终效果图 注意:没有带条件的时候 默认的是第一页数据 条件是组合的 sql->sql的动态变换 注意第二次查询的时候回显问题 就是填完条件后显示完当页数据ok 但是我点击第二页的时候条件还存在着 此时ListSerevlet不仅要拿到页码 页容量 还要拿到三个条件参数 封装…

Linux网络之连接跟踪 conntrack

一 Linux网络之连接跟踪 conntrack k8s 有关conntrack的分析 ① 什么是连接跟踪 netfilter连接跟踪 conntrack 详述 思考:连接跟踪模块会对哪些协议进行跟踪?TCP、UDP、ICMP、DCCP、SCTP、GRE ② 为什么需要连接跟踪 没有连接跟踪有很多问题是不好解决的&a…

掌握视频剪辑技巧:批量置入视频封面,提升视频品质

在当今数字化时代,视频已成为生活的重要组成部分。无论是观看电影、电视剧、综艺节目,还是分享个人生活、工作成果,视频都以其独特的魅力吸引着大众的视线。视频封面是视频内容的缩影,是观众对视频的第一印象。一个好的封面能吸引…

分享一个简单的基于C语言嵌入式GUI界面切换代码

目录 前言 一、数据类型 二、页面调度 三、页面显示 四、视频展示 前言 最近在用LVGL写一个简单的UI界面,需要进行几个页面的切换,所以就自己写了一个简单页面切换代码,方便进行页面切换,同时使UI代码结构更加清晰。这个结构…

基于Java SSM框架实现实现四六级英语报名系统项目【项目源码+论文说明】

基于java的SSM框架实现四六级英语报名系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个高校四六级报名管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作…

什么是跨站脚本攻击

跨站脚本攻击 1. 定义2. 跨站脚本攻击如何工作3. 跨站脚本攻击类型4. 如何防止跨站脚本攻击 1. 定义 跨站脚本攻击(Cross-site Scripting,通常称为XSS),是一种典型的Web程序漏洞利用攻击,在线论坛、博客、留言板等共享…

leetCode 51.皇后 + 回溯算法 + 图解 + 笔记

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包…

Python读取栅格遥感影像并加以辐射校正后导出为Excel的一列数据

本文介绍基于Python语言中的gdal模块,读取一景.tif格式的栅格遥感影像文件,提取其中每一个像元的像素数值,对像素值加以计算(辐射定标)后,再以一列数据的形式将计算后的各像元像素数据保存在一个.csv格式文…

【力扣206】反转链表

【力扣206】反转链表 一.题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1 : 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2 : 输入:head [1,2] 输出&#x…

机器学习---pySpark代码开发

1、eclipse开发pySpark程序 在eclipse中开发pySpark程序,需要安装pydev插件。 1).eclipse安装python插件,安装完成后重启。 2). 在window--->preferences中找到python interpreter配置安装python的路径: 3).新建python项目: 2、pyCharm开…

Centos图形化界面封装OpenStack Centos镜像

目录 背景 环境 宿主机环境安装 创建与安装Centos7.8虚机 虚机设置 安全相关 安装ACPI服务 安装cloud-init 安装cloud-utils-growpart 停⽌虚拟机 删除个性化信息 模板化与压缩 登录与验证 背景 今天早上在Centos官网下载的CentOS-7-aarch64-GenericCloud-2003.…

3dMax拼图生成工具Puzzle2D使用教程

Puzzle2D for 3dsMax拼图生成工具使用教程 Puzzle2D简介: 2D拼图随机生成器(英文:Puzzle2D) ,是一款由#沐风课堂#用MAXScript脚本语言开发的3dsMax建模小工具,可以随机创建2D可编辑样条线拼图图形。可批量…

解决vscode中html部分无法嵌套注释

不管是React项目还是Vue项目,相信你一定遇到过同样的问题,如果想要注释的结构内部也存在注释,那么编译器会报以下问题 使用 HTML-Comment 这个插件即可解决问题 选中需要注释的区域并根据系统输入快捷键,可以发现就算嵌套了注释…

使用Redis构建任务队列

文章目录 第1关:先进先出任务队列第2关:优先级任务队列第3关:定时任务队列 第1关:先进先出任务队列 编程要求 在Begin-End区域编写 add_task(task_name) 函数,实现将任务加入队列的功能,具体参数与要求如下…

C++基础 -35- string类

string类的格式 string a;如下图,使用string类比常规的字符串处理方便很多 而且需要进行的字符串处理,在类中都能完成 #include "iostream"using namespace std;extern "C" {#include "string.h" }int main() {//c的写…

Java基本数据类型详解

✨个人主页:全栈程序猿的CSDN博客 💨系列专栏:Java从入门到精通 ✌座右铭:编码如诗,Bug似流星,持续追求优雅的代码,解决问题如同星辰般自如 Java是一种强类型语言,数据类型在程序中起…