循环神经网络 - 简单循环网络
本文我们来学习和了解简单循环网络(Simple Recurrent Network,SRN), SRN是一个非常简单的循环神经网络,只有一个隐藏层的神经网络。
简单循环神经网络,也常称为 Elman 网络,是最基本的循环神经网络(RNN)架构。它通过在隐藏层中引入循环连接,使网络能够处理序列数据,并记忆之前的输入信息。
1. 基本构成
SRN 通常包含三个主要部分:
-
输入层:接收当前时间步的输入 x(t)。
-
隐藏层:这是 SRN 的核心,负责处理当前输入和之前时刻的记忆。隐藏层不仅接收当前输入,还接收来自上一时刻隐藏层状态 h(t−1) 的信息。
-
输出层:根据隐藏层的状态生成当前的输出 y(t)。
这里需要特别注意下,简单循环神经网络(SRN)通常被描述为由以上三个主要部分构成,但并不是只有三层。但需要注意的是,隐藏层的循环连接使得它在时间维度上展开时,相当于多个层次的堆叠。也就是说,当我们对时间序列进行“展开”(Unrolling)时,每个时间步都有一个隐藏层实例,所以在时间展开的过程中实际上会有很多层共享同一组参数。
总结:
-
从模型架构角度看,SRN 通常有输入层、隐藏层(循环层)和输出层这三部分。
-
从时间展开角度看,隐藏层在每个时间步都被复制,从而形成了一个深层网络。因此,简单循环神经网络的基本结构可以看作是“三层”,但它的隐藏层是通过循环连接在时间上不断重复的。
这种设计既保持了结构的简单性,又能够捕捉序列中的时间依赖性。
也即是说,虽然在 SRN 的设计中,我们只定义了一个隐藏层,但由于它在每个时间步都会接收当前输入和上一个时间步的隐藏状态,所以在实际计算时,我们将整个时间序列“展开”成一个类似深层网络的结构。具体来说:
-
时间展开(Unrolling):
当我们处理一个序列时,比如有 T 个时间步,循环神经网络的隐藏层在每个时间步都参与计算。但这些计算都是基于相同的参数。为了便于理解和反向传播(BPTT),我们将网络在时间上“展开”,把每个时间步看作一个独立的层。这样,一个包含 T 个时间步的 RNN就像是一个深度为 T 的网络,每一层都对应同一个隐藏层在不同时间步的计算。 -
共享参数:
虽然展开后网络看起来有 T 层,但所有这些“层”共享同一组权重。这意味着每个时间步都在用同样的方式处理数据,但由于输入和状态的不同,最终计算结果不同。 -
深层网络的意义:
展开后的结构使得 RNN 能够捕捉长距离的依赖关系,就像一个深层网络可以通过多层抽象获得复杂特征一样,展开后的 RNN 通过多层时间递归捕捉序列的动态变化。
举个例子:假设有一个长度为 5 的时间序列,展开后 RNN 的隐藏层就相当于 5 层深的网络,每一层都接收前一层的隐藏状态,并结合当前输入更新状态。这种深层结构有助于梯度在时间上逐步传递,尽管也会带来梯度消失或爆炸的问题,但这正是后来 LSTM、GRU 等改进模型出现的原因。
由此可见,SRN 中的隐藏层具有循环连接,这使得网络具有“记忆”功能,即能够将过去的信息传递给未来的时间步。
2. 工作原理
在 SRN 中,隐藏层状态的更新通常通过下面的公式实现:

其中:
-
x(t) 为当前输入,
-
h(t−1) 为前一时刻的隐藏状态,
-
Wxh 为输入到隐藏层的权重矩阵,
-
Whh 为隐藏层的递归权重矩阵,
-
bh 为隐藏层的偏置,
-
f(⋅) 是非线性激活函数(例如 tanh 或 ReLU)。
输出层通常根据隐藏层状态计算输出:

