zoukankan      html  css  js  c++  java
  • 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}

  • 相关阅读:
    黄聪:手机移动端建站Jquery+CSS3+HTML5触屏滑动特效插件、实现触屏焦点图、图片轮展图
    黄聪:VS2010开发如何在c#中使用Ctrl、Alt、Tab等全局组合快捷键
    利用python实现汉字转拼音
    python 获得质数
    将你的python转成exe格式
    python 动画
    python 饼状图
    python 抓屏
    python 图像迷糊
    python-opencv-圆、椭圆与任意多边形的绘制
  • 原文地址:https://www.cnblogs.com/Ponys/p/3315657.html
Copyright © 2011-2022 走看看