| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 人工智能 -> Pytorch backward() 笔记 -> 正文阅读 |
|
|
[人工智能]Pytorch backward() 笔记 |
|
创建和训练神经网络包括以下基本步骤: ?
第1,2,3步都已经了解,这里记录一下第4步的原理和pytorch中的实现,方便回忆。 原理反向传播其实就是链式求导法则的另一个名字。在训练时,用给定的输入计算出输出,然后和标准比较计算出loss。然后用loss对每一个参数求偏导。因为用的是梯度下降法,所以是把当前的偏导值乘以学习率更新参数。如果只是一个简单的复合函数f(g(x)),链式法则很容易。但在神经网络中一般会用到多元复合函数求导法则(比如ResNet中的残差链接,就是y=x+f(x))。对于多变量的链式法则如下所示,其中z?=?f(x,?y),其中x?=?g(t),y?=?h(t)。
考虑一个简单的例子,如下图所示:
可以看成是残差链接的一个简化版。假如希望求k关于i的偏导,利用链式法则
可以求得k对于i的偏导。这个结果和用k=(i+h)*i求偏导是一样的。但是这种求法可以将求某个变量 的偏导限制在一个局部,方便程序执行。有一个注意的地方就是,在上边的计算图中,i的导数来自两个地方,一个是直接k对i求的,一个是k先对j求,再对i求。这两部分是直接加起来的关系,这是因为多变量的链式法则,对不同部分的偏导就是相加的关系。 pytorch实现pytorch的实现可以参考这个视频,有一个很好的动画图示,上边的例子也是用的这个视频片尾的例子。 在正向时,除了做正向的计算,pytorch还会自动生成一个叫做计算图的东西。计算图会记录下来每个参数以及他们计算的op。然后在反向传播的时候,就会根据这个计算图来做。为了实现这个功能,tensor除了要存原本的参数外,还需要存额外的数据:
在使用中,假如一波操作后,最终的输出是一个标量的变量loss。只需要对loss调用.backward(gradient),就可以按照计算图,把loss对每个变量的梯度求出来存在对应的变量中。然后使用optimizer.step(),就可以按照optimizer中定义的learning rate等更新参数。 backward()中的参数gradient需要解释一下。回看之前的例子,如果是k经过j再对i求偏导,那么就是 参考: https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html https://zhuanlan.zhihu.com/p/29904755 |
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/6 10:53:53- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |