首页 > 其他分享 >关于RNN (循环神经网络)相邻采样为什么在每次迭代之前都需要将参数detach

关于RNN (循环神经网络)相邻采样为什么在每次迭代之前都需要将参数detach

时间:2025-01-22 10:55:04浏览次数:1  
标签:RNN 迭代 H0 传播 小批量 detach 节点

转自:https://www.cnblogs.com/catnofishing/p/13287322.html

  • detach到底有什么作用呢

    首先要明确一个意识:pytorch是动态计算图,每次backward后,本次计算图自动销毁,但是计算图中的节点都还保留。

    ​ 方向传播直到叶子节点为止,否者一直传播,直到找到叶子节点

    我的答案是有用,但根本不是为了防止梯度开销过大(注释真的害人不浅啊),detach的真正作用是梯度节流,防止反向传播传播到隐藏状态时,因为上次小批量方向传播计算图的销毁导致继续向下传播而引起报错。啥意思呢,我以连续两次小批量迭代举例:

    第一次小批量迭代,H0 是叶子节点,因为他没经过任何计算。剩余H1是非叶子节点。在第一次方向传播后,第一次的计算图已经销毁,但是节点数据仍然存在。

    第二次小批量迭代,第一次批量迭代的最后时间节点的隐藏状态H2 成为第二批次小的初始隐藏状态( H0(第二次) = H2(第一次) ),这样第二次在方向传播时,当传播到H0时,发现H0 是 分支节点(grad_fn+requires_grad) ,就会继续向下传播直到找到叶子节点为止,但是可惜的是H0 之后的计算图(即第一次小批量的计算图)已经销毁,传播发生中断,因此就会导致出错。而使用detach之后,H0 自然与上次的计算图没有任何关系,H0自身变为叶子节点,这样传播到H0时自然就结束了。

    image-20200712092715508

    好了,验证我所说的吧。

    • 首先,不使用detach,会导致传播报错

    将detach 操作删除

    image-20200712093904952

    运行结果:

    image-20200712093955090

看到没,第二次在方向传播时出错了吧

  • 使用detach,防止出错,并使H0 变为叶子节点

    代码更改如下:

    image-20200712094214574

结果:全是true

image-20200712094233502

综上:detach在这里作用,大家明白不,喜欢点个赞!!!!

至于书中为什么将detach的作用注释成那样呢,我想作者在翻译成torch的时候,忽略了MAXNET框架(原书是maxnet框架)与pytorch的区别。 MaxNet是支持静态图的,所以对于MaxNet ,detach的作用是与注释相同的,但是pytorch是动态图,所以作用在这里就不同了!!!

标签:RNN,迭代,H0,传播,小批量,detach,节点
From: https://www.cnblogs.com/gongzb/p/18685280

相关文章

  • 【超详细】深度学习三杰:CNN、RNN、GNN 全面对比与应用场景详解
    以下是一篇尽可能全面而详尽的博客,围绕卷积神经网络(CNN)、循环神经网络(RNN)、图神经网络(GNN)三大常见深度学习模型进行对比。希望兼顾深度与易读性,同时通过适当的关键词优化来吸引更多流量。深度学习三杰:CNN、RNN、GNN全面对比与应用场景详解导语:在深度学习领域,神经网络种......
  • 深度解析从 RNN 到 Transformer:构建 NLP 应用的架构演进之路
    深度解析从RNN到Transformer:构建NLP应用的架构演进之路......
  • 循环神经网络(RNN)与序列数据处理:亦菲彦祖的时序分析
    循环神经网络(RNN)与序列数据处理:亦菲彦祖的时序分析亲爱的亦菲彦祖,欢迎来到“时间的国度”!在之前的文章中,我们主要聚焦于深度学习在视觉领域的应用(如CNN)。然而,现实世界中有许多数据都存在时间或顺序上的依赖关系,例如自然语言、时间序列、视频数据等。为了处理这些序列数据,深度......
  • 迭代器模式
    迭代器(Iterator)模式属于行为型模式的一种。迭代器就是提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。在Java中,迭代器模式最常见的实现就是java.util.Iterator接口。我们经常在Java的集合类中使用的 Iterator 遍历,就是使用的迭代器模式。j......
  • 番外-rust迭代器-iter()
    iter()是Rust中的一个方法,它可以用于可迭代的集合,返回一个不可变的迭代器。这个方法使得你可以遍历集合中的元素。通常,iter()适用于以下几种类型:1.数组(Array)数组是固定大小的集合,iter()可以用来遍历数组中的元素。示例:letarr=[1,2,3];foriteminarr.iter(){......
  • 举例说明数组和对象的迭代方法分别有哪些?
    在前端开发中,数组和对象的迭代是常见的操作。对于数组,有多种迭代方法可供选择,而对于对象,由于其结构的特殊性,迭代方式相对有限但同样重要。以下分别举例说明数组和对象的迭代方法:数组的迭代方法forEach():该方法对数组的每个元素执行一次提供的函数。它不接受任何返回值,并且总是......
  • 设计模式-迭代器模式
    迭代器模式(IteratorPattern)解释定义迭代器模式是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。特点分离遍历集合与集合本身的实现。提供一种统一的方式来遍历不同类型的集合。使得集合的实现和迭代逻辑分离。......
  • 【C++】反向迭代器
    反向迭代器一.源码及框架分析二.反向迭代器实现代码1.ReverseIterator.h2.Vector.h3.List.h4.Test.cpp一.源码及框架分析SGI-STL30版本源代码,反向迭代器实现的核心源码在stl_iterator.h中,反向迭代器是一个适配器,各个容器中再适配出自己的反向迭代器。下面截出vector......
  • 混合迭代重建
    混合迭代重建(hybrid-IR)是一种CT图像的重建算法,它结合了传统的滤波反投影(FBP)算法和迭代重建技术的优点。以下是对混合迭代重建的详细解释:一、基本原理混合迭代重建的基本思路是首先使用滤波反投影算法(FBP)进行图像的初步重建,然后在此基础上进行迭代修正。迭代过程中,算法会不断比较......
  • 基于模型的迭代重建
    基于模型的迭代重建(ModelBasedIterativeReconstruction,MBIR)是实现三维重建的一种极其有效并在近些年快速发展的方法。以下是对基于模型的迭代重建的详细解释:一、基本原理在基于模型的迭代重建算法的框架构建中,三维重建问题被转换为在每一个体素(Voxel,类似于二维图像中的像素,是......