其中 Why 和 by 分别是输出层的权重和偏置,g(⋅) 是适用于输出任务的激活函数(例如 softmax 用于分类)。
我们现在来理解一下上面标红的那句话:此外,SRN 中的隐藏层具有循环连接,这使得网络具有“记忆”功能,即能够将过去的信息传递给未来的时间步。
这句话的核心意思是:SRN 的隐藏层不仅处理当前的输入,还通过循环连接将前一时刻的“记忆”或状态传递到当前时刻,使得网络在处理当前信息时能够参考过去的信息。具体来说:
-
循环连接:在 SRN 中,隐藏层的输出 h(t) 不仅依赖于当前输入 x(t),还依赖于上一时间步的隐藏状态 h(t−1)。
-
记忆功能:由于每个时间步都会传递上一时刻的隐藏状态,网络就能“记住”之前的信息。也就是说,当前的输出不仅反映当前输入的信息,还包含了历史信息。这对于处理序列数据(如语音、文本、时间序列)非常重要,因为当前的状态往往受之前状态的影响。
-
类比说明:可以把它比作人类的记忆。当你在阅读一篇文章时,你的理解不仅取决于当前阅读的句子,还受之前内容的影响。SRN 的隐藏层正是起到类似作用,将之前的“记忆”与当前的信息结合,做出更合理的判断。
因此,SRN 中的循环连接使得网络能够跨时间步传递信息,形成一种内部的记忆机制,从而更好地处理具有时序依赖性的任务。
3. 直观理解
-
记忆机制:
SRN 的关键在于隐藏层的循环连接。可以将它想象为一个“记忆容器”,在每个时间步都会更新,但同时保留了一部分过去的信息。这样,当处理一个序列时,当前的预测不仅基于当前输入,还受之前输入的影响。 -
时间动态:
例如,在处理语音或文本序列时,SRN 能够捕捉上下文信息,理解前后文关系,从而更准确地进行预测或分类。 -
简单结构:
SRN 的结构简单,只有一个循环隐藏层。虽然这种网络容易训练,但也存在梯度消失的问题,导致对长序列的依赖捕捉较弱。这也是后来发展 LSTM、GRU 等更复杂循环模型的原因。
4. 举例说明
假设我们用 SRN 来预测一个简单的时间序列,例如预测下一个数字。
序列示例:
假设输入序列为:[1,2,3,4,5],目标是预测下一个数(例如 6)。
操作步骤:
-
初始化:设定隐藏状态 h(0)=0(或随机初始化)。
-
时间步 t=1:

-
时间步 t=2:

-
时间步 t=3:

-
时间步 t=4:

-
时间步 t=5:

-
输出预测:

