循环神经网络 - 参数学习之随时间反向传播算法

本文中,我们以同步的序列到序列模式为例来介绍循环神经网络的参数学习。

循环神经网络中存在一个递归调用的函数 𝑓(⋅),因此其计算参数梯度的方式和前馈神经网络不太相同。在循环神经网络中主要有两种计算梯度的方式:随时间反向传播(BPTT)算法和实时循环学习(RTRL)算法。

本文我们来学习随时间反向传播算法。

BPTT 算法将循环神经网络看作一个展开的多层前馈网络,其中“每一层”对 应循环网络中的“每个时刻”。这样,循环神经网络就可以按照前馈网络中的反向传播算法计算参数梯度。在“展开”的前馈网络中,所有层的参数是共享的,因此参数的真实梯度是所有“展开层”的参数梯度之和。

一、数学推导:

以随机梯度下降为例,给定一个训练样本 (𝒙, 𝒚),其中 𝒙1∶𝑇 =  (𝒙1, ⋯ , 𝒙𝑇 )为长度是𝑇的输入序列,𝑦1∶𝑇 =(𝑦1,⋯,𝑦𝑇)是长度为𝑇的标签序列。即在每个时 刻 𝑡,都有一个监督信息 𝑦𝑡 ,我们定义时刻 𝑡 的损失函数为:

其中 𝑔(𝒉𝑡) 为第 𝑡 时刻的输出,L 为可微分的损失函数,比如交叉熵。那么整个序列的损失函数为:

整个序列的损失函数 L 关于参数 𝑼 的梯度为

即每个时刻损失 L𝑡 对参数 𝑼 的偏导数之和。

基于参数 𝑼 和隐藏层在每个时刻 𝑘(1 ≤ 𝑘 ≤ 𝑡) 的净输入有关,通过数学推导(推导过程比较复杂,这里略过,大家着重掌握公式),可以得出:

计算偏导数

得到整个序列的损失函数 L 关于参数 𝑼 的梯度:

同理可得,L 关于权重 𝑾 和偏置 𝒃 的梯度为:

其中,类似前馈神经网络中的误差项为:

定义以下误差项为第 𝑡 时刻的损失对第 𝑘 时刻隐藏神经层的净输入 𝒛𝑘 的导数,则当 1 ≤ 𝑘 < 𝑡 时

由上可以看出误差项,时刻k的𝛿𝑡,𝑘可以由时刻k+1的𝛿𝑡,𝑘+1得出,即所谓的反向传播。

下图给出了误差项随时间进行反向传播算法的示例:

二、进一步理解随时间反向传播算法BPTT

BPTT 的具体实现核心在于将 RNN 在时间维度上“展开”,从而把整个循环网络视作一个深层的前馈网络,然后利用反向传播算法计算每个时间步的梯度。以下是关键步骤:

(一)前向传播(Forward Pass)

在前向传播阶段,模型从初始隐藏状态开始,按时间顺序依次处理输入序列的每个时间步。在每个时间步 t 中,RNN 会计算出当前隐藏状态 ht:

同时,根据隐藏状态产生输出:

这些中间状态和输出都被存储下来,供之后的反向传播使用。

(二)损失计算

对于整个序列的输出,我们会计算一个总体损失 LL,它通常是所有时间步损失 LtL_t 的求和或平均:

例如,在一个回归或分类任务中,可能使用均方误差交叉熵作为每个时间步的损失。

(三)时间展开(Unrolling)

为了使反向传播适用于循环结构,我们把 RNN 展开成一个由 T 个层组成的前馈网络,每一层对应一个时间步。虽然这些层共享同一组参数,但在展开的过程中,各个时间步之间的依赖关系(主要是隐藏状态 ht)得以显现。

这样做的目的是为了使我们能够用标准的反向传播算法计算梯度,从而更新整个序列中共享的参数。下面通过一个简单的例子说明这一过程。

假设情景

