主页
手机版
扫描查看手机站
所在位置:首页 → 教程资讯 → 深度学习框架中自定义反向传播函数参数传递问题及解决方案

深度学习框架中自定义反向传播函数参数传递问题及解决方案

发布: 更新时间:2024-05-09 15:51:43

在MindSpore深度学习框架中,我们可以向construct函数传输必备参数或者关键字参数,这跟普通的Python函数没有什么区别。但是对于MindSpore中的自定义反向传播bprop函数,因为标准化格式决定了最后的两位函数输入必须是必备参数

out



dout

用于接收函数值和导数值。那么对于一个自定义的反向传播函数而言,我们有可能要传入多个参数。

然而,由于在Python的函数传参规则下,必备参数必须放在关键字参数之前,也就是out和dout这两个参数要放在前面。否则,就会出现报错。按照普通Python函数的传参规则,我们可以把关键字参数y放到最后面去。

然而,这种调整后发现可以正常输出结果,但结果似乎不太正常。因为在construct函数计算函数值时,得到的结果应该是sin(π)+y。但是关键问题在反向传播函数的计算,原本应该是cos(π)+y=y-1,但是在这里输入的y=0,而导数的计算结果却是0而不是正确结果-1。这就说明,在MindSpore的自定义反向传播函数中,并不支持传入关键字参数。

刚好前面写了一篇关于PyTorch的文章,这篇文章中提到的两个Issue就针对此类问题。受到这两个Issue的启发,我们在MindSpore中如果需要自定义反向传播函数,可以这么写。

简单来说就是,把原本要传给bprop的关键字参数,转换成必备参数的方式进行传入,然后做一个条件判断:当给定了该输入的时候,执行计算一,如果不给定参数值,或者给一个None,执行计算二。

这里输出的结果都是正确的。然而,因为我们其实是强行把关键字参数按照顺序变成了必备参数进行输入,所以在顺序上一定要严格遵守bprop所定义的必备参数的顺序,否则计算结果也会出错。

另外还有一个缺陷是,如果我们在传参给bprop的时候传递了一个None参数,那么不会使用construct函数中的缺省值,这需要我们自己手动设定了。这个结果意味着,在bprop函数中执行时y参数的值是None而不是construct函数中的缺省值1。但是就目前来说,只有这一个方法可以允许我们向bprop函数传递关键字参数。

继上一篇文章从Torch的两个Issue中找到一些类似的问题之后,可以发现深度学习框架对于自定义反向传播函数中的传参还是比较依赖于必备参数,而不是关键字参数,MindSpore深度学习框架也是如此。但是我们可以使用一些临时的解决方案,对此问题进行一定程度上的规避,只要能够自定义的传参顺序传入关键字参数即可。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/bprop-kwargs.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

参考链接

  1. https://www.cnblogs.com/dechinphy/p/18179248/torch
软件上新 查看更多