深度学习框架中自动微分的实现

自动微分的实现为深度学习的框架的梯度回传的计算提供了很大的便捷,我们只需定义好算子(operator),搭建好整个深度神经网络的网络结构后,就可以通过拓扑序构建好(具体拓扑排序方法可以参考引文中的深度优先搜索方法DFS)计算图,然后就可以根据偏微分的链式法则,就可以依次反向计算节点的数值结果,参数梯度等数值了。

在不同的深度学习的框架中,神经网络反向传播的算法实现会存在着一些差异,以早期的比较有影响力的caffe举例说明,caffe的实现中没有算子,而是blob(tensor)和layer,Net三种粒度的结构,各种不同的计算方法的layer(类似于各种不同的operator,如加减乘除)中计算前向和反向的结果,layer的输入为bottom blob,输出为top blob(也有可能存在着inplace的操作)其计算流图的关系是通过Net类中的相关函数进行静态计算的(Init函数)。

深度学习框架经过技术的发展,早期的caffe已经淡出了研发者的视线,不过在当时(还没有出现tensorflow,caffe2,以及pytorch)是相当有影响力的,其中的设计思想也是比较优秀的,有兴趣的读者可以阅读某些layer的forward,backward函数(基于cpu和gpu(cublas库)的矩阵计算)的实现都可以具体阅读源码加以具体深入的理解。不过由于其python的接口支持不是特别丰富,一些特殊的层的自定义实现和框架的重编译门槛比较高,相比pytorch要繁琐很多。

现在基于pytorch的深度学习框架由于其简洁易用而广受欢迎,其网络的定义也更加自由灵活(代码定义网络结构也很方便),基于pytorch的深度学习应用框架也有很多,纷繁多样,比如openmmlab等等。

Reference


by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *