CNN卷积神经网络之LeNet5原理

#引言
一个典型的卷积神经网络,如LeNet,开始阶段都是卷积层以及池化层的相互交替使用,之后采用全连接层将卷积层和池化之后的结果的特征全部提取进行概率计算处理。在具体的误差反馈和权重的更新的处理上,不论是全连接层发的更新还是卷积层的更新。使用的都是经典的反馈神经网络算法,这种方法将原本较为复杂的,要考虑长期的链式法则转化为只需要考虑前后节点输入和输出误差的权重的影响,使得神经网络当神经网络深度加深时能利用计算机计算,以及卷积核在计算的过程中产生了很多的数据计算。

#BP神经网络的算法的原理
为了使得整个计算的过程统一,设一个敏感度的参数$\sigma_k$,即当前的输出层的误差对该层的输入的偏导数。
一般而言,经典的反馈网络有伴包括三个部分:数据的前向计算,误差的反向传播和权重的更新。

1. 前向传播算法

对于前向传播算法的值传递,隐藏层输出的值的定义如下:
$$a_h^{H1} = W_h^{H1} \cdot X_i$$
$$b_h^{H1} = f(a_h^{H1} )$$
对于输出层,定义如下:
$$a_k = \sum W_{hk} \cdot b_h^{H1}$$
其中,$X_i$是当前节点的输入值,$W_h^{H1}$是连接到此节点的权重,$a_h^{H1}$是输出值。$f$是当前阶段的激活函数,$b_h^{H1}$为当前节点的输入值经过计算后被激活的值。$W_{hk}$为输入的权重,$b_h^{H1}$为输入到输出节点的输入值。这里对所有输入的值进行权重计算后求得和值。

2. 反向传播算法

与前向传播相似,首先定义两个值$\sigma_k$与$\sigma_h^{H1}$:
$$\sigma_k = \frac{\partial Loss}{\partial a_k} = (Y-T)$$
$$\sigma_h^{H1} = \frac{\partial Loss}{\partial a_h^{H1}}$$
其中,$\sigma_k$ 为输出层的误差项,是计算值($Y$)与模型计算值($T$)之间的差值。$\sigma_h^{H1}$为输出层的误差
反馈神经网络计算公式定义如下:
$$\begin{align} \sigma_h^{H1} &= \frac{\partial Loss}{\partial a_h^{H1}}\newline &= \frac{\partial Loss}{\partial b_h^{H1}} \cdot \frac{\partial b_h^{H1}}{\partial a_h^{H1}} \newline & =\frac{\partial Loss}{\partial b_h^{H1}} \cdot f’(a_h^{H1}) \newline &= \frac{\partial Loss}{\partial a_k} \cdot \frac{\partial a_k}{\partial b_h^{H1}} \cdot f’(a_h^{H1}) \newline &= \sigma_k \cdot \sum W_{hk} \cdot f’(a_h^{H1}) \newline &= \sum W_{hk} \cdot \sigma_k \cdot f’(a_h^{H1}) \end{align}$$
即当前层输出值对误差的梯度可以通过下一层的误差与权重和输入值的梯度乘积获得。
或者换一种表述形式将上面的公式表示为:
$$\sigma^l= \sum W_{ij}^l \times \sigma_j^{l+1} \times f’(a_i^l)$$

3. 权重的更新

反馈的神经网络计算的目的是对权重的更新。与梯度下降法类似,式子如下:
$$W_{ji} = W_{ji} + \alpha (f(\theta)-y_i)x_i$$
$$b_{ji} = b_{ji} + \alpha \sigma_j^l$$
其中,$ji$表示为反向传播时对应的节点系数,通过对$\sigma_j^l$的计算来更新对应的权重。

#卷积神经网络正向和反向传播公式推导
对于每层$l$的下面都会有一个采样层$l+1$,对于反馈神经网络而言,要求得$l$层的每个神经元对应的权值更新,就需要先求$l$层的每一个神经节点的灵敏度$\sigma_k$
即:正向的计算:

  • 输入层-卷积层
  • 卷积层-池化层
  • 池化层-全连接层
  • 全连接层-输出层

在正向计算的时候,当权重更新的时候,需要对其进行反向更新

  • 输出层-全连接层
  • 全连接层-池化层
  • 池化层-卷积层
  • 卷积层-输入层

相对于反馈网络,卷积神经网络在整个模型的构成上是分解为若干个小的步骤进行,因此对其进行求导更新计算的是逐层更新,
首先设定损失函数,因为采用个的one-hot方法,因此误差计算的误差函数为交叉熵函数:
$$Loss = -ylog(f(x)) + \frac{\lambda}{2} ||w||^2$$

##1.输出层到全连接层的方向求导
对于输出层来说,损失函数是交叉熵函数,由于one-hot方法是大部分是0,只有一个是1,对其交叉熵进行求解可得到:
$$ \begin{align} Loss(f(x),y) &= -\sum ylog(f(x)) \newline &= -(0 \times log(f(x_1)) +0 \times log(f(x_2))… 0 \times log(f(x_{n-1})) + 1\times log(f(x_n))) \newline &= -log(f(x_n))\end{align}$$
使用此种规则可以得到的损失函数为:
$$Loss = -(y-log(f(x))) + \frac{\lambda}{2} ||w||^2$$
其中 $y$是样本值等于1的那个值,$log(f(x))$为模型计算出的交叉熵的那个值,其差值$y-log(f(x))$是误差的额度,因为y在one-hot中始终未1,化简如下:
$$Loss = -(1-log(f(x))) + \frac{\lambda}{2} ||w||^2$$
我们的最终的输出层是$softmax$函数,那么对于结果会采用交叉熵的形式去计算损失函数,最后一层的误差敏感度就是卷积网络模型的输出值与真实值之间的差值。
那么根据损失函数对权值的偏导数,可以求得全连接的权重更新的计算公式:
$$\frac{\partial Loss}{\partial w} = -\frac{1}{m} \cdot (1-f(x)) \cdot f’(x) + \lambda w$$
其中,$f(x)$是激活函数,$w$是为$l-1$层到$l$层之间的权重。
则输出层的偏导数为:
$$\frac{\partial Loss}{\partial b} = -\frac{1}{m} \cdot (1-f(x))$$
注:具体的推导如下:

当$i = j$时,$softmax(f(x))$函数对于$f(x)$求导得到的导数为:
$$\frac{\partial softmax(f(x))}{\partial f(x)} = f(x) \cdot (1-f(x))$$
对于$Loss(f(x))$对$f(x)$求导可以得到的导数如下:
$$\frac{\partial Loss(f(x)}{\partial f(x)} = \frac{1}{f(x)} \cdot f’(x)$$
其中$f(x) = wx + b$
但是对于$\frac{1}{m}$是怎么来的有待下次推导

2. 池化层反馈到卷积层的反向求导

从正向来看,假设$l$层为卷积层,而$l+1$层为池化层
此时假设:池化层的敏感度为$\sigma_j^{l+1}$,卷积层的敏感度为$\sigma_j^l$。
两者的关系可以近似的表达为:

$$\sigma_j^l = pool \left(\sigma_j^{l+1} \right) * h \left(a_j^l \right)$$

$*$对应的是点对点乘,即时元素对应位置的乘积。
如果按照mean-pool方法进行反馈运算,则需要将$l+1$池化层扩展到$l$卷积层的大小 :矩阵由$2 \times 2$变为$4 \times 4$
的大矩阵,然后进行平摊处理得到最右边的结果
$\begin{bmatrix}1& 2 \newline 3 &4\end{bmatrix}$==>$\begin{bmatrix}1&1 &2 & 2 \newline 1&1 &2 & 2 \newline 3&3 &4 & 4 \newline3&3 &4 & 4 \end{bmatrix}$==>$\begin{bmatrix}0.25&0.25 &0.75& 0.75 \newline 0.25&0.25 &0.75& 0.75 \newline 0.5&05 &1 &1 \newline0.5&05 &1 &1 \end{bmatrix}$

3. 卷积层反馈到池化层的反向求导

当$l$层为池化层的时候,而$l+1$层为卷积层时
假设第$l$层有$n$个通道,即有n张特征图[weight,height,n],而在$l+1$卷积层中有m个特征值。如果$l$层池化层中每个通道都有其对应的敏感度误差,则计算依据为$l+1$层的卷积层中所有卷积核元素敏感度之和

$$\sigma_j^l = \sum_j^m \left( \sigma_j^{l+1}\otimes K_{ij}\right)$$

其中$\otimes$是矩阵的卷积操作,与向前传播不同的是:求$l$层池化层对$l+1$层的敏感度是全卷积操作。在tensorflow中将padding设置为full。注意的是这里的卷积操作是将卷积核先旋转180度再与padding后的矩阵进行卷积计算。

4.通过敏感度更新卷积神经网络中的权重

前面已经计算了在卷积神经网络中所有层中敏感度 ,对于卷积神经网络而言,其中特殊的是卷积层和池化层的权重更新比较难计算,而这些层的计算可以通过权重所连接的前后的敏感度来计算,则:
$$\frac{\partial Loss}{\partial w_{ij}} = x_i \cdot \sigma_j^{i+1}$$
$$\frac{\partial Loss}{\partial b_{ij}} = \sum \left( \sigma_j^{i+1}\right)$$
其中$\cdot$表示矩阵的点乘
未完待更新。。。。。。

-------------本文结束感谢您的阅读-------------