假设我们有一个 RNN 模型,用来处理一个长度为 3 的输入序列 [x1,x2,x3](例如数值 1、2、3),初始隐藏状态 h0​ 设为零。模型的前向计算公式为:

将 RNN 展开成前馈网络

原始的 RNN 是通过循环实现的,即使用同一组参数不断将隐藏状态从前一步传递到下一步。为了直观地理解反向传播的过程,我们将其在时间轴上展开,即把每个时间步看作网络中的一层,这些层之间按照时间顺序相连。

对于我们的序列,有如下展开:

  1. 时间步 1

  2. 时间步 2

  3. 时间步 3

这整个过程就像一个前馈网络,共有 3 层(不包括初始状态),每层的输出 h_t​ 都依赖于前一层的输出 h_{t-1}​ 和当前输入 x_t 。注意,虽然在展开过程中每一层对应一个不同的时间步,但所有层共享同一组权重和偏置。

为什么这样展开?

这种展开方式将时序依赖“展开”到层级结构中,使得整个序列可以看成一个深层网络。这样有两个好处:

  1. 便于反向传播计算
    我们可以像对普通前馈神经网络那样,基于链式法则逐层计算梯度,并且由于参数共享,每层计算的梯度会累积在同一组权重上。

  2. 捕捉长距离依赖
    通过展开,我们能直观地理解误差如何从最后一层传回到第一层,反映长距离依赖问题,以及梯度消失或爆炸的问题。

总结

  • 展开过程:将 RNN 从时间步 1 到 T 展开,每个时间步视为一层前馈网络,所有层使用同一组参数。

  • 前向传播:依次计算每层隐藏状态和输出。

  • 反向传播:从最后一层开始反向传播,逐层累积梯度,更新共享参数。

这种展开不仅使得梯度计算过程清晰,而且方便我们理解如何利用 BPTT 解决时间依赖问题,确保模型能够捕捉序列中长期和短期的信息。

(四)反向传播(Backward Pass Through Time,BPTT)

从展开后的最后一个时间步 T 开始,依次向前计算梯度:

  • 局部梯度计算:在每个时间步,根据当前输出与目标之间的误差,首先计算当前时间步的输出层梯度,然后通过当前隐藏状态对损失的贡献,计算激活函数(如 tanh⁡)的导数。

  • 梯度传递与累积:由于隐藏状态 hth_t 不仅直接影响当前输出,还间接影响后续所有时间步的输出,因而需要将来自未来时间步传回的梯度(往往称为 “dh_next”)与当前时间步的梯度相加,形成一个总的梯度

  • 参数梯度更新:利用链式法则,通过隐藏状态梯度计算出对输入到隐藏权重 Wxh 和隐藏到隐藏权重 Whh 以及偏置的梯度。由于这些参数在每个时间步都是共享的,每一步计算出的梯度都会被累加起来。

  • 时间传递:在完成当前时间步梯度计算后,再将梯度通过 传递回前一个时间步,继续重复这一过程直到第一个时间步。

下面以一个简单的 RNN 模型展开一个长度为 3 的序列的反向传播过程,来详细说明 BPTT 中的四个关键步骤:局部梯度计算、梯度传递与累积、参数梯度更新、和时间传递。假设模型的前向传播计算如下(激活函数采用 tanh):

  • 隐藏状态更新

  • 输出计算

假设我们的损失函数 L 是所有时间步损失的加和:

其中每个时间步的损失 Lt 是模型输出 yt 和目标 (y_t)^{target} 之间的误差(例如均方误差)。

下面分步详细说明 BPTT 的反向传播过程。

1. 局部梯度计算

在反向传播时,我们需要先计算每个时间步在输出端的局部梯度,然后再传回隐藏层。具体来说:

  • 对于时间步 t,我们先计算输出层的梯度:

  • 接着,通过输出层将梯度传递给隐藏状态:

  • 由于隐藏状态经过 tanh⁡ 激活,,其局部梯度部分需乘上激活函数的导数:

    因此,得到当前时间步的局部梯度:

    其中“⊙”表示元素级相乘。

