目录

摘要

Abstract

1 RNN学习意义

2 RNN基础知识

2.1 核心思想

2.2 传播

2.3 优缺点

2.4 变体结构与应用场景

3 RNN结构代码示例

4 总结


摘要

本周主要学习了循环神经网络的学习意义与基础知识,重点了解了RNN循环连接的核心思想、前向传播与反向传播过程,认识了其优缺点与应用场景,对它的变体结构也进行了拓展,最后还通过代码加深了对循环神经网络结构以及使用的了解。

Abstract

This week, I primarily studied the significance and fundamental concepts of Recurrent Neural Networks (RNNs). I focused on understanding the core idea of recurrent connections, the processes of forward and backward propagation, and learned about the advantages, disadvantages, and application scenarios of RNNs. I also explored its variant architectures and deepened my understanding of the structure and usage of RNNs through coding.

1 RNN学习意义

循环神经网络(Recurrent Neural Network, RNN) 是一类专门用于处理序列数据、解决序列式问题的神经网络。它的核心特点是具备“记忆”能力,能够捕捉序列中元素之间的时序依赖关系。

序列数据就是指按时间或其他顺序排列的一组数据点,其中每个数据点不仅自身有意义,其位置和先后关系可能也蕴含着信息,故而它的关键特征包括有序性、可变长度、时序依赖(当前状态可能依赖于之前多个时刻的状态)以及动态性(序列通常是动态生成的,如实时语音流、传感器数据流)。常见的序列数据类型包括文本、语音信号、时间序列、用户行为日志、视频帧和DNA序列等。

序列式问题就是指那些输入、输出或两者都是序列的任务,模型需要理解或生成具有顺序结构的数据,这种问题的核心通常是对序列中的依赖关系进行建模。序列式问题可能包括一个输入对应多个输出(图像描述生成)、一个输出对应多个输入(情感分析)、非实时的多个输入对应多个输出(词性标注)以及实时的多个输入对应多个输出(实时翻译)。

这揭示RNN与普通神经网络的主要区别以及学习RNN的原因及意义。一方面,普通的神经网络只能处理固定长度的数据,而对变长数据无能为力;另一方面,普通的神经网络基本上是对给定的某个输入输出某个特定的值(一对一),例如图像分类或者图像检测。而RNN就能够很好地弥补这些不足。

下图从左至右分别为普通神经网络(一个输入对应一个输出),一个输入对应多个输出,一个输出对应多个输入,非实时的多个输入对应多个输出,实时的多个输入对应多个输出。

2 RNN基础知识

2.1 核心思想

与传统的前馈神经网络不同,RNN 引入了循环连接(Recurrent Connection),使得网络在处理当前输入时,可以利用之前时刻的信息。

它维护一个状态作为下一步的额外输入,比如,输入一个 x^{0} 经过RNN的网络结构得到 s^{0} ,这个 s^{0} 一方面经过某种变化成为最终输出的 y^{0} ,一方面又和下一步输入的 x^{1} 一起经过RNN的网络结构得到 s^{1},并以此类推 。这个状态也被称为隐藏状态(Hidden State)。

它在不同时间步上使用同样的激活函数与参数。其公式为:

s_{t} = f_{w}(s_{t-1}, x_{t})

其中 s_{t} 是当前时间步的隐藏状态, s_{t-1} 是上一个时间步的隐藏状态, x_{t} 是当前时间步的输入,f_{w} 是二者最终得到  s_{t} 所经过的变换。

对 f_{w} 进行展开,公式可能如下:

s_{t} =tanh(Ws_{t-1}+U x_{t})

其中 tanh 为选用的激活函数,W 为前一步隐藏状态到当前隐藏状态的权重,U 为当前输入到当前隐藏状态的权重。

当前输出的概率分布可能为:

\hat{y_{t}} =softmax(Vs_{t})

2.2 传播

由上,循环神经网络对于一个序列的的前向传播过程--以字符语言模型(给定上下文以预测下一字符,例如输入法)为例--可能如下所示:

(词典为  \begin{bmatrix} j ,&e , & p \end{bmatrix} ,样本为 jeep)

由于,RNN 在时间上有依赖关系,其反向传播被称为随时间反向传播(Backpropagation Through Time, BPTT),具体而言就是将 RNN 在时间上展开成一个深层网络,然后像普通神经网络一样进行反向传播。损失函数通常是各时间步损失之和:

E= \sum_{t = 1}^{T}E(y_{t},\hat{y_{t}})

其中 T 代表序列长度,t 代表当前时间索引,y_{t} 代表目标值,\hat{y_{t}} 代表当前时间的预测输出。

反向传播需要计算损失 E 对所有参数的梯度,并统一更新参数。由于参数在所有时间步共享,总梯度是各时间步梯度之和。

1. 输出层权重 V​:

\frac{\partial E}{\partial V} = \sum_{t}^{}\frac{\partial E_{t}}{\partial V}

2. 循环权重 W:

\frac{\partial E}{\partial W} = \sum_{t}^{}\frac{\partial E_{t}}{\partial W}

对于单个时间步的损失值,它关于循环权重 W 的梯度计算就相当于先计算损失对于预测输出的梯度,再计算预测输出对于当前隐藏状态的梯度,最后计算当前隐藏状态对于上一步隐藏状态的梯度:

\frac{\partial E_{3}}{\partial W} =\frac{\partial E_{3}}{\partial \hat{y_{3}}}\frac{\partial \hat{y_{3}}}{\partial s_{3}}\frac{\partial s_{3}}{\partial W}

其循环性体现在最后一步,因为当前隐藏状态对于上一步隐藏状态是一个递归过程(可见上一小节),故上式可以进一步展开得到:

\frac{\partial E_{3}}{\partial W} =\frac{\partial E_{3}}{\partial \hat{y_{3}}}\frac{\partial \hat{y_{3}}}{\partial s_{3}}\frac{\partial s_{3}}{\partial W}+\frac{\partial E_{3}}{\partial \hat{y_{3}}}\frac{\partial \hat{y_{3}}}{\partial s_{3}}\frac{\partial s_{3}}{\partial s_{2}}\frac{\partial s_{2}}{\partial W}+\frac{\partial E_{3}}{\partial \hat{y_{3}}}\frac{\partial \hat{y_{3}}}{\partial s_{3}}\frac{\partial s_{3}}{\partial s_{2}}\frac{\partial s_{2}}{\partial s_{1}}\frac{\partial s_{1}}{\partial W}+...

进行简化得到:

\frac{\partial E_{3}}{\partial W} =\sum_{k=0}^{3}(\frac{\partial E_{3}}{\partial \hat{y_{3}}}\frac{\partial \hat{y_{3}}}{\partial s_{3}})(\prod_{j=k+1}^{3}\frac{\partial s_{j}}{\partial s_{j-1}})\frac{\partial s_{k}}{\partial W}

3. 输入权重 U:

\frac{\partial E}{\partial U} = \sum_{t}^{}\frac{\partial E_{t}}{\partial U}

在测试时,由于只知道最初的输入,所以需要用到上一步的输出来作为下一步的输入。如果中间某一步有预测错误的情况发生,很可能此后的预测都会出现错误。不过如果数据量足够大,模型训练得好,理论上也可能训练出兼容性,即使中间某一步发生了错误,后面依然能预测准确。

2.3 优缺点

RNN 的优点包括可以接受不同长度的输入序列;能够捕捉时序依赖,即通过隐藏状态建模序列中的前后关系;参数共享,同一组参数用于所有时间步,可以适当减少模型复杂度。

RNN 的缺点主要是两方面。一方面,由于在训练长序列时,反向传播过程中梯度可能变得极小或极大,出现梯度消失与梯度爆炸问题,导致模型难以学习长期依赖。这也是标准 RNN 最大的局限。相应的解决办法包括使用其他的激活函数、忽略较远的步骤以及分批次进行梯度计算(靠后的步骤对于第一步的梯度计算贡献可能有限)。另一方面,由于每个时间步依赖前一个状态,无法像 CNN 那样高效并行计算,训练速度较慢,难以并行化。

2.4 变体结构与应用场景

为了解决标准 RNN 的问题,研究者提出了多种改进结构:

首先就是长短期记忆网络(Long Short-Term Memory,LSTM)。它引入了门控机制(遗忘门、输入门、输出门)和细胞状态(Cell State),能有效缓解梯度消失问题,适合处理长序列,广泛应用于机器翻译、语音识别等任务,是使用最广泛的RNN变体网络结构。

然后是门控循环单元(Gated Recurrent Unit,GRU)。它相当于LSTM的简化版本,只有两个门(更新门、重置门),参数更少,训练更快,表达能力相对LSTM稍弱,但在许多任务中性能与其相当。

其次是双向 RNN(Bi-RNN),它包含前向和后向两个 RNN 层,同时利用过去和未来两个状态拼接输出,模型表达能力得到了提升,但实时性变差,常用于命名实体识别、语音识别等需要双向信息的任务。

最后是多层网络,也称深度RNN。它在垂直方向上堆叠多个 RNN 层,每一层的输出作为下一层的输入,同层之间依旧递归,形成一个深层循环结构,这增加了网络的拟合能力。

 RNN 的应用场景包括自然语言处理(语言建模、机器翻译、情感分析、文本生成)、语音处理(语音识别(Speech-to-Text)、语音合成(Text-to-Speech))、时间序列预测(股票价格预测、天气预报、用户行为预测)以及视频分析(动作识别、视频字幕生成)等等。

3 RNN结构代码示例

class SimpleRNN(nn.Module):# input_size代表每个输入向量的维度, hidden_size代表隐藏状态的维度,## num_layers代表RNN层数(大于1,则代表是深层RNN), output_size代表输出维度def __init__(self, input_size=1, hidden_size=50, num_layers=1, output_size=1):super(SimpleRNN, self).__init__()self.hidden_size = hidden_sizeself.num_layers = num_layers# 定义 RNN 层self.rnn = nn.RNN(input_size=input_size,hidden_size=hidden_size,num_layers=num_layers,# 输入形状: (batch, seq, feature)# batch代表一次处理的独立序列数量, seq代表序列长度(每条序列时间步数量), feature代表每个时间步输入的向量维度batch_first=True,nonlinearity='tanh')# 输出层,将最后一个时间步的隐藏状态映射到输出self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):# 输入形状 (batch_size, seq_len, input_size),可与上面对应batch_size = x.size(0)# 初始化隐藏状态为零向量h0 = torch.zeros(self.num_layers, batch_size, self.hidden_size).to(x.device)# 前向传播,隐式执行循环out, hn = self.rnn(x, h0)  # 取最后一个时间步的输出out = self.fc(out[:, -1, :])  return out

若同一批次的序列长度不同,可以先将所有序列填充到一个长度,并对序列原始长度进行记录,然后再使用 pack_padded_sequence和 pad_packed_sequence工具忽略掉填充部分,避免它们影响隐藏状态。

4 总结

本周主要了解了RNN的相关知识,包括学习意义、传播过程以及变体等,并通过代码加深了对RNN网络的理解。下周计划深入学习LSTM(长短期记忆网络)的相关知识。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

借助 LAMBDA 公式,实现单元格区域高效转换

新特性介绍 “转换单元格(Transform)” 功能允许用户将自定义的单参数 LAMBDA 公式应用于选中的单元格区域。用户可选择公式参数的作用域 —— 按单元格、按行、按列或按整个区域。 转换完成后,源单元格区域会被清空,转换后的区…

LeetCode 01背包 494. 目标和

494. 目标和给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums [2, 1] ,可以在 2 之前添加 ‘’ ,在 1 之前…

Dify 1.8.0 全网首发,预告发布

距离Dify 1.7.2过去两周了 Dify 1.8.0 又跟大伙见面了! 1.8.0,属于主版本号不变、但第二位数字更新的“阶段性大更”,意味着功能上的显著优化和体验上的重要升级。 根据官方的Github日志,这一版本将继续聚焦三大核心方向&#x…

基于LangChain框架搭建AI问答系统(附源码)

AI问答系统1. 背景知识2. 问答系统流程3. 知识问答系统相关组件3.1 文档加载器3.2 文档切割器3.3 嵌入模型包装器3.4 向量存储库3.5 模型包装器3.6 链组件4. 问答系统演示4.1 问答程序4.2 演示大模型回答效果5.问答系统代码1. 背景知识 在人工智能技术飞速发展的今天&#xff…

【Python】QT(PySide2、PyQt5):Qt Designer,VS Code使用designer,可能的报错

Qt designer:可直接在designer界面,使用拖拽的方式设计需要的界面,可设定部分属性。安装Pyside2后,designer默认在python安装目录的Lib/sit_packages/PySide2文件夹中。designer使用:① 双击打开designer.exe&#xff…

前端常见安全问题 + 防御方法 + 面试回答

目录 XSS(跨站脚本攻击)CSRF(跨站请求伪造)SQL 注入文件上传漏洞其他前端常见安全问题面试常见问答 1. XSS(跨站脚本攻击) 定义 XSS(Cross-Site Scripting)是一种 通过注入恶意脚…

jxWebUI--下拉选择框

下拉选择框提供了预先定义好的选项,用户只能在这些选项中选择输入。 combobox 定义格式 combobox 控件名 属性列表 ;属性 bind 类型:string 缺省值: 输入控件所绑定的变量名。当给输入控件bind了一个变量名后【bindbind_var_name】&#xff0…

大模型时代:用Redis构建百亿级向量数据库方

大模型时代:用Redis构建百亿级向量数据库方案第一章:大模型时代的向量数据库挑战1.1 大模型时代的特征与需求1.2 向量数据库的核心价值1.3 百亿级向量的技术挑战第二章:Redis作为向量数据库的优势2.1 Redis的核心优势2.2 Redis向量搜索模块&a…

