目前主流的CNN训练框架,如pytorch、mxnet、tensorflow2.0中都已经集成了autograd的机制,自动求导的机制相较于传统训练框架如caffe、tensorflow 1.x等粒度要精细。caffe、tensorflow 1.x一般以单层Op作为BP的节点,pytorch、mxnet、tensorflow 2.0中集成了autograd的机制,以单个math op作为bp节点。
本文通过算例跟大家讨论一下卷积Op在CNN训练过程中的一些求导细节,采用的记号和形式主要参考caffe、tensorlfow 1.x的设计模式,粒度为单个layers(如Conv2D layers)。卷积的数学符号的计算图,一般可以用如下图表示:
上图中,我们一般称x为features,k为conv kernel,b为bias。卷积的inference path可以参考上图中的红线方向箭头,其back-propagation path可以参考上图中的蓝色方向箭头。通过观察不难反向,在卷积Op中如果想实现反向传播,我们需要考虑三个数据项的求导过程,即y关于x的偏导、y关于b的偏导、y关于k的偏导。我们先来看一个简单的算例: