吴恩达机器学习(七)神经网络(反向传播)

目录

0. 前言

1. 代价函数(Cost Function)

2. 反向传播(back propagation)

3. 前向传播和反向传播的结合

4. 梯度检测(gradient checking)

5. 随机初始化


学习完吴恩达老师机器学习课程的神经网络,简单的做个笔记。文中部分描述属于个人消化后的理解,仅供参考。

如果这篇文章对你有一点小小的帮助,请给个关注喔~我会非常开心的~

0. 前言

上一篇文章中,介绍了神经网络的前向传播(forward propagation),前向传播是从输入层开始,不断前进计算参数、激活函数,直到传播至输出层。

反向传播(back propagation)从输出层开始,不断计算误差值,向后传播,传播至输入层,修改神经网络中的参数,得以更好的效果。

初始作如下定义:

  • L --- 神经网络的总层数
  • s_{l} --- 第 l 层的激活单元数量(不包括偏置单元)
  • K --- 输出层的单元数量
  • (h_{\theta}(x))_{k} --- 输出层第 k 个单元的输出值
  • \delta_{j}^{(l)} --- 第 l 层的第 j 个单元的误差

1. 代价函数(Cost Function)

在逻辑回归中,我们的代价函数为 J(\theta)= -\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}log(h_{\theta}(x^{(i)}))+(1-y^{(i)})log(1-h_{\theta}(x^{(i)}))]+ \frac{\lambda}{2m}\sum_{j=1}^{n}\theta_{j}^{2} ,前一部分为 h_{\theta}(x) 的代价,后一部分为正则化项(减少不重要的特征的权重),而在神经网络中,我们可以定义为如下:

\large \begin{align*} J(\theta)&= -\frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{K}[y^{(i)}_{k}log(h_{\theta}(x^{(i)})_{k})+(1-y^{(i)}_{k})log(1-h_{\theta}(x^{(i)})_{k})]\\&+ \frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_{l}}\sum_{j=1}^{s_{l+1}}(\theta_{ji}^{(l)})^{2}\end{align*}

与逻辑回归相比,前一项中对输出层每一个单元进行了求和,后一项中对每一层的每一个 \theta 进行了平方求和(正则化项)。

2. 反向传播(back propagation)

给出一个4层的神经网络的例子如下(图源:吴恩达机器学习):

吴恩达机器学习(七)神经网络(反向传播)_第1张图片

对于输出层的误差,可定义为 \delta_{j}^{(4)}=a_{j}^{(4)}-y_{j} ,如果将其向量化,可写成 \delta^{(4)}=a^{(4)}-y ,计算反向传播的过程如下:

\large \begin{align*} \delta^{(4)} &= a^{(4)}-y \\ \delta^{(3)} &= (\theta^{(3)})^{T}\delta^{(4)}.*{g(z^{(3)})}' \\ \delta^{(2)} &= (\theta^{(2)})^{T}\delta^{(3)}.*{g(z^{(2)})}' \end{align*}

其中,不存在 \delta^{(1)} ,因为输入层不存在误差。如果忽略正则项,可近似如下:

\large \frac{\partial }{\partial \theta_{ij}^{(l)}}J(\theta)=a_{j}^{(l)}*\delta_{i}^{(l+1)}

3. 前向传播和反向传播的结合

通过前向传播,可以由输入层传递信息至输出层,得到最终输出;再通过反向传播,从输出层传回至输入层,修改参数、优化模型。可以通过以下定义步骤:

吴恩达机器学习(七)神经网络(反向传播)_第2张图片

其中, \frac{\partial }{\partial \theta_{ij}^{(l)}}J(\theta)=D_{ij}^{(l)} 。因此,可继续使用梯度下降算法,对每一个神经单元间的 \theta 进行优化。

正规来说,误差定义如下:

\large \begin{align*} \delta_{j}^{(l)}&=\frac{\partial }{\partial z_{j}^{(l)}}cost(i) \\ cost(i)&=y^{(i)}log(h_{\theta}(x^{(i)}))+(1-y^{(i)})log(1-h_{\theta}(x^{(i)})) \end{align*}

注:在神经网络的计算中,J(\theta) 是非凸函数,理论上会收敛于局部最小值,但实际运用中,神经网络还是可以收敛于接近全局最小值的局部最小值的。

4. 梯度检测(gradient checking)

对于一点的 J(\theta) ,可近似为 \frac{\partial }{\partial \theta}J(\theta)\approx \frac{J(\theta+\xi)-J(\theta-\xi)}{2\xi} ,\xi 为一很小的数。

通过此方法,验证上述的反向传播正确性。

注:当证明反向传播正确时,需关闭梯度检测,因梯度检测计算量巨大,时间复杂度高。

5. 随机初始化

当我们设 \theta_{ij}^{(l)}=0\ (for\ all\ i,j,l) 时,随着前向传播和反向传播的计算,所有激活单元的参数会是一致的,导致模型效果较差。

所以我们采用随机初始化,设 \theta_{ij}^{(l)} \in [-\xi,\xi] ,\xi 为一很小的数。


如果这篇文章对你有一点小小的帮助,请给个关注喔~我会非常开心的~

 

 

 

你可能感兴趣的:(机器学习)