目录pytorch自界说forward和backward函数pytorch会自动求导,但是当遇到无法自动求导的时候,需要本身认为界说求导过程,这个时候就涉及到要界说本身的forward和backward函数。 举比方下: 看到这里,大家应该会有许多疑问比如:
针对以上题目,我们一个个解答
但是这么看也费劲,我们写一个网络,把这个函数加到网络中去,再完整的跑一遍看吧! 测试代码结果如下: 来进行解答首先,backward函数的返回值,就是对应着forward内里的参数的梯度,也就是说,forward函数内里有几个输入参数,那么backward函数的输出就要有几个!为什么是这样? 我们首先要明白backward的输入grad_out,为什么backward的参数就是一个,因为这是根据链式法则来的 比如,我们界说三个函数H(对应上面网络中linear1),F(自界说函数xjm_inter),D(对应上面网络中linear2),界说一个输入x(对应上面输入a),界说一个输出y(对应上面输出b): [code]y = D(F(H(X)))[/code]如今,我们求y对x的偏导,那么: [code]dy/dx = dy/dD * dD/dF * dF/dH * dH/dx[/code]好吧看到这里你可能照旧不懂,为什么backward的参数就是一个grad_out!! 我们韩式以上面则个函数为例子,但是,我们如今不求y对x的导数,我们假设F函数有一个叶子节点(大概说requires_grad=True)的参数w1,如今我们要求y对w1的导数: 所以 [code]dy/dw1 = dy/dD *dD/dF * dF/dw1[/code]那么此时,F就是我们上面代码中自界说的xjm_inter函数,则 grad_out = dy/dD *dD/dF。 怎么明白呢,根据链式法则,我们呢所界说的网络中的每一层都是一个单独的函数,所以函数中的变量的终极求导其实只取决于该函数本身,链式法则求导转达过来的其实永远都知识一个值,这就是为什么backward函数的输出只有一个。 扩展当forward的输出有多个的时候,那么就有多个链式法则,因为可以同时对x大概对w求导,此时backward的输入可以是一个,也可以是对应forward输出的个数,假如是一个则是一个元组,包罗对应的梯度!!! 那么我们的backward要实现什么样的功能呢?说到这里,大家应该大概能明白了,就是实现当前层那的梯度计算,并进行返回,所以,这也是为什么backward的返回值要和forward的输入值一一对应,否则会报错。 总结以上为个人履历,希望能给大家一个参考,也希望大家多多支持脚本之家。 来源:https://www.jb51.net/python/328671y4q.htm 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|手机版|小黑屋|梦想之都-俊月星空
( 粤ICP备18056059号 )|网站地图
GMT+8, 2025-7-1 19:31 , Processed in 0.035048 second(s), 20 queries .
Powered by Mxzdjyxk! X3.5
© 2001-2025 Discuz! Team.