循环神经网络RNN介绍

news2024/11/16 21:51:59

文章目录

  • 1、学习介绍
  • 2、RNN的基本结构
    • 2.1、图例
    • 2.2、公式
    • 2.3、公式计算示例
      • 2.3.1、给定参数
      • 2.3.2、时间步计算
  • 3、序列依赖与梯度消失/爆炸
    • 3.1、序列依赖
    • 3.2、梯度消失与爆炸
    • 3.3、总结
  • 4、传统的前馈神经网络
    • 4.1、结构
    • 4.2、工作原理
    • 4.3、特点
    • 4.4、局限性
  • 5、CNN与RNN的关系
    • 5.1、二者的关系
    • 5.2、CNN 的独特特性
    • 5.3、适用场景
    • 5.4、总结

🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎人工智能和前端开发。
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹

1、学习介绍

循环神经网络(Recurrent Neural Networks, RNNs)是一类用于处理序列数据神经网络模型
它们在处理诸如时间序列分析自然语言处理语音识别等任务时表现出色。
RNN的 核心特性是它们能够在序列中保存状态信息,从而捕捉输入序列中的时间依赖关系


在循环神经网络的这部分,后续的文章主要包含内容如下:

  1. 了解词嵌入层的作用
  2. 了解循环网络层的作用
  3. 穿插各种数学原理和python代码

最后,将会有一篇文章来使用前面学习的知识来构建一个 循环神经网络实现对歌词数据的学习,并能够根据给出的词来预测出指定长度的歌词。

2、RNN的基本结构

RNN传统的前馈神经网络文末讲解)不同,它的每个神经元 不仅 接收来自 输入层的信号,还接收来自 自身或其他神经元反馈信号
这种反馈机制使
RNN能够在处理序列数据保留之前的信息
,从而在时间步之间共享信息。

2.1、图例


这张图展示了一个典型的循环神经网络(RNN)结构,以及它在时间步上的展开(unfolding)
图中元素的解释:

  1. 输入层(input)
    • 标记为 x x x(单个时间步的输入)。
    • 在展开的图中,每个时间步 t t t 的输入标记为 x t x_t xt
  2. 隐藏层(hidden)
    • 标记为 s s s(表示隐藏状态)。
    • 图中,隐藏层的状态在每个时间步用 s t s_t st 表示。隐藏层保存了当前输入和之前隐藏状态的信息。
    • 权重 W W W 用于在时间步之间传播隐藏状态。
  3. 输出层(output)
    • 标记为 o o o
    • 在展开的图中,每个时间步的输出标记为 o t o_t ot
    • 权重 V V V 用于将隐藏状态转换为输出。
  4. 权重矩阵
    • U U U:输入到隐藏层的权重矩阵。
    • W W W:隐藏层之间的循环权重矩阵,用于将先前的隐藏状态 s t − 1 s_{t-1} st1 传播到当前时间步的隐藏状态。
    • V V V:隐藏层到输出层的权重矩阵。

2.2、公式

在RNN中,隐藏状态 h t h_t ht 的更新公式为: h t = f ( W h x x t + W h h h t − 1 + b h ) h_t = f(W_{hx} x_t + W_{hh} h_{t-1} + b_h) ht=f(Whxxt+Whhht1+bh)

  • h t h_t ht 是时间步 t t t 的隐藏状态。
  • x t x_t xt 是时间步 t t t 的输入。
  • W h x W_{hx} Whx 是输入到隐藏层的权重矩阵。
  • W h h W_{hh} Whh 是隐藏层到隐藏层的权重矩阵。
  • b h b_h bh 是偏置项。
  • f f f 是激活函数,通常使用 tanh ⁡ \tanh tanh ReLU \text{ReLU} ReLU

输出 y t y_t yt 通常由以下公式给出: y t = f ( W h y h t + b y ) y_t = f(W_{hy} h_t + b_y) yt=f(Whyht+by)

  • W h y W_{hy} Why 是隐藏层到输出层的权重矩阵。
  • b y b_y by 是输出层的偏置项。

image.png
所以实际上RNN就是 x t x_t xt h t − 1 h_{t-1} ht1线性组合后,通过tanh函数向前传递。

2.3、公式计算示例

一个简单的RNN计算示例,通过给定的输入序列、初始状态和权重矩阵,演示如何计算每个时间步的隐藏状态和输出。

2.3.1、给定参数

  • 输入序列 x = [ 0.5 , 0.1 , − 0.3 ] x = [0.5, 0.1, -0.3] x=[0.5,0.1,0.3]
  • 初始隐藏状态 h 0 = 0 h_0 = 0 h0=0
  • 权重矩阵
    • W h x = 0.8 W_{hx} = 0.8 Whx=0.8
    • W h h = 0.3 W_{hh} = 0.3 Whh=0.3
    • W h y = 1.0 W_{hy} = 1.0 Why=1.0
  • 偏置项
    • b h = 0.1 b_h = 0.1 bh=0.1
    • b y = 0.2 b_y = 0.2 by=0.2
  • 激活函数:使用 tanh ⁡ \tanh tanh,其定义为 tanh ⁡ ( z ) = e z − e − z e z + e − z \tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}} tanh(z)=ez+ezezez

2.3.2、时间步计算

时间步 1 ( t = 1 t = 1 t=1):
输入 x 1 = 0.5 x_1 = 0.5 x1=0.5

  1. 隐藏状态计算
    在这里插入图片描述

  2. 输出计算
    在这里插入图片描述

时间步 2 ( t = 2 t = 2 t=2):
输入 x 2 = 0.1 x_2 = 0.1 x2=0.1

  1. 隐藏状态计算
    在这里插入图片描述

  2. 输出计算
    在这里插入图片描述

时间步 3( t = 3 t = 3 t=3):
输入 x 3 = − 0.3 x_3 = -0.3 x3=0.3

  1. 隐藏状态计算
    在这里插入图片描述

  2. 输出计算

在这里插入图片描述

通过这几个时间步的计算,我们可以看到 RNN如何利用之前的隐藏状态当前的输入来计算当前的隐藏状态,并进一步生成输出

3、序列依赖与梯度消失/爆炸

3.1、序列依赖

概念:

  • 序列依赖指的是序列数据中元素之间的相互关系和依赖性。
  • 在时间序列、自然语言处理、语音识别等任务中,当前数据点通常与之前的若干数据点相关联。
  • RNN 利用其循环结构来捕获序列中的时间依赖性。通过记住和传递过去的隐藏状态,RNN 可以将过去的信息带入到当前的计算中。

例子:

  • 自然语言处理:在句子中,当前词的含义通常取决于前面的词。例如,“我喜欢喝咖啡”中的“咖啡”与前面的“喜欢喝”密切相关。
  • 时间序列预测:在预测股票价格时,前几天的价格变化可以帮助预测未来的价格趋势。

3.2、梯度消失与爆炸

概念:

  • 梯度消失和梯度爆炸是反向传播算法中常见的问题,尤其是在深度神经网络和 RNN 中。
  • 梯度消失:在反向传播过程中,梯度逐渐衰减为接近零的值,导致早期层(或早期时间步)中的权重更新几乎停滞。这会使模型难以学习序列中较早的依赖关系
  • 梯度爆炸:梯度在反向传播过程中快速增大,导致权重更新过大,引起数值不稳定训练失败

原因:

  • 在RNN中,隐藏状态之间的递归计算导致梯度的连乘。对于梯度消失,这种连乘可能导致梯度的 指数衰减;对于梯度爆炸,可能导致梯度的 指数增长
  • 激活函数的选择(例如,使用sigmoid或tanh)也可能加剧梯度消失问题,因为这些函数在其饱和区间内的导数很小

可以看一下sigmoid和tanh的函数、导数关系,直观感受一下:

sigmoid:image.png
tanh:
image.png

解决方法:

  1. 使用LSTM和GRU
    • 长短时记忆网络(LSTM)和门控循环单元(GRU)是RNN的变体,通过引入门控机制有效管理信息流动。
    • 这些门控单元(输入门、遗忘门、输出门)允许网络有选择地保留或遗忘信息,从而缓解梯度消失和爆炸问题。
  2. 梯度裁剪
    • 在反向传播中 限制梯度的最大值,以防止梯度爆炸。
    • 梯度裁剪通过将过大的梯度向量缩放到一个合理的范围来实现。
  3. 使用合适的激活函数
    • 使用ReLU或其变体(如Leaky ReLU)替代sigmoid或tanh,因为ReLU在正区间的梯度不会消失。
    • image.png
  4. 正则化技术
    • 采用正则化技术(如Dropout)来减少过拟合和提高模型的泛化能力。
  5. 初始化技术
    • 使用合适的权重初始化方法(如Xavier初始化或He初始化)来改善训练稳定性。

3.3、总结

  1. RNN在处理序列依赖性上具有强大的能力,主要挑战是梯度消失和梯度爆炸问题。
  2. 这些问题在序列很长时尤为明显,因为反向传播通过时间(Backpropagation Through Time, BPTT)过程中,梯度会随着时间步的增加而指数级地缩小或放大。
  3. 为了解决这些问题,引入了先进的架构 如LSTM(Long Short-Term Memory)和GRU(Gated Recurrent Unit)等变体,这些模型通过门控机制有效地管理信息流,缓解了梯度消失和爆炸的问题。
  4. 还有优化策略(如梯度裁剪)、正则化和适当的初始化等,也能够有效缓解这些问题,从而提升模型的性能和稳定性。、

4、传统的前馈神经网络

传统的前馈神经网络(Feedforward Neural Networks,简称 FNN)是一种最基础的人工神经网络结构,主要用于监督学习任务。
它们由多个神经元(类似于生物神经元的模型)组成,按照层级结构排列,包括输入层、隐藏层和输出层。

4.1、结构

  1. 输入层:接收外部输入信号,每个节点代表一个特征。
  2. 隐藏层:介于输入层和输出层之间,可以有一个或多个。隐藏层中的神经元接收前一层的输出,通过激活函数进行处理,再输出到下一层。
  3. 输出层:产生网络的输出结果,输出层的节点数通常与需要预测的类别数或目标值的维度一致。

4.2、工作原理

  • 前向传播:输入信号经过网络的各层,逐层计算并传递,直至输出层。每个神经元对输入的加权求和,再通过激活函数得到输出。
  • 激活函数:引入非线性特性,常用的有 Sigmoid、Tanh、ReLU 等,帮助网络学习复杂的非线性关系。
  • 损失函数:计算输出预测值与真实值之间的误差,常用的有均方误差(MSE)、交叉熵损失等。
  • 反向传播:通过计算损失函数的梯度,将误差从输出层逐层向输入层传播,更新每个连接权重以最小化误差。这是通过梯度下降等优化算法实现的。

4.3、特点

  • 单向传播:信号只从输入层向输出层传递,不会有反馈回路。
  • 训练过程:基于反向传播算法,通过多次迭代来优化权重,直到损失函数收敛。
  • 适用场景:适合解决分类、回归问题,如手写数字识别、图像分类等。

4.4、局限性

  • 局部极小值:可能陷入局部极小值,无法找到全局最优解。
  • 过拟合:在训练数据上表现良好,但在新数据上可能泛化能力较差。
  • 不适合序列数据:由于缺乏记忆能力,无法有效处理时间序列或序列相关的数据(如语音、文本),此类任务通常使用循环神经网络(RNN)或长短期记忆网络(LSTM)来解决。

传统前馈神经网络是深度学习的基础,尽管其功能有限,但在理解和构建更复杂的网络结构(如卷积神经网络CNN和循环神经网络RNN)方面,它们提供了重要的基础知识。

5、CNN与RNN的关系

卷积神经网络(Convolutional Neural Networks,简称 CNN)可以被视为一种特殊类型的前馈神经网络。
它们在设计上继承了前馈神经网络的基本结构,即数据在网络中是单向流动的,从输入层通过隐藏层到输出层。
然而,CNN 在结构上引入了一些独特的层和机制,以更好地处理特定类型的数据,特别是图像数据。

5.1、二者的关系

  1. 前馈特性:CNN 中的数据流动方向是单向的,类似于传统的前馈神经网络。
  2. 层次结构:CNN 也由输入层、隐藏层和输出层组成。隐藏层通常包含卷积层、池化层和全连接层。
  3. 训练过程:与传统的前馈神经网络一样,CNN 也通过反向传播和梯度下降等优化算法进行训练。

5.2、CNN 的独特特性

  1. 卷积层:通过卷积运算提取数据中的局部特征。卷积层使用多个过滤器(或核)在输入数据上滑动,以识别不同的模式和特征。
  2. 池化层:进行降维处理,减少数据量和计算量,同时保留重要特征。常用的池化操作有最大池化(Max Pooling)和平均池化(Average Pooling)。
  3. 权重共享:CNN 的卷积层中的过滤器在整个输入上共享相同的权重,这大大减少了参数数量,提高了模型的训练效率。
  4. 平移不变性:由于卷积和池化操作,CNN 能够识别输入数据中的特征,即使这些特征在位置上有所变化。

5.3、适用场景

CNN 在图像处理和计算机视觉领域表现出色,如图像分类、目标检测、图像分割等任务。
其设计能够有效捕捉图像中的空间结构和局部依赖性。

5.4、总结

虽然 CNN 是一种前馈神经网络,但其独特的结构使其在处理某些类型的数据时更加高效和准确。
与传统的前馈神经网络相比,CNN 通过引入卷积和池化等操作,实现了对图像数据的更好处理。

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

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

相关文章

【建造者模式】全面解析与最佳实践:打造复杂对象的蓝图(构建复杂对象的艺术)

文章目录 Java中的建造者模式:全面解析与最佳实践1. 引言2. 建造者模式概念定义与用途适用场景解决的问题 3. 建造者模式原理主要角色解释工作流程UML图和时序图 4. 建造者模式在Java中的实现逐步构建示例程序1. 创建抽象建造者类2. 实现具体建造者类3. 设计产品类4…

如何在厂商软件不提供二次开发资源的情况下实现LabVIEW开发

在遇到厂商提供的软件不支持二次开发资源时,如果需要使用LabVIEW进行开发,通常面临以下几个挑战:设备通讯接口封闭、协议不公开、厂商技术支持有限等。这些问题需要综合考虑并制定解决方案,以下是详细的分析: 1. 了解原…

权限模块开发+权限与角色关联(完整CRUD)

文章目录 🌞 Sun Frame:SpringBoot 的轻量级开发框架(个人开源项目推荐)🌟 亮点功能📦 spring cloud模块概览常用工具 🔗 更多信息1.easycode生成代码1.配置2.AuthPermissionDao.java剪切到mapp…

SharpLab:.Net反编译工具,方便实时查看反编译后的代码!

C#提供了很多高级语法,很多都是语法糖。这些语法糖对于初学者来说,很多无法理解。 下面推荐一个开源项目,它能够让我们,实时查看编译过程、生成的中间语言(IL)以及反编译后的代码。 01 项目简介 SharpLa…

C语言 ——深入理解指针(2)

目录 1. 数组名的理解2. 二级指针3. 指针数组4. 字符指针变量5. 数组指针变量6. 函数指针变量7. 函数指针数组 1. 数组名的理解 这里我们使用 &arr[0] 的方式拿到了数组第一个元素的地址,但是其实数组名本来就是地址,而且是数组首元素的地址&#x…

TabLayout使用以及自定义tab标签

<?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tool…

YoloV10 论文翻译(Real-Time End-to-End Object Detection)

​摘要 近年来&#xff0c;YOLO因其在计算成本与检测性能之间实现了有效平衡&#xff0c;已成为实时目标检测领域的主流范式。研究人员对YOLO的架构设计、优化目标、数据增强策略等方面进行了探索&#xff0c;并取得了显著进展。然而&#xff0c;YOLO对非极大值抑制&#xff0…

01【功能项目】之【主角射线点击导航】

首先创建一个Unity3D的项目 打开资源商店添加一个人物模型 选择一个免费资源主角添加至项目中 在unity中打开后点击下载包 点击导入包 导入成功后会出现在资源包Assets下 右键创建地面 设置地面尺寸 创建一个材料方便给地面调配颜色 选择材料的颜色 将材质拖拽给地面组为组件 将…

double类型 精度丢失的问题

前言 精度丢失的问题是在其他计算机语言中也都会出现&#xff0c;float和double类型的数据在执行二进制浮点运算的时候&#xff0c;并没有提供完全精确的结果。产生误差不在于数的大小&#xff0c;而是因为数的精度。 一、double进行运算时,经常出现精度丢失 0.10.2使用计算…