这部分称为“局部梯度计算”,即对当前时刻输出误差先求到隐藏层(通过 Why​),再结合激活函数求出对 zt 的梯度。

2. 梯度传递与累积

由于 RNN 中隐藏状态间存在依赖,当前时刻 ht 不仅受当前时间步损失 Lt 影响,还间接受到后续时间步的反馈。因此,反向传播时需要将未来时间步传回来的梯度累积在当前时刻。设我们计算总的梯度 dht​ 对隐藏状态的偏导,其计算方式为:

即当前时刻的总梯度等于当前局部梯度加上由下一时间步传回来的梯度经过隐藏层的权重传递后的结果。

3. 参数梯度更新

有了每个时间步的梯度 δt​ 和从后续传来的梯度累积 ,我们可以对各层参数求导。具体来说:

  • 对于 输入到隐藏层权重 Wxh​

    其中 ⊗ 表示外积,此处对每个时间步将 δt 与相应的输入 xt 外积,然后累加。

  • 对于 隐藏到隐藏层权重 Whh​

    同样每个时间步累加当前梯度与前一隐藏状态的外积。

  • 对于 隐藏层偏置 bh​

  • 对于 隐藏到输出层权重 Why​,输出层的梯度已经在局部步骤中计算:

    .
  • 对于 输出偏置 by​

这些梯度在反向传播过程中在每个时间步内计算完毕后,通过累加得到整个序列上的梯度,接着就可以用常规优化方法更新参数。

4. 时间传递(从未来到过去)

在反向传播过程中,必须将未来时间步的梯度传递到当前时间步,这就是“时间传递”。具体步骤为:

这种梯度传递过程在整个序列反向迭代中重复执行,从时间步 T 逐层传回到时间步 1。

综合一个详细例子

假设我们有一个时间序列长度为 3 的 RNN,且以时间步 t=3 开始反向传播。简化起见,以下给出各步描述:

  1. 时间步 3

  2. 时间步 2

  3. 时间步 1

总结

  • 局部梯度计算:在每个时间步,根据输出误差乘以输出层权重和激活函数导数,得到对当前隐藏单元输入的梯度(δt​)。

  • 梯度传递与累积:从后向前逐步将未来时刻的梯度通过隐藏层(乘以 和激活导数)传递给前一时间步,累加成当前时刻的总梯度

  • 参数梯度更新:利用每个时间步局部梯度与输入(或前一时刻隐藏状态)的外积,累积得到 Wxh​、Whh​ 和 bh​ 的梯度;输出层参数的梯度也由对应输出误差累积。

  • 时间传递:通过计算隐藏状态之间的依赖(即 ​​),将梯度从后续传递给当前,直至序列首端。

这种详细步骤体现了 BPTT 如何让 RNN 捕捉序列中长距离依赖,以及如何利用链式求导从序列的末端逐步将梯度传回并更新共享参数。

(五)参数更新

在累积了整个序列上各时间步的梯度后,使用如梯度下降、Adam 等优化算法对共享参数进行更新,从而使整体损失下降,模型逐步学会捕捉时序依赖关系。

总体来说,BPTT 的实现流程可总结为:

  • 先在时间上前向传播:依次计算每个时间步的隐藏状态和输出,并存储中间结果。

  • 计算整个序列的总损失:对每一时间步的输出和目标计算损失。

  • 从后向前反向传播:将误差信息沿时间展开的网络逐层反向传递,每一步既考虑当前的局部误差,也考虑来自未来时间步的反馈,累积梯度。

  • 更新共享参数:利用累积的梯度,通过优化算法更新各个权重和偏置。

这一过程确保了即使序列较长,模型也能捕捉到早期输入对后续输出的影响,从而在学习长距离依赖关系方面发挥关键作用。

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

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

相关文章

体验OceanBase的 并行导入功能

