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

反向传播算法(Back Propagation):

引言:

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

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

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

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


实现过程:

 一、正向传播

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

 

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


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

 

展开之后:

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

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

 

 二、反向传播

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


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

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

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

这里:

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

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

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

 
egin{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、

 
egin{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)
ight|^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、

 
egin{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)
ight|^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}
ight) \
&= 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)}
ight)f'(z_i^{n_l-1})
end{align}

原文地址:https://www.cnblogs.com/Ponys/p/3315657.html