《动手学深度学习 Pytorch版》 8.7 通过时间反向传播
8.7.1 循环神经网络的梯度分析
本节主要探讨梯度相关问题,因此对模型及其表达式进行了简化,进行如下表示:
h t = f ( x t , h t − 1 , w h ) o t = g ( h t , w o ) \begin{align} h_t&=f(x_t,h_{t-1},w_h)\\ o_t&=g(h_t,w_o) \end{align} htot=f(xt,ht−1,wh)=g(ht,wo)
参数字典:
-
t t t 表示时间步
-
h t h_t ht 表示时间步 t t t 的隐状态
-
x t x_t xt 表示输入
-
o t o_t ot 表示输出
-
w h w_h wh 表示隐藏层权重
-
w o w_o wo 表示输出层权重
-
f f f 表示隐藏层变换
-
g g g 表示输出层权重
前向传播相当简单,一次一个时间步的遍历三元组 ( x t , h t , o t ) (x_t,h_t,o_t) (xt,ht,ot),然后通过一个目标函数在所有 T T T 个时间步内评估输出 o t o_t ot 和对应的标签 y t y_t yt 之间的差异:
L ( x 1 , … , x T , y 1 , … , y T , w h , w o ) = 1 T ∑ t = 1 T l ( y t , o t ) L(x_1,\dots,x_T,y_1,\dots,y_T,w_h,w_o)=\frac{1}{T}\sum^T_{t=1}l(y_t,o_t) L(x1,…,xT,y1,…,yT,wh,wo)=T1t=1∑Tl(yt,ot)
对于反向传播,就很棘手了,特别是计算目标函数 L L L 关于参数 w h w_h wh 的梯度时,按照链式法则:
∂ L ∂ w h = 1 T ∑ t = 1 T ∂ l ( y t , o t ) ∂ w h = 1 T ∑ t = 1 T ∂ l ( y t , o t ) ∂ o t ∂ g ( h t , w o ) ∂ h t ∂ h t ∂ w h \begin{align} \frac{\partial L}{\partial w_h}&=\frac{1}{T}\sum^T_{t=1}\frac{\partial l(y_t,o_t)}{\partial w_h}\\ &=\frac{1}{T}\sum^T_{t=1}\frac{\partial l(y_t,o_t)}{\partial o_t}\frac{\partial g(h_t,w_o)}{\partial h_t}\frac{\partial h_t}{\partial w_h} \end{align} ∂wh∂L=T1t=1∑T∂wh∂l(yt,ot)=T1t=1∑T∂ot∂l(yt,ot)∂ht∂g(ht,wo)∂wh∂ht
乘积的第一项和第二项很容易计算, 而第三项 ∂ h t / ∂ w h \partial h_t/\partial w_h ∂ht/∂wh 是使事情变得棘手的地方,因为我们需要循环地计算参数 w h w_h wh 对 h t h_t ht 的影响。根据定义式中的递归计算, h t h_t ht 既依赖于 h t − 1 h_{t-1} ht−1 又依赖于 w h w_h wh,其中 h t − 1 h_{t-1} ht−1 的计算也依赖于 w h w_h wh。因此,使用链式法则产生:
∂ h t ∂ w h = ∂ f ( x t , h t − 1 , w h ) ∂ w h + ∂ f ( x t , h t − 1 , w h ) ∂ h t − 1 ∂ h t − 1 ∂ w h \frac{\partial h_t}{\partial w_h}=\frac{\partial f(x_t,h_{t-1},w_h)}{\partial w_h}+\frac{\partial f(x_t,h_{t-1},w_h)}{\partial h_{t-1}}\frac{\partial h_{t-1}}{\partial w_h} ∂wh∂ht=∂wh∂f(xt,ht−1,wh)+∂ht−1∂f(xt,ht−1,wh)∂wh∂ht−1
消掉递归计算得
∂ h t ∂ w h = ∂ f ( x t , h t − 1 , w h ) ∂ w h + ∑ i = 1 t − 1 ( ∏ j = i + 1 t ∂ f ( x t , h j − 1 , w h ) ∂ h j − 1 ) ∂ f ( x i , h i − 1 , w h ) ∂ w h \frac{\partial h_t}{\partial w_h}=\frac{\partial f(x_t,h_{t-1},w_h)}{\partial w_h}+\sum^{t-1}_{i=1}(\prod^t_{j=i+1}\frac{\partial f(x_t,h_{j-1},w_h)}{\partial h_{j-1}})\frac{\partial f(x_i,h_{i-1},w_h)}{\partial w_h} ∂wh∂ht=∂wh∂f(xt,ht−1,wh)+i=1∑t−1(j=i+1∏t∂hj−1∂f(xt,hj−1,wh))∂wh∂f(xi,hi−1,wh)
虽然我们可以使用链式法则递归地计算 ∂ h t / ∂ w h \partial h_t/\partial w_h ∂ht/∂wh,但当 t t t 很大时这个链就会变得很长。需要想办法来处理这一问题.
8.7.1.1 完全计算
最简单粗暴的方法,可以直接计算,然而,这样的计算非常缓慢,并且可能会发生梯度爆炸,因为初始条件的微小变化就可能会对结果产生巨大的影响。也就是说类似于蝴蝶效应,即初始条件的很小变化就会导致结果发生不成比例的变化。而我们正在寻找的是能够很好地泛化高稳定性模型的估计器。因此,在实践中,这种方法几乎从未使用过。
8.7.1.2 随即截断
可以用一个随机变量替换 ∂ h t / ∂ w h \partial h_t/\partial w_h ∂ht/∂wh,该随机变量在预期中是正确的,但是会截断序列。 这个随机变量是通过使用序列 ξ t \xi_t ξt 来实现的,序列预定义了 0 < π t < 1 0<\pi_t<1 0<πt<1,其中 P ( ξ t = 0 ) = 1 − π t P(\xi_t=0)=1-\pi_t P(ξt=0)=1−πt 且 P ( ξ t = π t − 1 = π t ) P(\xi_t=\pi_t^{-1}=\pi_t) P(ξt=πt−1=πt),因此 E ∣ ξ t ∣ = 1 E|\xi_t|=1 E∣ξt∣=1。 我们使用它来替换梯度 ∂ h t / ∂ w h \partial h_t/\partial w_h ∂ht/∂wh 得到:
(8.7.8)
z t = ∂ f ( x t , h t − 1 , w h ) ∂ w h + ξ t ∂ f ( x t , h t − 1 , w h ) ∂ h t − 1 ∂ h t − 1 ∂ w h z_t=\frac{\partial f(x_t,h_{t-1},w_h)}{\partial w_h}+\xi_t\frac{\partial f(x_t,h_{t-1},w_h)}{\partial h_{t-1}}\frac{\partial h_{t-1}}{\partial w_h} zt=∂wh∂f(xt,ht−1,wh)+ξt∂ht−1∂f(xt,ht−1,wh)∂wh∂ht−1
从 ξ t \xi_t ξt 的定义中推导出来 E ∣ ξ t ∣ = ∂ h t / ∂ w h E|\xi_t|=\partial h_t/\partial w_h E∣ξt∣=∂ht/∂wh。每当 ξ t = 0 \xi_t=0 ξt=0 时,递归计算终止在这个 t t t 时间步。这导致了不同长度序列的加权和,其中长序列出现的很少,所以将适当地加大权重。
8.7.1.3 比较策略

