损失函数
为了学习神经网络中的参数,我们要为神经网络模型定义损失函数。回想一下,逻辑回归可以将数据分成正例和负例两类,因此它的损失函数为:
\[
J(\theta) = -\frac{1}{n}\sum_{i=1}^n \left[y^{(i)}\log(h_\theta(x^{(i)}) ) + (1-y^{(i)})\log(1-h_\theta(x^{(i)}))\right] + \frac{\lambda}{2n}\sum_{j=1}^n\theta^2_j
\]
而对于神经网络模型,其输出层可能有多个神经元,因此我们需要在逻辑回归损失函数的基础上考虑多个类别的问题。假设模型共有\(K\)个输出层神经元,那么其损失函数为:
\[
\begin{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)\right] + \frac{\lambda}{2n}\sum_{l=1}^{L-1} \sum_{i=1}^{s_l} \sum_{j=1}^{s_{l+1}} ( \Theta_{j,i}^{(l)})^2\end{gathered}
\]
其中\(L\)表示神经网络模型的层数,\(s_{l}\)则表示每一层神经元的数量。
误差反向传播算法
神经网络的参数学习过程是通过误差反向传播算法与梯度下降法(或其他优化算法)完成的,其中误差反向传播算法用来计算每层参数的梯度,梯度下降法用来更新每一层的参数。在介绍误差反向传播算法之前,我们先回顾一下前向传播的过程。
假设我们有一个4层的神经网络,每层的参数用\(\Theta^{(l)}\)表示,激活函数使用sigmoid函数,那么它的前向传播进行预测过程如下:
\[
\begin{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)}\)表示每层的误差。首先,我们先来看一下最后一层的误差是如何计算的:
\[
\begin{aligned}
\delta^{(4)} = \frac{\partial J}{\partial z^{(4)}}
&= \frac{\partial}{\partial z^{(4)}}\left[-y\log(h_{\Theta}(x)) -(1-y)\log(1-h_{\Theta}(x))\right]\ &= \frac{\partial}{\partial z^{(4)}}[-y\log(g(z^{(4)}))-(1-y)\log(1-g(z^{(4)}))]\ &= -y\frac{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积:
\[
\begin{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)}\right)^T \delta^{(4)}\right) \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)}\right)^T \delta^{(l+1)}\right) \circ g'(z^{(l)}) \quad 2 \le l \le L-1
\]
在求解出每一层的梯度后,我们就可以使用不同的优化算法,比如梯度下降,来更新神经网络模型的参数了。
随机初始化
在训练神经网络的过程中,参数初始化方式非常关键。将所有的参数初始化为0并不是一种好方法,那样在反向传播过程中所有的神经元就会重复地更新相同的值。一般来说,我们通常使用随机初始化方法。
原文地址:https://www.cnblogs.com/littleorange/p/12271174.html