• 神经网络BP算法推导


    Cost Function

    • (L):表示神经网络的总层数。

    • (S_l):表示第(l)层的单元数(即神经元的数量),其中不包括第(l)层的偏置单元。

    • (K):输出层单元数目。

    • (left( h_Theta left( x^{left( i ight)} ight) ight)_k):表示输出神经网络输出向量中的第(k)个元素。

    • 如果一个网络在第(j)层有(S_j)个单元,在(j+1)层有(S_{j+1})个单元,那么矩阵( heta^{left(j ight)}),即控制第(j)层到第(j+1)层映射的矩阵,他的维度是(S_{j+1} imes(S_j+1)).

    • 神经网络代价函数(带正则化项):

    [J( heta)=frac1m sum_{i=1}^m sum_{k=1}^K left[ - y^{left(i ight)}_k log left( h_Theta left( x^{left( i ight)} ight) ight)_k - left( 1-y^{left( i ight)}_k ight) log left( 1- left( h_Theta left( x^{left( i ight)} ight) ight)_k ight) ight] + frac {lambda}{2m} sum_{l=1}^{L-1} sum_{i=1}^{S_l} sum_{j=1}^{S_{l+1}} left( Theta_{ji}^ { left( l ight) } ight)^2 ]

    • 看起来复杂很多的代价函数背后的思想还是一样的,通过代价函数来观察算法预测的结果与真实情况的误差有多大。
    • 唯一不同的是对于每一行特征,都会给出(K)个预测。在(K)个预测中选择可能性最高的一个,将其与(y)中的实际数据进行比较。
    • 正则化的那一项是排除了每层的( heta_0)后,每一层的( heta)矩阵的和。最里面的循环(j)循环所有的行,由(S_{l+1})层的激活单元数决定;循环(i)则循环所有的列,由(S_l)层的激活单元数决定。

    Forward propagation

    假设有一个三层的神经网络
    在这里插入图片描述

    参数含义:

    • ( heta^{left(i ight)}):第(i)层的参数矩阵(即控制第(i)层到第(i+1)层映射的矩阵)
    • (z^{left(l ight)}):第(l)层的输入
    • (a^{left(l ight)}):第(l)层的输出

    向前传播算法过程:(其中(g)为sigmoid激活函数。)

    • (a^{left(1 ight)}=x quad (add quad a_0^{left(1 ight)}))
    • (z^{left(2 ight)}= heta^{left(1 ight)}a^{left(1 ight)})
    • (a^{left(2 ight)}=gleft(z^{left(2 ight)} ight) quad (add quad a_0^{left(2 ight)}))
    • (z^{left(3 ight)}= heta^{left(2 ight)}a^{left(2 ight)})
    • (a^{left(3 ight)}=gleft(z^{left(3 ight)} ight)=h_ heta(x))

    Backpropagation Algorithm

    参数含义:

    • (delta^{left(l ight)}):第(l)层的误差
    • (y):每个样本的标签(要转化成非线性相关的向量)
    • (h):每个样本的预测值

    先来从后往前计算每层的“误差“。注意到这里的误差用双引号括起来,因为并不是真正的误差。

    • (delta^{left(3 ight)}=h-y=a^{left(3 ight)}-y)
    • (delta^{left(2 ight)}=left( heta^{left(2 ight)} ight)^T·delta^{left(3 ight)}.*{g^prime (z^{left(2 ight)}) })
    • 没有(delta^{left(1 ight)}),因为第一层是输入变量不存在误差。

    然后来计算每层参数矩阵的梯度,用(Delta^{(l)})表示。
    (lambda=0)时,即不考虑正则化处理

    • (Delta^{(2)}=a^{left(2 ight)}·delta^{left(3 ight)})
    • (Delta^{(1)}=a^{left(1 ight)}·delta^{left(2 ight)})

    则利用反向传播算法计算所有的偏导数(不考虑正则化)

    • (frac{partial}{partial Theta^{left( 2 ight)}} Jleft(Theta ight) = Delta^{left( 2 ight)}=a^{left(2 ight)}·delta^{left(3 ight)})
    • (frac{partial}{partial Theta^{left( 1 ight)}} Jleft(Theta ight) = Delta^{left( 1 ight)}=a^{left(1 ight)}·delta^{left(2 ight)})

    推导:

    • 要优化的参数有( heta^{left( 2 ight)})( heta^{left( 1 ight)})
    • 利用梯度下降法的思想,我们只需要求解出代价函数对参数的梯度即可。
    • 假设只有一个输入样本,则代价函数是:

    [Jleft( heta ight)=-y log h(x)-(1-y)log (1-h(x)) ]

    • 回顾下正向传递的过程,理解其中函数的嵌套关系:
      • (a^{left(1 ight)}=x quad (add quad a_0^{left(1 ight)}))
      • (z^{left(2 ight)}= heta^{left(1 ight)}a^{left(1 ight)})
      • (a^{left(2 ight)}=gleft(z^{left(2 ight)} ight) quad (add quad a_0^{left(2 ight)}))
      • (z^{left(3 ight)}= heta^{left(2 ight)}a^{left(2 ight)})
      • (a^{left(3 ight)}=gleft(z^{left(3 ight)} ight)=h_ heta(x))
    • 然后我们来求解代价函数对参数的梯度:(frac{partial}{partial heta^{left( 2 ight)}} Jleft( heta ight))(frac{partial}{partial heta^{left( 1 ight)}} Jleft( heta ight))
    • 根据链式求导法则,可以计算得到:

    [frac{partial}{partial heta^{left( 2 ight)}} Jleft( heta ight)=frac{partial Jleft( heta ight)}{partial a^{left( 3 ight)}}·frac{partial a^{left( 3 ight)}}{partial z^{left( 3 ight)}}·frac {partial z^{left( 3 ight)}}{partial heta^{left( 2 ight)}} ]

    - 其中,$frac{partial Jleft(	heta 
    ight)}{partial  a^{left( 3 
    ight)}}=frac{partial Jleft(	heta 
    ight)}{partial  h(x)}=-frac yh+(1-y)frac1{1-h}=frac{h-y}{h·(1-h)}$
    - $frac{partial a^{left( 3 
    ight)}}{partial z^{left( 3 
    ight)}}=frac{ e^{-z} }{ (1+e^-z)^2}=a^{left( 3 
    ight)}·left(1-a^{left( 3 
    ight)}
    ight)=h·(1-h)$
    - $frac {partial z^{left( 3 
    ight)}} {partial 	heta^{left( 2 
    ight)}}=a^{(2)}$
    - 所以可得:
    

    [frac{partial}{partial heta^{left( 2 ight)}} Jleft( heta ight)=(h-y)·a^{(2)}=delta^{left(3 ight)}·a^{(2)} ]

    • 同理,根据链式求导法则,计算:

    [frac{partial}{partial heta^{left( 1 ight)}} Jleft( heta ight)=frac{partial Jleft( heta ight)}{partial a^{left( 3 ight)}}·frac{partial a^{left( 3 ight)}}{partial z^{left( 3 ight)}}·frac {partial z^{left( 3 ight)}}{partial a^{left( 2 ight)}}·frac{partial a^{left( 2 ight)}}{partial z^{left( 2 ight)}}·frac {partial z^{left( 2 ight)}}{partial heta^{left( 1 ight)}} ]

    - 其中,由上可知,$frac{partial Jleft(	heta 
    ight)}{partial  a^{left( 3 
    ight)}}·frac{partial a^{left( 3 
    ight)}}{partial z^{left( 3 
    ight)}}=h-y=delta^{left(3
    ight)}$
    - $frac {partial z^{left( 3 
    ight)}}{partial a^{left( 2 
    ight)}}=	heta^{(2)}$
    - $frac{partial a^{left( 2 
    ight)}}{partial z^{left( 2 
    ight)}}=g^primeleft(z^{left(2
    ight)}
    ight)$
    - $frac {partial z^{left( 2 
    ight)}}{partial 	heta^{left( 1 
    ight)}}=a^{(1)}$
    - 所以可得:
    

    [frac{partial}{partial heta^{left( 1 ight)}} Jleft( heta ight)=delta^{left(3 ight)} heta^{(2)} g^primeleft(z^{left(2 ight)} ight) a^{(1)}=delta^{left(2 ight)}·a^{(1)} ]

    (lambda eq 0)时,即考虑正则化处理:

    [frac{partial}{partial Theta_{ij}^{left( l ight)}} Jleft(Theta ight) = D_{ij}^{left( l ight)}= frac1m Delta_{ij}^{left( l ight)} quad for quad j=0 ]

    [frac{partial}{partial Theta_{ij}^{left( l ight)}} Jleft(Theta ight) = D_{ij}^{left( l ight)}= frac1m Delta_{ij}^{left( l ight)}+frac{lambda}{m} Theta_{ij}^{left( l ight)} quad for quad j geq 1 ]

    参考资料

    BP(反向传播)神经网络

  • 相关阅读:
    第七章 深入理解多态
    第六章 继承和多态
    第五章 体验套餐管理系统
    第四章 深入类的方法
    第三章 使用集合组织相关数据
    第二章 深入C#数据类型
    mysql 创建表字段类型笔记
    梳理下phpmyadmin改root密码后登录不上的问题。
    easyui 验证控件 tooltip message显示位置
    random模块详解
  • 原文地址:https://www.cnblogs.com/yangdd/p/12419326.html
Copyright © 2020-2023  润新知