行自上而下分别为:
-
第一行采用随机截断,方法是将文本划分为不同长度的片断;
-
第二行采用常规截断,方法是将文本分解为相同长度的子序列。这也是我们在循环神经网络实验中一直在做的;
-
第三行采用通过时间的完全反向传播,结果是产生了在计算上不可行的表达式。
虽然随机截断在理论上具有吸引力,但很可能是由于多种因素在实践中并不比常规截断更好:
-
首先,在对过去若干个时间步经过反向传播后,观测结果足以捕获实际的依赖关系。
-
其次,增加的方差抵消了时间步数越多梯度越精确的事实。
-
第三,我们真正想要的是只有短范围交互的模型。因此,模型需要的正是截断的通过时间反向传播方法所具备的轻度正则化效果。
8.7.2 通过时间反向传播

-
“通过时间反向传播”仅仅适用于反向传播在具有隐状态的序列模型。
-
截断是计算方便性和数值稳定性的需要。截断包括:规则截断和随机截断。
-
矩阵的高次幂可能导致神经网络特征值的发散或消失,将以梯度爆炸或梯度消失的形式表现。
-
为了计算的效率,“通过时间反向传播”在计算期间会缓存中间值。
相关文章:
《动手学深度学习 Pytorch版》 8.7 通过时间反向传播
8.7.1 循环神经网络的梯度分析 本节主要探讨梯度相关问题,因此对模型及其表达式进行了简化,进行如下表示: h t f ( x t , h t − 1 , w h ) o t g ( h t , w o ) \begin{align} h_t&f(x_t,h_{t-1},w_h)\\ o_t&g(h_t,w_o) \end{ali…...
2023-10-20 游戏开发-cocos旧版本2.0.6-下载地址-记录
官方下载地址: Cocos Creator 下载 - 轻量高效的开发引擎 Tags cocos/cocos-engine GitHub cocos creater 旧版本: Tool/Package/REAMDE.md adofsauron/CocosCreatorFAQ - Gitee.com v2.0.6版本: Mac版:http://cocos2d-x.org/filedown/CocosStudioForMac-v2.0.…...
Python 框架学习 Django篇 (三) 链接数据库
只要你是做后端开发的,那么就离不开各种数据库,Django框架对各种数据库都非常友好,比如常见的PostgreSQL、MySQL、SQLite、Oracle,django都对他们提供了统一调用api,我们这里主要使用mysql数据库作为演示 一、ORM机制 …...
【debug】安装diffusion的bug解决合集
环境问题 ImportError: cannot import name ‘CLIPImageProcessor’ from ‘transformers’ (D:\Python\lib\site-packages\transformers_init_.py) https://github.com/huggingface/transformers/issues/23340 解决:查看更详细信息,安装环境 transfor…...
面试题 01.02. 判定是否互为字符重排
题目来源: leetcode题目,网址:面试题 01.02. 判定是否互为字符重排 - 力扣(LeetCode) 解题思路: 遍历计数即可。 解题代码: class Solution { public:bool CheckPermutation(string s1, …...
笔记39:在Pycharm中为项目添加新解释器
很久不用pycharm都生疏了 a a a 第一步:创建虚拟环境 略 a a a 第二步:将虚拟环境应用到项目中去 【File】----【Settings】----【Project:~~~】-----【Project Interpreter】----【选择合适的解释器】 因为我们要用新的解释…...
C#—VB.NET的相同点与不同点
目录 前言 一、相同之处 二、不同之处 三、总结 前言 VB.NET 和C#是两种由微软公司开发的面向对象编程语言。它们在语法上有很多相似之处,但也有一些不同之处。本文将讨论 VB.NET 和C#之间的相同之处和不同之处。 一、相同之处 1.面向对象编程语言:…...
【Edabit 算法 ★☆☆☆☆☆】【返回数组第一个元素】 Return the First Element in an Array
【Edabit 算法 ★☆☆☆☆☆】【返回数组第一个元素】 Return the First Element in an Array arrays language_fundamentals Instructions Create a function that takes an array containing only numbers and return the first element. Examples getFirstValue([1, 2, 3…...
在Qt中怎么操作MySQL数据库
一、安装驱动 (1)安装 在Qt中操作MySQL数据库首先要安装mysql的驱动文件,将MySQL下的libmusql.dll文件复制到Qt的安装路径下的bin文件夹下即可。 本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(…...
C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)
目录 前言 一、网络的含义与构成 含义: 构成: 二、网络的体系结构 1>OSI七层模型 2>TCP/IP协议体系结构 3>数据经过体系结构,怎么封装? 4>端口号 5>大小端序 6>TCP/UDP传输层的协议 三、系统函数API学习框…...
chrome Driver 使用教程
ChromeDriver是一款实用的chrome浏览器驱动工具,能够用于自动化测试、网络爬虫和操作浏览器,其主要作用是模拟浏览器操作。 ## 下载地址 [Chrome for Testing availability](Chrome for Testing availability)...
目标检测YOLO实战应用案例100讲-面向恶劣环境下的多模态 行人识别
目录 前言 国内外研究现状 可见光行人目标识别 红外行人目标识别...
react-router-dom v6版本实现Tabs路由缓存切换
目录 文章目录 概要 效果 完整代码 概要 摆了半年摊,好久没写代码了,今天有人问我怎么实现React-Router-dom类似标签页缓存。后面看了一下router的官网。很久以前用的是react-router v5那个比较容易实现。v6变化挺大,但了解react的机制和rea…...
ArcGIS笔记9_数据源缺少空间参考信息?如何定义坐标系?
本文目录 前言Step 1 确定好要赋予给目标文件的恰当坐标系Step 2 定义坐标系 前言 有时从其他软件转换得到了shp文件,拖到ArcGIS后却出现“未知的空间参考:添加的数据源缺少空间参考信息 不能投影”的提示,如下图所示: 这种情况就…...
Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现
可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎,它还提供了分布式的多用户能力,实时的分析,以及对复杂搜索语句的处理能力,使其在众多场景下,如企业搜索,日志和事件数据分析等…...
离线语音与IoT结合:智能家居发展新增长点
离线语音控制和物联网(IoT)相结合在家居中具有广泛的应用和许多优势。离线语音控制是指在设备在本地进行语音识别和处理,而不需要依赖云服务器进行处理。IoT是指借助网络,通过手机APP、小程序远程控制家居设备。 启英泰伦基于AI语…...
STM32MP135和STM32MP157的区别
本文介绍了STMicroelectronics公司推出的两款多核处理器STM32MP135和STM32MP157之间的区别,包括主频、集成硬件模块数量、内存大小和电压调节模块等方面。 STMicroelectronics是一家领先的半导体解决方案提供商,在嵌入式系统领域有着丰富的经验。他们…...
微信小程序文本横向无缝滚动
背景: 微信小程序中列表宽度不够长,其中某字段显示不完整,因此要使其自动滚动。 (最初看网上很多用定时器实现,但他们的案例中都只是一个横幅、用定时器也无所谓。但是我的需求中是一个上下无限滚动的列表,…...
Layui 主窗口调用 iframe 弹出框模块,获取控件的相应值
var iframeWindow window[layui-layer-iframe index]; iframeWindow.layui.tree............(这里就可以操作tree里面的内容了)。var chrild layero.find(iframe).contents(); chrild.layui.tree (这样是调用不到的)。var child layer.getChildFrame(); child.layui.tree(这…...
镜头边缘的解析力通常比中心差很多的原因是什么?
1、问题背景 之前有总结过一篇文章,“ 相机出图画面一半清晰,一半模糊的原因是什么?”里面有描述到关于镜头边缘的清晰度通常比中心要差的原因主要是光的折射导致的,有读者指出问题,折射率是和传输介质相关࿰…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