QTableView使用示例-Qt模型视图代理(Model-View-Delegate)使用示例

模型视图委托&#xff08;MVD&#xff09;是Qt中特有的设计模式&#xff0c;类似MVC设计模式&#xff0c;将MVC设计模式中的Controller当做MVD中的Delegate&#xff0c;两者的概念基本相同。不同的是委托不是独立存在&#xff0c;而是包含在视图里面。 模型视图委托设计模式中&…

#71结构体案例2(三国游戏,冒泡排序)

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <string> using namespace std;//英雄结构体 struct Hero {string name;int age;string gender; };//冒泡排序 void bubbleSort(struct Hero hArray[],int len) {for(int i0;i<len-1;i){for(i…

CentOS 8 本地创建yum源

1.获取iso (有iso就可以建立本地repo) 如CentOS-8.5.2111-aarch64-dvd1.iso 2.解压iso&#xff08;mount挂载就可以吧iso解压到linux某一目录中&#xff09; mkdir /mnt/cdrom mount -o loop ./CentOS-Stream-8-aarch64-20220913-dvd1.iso /mnt/cdrom ls /mnt/cdrom 3.编…

奇偶函数的性质及运算

目录 定义 注意 特征 运算 拓展 定义 设函数f(x)的定义域D&#xff1b; 如果对于函数定义域D内的任意一个x&#xff0c;都有f(-x)&#xff0d;f&#xff08;x&#xff09;&#xff0c;那么函数f&#xff08;x&#xff09;就叫做奇函数。如果对于函数定义域D内的任意一个x…

【前端】 如何在 Vue.js 中使用 Mock 数据:教程与技巧

如何在 Vue.js 中使用 Mock 数据&#xff1a;教程与技巧 在开发过程中&#xff0c;为了测试和开发前端功能&#xff0c;你常常需要用到模拟&#xff08;mock&#xff09;数据。Vue.js 提供了灵活的方式来处理数据请求和更新&#xff0c;但在没有真实后端的情况下&#xff0c;我…

在 VueJS 中使用事件委托处理点击事件(事件委托,vue事件委托,什么是事件委托,什么是vue的事件委托)

前言 在开发 Vue 项目时&#xff0c;我们经常需要处理大量的点击事件。为每个可点击的元素单独添加事件监听器不仅会增加代码的复杂度&#xff0c;还会降低性能。事件委托是一种有效的优化方式&#xff0c;它可以显著减少事件监听器的数量&#xff0c;提高代码的可维护性和执行…

SSM禾泽校园学生商品交易平台-计算机毕设定制-附项目源码(可白嫖)50284

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对禾泽校园学生商品交易平台等问题&#xff0…

部署PXE

一 准备工作 1.rhel7主机 2.开启主机图形init 5 开图形 3.配置网络可用 4.关闭vmware dhcp功能 将VMnet8本地DHCP服务关闭 二 部署kickstart 1.安装kichstart并开启 2.安装httpd并启动 3.测试 4.配置kickstart 左上角文件保存 在vim ks.cfg中配置软件 共享 测试 四 DHCP 1.…

mysql操作(进阶)

1.数据库约束 数据库自动对数据的合法性进行校验检查的一系列机制&#xff0c;目的是为了保证数据库中能够避免被插入或者修改一些非法数据。 &#xff08;1&#xff09;mysql中提供了以下的约束&#xff1a; a.NOT NULL&#xff1a;指定某列不能为null b.UNIQUE&#xff1…

防火墙工具iptables应用详解

文章目录 前言一、Netfilter内核二、Netfilter与iptables的关系三、iptables的表与链四、iptables的常用命令与参数五、 iptables使用案例 前言 iptables是Linux系统中一款强大的防火墙工具&#xff0c;它基于Netfilter内核模块&#xff0c;允许管理员定义数据包的转发、过滤和…

RabbitMQ中如何防止消息堆积的情况发生?

RabbitMQ中如何防止消息堆积的情况发生&#xff1f; 消息堆积是消息队列系统中常见的问题&#xff0c;尤其是在高负载环境下。RabbitMQ作为一个流行的消息代理系统&#xff0c;也不可避免地会遇到这种情况。为了防止消息堆积&#xff0c;我们可以采取以下几种方法&#xff1a;…