pytorch 深度学习之自动微分
自动微分
深度学习框架通过自动计算导数,即自动微分(automatic differentiation)来加快求导。 实际中,根据我们设计的模型,系统会构建一个计算图(computational graph), 来跟踪计算是哪些数据通过哪些操作组合起来产生输出。 自动微分使系统能够随后反向传播梯度。 这里,反向传播(backpropagate)意味着跟踪整个计算图,填充关于每个参数的偏导数。
例如,相对 关于向量 求导,首先创建一个变量 并为其分配一个初始值:
需要一个地方来存储梯度。重要的是,我们不会在每次对一个参数求导时都分配新的内存。 因为我们经常会成千上万次地更新相同的参数,每次都分配新的内存可能很快就会将内存耗尽。 注意,一个标量函数关于向量 的梯度是向量,并且与 具有相同的形状。
是一个长度为 4 的向量,计算 和 的点积,得到了我们赋值给y的标量输出。 接下来,我们通过调用反向传播函数来自动计算 关于 每个分量的梯度,并打印这些梯度:
函数 关于 的梯度应该是 ,验证:
非标量变量的反向传播
当 不是标量时,向量 关于向量 的导数的最自然解释是一个矩阵。对于高阶和高维的 和 ,求导的结果可以是一个高阶张量。
分离计算
假设 是作为 的函数计算的,而 则是作为 和 的函数计算的。 想象一下,我们想计算 关于 的梯度,但由于某种原因,我们希望将 视为一个常数, 并且只考虑到 在 被计算后发挥的作用。
在这里,我们可以分离 来返回一个新变量 ,该变量与 具有相同的值,但丢弃计算图中如何计算 的任何信息。 换句话说,梯度不会向后流经 到 。 因此,下面的反向传播函数计算 关于 的偏导数,同时将 作为常数处理, 而不是 关于 的偏导数。
由于记录了 的计算结果,我们可以随后在 上调用反向传播, 得到 关于的 的导数,即 。
Python 控制流的梯度计算
在下面的代码中,while 循环的迭代次数和 if 语句的结果都取决于输入 a 的值:
__EOF__

本文链接:https://www.cnblogs.com/xiaojianliu/p/16160210.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2020-04-18 Sphinx + GitHub + ReadtheDocs 创建电子书