在数据库的日常使用中&#xff0c;会经常遇到以下场景&#xff1a; ‌数据复制‌&#xff1a;将一个或多个表中的数据复制到目标表中&#xff0c;可能是复制全部数据&#xff0c;也可能仅复制部分数据。数据合并&#xff1a;将数据从一个表转移到另一个表&#xff0c;或者将多…

Kafka和RocketMQ相比有什么区别?那个更好用?

Kafka和RocketMQ相比有什么区别?那个更好用? Kafka 和 RocketMQ 都是广泛使用的消息队列系统&#xff0c;它们有很多相似之处&#xff0c;但也有一些关键的区别。具体选择哪个更好用&#xff0c;要根据你的应用场景和需求来决定。以下是它们之间的主要区别&#xff1a; 1. …

UniApp 实现兼容 H5 和小程序的拖拽排序组件

如何使用 UniApp 实现一个兼容 H5 和小程序的 九宫格拖拽排序组件&#xff0c;实现思路和关键步骤。 一、实现目标 支持拖动菜单项改变顺序拖拽过程实时预览移动位置拖拽松开后自动吸附回网格兼容 H5 和小程序平台 二、功能结构拆解以及完整代码 完整代码&#xff1a; <…

[raspberrypi 0w and respeaker 2mic]实时音频波形

0. 环境 ubuntu22主机&#xff0c; 192.168.8.162&#xff0c; raspberry 0w&#xff0c; 192.168.8.220 路由器 1. 树莓派 # rpi - send.py # 或者命令行&#xff1a;arecord -D plughw:1,0 -t wav -f cd -r 16000 -c 2 | nc 192.168.8.162 12345import socket imp…

公司内部建立apt源

有一篇建立pypi源的在这里需要的可以查看&#xff1a;公司内部建立pypi源-CSDN博客 背景&#xff0c;公司内部有很多工具仅供内部使用&#xff0c;如果用apt的方式就比较方便&#xff0c;只需要修改sources.list将源添加进去就可以了。我们接下来的操作就是为了实现这个需求。…

UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题

【[metablriger] UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题】 UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题

AWS Bedrock生成视频详解:AI视频创作新时代已来临

💡 TL;DR: AWS Bedrock现已支持AI视频生成功能,让企业无需深厚AI专业知识即可创建高质量视频内容。本文详解Bedrock视频生成能力的工作原理、应用场景和实操指南,助你快速掌握这一革命性技术。 🎬 AWS Bedrock视频生成:改变内容创作的游戏规则 还记得几年前,制作一个专…

1.2 测试设计阶段:打造高质量的测试用例

测试设计阶段&#xff1a;打造高质量的测试用例 摘要 本文详细介绍了软件测试流程中的测试设计阶段&#xff0c;包括测试用例设计、测试数据准备、测试环境搭建和测试方案设计等内容。通过本文&#xff0c;读者可以系统性地了解测试设计的方法和技巧&#xff0c;掌握如何高效…

jQueryHTML与插件

1.jQuery 事件机制 1.1 注册事件 bind()、on()方法向被选元素添加一个或多个事件处理程序&#xff0c;以及当事件发生时运行的函数 $("p").on({"click": function () {alert("点击了")},"mouseenter": function () {…

MySQL 触发器与存储过程:数据库的自动化工厂

在数据世界的工业区&#xff0c;有一座运转高效的自动化工厂&#xff0c;那里的机器人日夜不停地处理数据…这就是 MySQL 的触发器与存储过程系统&#xff0c;它让数据库从"手工作坊"变成了"现代化工厂"… 什么是 MySQL 触发器与存储过程&#xff1f;&…

PostgreSQL-中文字段排序-修改字段的排序规则

最新版本更新 https://code.jiangjiesheng.cn/article/365?fromcsdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 -- 修改字段的排序规则 ALTER TABLE "public"."your_table_name" ALTER COLUMN "name" TYPE varcha…

