现在的位置: 首页 > 综合 > 正文

斯坦福机器学习-week5 学习笔记(1)——神经网络训练BP算法与Gradient checking

2017年12月25日 ⁄ 综合 ⁄ 共 1293字 ⁄ 字号 评论关闭

一.神经网络的cost function

    对于神经网络,可以用下图表示一个神经网络

    因此,对于神经网络来说,cost function J(θ)的定义如下:


二.神经网络的训练算法(Backpropagation algortithm)

   对于一中定义的神经网络的cost function J(θ),我们可以使用梯度下降算法来求解使得cost function J(θ)最小的参数,不过在神经网络中,可以利用梯度算法的一个变形--BP算法来对参数进行训练。


2.1 一个样本时的BP算法

   BP算法的第一步是前向传递的过程,即按照神经网络的结构,计算每一层神经元的输出,如下图所示

   在前向计算结束之后,就可以开始计算方向的过程了,也就是将误差反向进行传递,从输出层传递到输入层,具体方法如下图


  

2.2 样本集时的BP算法

   上面是只有一个样本时的计算梯度的过程,对于一个样本集时,训练的过程如下图所示:


2.3 BP算法的推导
    具体的提到过程可以看我以前写的一篇博客:Back
Propagation
算法推导过程
。推导的过程应该是没有问题的,不过,细心的人会发现,为什么在输出层的时候,我的的表达式和Andrew
Ng的表达式不同,刚开始我也纠结了很久,以为是自己推导有错,后面发现,其实是我的cost function的定义与Andrew Ng的定义不同,所以导致了在输出层直接对cost function求导的过程中不同,才导致了的表达不同,不过这个并不会很大程度的影响参数的训练过程。



三.梯度检查(Gradient checking)


    有时,我们在实现BP的算法的过程中,可能会出现一些逻辑的bug,这些bug在调试过程中是很难被发现的,因此,需要一些方法能够让我们很方便的发现神经网络实现过程中的逻辑上的bug。
    在神经网络的训练过程中,BP算法就是梯度下降算法的一般变形,因此,本质上,BP算法也是一个计算梯度的过程,因此梯度检查(Gradient checking)对于验证BP算法的实现是否有问题是一个很有帮助的方法。
    在数学上,函数J(θ)对于参数θ的梯度的计算可以用下图蓝色框中的式子进行计算。
   
    
    对于含有多个参数的cost function J(θ), 其对于每一个参数θi的计算可以用下图中的式子进行:
 
    
    对于有n个参数θ来说,可以使用下面的步骤对BP算法进行检查:

   在实现过程中,有下面几点需要注意的:
   其中,梯度检查是在调试代码的过程中进行的,在实际用于BP算法进行参数训练时,不能进行梯度检查,不能会导致训练过程十分缓慢。
   


四.随机初始化
    对于神经网络来说,如果将所有的参数都初始化为零,会导致在进行每一步训练的过程中,连接到每一个神经元的连接权重相同,导致了神经网络在训练的过程中,只能学习到一种特征(如果每一个神经元与前一层的连接权重不一样的话,神经网络就能够学习到不同的特征)。
    因此,必须对神经网络进行随机初始化,打破神经网络的对称,这样才可以迫使网络学习不同的特征。具体的做法是将神经网络每一层的参数都随机初始化为一个高斯分布中的数,如下图所示









抱歉!评论已关闭.