经过适当的缩放或后续层的调整,可以将预测值映射到目标数值(例如预测 6)。实际中,模型会通过训练学习合适的参数,使预测值准确。
-
为什么根据 y(5)=h(5)≈0.989,可以推测出下一个值是6呢?
我们假设输出 y(t) 与隐藏状态 h(t) 直接相等(即采用线性映射),所以 y(5)=h(5)≈0.989。然而,在实际应用中,预测目标(例如预测下一个值为6)通常与模型内部的数值尺度不同,这就需要额外的输出层来对隐藏状态进行“缩放”或“映射”。具体解释如下:
-
数值尺度不匹配
在我们的示例中,为了简单起见,我们直接用 h(t) 作为输出,但在真实任务中,输入数据、隐状态和目标值往往处于不同的数值范围。例如,输入序列可能已经经过归一化,而目标值可能处于实际数值范围内。模型需要学习一个从隐藏状态到目标输出的映射函数,这通常通过一个全连接层(线性变换)来实现。
-
输出层映射
实际上,一个完整的 RNN 模型通常会在隐藏层之后添加一个输出层,用来将隐藏状态 h(t) 经过线性变换映射到预测值 y(t)。输出层的形式一般是:
其中 Why 和 by 是输出层的权重和偏置。在训练过程中,这个层会自动调整,使得模型输出接近真实目标。例如,如果真实目标值是6,而隐藏状态大约是0.989,输出层会学习一个大约为6.06的缩放因子(以及相应的偏置调整),从而使得 y(t)≈6。
-
训练过程的作用
在训练过程中,通过最小化损失函数(比如均方误差),模型会同时调整 RNN 的参数和输出层的参数。这样,虽然隐藏状态 h(5)可能在0到1左右,但输出层会学到如何将这个数值映射到正确的预测范围。
-
结论:
-
示例中 y(5)=h(5)≈0.989 只是一个简化假设,用于演示 SRN 隐状态的更新过程。
-
实际上,为了预测出目标数值(例如6),需要一个额外的输出层对隐藏状态进行缩放和偏置调整。
-
这种映射过程是在训练过程中自动学习得到的,确保最终预测值和实际目标在相同的尺度上。
-
因此,从 0.989 直接推断下一个值是6,是通过训练中学到的输出层映射来实现的,而不是简单的数值相等。
这个简单例子说明了 SRN 如何通过不断更新隐藏状态来“记住”序列中的信息,并利用这些信息进行预测。
5. 总结
-
结构:SRN 包含输入、循环隐藏和输出层,其中隐藏层通过递归连接捕捉时间序列中的依赖关系。
-
工作原理:每个时间步,隐藏状态 h(t) 同时受当前输入 x(t) 和前一时刻隐藏状态 h(t−1) 的影响,使得网络能够综合历史信息进行预测。
-
优势与局限:SRN 结构简单,易于实现,但在处理长序列时可能出现梯度消失问题,因此实际应用中往往需要更复杂的 RNN 变体(如 LSTM 或 GRU)。
如果我们把每个时刻的状态都看作前馈神经网络的一层,循环神经网络可以看作在时间维度上权值共享的神经网络,下图给出了按时间展开的循环神经网络:

