码迷,mamicode.com
首页 > 其他好文 > 详细

[深度之眼机器学习训练营第四期]神经网络之参数学习

时间:2020-02-06 23:28:35      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:导数   其他   函数   line   isp   log   参数   逻辑回归   输出   

损失函数

为了学习神经网络中的参数,我们要为神经网络模型定义损失函数。回想一下,逻辑回归可以将数据分成正例和负例两类,因此它的损失函数为:
\[ 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并不是一种好方法,那样在反向传播过程中所有的神经元就会重复地更新相同的值。一般来说,我们通常使用随机初始化方法。

[深度之眼机器学习训练营第四期]神经网络之参数学习

标签:导数   其他   函数   line   isp   log   参数   逻辑回归   输出   

原文地址:https://www.cnblogs.com/littleorange/p/12271174.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!