卷积神经网络其实是神经网络特征学习的一个典型例子。传统的机器学习算法其实需要人工的提取特征,比如很厉害的SVM。而卷积神经网络利用模板算子的参数也用以学习这个特点,把特征也学习出来了。其实不同的模板算子本质上就是抽象了图像的不同方面的特征。比如提取边缘,提取梯度的算子。用很多卷积核去提取,那就是 提取了很多的特征。一旦把参数w,b训练出来,意味着特征和目标之间的函数就被确定。今天分享下CNN的关键部分,训练方法,即随机梯度下降和误差反向传播。
先说下推导的思路:
(1)说明CNN是一种局部连接和权值共享的网络,这种网络可以看做是特殊的全连接网络,即不连接部分的权值为0。
(2)解释网上常见的pooling层向卷积层,以及卷积层向pooling层的残差反向传播的原理。
在推导CNN反向传播之前,MLP的反向传播是推导基础。
首先定义wij(l)为第l层第j个神经元与第l+1层第i个神经元的链接权重,zi(l)为第l层第i个神经元的输入,ai(l)为第l层第i个神经元的输出,bi(l)为第l+1层第i个神经元的偏置,定义hwb(x)为神经网络在输入层为x时输出层的输出值,定义函数f为神经元的激活函数。神经元网络的前馈传播可表示成
zi(l+1)=w(l)a(l)+b(l)
a(l+1)=f(z(l+1)
在网络初始化的时候,可以采用高斯分布的随机函数去初始化权重w,然后定义损失函数(loss function)如下:
J(x(i),y(i);w,b)=21∣∣hwb(x(i)−y(i)∣∣2
J(w,b)=m1i=1∑mJ(x(i),y(i);w,b)+2λl=1∑nl−1i=1∑sl+1j∑sl(wijl)2
如果J(w,b)加权重的平方,是为了减小权重的大小,防止过拟合。神经网络的训练目标就是寻找合适的w,b使得损失函数J(w,b)最小。因而可以使用梯度下降法确定w,b.
wij(l)=wij(l)−∂wij(l)∂J(w,b)
wij(l)=wij(l)−m1∑i=1m∂wij(l)∂J(x(i),y(i);w,b)−λwji(l)
wij(l)=wij(l)−m1∑i=1m∂zij(l+1)∂J(x(i),y(i);w,b)∂wij(l)∂zij(l+1)−λwji(l)
Qzij(l+1)=∑k=1slwik(l)ak(l)+bi(l)
∴wij(l)=wij(l)−m1∑i=1m∂zij(l+1)∂J(x(i),y(i);w,b)aj(l)−λwji(l)
∴bi(l)=bi(l)−m1∑i=1m∂zij(l+1)∂J(x(i),y(i);w,b)
因而只需要计算出∂zij(l+1)∂J(x(i),y(i);w,b),梯度下降法就可以计算。残差项定义如下:
δi(nl)=∂zi(nl)∂J(x,y;w,b)=∑k=1Snl(ak(nl)−yk)∂zi(nl)∂ak(nl)
=∑k=1Snl(ak(nl)−yk)∂zi(nl)∂(f(zk(nl)))=(ai(nl)−yi)f′(zi(nl))
因此前一层的δi(nl−1)可以计算如下:
δi(nl−1)=∂zi(nl−1)∂J(x,y;w,b)=∑k=1Snl(ak(nl)−yk)∂zi(nl−1)∂ak(nl)
=∑k=1Snl(ak(nl)−yk)∂zi(nl−1)∂(f(zk(nl)))=∑k=1Snl(ak(nl)−yk)f′(zk(nl))∂zi(nl−1)∂zk(nl)
=∑k=1Snl(ak(nl)−yk)f′(zk(nl))∂zi(nl−1)∂(∑r=1Snlwkrnl−1f(zr(nl−1)+bk(nl−1))
=∑k=1Snl(ak(nl)−yk)f′(zk(nl))wki(nl−1)f′(zi(nl−1))
=∑k=1Snlδk(nl−1)wki(nl−1)f′(zi(nl−1))
将残差结果带入梯度下降公式:
∴wij(l)=wij(l)−m1∑k=1mδi(k,l+1)aj(k,l)−λwij(l)
∴bi(l)=bi(l)−m1∑k=1mδi(k,l+1)
从随机梯度下降法训练网络的推导过程可见,残差的反向传播是计算的核心。残差的反向传播用一句话来概况就是“某一层第i个节点的残差等于与该节点有权值连接的后一层所有节点上的残差乘以连接权重的和,最后和乘以激活函数在该节点输入值上的导数”,所以残差在往前传播的时候,只和与该节点有连接的后一层上的残差有关系。
这句话有点绕口,但是正是描述了公式:
=∑k=1Snlδk(nl)wki(nl−1)f′(zi(nl−1))
下面分析CNN其实是一种特殊的全连接网络做卷积的本质是后一层的某一节点上的值之与前一层的9个节点有关(以3*3卷积核为例),如果把n
*n的图像展开成列向量,长度就是n*n,那么后一层的节点个数就是(n-3+1)*(n-3+1),也可以排成只有一列的列向量。这样的网络和MLP的网络是一样的,唯一的区别是非全连接,后一层的输入值之和前一层的九个节点有关系。
我们只需要考虑CNN和MLP不同之处即可,相同的地方参考MLP的反向传播。显然不同之处在于CNN多了卷积计算和pooling。上图右边表示的是max pooling和mean pooling的反向传播示意图,以max pooling为例,其实是把残差直接给了前向传播pooling时值最大的节点。比如2*2的pooling,那么其实四个权重除了最大值的那个节点连接权重是1,其他三个都是0,那么再次参考残差传播的公式,权重为0,意味着反向残差为0,理解下面的公式,看看你就知道为啥是0了,w只有一个而且还是0,算出来当然是0。
=∑k=1Snlδk(nl)wki(nl−1)f′(zi(nl−1))
其实pooling层的反向传播其实好理解。不好意理解的是卷积层。
为啥卷积层的反向传播会是残差与卷积核的再卷积。要解释这个还得从残差的反向传播公式说起,
某一层第i个节点的残差等于与该节点有权值连接的后一层所有节点上的残差乘以连接权重的和,最后和乘以激活函数在该节点输入值上的导数”,所以残差在往前传播的时候,只和与该节点有连接的后一层上的残差有关系。前一层的某一节点在卷积核计算过程中影响了后一层的谁,后一层的残差就要参与计算。那么我们通过下图分析下到底卷积核计算,使得一个节点影响了后一层的哪些节点,影响的权重是多少。
上图分析的是红色节点影响了下一层的A11,A12....A33中的哪些节点,权重是多少。中间的星星图,就是具体影响。具体怎么得出这个图的,就是把做左图的3*3卷积核,往左边,右边,上面,下面,左上,左下,右上,右下,不动,共九个位置。看看红色部分影响到了后面中的哪些节点。根据残差反向传播公式,残差应该如下图计算:
上图的上半部分就是完全按照计算公式得到的,下图就是传说中的用残差和卷积核做卷积,显然这两个式子是完全相等的。所以可以说,“莫名其妙”的残差卷积其实也是根据残差公式严格推导来的。多个卷积核的情况那还是一样的,多个卷积核与多个残差层逐一卷积后累加和。
至此卷积神经网络的反向传播算法通过解释:局部连接和权值共享转为全连接网络,通过推导pooling层反向和卷积层反向传播与全连接网络具有一致性。两个方面分析将CNN的训练算法完整的归入了统一的公式体系。