Deep Learning 学习笔记(7):神经网络的求解 与 反向传播算法(Back Propagation)

 

反向传播算法(Back Propagation):

 

引言:

在逻辑回归中,我们使用梯度下降法求参数方程的最优解。

这种方法在神经网络中并不能直接使用,

因为神经网络有多层参数(最少两层),(?为何不能)

这就要求对梯度下降法做少许改进。

 


 

实现过程:

 一、正向传播

首先,同逻辑回归,我们求出神经网络输出与实际值的“误差”——COST:

 

 这里先使用欧式距离而不是索夫曼函数作为输出的cost:


\begin{align}
J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2.
\end{align}

 

展开之后:

 
\begin{align}
J(W,b)
&= \left[ \frac{1}{m} \sum_{i=1}^m J(W,b;x^{(i)},y^{(i)}) \right]
                       + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2
 \\
&= \left[ \frac{1}{m} \sum_{i=1}^m \left( \frac{1}{2} \left\| h_{W,b}(x^{(i)}) - y^{(i)} \right\|^2 \right) \right]
                       + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2
\end{align}

(注意右边的权重衰减项,既规则化)

 

 二、反向传播

对于第 \textstyle n_l 层(输出层)的每个输出单元 \textstyle i,我们根据以下公式计算残差


\begin{align}
\delta^{(n_l)}_i
= \frac{\partial}{\partial z^{(n_l)}_i} \;\;
        \frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 = - (y_i - a^{(n_l)}_i) \cdot f'(z^{(n_l)}_i)
\end{align}

对 \textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2 的各个层,第 \textstyle l 层的第 \textstyle i 个节点的残差计算方法如下

 
\delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) f'(z^{(l)}_i)

这里:

\textstyle f'(z^{(l)}_i) = a^{(l)}_i (1- a^{(l)}_i)

这里相当于把本层节点的残差按照权重“投影”到上一层残差的节点上(“反向传播”就是这个意思)

 

在计算出各节点的残差之后,参数的偏导如下计算:

 
\begin{align}
\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) &= a^{(l)}_j \delta_i^{(l+1)} \\
\frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y) &= \delta_i^{(l+1)}.
\end{align}

 

然后就可以梯度下降去了!

 

梯度下降过程:

1、进行前馈计算,求的所有节点的输出,求得cost;

2、进行反向传播计算,求的所有节点残差(第nl ~ 第2层)

3、利用公式求得cost对参数的偏导

4、更新偏导。

5、重复1~4知道cost差距小于预设值或重复次数大于预设值

(这里以上只讲实现方法,省略所有证明。相关证明贴于最后。)


 

随机初始化( Random Initialization):

在进行第一次前馈算法之前,神经网络参数的值是多少呢?

全零初始化?这是不可以的!

如果选择相同的参数进行初始化,

隐藏节点的出入必定相同(自己推推,更不用说输出了)。

为了使得对称失效,我们对神经网络的参数进行随机初始化,

既采用接近零的初始值进行初始化

这个过程可以用matlab产生随机矩阵的功能来实现。

初始化之后,让我们一起下降吧!


 

用到的证明(残差的计算):

1、

 
\begin{align}
\delta^{(n_l)}_i &= \frac{\partial}{\partial z^{n_l}_i}J(W,b;x,y)
 = \frac{\partial}{\partial z^{n_l}_i}\frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 \\
 &= \frac{\partial}{\partial z^{n_l}_i}\frac{1}{2} \sum_{j=1}^{S_{n_l}} (y_j-a_j^{(n_l)})^2
 = \frac{\partial}{\partial z^{n_l}_i}\frac{1}{2} \sum_{j=1}^{S_{n_l}} (y_j-f(z_j^{(n_l)}))^2 \\
 &= - (y_i - f(z_i^{(n_l)})) \cdot f'(z^{(n_l)}_i)
 = - (y_i - a^{(n_l)}_i) \cdot f'(z^{(n_l)}_i)
\end{align}

2、

 
\begin{align}
\delta^{(n_l-1)}_i &=\frac{\partial}{\partial z^{n_l-1}_i}J(W,b;x,y)
 = \frac{\partial}{\partial z^{n_l-1}_i}\frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 
 = \frac{\partial}{\partial z^{n_l-1}_i}\frac{1}{2} \sum_{j=1}^{S_{n_l}}(y_j-a_j^{(n_l)})^2 \\
&= \frac{1}{2} \sum_{j=1}^{S_{n_l}}\frac{\partial}{\partial z^{n_l-1}_i}(y_j-a_j^{(n_l)})^2
 = \frac{1}{2} \sum_{j=1}^{S_{n_l}}\frac{\partial}{\partial z^{n_l-1}_i}(y_j-f(z_j^{(n_l)}))^2 \\
&= \sum_{j=1}^{S_{n_l}}-(y_j-f(z_j^{(n_l)})) \cdot \frac{\partial}{\partial z_i^{(n_l-1)}}f(z_j^{(n_l)})
 = \sum_{j=1}^{S_{n_l}}-(y_j-f(z_j^{(n_l)})) \cdot  f'(z_j^{(n_l)}) \cdot \frac{\partial z_j^{(n_l)}}{\partial z_i^{(n_l-1)}} \\
&= \sum_{j=1}^{S_{n_l}} \delta_j^{(n_l)} \cdot \frac{\partial z_j^{(n_l)}}{\partial z_i^{n_l-1}}
 = \sum_{j=1}^{S_{n_l}} \left(\delta_j^{(n_l)} \cdot \frac{\partial}{\partial z_i^{n_l-1}}\sum_{k=1}^{S_{n_l-1}}f(z_k^{n_l-1}) \cdot W_{jk}^{n_l-1}\right) \\
&= \sum_{j=1}^{S_{n_l}} \delta_j^{(n_l)} \cdot  W_{ji}^{n_l-1} \cdot f'(z_i^{n_l-1})
 = \left(\sum_{j=1}^{S_{n_l}}W_{ji}^{n_l-1}\delta_j^{(n_l)}\right)f'(z_i^{n_l-1})
\end{align}

 

 

 

 

posted @ 2013-09-15 09:25  Pony_s  阅读(4423)  评论(0编辑  收藏  举报