[深度之眼机器学习训练营第四期]神经网络之参数学习
Posted littleorange
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[深度之眼机器学习训练营第四期]神经网络之参数学习相关的知识,希望对你有一定的参考价值。
损失函数
为了学习神经网络中的参数,我们要为神经网络模型定义损失函数。回想一下,逻辑回归可以将数据分成正例和负例两类,因此它的损失函数为:
[
J( heta) = -frac{1}{n}sum_{i=1}^n left[y^{(i)}log(h_ heta(x^{(i)}) ) + (1-y^{(i)})log(1-h_ heta(x^{(i)}))
ight] + frac{lambda}{2n}sum_{j=1}^n heta^2_j
]
而对于神经网络模型,其输出层可能有多个神经元,因此我们需要在逻辑回归损失函数的基础上考虑多个类别的问题。假设模型共有(K)个输出层神经元,那么其损失函数为:
[ egin{gathered} J(Theta) = - frac{1}{n} sum_{i=1}^n sum_{k=1}^K left[y^{(i)}_k log ((h_Theta (x^{(i)}))_k) + (1 - y^{(i)}_k)log (1 - (h_Theta(x^{(i)}))_k) ight] + frac{lambda}{2n}sum_{l=1}^{L-1} sum_{i=1}^{s_l} sum_{j=1}^{s_{l+1}} ( Theta_{j,i}^{(l)})^2end{gathered} ]
其中(L)表示神经网络模型的层数,(s_{l})则表示每一层神经元的数量。
误差反向传播算法
神经网络的参数学习过程是通过误差反向传播算法与梯度下降法(或其他优化算法)完成的,其中误差反向传播算法用来计算每层参数的梯度,梯度下降法用来更新每一层的参数。在介绍误差反向传播算法之前,我们先回顾一下前向传播的过程。
假设我们有一个4层的神经网络,每层的参数用(Theta^{(l)})表示,激活函数使用sigmoid函数,那么它的前向传播进行预测过程如下:
[
egin{aligned}
a^{(1)} &= x z^{(2)} &= Theta^{(1)}a^{(1)} a^{(2)} &=g(z^{(1)}) z^{(3)} &= Theta^{(2)}a^{(1)} a^{(3)} &=g(z^{(3)}) z^{(4)} &= Theta^{(3)}a^{(3)} h_{Theta}(x)&=a^{(4)} =g(z^{(4)})\end{aligned}
]
误差反向传播,顾名思义,就是误差沿着神经网络从最后一层传递到第一层。我们用(delta^{(l)})表示每层的误差。首先,我们先来看一下最后一层的误差是如何计算的:
[ egin{aligned} delta^{(4)} = frac{partial J}{partial z^{(4)}} &= frac{partial}{partial z^{(4)}}left[-ylog(h_{Theta}(x)) -(1-y)log(1-h_{Theta}(x)) ight] &= frac{partial}{partial z^{(4)}}[-ylog(g(z^{(4)}))-(1-y)log(1-g(z^{(4)}))] &= -yfrac{1}{g(z^{(4)})}g(z^{(4)})(1-g(z^{(4)}))-(1-y)frac{1}{1-g(z^{(4)})}(-1)g(z^{(4)})(1-g(z^{(4)})) &= -y(1-g(z^{(4)})) +(1-y)g(z^{(4)}) &= g(z^{(4)}) -y &= a^{(4)} - y end{aligned} ]
通过求导计算出第4层的误差后,我们就可以通过链式法则计算前面几层的误差,这里给出了第3层的误差计算过程,其中(circ)表示矩阵的Hadamard积:
[ egin{aligned} delta^{(3)} = frac{partial J}{partial z^{(3)}} &=frac{partial J}{partial z^{(4)}} frac{partial z^{(4)}}{partial z^{(3)}} &= frac{partial J}{partial z^{(4)}} frac{partial z^{(4)}}{partial a^{(3)}}frac{partial a^{(3)}}{partial z^{(3)}} &=left(left(Theta^{(3)} ight)^T delta^{(4)} ight) circ g'(z^{(3)}) end{aligned} ]
其中sigmoid函数的导数(g'(cdot))为:
[
g'(z^{(l)}) = a^{(l)} circ (1-a^{(l)})
]
通过链式法则和下面的公式,我们可以按照顺序求出(delta^{(L-1)},delta^{(L-2)},cdots,delta^{(2)}):
[
delta^{(l)} = left(left(Theta^{(l)}
ight)^T delta^{(l+1)}
ight) circ g'(z^{(l)}) quad 2 le l le L-1
]
在求解出每一层的梯度后,我们就可以使用不同的优化算法,比如梯度下降,来更新神经网络模型的参数了。
随机初始化
在训练神经网络的过程中,参数初始化方式非常关键。将所有的参数初始化为0并不是一种好方法,那样在反向传播过程中所有的神经元就会重复地更新相同的值。一般来说,我们通常使用随机初始化方法。
以上是关于[深度之眼机器学习训练营第四期]神经网络之参数学习的主要内容,如果未能解决你的问题,请参考以下文章