Programming Exercise 4:Neural Networks Learning
神经网络模型由输入层、隐藏层和输出层组成。每一层都能够看作是上一层(如果有)的输出层和下一层(如果有)的输入层。
先来介绍一下向前传递算法。如图1所示即为简单的三层神经网络模型向前传递算法的计算过程。我们可以a (L) 表示第L层单元的数据,与逻辑回归类似,a (L) =g(z (L) ) 这样可以很容易看出哪一个分类是可能性最大的。需要注意的是,每一层的a (L) 在计算下一层的z (L+1) 时,应该加上偏移单元(bias unit),这和线性回归的常数项有些类似。
在神经网络每一层之间的计算时,我觉得难点在于对矩阵各行列意义的理解,如果理解不好的话,code的时候很容易产生矩阵大小不匹配相乘或想相加的问题。常见的问题是由于每一层Θ 的矩阵形式都不一样,必须很小心的注意每一层Θ 矩阵行列大小,由图也能看出,第L层Θ (L) 矩阵的维数为(s L +1)∗s L+1 ,因为行代表了下一层单元的个数,列代表上一层单元个数(由于存在偏移单元,因此+1)。
理解了如何向前传递参数之后,就能通过输出层数据来得到costfunction了。如图2所示。
式子看上去很复杂,实际上并不难,两个求和符号最里面实际上就是逻辑函数的costfunction,只不过二分类问题变成了k分类问题。第一个求和符号就是将输出层(预测的结果)与实际分类每一位的差进行求和,例如:假设实际分类为5,即y=[0,0,0,0,1,0,0,0,0] T ,而输出层为out=[0.1,0.2,0.1,0.1,0.9,0.1,0.1,0.1,0.1] ,那么求和结果就是sum(y−out) ,这是对y和out向量误差的一个综合量。 第二个求和符号则是对m个训练集的误差进行求和,这和逻辑函数表达的方式一样,就不在此赘述了。
为了防止过拟合,可以通过正则化(regularized)的方法修改costfunction,然后进行模型训练。对于神经网络模型,正则化后的costfunction为:
正则化项就是将每层的Θ 的每一项都平方求和(对每一项都惩罚的原因是,不能判断哪一项影响过大),需要注意的是,计算时要将偏移单元排除在外(一种约定)。
上述为向前传递算法的基本过程,下面开始介绍BP神经网络(Backpropagation neural networks )的过程,BP神经网络利用向前传递的算法得到的结果与训练值的误差,反向得到每一层的误差向量,最后根据每一层的误差向量确定梯度下降的方向。下面第一个式子代表最后一层的误差(此例为3层神经网络),第二个式子则代表误差向量反向的传播,具体推导暂时还没有学到。得到了每一层的误差向量δ (L) 以及向前传递算法中得到的a (L) 后,根据第三和第四个式子可以计算出整个模型的梯度方向。
BP神经网络下降梯度 |
---|
得到了梯度方向,之后便是关于正则化、利用数值方法进行梯度的检查、以及matlab自带的fmincg函数求最值的方法,以后有时间再介绍了。