神经网络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(反向传播)神经网络

原文地址:https://www.cnblogs.com/yangdd/p/12419326.html