其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。
导言–
在SIGAI之前的公众号文章“反向传播算法推导-全连接神经网络”中,我们推导了全连接神经网络的反向传播算法。其核心是定义误差项,以及确定误差项的递推公式,再根据误差项得到对权重矩阵、偏置向量的梯度。最后用梯度下降法更新。卷积神经网络由于引入了卷积层和池化层,因此情况有所不同。在今天这篇文章中,我们将详细为大家推导卷积神经网络的反向传播算法。对于卷积层,我们将按两条路线进行推导,分别是标准的卷积运算实现,以及将卷积转化成矩阵乘法的实现。在文章的最后一节,我们将介绍具体的工程实现,即卷积神经网络的卷积层,池化层,激活函数层,损失层怎样完成反向传播功能。
回顾
首先回顾一下全连接神经网络反向传播算法的误差项递推计算公式。根据第l层的误差项计算第l-1层的误差项的递推公式为:
其中W为权重矩阵,u为临时变量,f为激活函数。根据误差项计算权重梯度的公式为:
其中x为本层的输入向量。这几组公式具有普遍意义,对于卷积神经网络的全连接层依然适用。如果你对这些公式的推导还不清楚,请先去阅读我们之前的文章“反向传播算法推导-全连接神经网络”。
卷积层
首先推导卷积层的反向传播计算公式。正向传播时,卷积层实现的映射为:
我们用前面的这个例子来进行计算:
卷积输出图像的任意一个元素都与卷积核矩阵的任意一个元素都有关,因为输出图像的每一个像素值都共用了一个卷积核模板。反向传播时需要计算损失函数对卷积核以及偏置项的偏导数,和全连接网络不同的是,卷积核要作用于同一个图像的多个不同位置。
上面的描述有些抽象,下面我们用一个具体的例子来说明。假设卷积核矩阵为:
输入图像是:
卷积之后产生的输出图像是U,注意这里只进行了卷积、加偏置项操作,没有使用激活函数:
正向传播时的卷积操作为:
反向传播时需要计算损失函数对卷积核以及偏置项的偏导数,和全连接网络不同的是,卷积核要反复作用于同一个图像的多个不同位置。根据链式法则,损失函数对第l层的卷积核的偏导数为:
在这里i和j是卷积输出图像的行和列下标,这是因为输出图像的每一个元素都与卷积核的元素 k_{pq} 相关。首先我们看上式最右边求和项的第二个乘积项:
这是激活函数对输入值的导数,激活函数作用于每一个元素,产生同尺寸的输出图像,和全连接网络相同。第三个乘积项为:
假设 已经求出,我们根据它就可以算出
的值:
偏置项的偏导数更简单:
这和全连接层的计算方式类似。同样的定义误差项为:
这是损失函数对临时变量的偏导数。和全连接型不同的是这是一个矩阵:
尺寸和卷积输出图像相同,而全连接层的误差向量和该层的神经元个数相等。这样有:
这也是一个卷积操作, 充当卷积核,
则充当输入图像。
卷积输出图像对应的误差项矩阵 为:
下面计算损失函数对卷积核各个元素的偏导数,根据链式法则有:
这是因为产生输出 时卷积核元素
在输入图像中对应的元素是
。产生输出
时卷积核元素
在输入图像中对应的元素是
。其他的依次类推。同样的有:
其他的以此类推。从上面几个偏导数的值我们可以总结出这个规律:损失函数对卷积核的偏导数实际上就是输入图像矩阵与误差矩阵的卷积:
其中 为卷积运算。写成矩阵形式为:
在这里conv为卷积运算,卷积输出图像的尺寸刚好和卷积核矩阵的尺寸相同。现在的问题是 怎么得到。如果卷积层后面是全连接层,按照全连接层的方式可以从后面的层的误差得到
。如果后面跟的是池化层,处理的方法在下一节中介绍。
接下来要解决的问题是怎样将误差项传播到前一层。卷积层从后一层接收到的误差为 ,尺寸和卷积输出图像相同,传播到前一层的误差为
,尺寸和卷积输入图像相同。同样的,我们用上面的例子。假设已经得到了