jsqlparser(六):TablesNamesFinder 深度解析与 SQL 格式化实现

在数据库应用开发中,SQL语句的解析和处理是一项常见而重要的任务。本文将深入探讨 JSQLParser 中的 TablesNamesFinder 类,分析其核心原理、与 AST 访问接口(CCJSqlParserVisitor )的关系、使用场景,并通过实际代码示例…

Python训练营打卡Day49-神经网络调参指南

知识点回顾:随机种子内参的初始化神经网络调参指南 参数的分类调参的顺序各部分参数的调整心得 作业:对于day41的简单cnn,看看是否可以借助调参指南进一步提高精度。 随机种子 import torch import torch.nn as nn# 定义简单的线性模型&…

Elasticsearch 常用任务管理命令及实战应用

常用任务管理命令 列出所有任务 curl -X GET "http://<es_host>:<es_port>/_tasks?detailedtrue&pretty" -H Content-Type: application/json获取特定类型的任务 curl -X GET "http://<es_host>:<es_port>/_tasks?actions<act…

Java试题-选择题(26)

Java试题-选择题(26) 题目 下列有关Thread的描述,哪个是正确的 ? A:启动一个线程的方法是:thread. run() B:结束一个线程的通常做法是:thread. stop() C:将一个线程标记成daemon线程,意味着当主线程结束,并且没有其它正在运行的非daemon线程时,该daemon线程也会自…

缓存的原理、引入及设计

开篇寄语&#xff1a;缓存&#xff0c;你真的用对了吗&#xff1f; 我们为什么要学习缓存呢&#xff1f;有必要学习缓存吗&#xff1f; 缓存的使用&#xff0c;是提升系统性能、改善用户体验的唯一解决之道。 其实&#xff0c;作为互联网公司&#xff0c;只要有直接面对用户的业…

单片机如何控制模数转换芯片

一、介绍单片机控制模数转换&#xff08;ADC&#xff09;芯片的核心是通过通信接口发送控制指令&#xff0c;并读取转换后的数字信号&#xff0c;本质是“指令交互数据传输”的协同过程&#xff0c;具体实现需分4步完成&#xff0c;关键在于接口匹配和时序同步。二、核心1. 先明…

【Proteus仿真】开关控制系列仿真——开关控制LED/拨码开关二进制计数/开关和继电器控制灯灭

目录 0案例视频效果展示 0.1例子1&#xff1a;开关控制LED灯亮灭 0.2例子2&#xff1a;数码管显示拨码开关二进制计数(000~255) 0.3例子3&#xff1a;开关和继电器控制灯亮灭 1基础知识补充 1.1 74LS245双总线收发器 1.1.1 引脚及功能 1.1.2应用场景 1.1.3真值表 1.2…

Q1 Top IF 18.7 | 基于泛基因组揭示植物NLR进化

文章DOI: 10.1016/j.chom.2025.07.011 标题&#xff1a;Pangenomic context reveals the extent of intraspecific plant NLR evolution 期刊&#xff1a;Cell Hose & Microbe (https://i-blog.csdnimg.cn/direct/0e31f86b94d348b0a1adb084ec4e49b7.png)(https://i-blog.cs…

技术干货|Prometheus PromQL查询语言之聚合操作内置函数

聚合操作 Prometheus还提供了下列内置的聚合操作符,这些操作符作用域瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。 sum (求和) min (最小值) max (最大值) avg (平均值) stddev (标准差) stdvar (标准差异) count (计数) count_values …

Redis 哨兵(Sentinel)全面解析

在2025年的数字化浪潮中&#xff0c;想象这样一个场景&#xff1a;凌晨3点&#xff0c;电商平台流量突然暴增&#xff0c;主Redis服务器因硬件故障突然宕机。几年前&#xff0c;这意味着紧急电话、慌乱的运维人员和不可避免的业务中断。而今天&#xff0c;用户甚至没有察觉任何…

【数学史冷知识】关于行列式的发展史

学习的途中会遇到一些有意思的东西&#xff0c;我想着做一个专栏《艾萨克纪行简报》&#xff0c;专门写这些知识发展历史。可以让您从繁忙的学习生活中放松&#xff0c;添些耀彩。行列式和微积分一样&#xff0c;都是两个人独立发现的。而且还都有莱布尼茨。1683 年&#xff0c…

【python】python进阶——生成器

目录 一、生成器介绍 1.1 生成器与迭代器的关系 1.2 生成器与return比较 二、创建生成器 方法1: 生成器函数 方法2: 生成器表达式 三、生成器的实际应用场景 3.1 处理大型文件 3.2 生成无限序列 3.3 数据管道处理 四、生成器的高级用法 4.1 使用send()方法传递值 …