当前位置: 首页 > article >正文

【循环神经网络】RNN介绍

在人工神经网络中,”浅层网络”是指具有一个输入层、一个输出层和最多一个没有循环连接的隐藏层的网络。随着层数的增加,网络的复杂性也在增加。更多的层或循环连接通常会增加网络的深度,并使其能够提供不同级别的数据表示和特征提取,称为“深度学习”。循环神经网络(Recurrent Neural Network, RNN)是一类有监督的机器学习模型,由具有一个或多个反馈回路的人工神经元组成,反馈回路使得网络具备记忆能力,可以存储一部分之前的信息,适用构建时间序列分析、文本情感分析等模型。本文主要阐述简单人工神经网络存在的局限,并介绍 RNN 的基本结构。

一、ANN 存在的局限

        在人工神经网络中,”浅层网络”是指具有一个输入层、一个输出层和最多一个没有循环连接的隐藏层的网络。随着层数的增加,网络的复杂性也在增加。更多的层或循环连接通常会增加网络的深度,并使其能够提供不同级别的数据表示和特征提取,称为“深度学习”。

        然而对于输入或输出是序列的问题, ANN 存在着如下局限:

1)输入、输出是固定长度,无法适应可变长度的问题,例如文本生成;

2)不是共享权重,无法共享不同位置的特征,且随着网络深度的增加,训练难度也随之增大。

二、RNN 的基本结构

        循环神经网络(Recurrent Neural Network, RNN)是一类有监督的机器学习模型,由具有一个或多个反馈回路的人工神经元组成。反馈回路是随时间或序列的循环(在 RNN 中称之为时间)。

        在单层感知器中,神经元需要完成两个阶段的计算,分别为对输入进行线性组合,以及非线性激活。激活函数通常为 sigmoid、ReLU 等函数。单层感知器网络任意时刻的输出,仅取决于当前时刻的输入,与时间无关。

        假设网络的初始输出为 0,将网络上个时刻的输出连接到输入端,就得到带反馈回路的神经网络。网络不同时刻的输入、线性组合与激活值使用下标进行区分。

        在循环神经网络中,通常使用 h_t 表示网络状态(h 代表 hidden layer)。让网络上个时刻的激活值 a_{t-1} 作为网络当前的状态 h_t,并输出网络当前的状态值,就得到了最简单的 RNN 网络。可以看到,RNN 任意时刻的输出,不仅取决于当前输入,还跟网络当前的状态有关。

        对于多维情况,输入、隐藏与输出层神经元的数量不再为 1,假设输入层包含 N 个单元,隐藏层包含 M 个单元,输出层包含 P 个单元,网络的输入、状态和输出分别记为

\mathbf{x}_t = (x_1, x_2, \cdots , x_N)

\mathbf{h}_t = (h_1, h_2, \cdots , h_M)

\mathbf{y}_t = (y_1, y_2, \cdots , y_P)

在时间上展开网络,得到如下图结构:

图中  \mathbf{W}_{IH}\mathbf{W}_{HH}\mathbf{W}_{HO} 分别为输入层到隐藏层、隐藏层到隐藏层、隐藏层到输出层的权重。

网络模型为

\mathbf{h}_t = \sigma _H(\mathbf{W}_{IH} \mathbf{x}_t + \mathbf{W}_{HH} \mathbf{h}_{t-1} + \mathbf{b}_H)

\mathbf{y}_t = \sigma_O (\mathbf{W}_{HO} \mathbf{h}_t + \mathbf{b}_o)

三、RNN 的训练

        以监督方式训练 RNN 需要输入和目标值成对的训练数据集。训练的目标是通过优化网络的权重来最小化输出和目标值之间的差异。

        损失函数用于评估网络的性能,将输出与预期的目标进行比较,损失函数在所有的时间步上进行累加,

L(\mathbf{y}, \mathbf{\hat{y}}) = \sum_{t=1}^{T} L_t( \mathbf{y}_t, \mathbf{\hat{y}}_t)

        RNN 训练的难点在于正确初始化网络中的权重,并使用优化算法对其进行调整,以尽量减少训练损失。网络参数之间的关系和隐藏状态随时间的动态变化会导致不稳定。通常算法需要大量的迭代来训练模型。


http://www.kler.cn/a/461265.html

相关文章:

  • zookeeper+kafka
  • 【从零开始入门unity游戏开发之——unity篇05】unity6基础入门——运行游戏按钮、Game游戏窗口和Project项目窗口介绍
  • 简单使用linux
  • vue中的设计模式
  • 深入浅出:Spring Boot 自定义消息转换器的实现与应用
  • ThinkPHP 8高效构建Web应用-控制器
  • Linux命令复习
  • 逆袭之路(11)——python网络爬虫:原理、应用、风险与应对策略
  • Jupyter占用内存高问题排查解决
  • c#接口和抽象方法
  • 2025.01.15python商业数据分析
  • 从AI远见到中国速度:Scaling Law发现者为何引全球热议?
  • windows系统安装完Anaconda之后怎么激活自己的虚拟环境并打开jupyter
  • 区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】
  • 鸿蒙开发:自定义一个车牌字母键盘
  • 混合并行训练框架性能对比
  • 未来20年在大语言模型相关研究方向--大语言模型的优化与改进
  • C语言优化技巧--达夫设备(Duff‘s Device)解析
  • 鸿蒙服务卡片
  • 反射工具类ReflectUtil
  • 最近的一些事情
  • 基础算法--滑动窗口
  • 深入理解MVCC:快照读与当前读的原理及实践
  • LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作
  • Docker容器日志查看与清理的方法
  • es使用简单语法案例