相关文章:
循环神经网络 - 简单循环网络
本文我们来学习和了解简单循环网络(Simple Recurrent Network,SRN), SRN是一个非常简单的循环神经网络,只有一个隐藏层的神经网络。 简单循环神经网络,也常称为 Elman 网络,是最基本的循环神经网络(RNN&am…...
Linux 企业项目服务器组建(附脚本)
一、架构概述 本方案旨在为企业搭建一套高效、安全的 Linux 服务器架构,包含一台 DNS 服务器,以及一台同时承载 FTP 和 Samba 服务的服务器,满足公司在域名解析、图片存储与共享、文件共享等方面的业务需求。 二、服务器部署 DNS 服…...
Linux 2021韩顺平网课笔记:shell编程
基本介绍 Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 Shell脚本的执行方式 格式要求 脚本以 #!bin/bash 开头,表明以bashell…...
软考 中级软件设计师 考点知识点笔记总结 day09 操作系统进程管理
文章目录 4、操作系统基本原理4.1 、进程管理**4.1.1 、进程同步机制****4.1.2 、进程互斥机制****4.1.3 、信号量机制****4.1.4 、PV操作实现前驱操作****4.1.5 、死锁**4.1.6 、银行家算法 4、操作系统基本原理 进程管理 存储管理 文件管理 设备管理 微内核操作系统 操作系…...
大模型和AIGC同质化浪潮下的信息困局与破局之道,面向未来的认知革命
欢迎来到涛涛聊AI。看到网上太多雷同的内容有感后,让AI批判下AI。 一、技术趋同引发的信息生态危机 当前互联网正被海量AI生成内容淹没,这种现象的根源在于技术底层的高度同质化。全球主流大模型90%以上基于相同算法架构开发,采用近似的训练…...
⼆、Kafka客户端消息流转流程
这⼀章节将重点介绍Kafka的HighLevel API使⽤,并通过这些API,构建起Kafka整个消息发送以及消费的主线流程。 Kafka提供了两套客户端API,HighLevel API和LowLevel API。 HighLevel API封装了kafka的运⾏细节,使⽤起来⽐较简单&…...
es 3期 第28节-深入掌握集群组建与集群设置
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...
如何在 SwiftUI 视图中使用分页(Paging)机制显示 SwiftData 数据(三)
概述 小伙伴们都知道,自从有了 SwiftData 的加持,现在 SwiftUI 可以非常惬意的利用描述型命令创建以数据驱动为本的视图了。这在测试或演示小项目中工作的完美无缺,不过真实世界要“残酷”的多。 实际情况是,我们无法一次性将海量数据统统拉入内存以便在 SwiftUI 中显示,…...
git和VScode
游戏存档保存的是游戏的进度 git保存的是代码的进度 Vscode和git 要正常的使用git首先要设置姓名和邮箱 要配合gitee(也可以是其他平台,以gitee举例)使用,首先创造一个gitee账号,复制邮箱和用户名 在VScode中找到…...
Linux Vim 编辑器的使用
Vim 编辑器的使用 一、安装及介绍二、基础操作三、高级功能四、配置与插件 一、安装及介绍 Vim是一款强大且高度可定制的文本编辑器,相当于 Windows 中的记事本。具备命令、插入、底行等多种模式。它可通过简单的键盘命令实现高效的文本编辑、查找替换、分屏操作等…...
NLP语言模型训练里的特殊向量
1. CLS 向量和 DEC 向量的区别及训练方式 (1) CLS 向量与 DEC 向量是否都是特殊 token? CLS 向量([CLS] token)和 DEC 向量(Decoder Input token)都是特殊的 token,但它们出现在不同类型的 NLP 模型中&am…...
利用Canvas在紫微斗数命盘上画出三方四正
许多紫微斗数排盘程序都会在命盘上画出三方四正的指示线,便于观察命盘。本文用Canvas在一个模拟命盘上画出三方四正指示线。 模拟命盘并画出“子”宫三方四正的HTML文件如下: <!doctype html> <html lang"en"> <head><…...
传统汽车 HMI 设计 VS 新能源汽车 HMI 设计,有何不同?
一、设计理念与目标的差异 传统汽车HMI设计的核心目标是辅助驾驶,强调功能的简洁性和操作的便捷性。其设计侧重于提供基础的车辆信息(如车速、转速、油量等),并确保驾驶员在操作时能够快速获取关键信息。相比之下,新能…...
【JavaWeb】前端基础
JavaWeb 前端三大件:HTML(主要用于网页主体结构的搭建),CSS(页面美化),JavaScript(主要用于页面元素的动态代理) 1. HTML 1.1 html概述 HTML:Hyper Text …...
SpringMVC组件解析
SpringMVC的执行流程 ① 用户发送请求至前端控制器DispatcherServlet。 ② DispatcherServlet收到请求调用HandlerMapping处理器映射器 ③ 处理器映射器找到具体的处理器(可以根据xm|配置、注解进行査找),生成处理器对象及处理器 拦截器(如果有则生成)一…...
使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例
1. 使用 Provider 实现局部刷新 示例 1:ChangeNotifier Consumer 通过 ChangeNotifier 和 Consumer 实现局部刷新。 import package:flutter/material.dart; import package:provider/provider.dart;void main() {runApp(ChangeNotifierProvider(create: (_) &g…...
数据结构C语言练习(两个栈实现队列)
一、引言 在数据结构的学习中,我们经常会遇到一些有趣的问题,比如如何用一种数据结构去实现另一种数据结构的功能。本文将深入探讨 “用栈实现队列” 这一经典问题,详细解析解题思路、代码实现以及每个函数的作用,帮助读者更好地…...
Java 基础-28- 多态 — 多态下的类型转换问题
在 Java 中,多态(Polymorphism)是面向对象编程的核心概念之一。多态允许不同类型的对象通过相同的方法接口进行操作,而实际调用的行为取决于对象的实际类型。虽然多态提供了极大的灵活性,但在多态的使用过程中…...
nextjs使用02
并行路由 同一个页面,放多个路由,, 目录前面加,layout中可以当作插槽引入 import React from "react";function layout({children,notifications,user}:{children:React.ReactNode,notifications:React.ReactNode,user:React.Re…...
第2.6节 iOS生成全量和增量报告
2.6.1 简介 在采集了覆盖率数据后,就需要生成对应需求的全量和增量覆盖率报告,以便对测试进行查漏补缺。IOS系统有两种开发语言,所以生成报告的方式也不相同,下面就分别介绍一下Object C和Swift语言如何生成覆盖率报告。 2.6.2 O…...
应用分享 | AWG技术突破:操控钻石氮空位色心,开启量子计算新篇章!
利用AWG操作钻石中的氮空位色彩中心 金刚石中的颜色中心是晶格中的缺陷,其中碳原子被不同种类的原子取代,而相邻的晶格位点则是空的。由于色心具有明亮的单光子发射和光学可触及的自旋,因此有望成为未来量子信息处理和量子网络的固态量子发射…...
前端开发学习路线完整指南
前端开发学习路线完整指南 前端开发是一个不断发展的领域,涉及多个技术栈。本文将为你提供一条系统的前端学习路线,帮助你从零基础到熟练掌握前端开发技能。 1. 前置知识 在学习前端之前,了解一些基础知识会对你的学习过程有很大帮助。 计…...
linux服务器专题2------vim编辑器如何设置显示行号
在 Vim 编辑器中,可以通过以下步骤来显示行号: 临时显示行号 打开 Vim 编辑器,输入如下命令: :set number这将临时启用行号显示。关闭 Vim 后,行号设置将丢失。 永久显示行号 如果希望在每次启动 Vim 时都显示行号…...
Jmeter触发脚本备份
JMeter 在以下情况会触发脚本备份: 手动保存测试计划时:如果测试计划有未保存的修改,当用户手动保存测试计划(脚本)时,JMeter 都会自动将当前脚本备份到${JMETER_HOME}/backups文件夹下。 关闭 JMeter 时…...
【视觉与语言模型参数解耦】为什么?方案?
一些无编码器的MLLMs统一架构如Fuyu,直接在LLM内处理原始像素,消除了对外部视觉模型的依赖。但是面临视觉与语言模态冲突的挑战,导致训练不稳定和灾难性遗忘等问题。解决方案则是通过参数解耦方法解决模态冲突。 在多模态大语言模型…...
重建二叉树(C++)
目录 1 问题描述 1.1 示例1 1.2 示例2 1.3 示例3 2 解题思路 3 代码实现 4 代码解析 4.1 初始化 4.2 递归部分 4.3 主逻辑 5 总结 1 问题描述 给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。 例如输入前序遍历序…...
VLAN、QinQ、VXLAN的区别
1、技术本质与封装方式 技术OSI层级封装原理标识位长度拓展性VLAN数据链路层L2在以太网帧头插入802.1Q Tag(单层VLAN标签)12位(4094个)有限,仅支持单一网络域内隔离QinQ数据链路层L2在原始VLAN标签外再封装一层802.1Q…...
保姆级教程:synchronized 同步方法 vs 同步代码块,看完彻底懂锁!
一、同步方法(锁住整个方法) 1. 代码示例 public class Counter {private int count 0;// 同步方法:锁住整个方法public synchronized void add() {count;}// 同步方法:锁住整个方法public synchronized void subtract() {coun…...
10乱码问题的解释(1)
在计算机中,一个汉字,占几个字节? 针对这个问题,只要你回答出一个具体的数字,就一定是错的!! 前提条件: 当前中文编码使用的是哪种方式(字符集) 计算机存的其实是二进制数字~~ 英文字母,怎么表示的?? ASCII 码表~~ 规定了每个字符,都有一个对应的数字来表示~~ 只是表示英文,…...
短视频文案--钓鱼女和滑板女
短视频文案 第一个文案: 1标题:风萧萧兮易水寒,美女钓鱼兮不复还 2内容: 我站在池边的微风中,再也看不到曾经快乐的少女了。 风很凉,凉得心不知前往何处。 水很清,清得深知这里没鱼群。 芦苇…...