GitHub优秀项目:数据湖的管理系统LakeFS

lakeFS 是一个开源工具&#xff0c;它将用户的对象存储转换为类似Git的存储库。使用户可以像管理代码一样管理数据湖。借助 lakeFS&#xff0c;可以构建可重复、原子化和版本化的数据湖操作--从复杂的ETL作业到数据科学和分析。 Stars 数11090Forks 数3157 主要特点 强大的数据…

页面编辑器CodeMirror初始化不显示行号或文本内容

延迟刷新 本来想延迟100毫秒的&#xff0c;但是会出现样式向左偏移的情况&#xff0c;于是试了试500毫秒&#xff0c;发现就没有问题了&#xff0c;可能是样式什么是需要一个加载过程吧。 useEffect(() > {editorRef.current?.setValue(value || );setTimeout(() > {edi…

使用 Spring Boot 和 Uniapp 搭建 NFC 读取系统

目录 一、NFC 技术原理大揭秘1.1 NFC 简介1.2 NFC 工作原理1.3 NFC 应用场景 二、Spring Boot 开发环境搭建2.1 创建 Spring Boot 项目2.2 项目基本配置 三、Spring Boot 读取 NFC 数据3.1 NFC 设备连接与初始化3.2 数据读取逻辑实现3.3 数据处理与存储 四、Uniapp 前端界面开发…

台式电脑插入耳机没有声音或麦克风不管用

目录 一、如何确定插孔对应功能1.常见音频插孔颜色及功能2.如何确认电脑插孔?3.常见问题二、 解决方案1. 检查耳机连接和设备选择2. 检查音量设置和静音状态3. 更新或重新安装声卡驱动4. 检查默认音频格式5. 禁用音频增强功能6. 排查硬件问题7. 检查系统服务8. BIOS设置(可选…

Gerrit的安装与使用说明(Ubuntu)

#本页面按192.168.60.148服务器举例进行安装配置 1.权限配置 ## 使用root或者有sudo权限用户执行 # 创建gerrit用户 sudo useradd gerrit # 设置gerrit用户的密码 sudo passwd gerrit # 增加sudo权限 sudo visudo 在root ALL(ALL:ALL) ALL行下添加如下内容 gerrit ALL(ALL:…

Visual Studio 2019 配置VTK9.3.1

文章目录 参考博客1、 VTK下载和编译2、vs2019配置vtk9.3.1参考博客 Visual Studio 2022 配置VTK9.3.0 1、 VTK下载和编译 见博客 CMake编译VTK 2、vs2019配置vtk9.3.1 新建一个项目 写入以下代码 #include <vtkActor.h> #include <vtkAssembly.h> #include…

C++进阶——C++11_右值引用和移动语义_可变参数模板_类的新功能

目录 1、右值引用和移动语义 1.1 左值和右值 1.2 左值引用和右值引用 1.3 引用延长生命周期 1.4 左值和右值的参数匹配 1.5 右值引用和移动语义的使用场景 1.5.1 左值引用主要使用场景 1.5.2 移动构造和移动赋值 1.5.3 右值引用和移动语义解决传值返回问题 1.5.4 右值…

HTTP协议原理深度解析:从基础到实践

引言 在互联网技术体系中,HTTP(HyperText Transfer Protocol)协议如同数字世界的"通用语言",支撑着全球超50亿网民的日常网络交互。作为爬虫开发、Web应用构建的核心技术基础,理解HTTP原理是每个开发者必须掌握的技能。本文将从协议本质、技术演进、安全机制三…

Web品质 - 重要的HTML元素

Web品质 - 重要的HTML元素 在构建一个优秀的Web页面时,HTML元素的选择和运用至关重要。这些元素不仅影响页面的结构,还直接关系到页面的可用性、可访问性和SEO表现。本文将深入探讨一些关键的HTML元素,并解释它们在提升Web品质方面的重要性。 1. <html> 根元素 HTM…