机器学习笔记(九) 神经网络的学习

来源:互联网 发布:数据库去掉重复行 编辑:程序博客网 时间:2024/04/24 23:41

1.代价函数

   首先引入一些新记法,便于稍后讨论。

   假设神经网络的样本有m个,每个样本包含一组输入x和一组输出信号y,L表示神经网络的层数,Sl即第l层的单元个数(不包括偏置单元)。

   将神经网络的分类定义为两种情况:二类分类和多类分类。

  

   在逻辑回归中,我们的代价函数:

  

   我们只有一个输出变量,也只有一个因变量y。但是在神经网络中不同,我们可以有很多输出变量,我们的hθ(x)是一个维度为k的向量,并且我们训练集中的因变量也是同样维度的向量,一次我们的代价函数会更复杂。

   神经网络的代价函数:

  

   代价函数虽然看起来复杂,但是背后的思想相同,我们希望通过代价函数来观察算法预测的结果与真实情况的误差。不同的地方在于,对于每一行特征,我们都会给出k个预测,预测k个不同的结果,选择其中可能性最高的一个,与y中的实际数据比较。后面的正则化是排除了每一层的θ0后,每一层的θ矩阵的和。最里层的循环j循环所有的行,外面的i循环所有的列。


2.反向传播算法

   和线性回归和逻辑回归类似,神经网络也可以用梯度下降算法,但是神经网络比较复杂,该如何计算梯度?

   需要如下两个式子:

    

   在前面,我们给出了前馈网络的计算方法,对于一个给定训练样本的神经网络,通过前向传播的方式从输入层开始,正向一层一层进行计算,直到最后一层。

   现在,为了计算代价函数的偏导数,我们需要一种反向传播算法。其核心是最小化网络输出值和目标值之间的误差。首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直至倒数第二层。

   对下面的神经网络:

  

   利用前向传播算法的计算方法:

  

   我们从最后一层的误差开始计算,误差是激活单元的预测与实际值之间的误差,用δ表示。即

   再利用这个误差去计算前一层的误差:

     

   其中是S型函数的导数,是权重导致的误差的和。

   下面继续计算第二层的误差:

    

   第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数,假设λ=0,不做正则化处理,偏导数计算如下:

  

   上面的式子中,各个参数的意义:

    l:目前所计算的是第几层;

    j:目前计算层中的激活单元的下标,也是下一层第j个输入变量的下标;

    i:下一层中误差单元的下标;

   现在我们给出一个完整的后向传播算法,表示误差矩阵:

  

   首先正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差用反向传播方法计算出知道第二层的误差。


3.反向传播算法的直观解释

   相比较于线性回归和逻辑回归,从数学的角度上,反向传播算法显得非常复杂,所以更需要我们仔细梳理,多做练习。

   再来仔细研究下前向传播的原理:

   前向传播算法:

  

   上面的神经网络,它有四层,除了输出层有一个单元,其他每层都有两个单元。对于一个训练样本,可以通过前向传播的方式计算各个相关单元,如下图:

  

   至于反向传播的做法:

   首先简化神经网络的代价函数:

  

   仅关注一个样本,化简:

  

   反向传播算法的过程:

  


4.梯度下降算法的检验

   当我们对一个较为复杂的模型,比如说神经网络使用梯度下降算法时,可能会存在一些不容易发觉的错误,虽然代价看上去在不断减小,但是有可能不是最优解。

   为了避免这样的错误,我们采取一种叫做梯度的数值检验。

   对梯度的估计采用的方法是在代价函数上沿着切线的方向选择两个距离很近的点,然后计算两个点的平均值用来估计梯度。

  

   对点θ,计算出在θ-ε处和θ+ε处的代价值(ε很小),然后求两个代价的平均值,用来估计θ处的代价值。

  

   同理,对于多元参数和参数向量来说,同样适用。

  

   当然,我们的主要目标是检查这个梯度的近似向量与反向传播算法得到的梯度向量是否近似相等:

  

   需要注意的地方:

   首先实现反向传播算法来计算梯度向量DVec。

   其次实现梯度的近似向量;

   确保计算的值近似相等;

   在实际的神经网络学习时,使用反向传播算法,关掉梯度检查;

   确保在训练分类器时关闭梯度检查的代码,否则代码运行效率很低。


5.随机初始化

   任何优化算法都需要一些初始的参数。在以前,我们初始所有的参数为0,这在逻辑回归中是可行的,但对于神经网络来说不可行。

   如果我们初始所有的参数为0,这意味着我们第二层的所有激活单元都会有相同的值。同理,如果所有的参数初始为一个相同的非0的数,结果也是一样的。

   这个问题又称为对称的权重问题,为了打破这种对称,提供一种随机初始化参数向量的方法:

   初始化参数为正负ε之间的随机值,ε可以很小。

  


6.综合

   总结下使用神经网络时的步骤:

   首先要确定网络结构,决定选择多少层以及每层有多少个单元。

   第一层的单元数是我们训练集的特征数量;最后一层的单元数是我们训练集结果的类的数量。如果隐藏层数大于1,要保证每个隐藏层的单元个数相同,一般来说,单元个数越多越好。

   我们真正要决定的是隐藏层的层数和每个中间层的单元数。

  


   确定好神经网络的结构后,训练神经网络:

   参数的随机初始化;

   正向传播计算所有hθ(x);

   计算代价函数;

   反向传播算法计算偏导数;

   梯度检查检验这些偏导数;

   优化算法来最优化代价函数;





原创粉丝点击