Andrew Ng Machine Learning (5) Neural Network Part2
此文是斯坦福大学 Andrew Ng 所开设的 Coursera 课程:Machine Learning 的课程笔记。
课程网址:
https://www.coursera.org/learn/machine-learning/home/welcome
上一篇文章,介绍了前向传播(forward propagation)的过程,以及神经网络计算非线性问题的例子(XOR问题)
这一篇文章,开始介绍,如何来计算神经网络中各种参数的方法:后向传播(backward propagation)
1. Cost Function
为了拟合神经网络的各个参数,我们首先需要规定一些变量:
不同分类问题:
若分为2类,其实用一个神经元作为输出层就可以了,用y=0和y=1区分;
多类问题,利用以前说过的,分为K类则最终的y∈R^K,例如分为三类的问题输出可选择为
因为同样是分类问题,我们回想一下逻辑回归的cost function,其实神经网络的相同,只不过是对于分为K类问题的版本而已:
是不是……太复杂了,如果用 cost function 计算梯度之后梯度直接梯度下降法来计算神经网络参数,明显不如接下来介绍的这种方法简单快捷。
2. Backpropagation
后向传播,是神经网络中用于替代直接计算梯度下降法,来设定各层参数的方法。方法的精髓在于,训练网络时先根据初始化的参数(一般是随机设定),计算得到最后一层(输出层)的输出,计算与实际网络输出之间的差,再根据当前层的差,反推出上一层的差,逐渐反推到第一层。每一层根据自身层的差,来逼近真实参数。
首先我们设定某l层的某j个神经元,与真实的神经元的值,两者的差距为,the error of node j in layer l.
对于输出层的每个神经元来说,可以直接计算:,向量化表示为
对于其他层的每个神经元而言,就需要依靠上一层神经元的计算结果来反推,反推的过程可以视为原本 Forwardpropagation 过程中分散到各个下一层神经元的水流沿着同样的道路再次汇聚到上一层的神经元中:
对于g′(t)的计算,这里需要一点点小技巧:
推导过程见下:
不存在δ(1),因为输入层没有误差
我们首先不考虑正则化项(最小化各个系数,得到计算各层各个单元的误差项之和
因此,我们得到求出神经网络各层参数的方法:
3. Gradient Checking
当我们需要验证求出的神经网络工作的对不对呢?可以使用 gradient checking,通过check梯度判断我们的code有没有问题
对于下面这个[θ−J(θ)]图,取θ点左右各一点(θ−ϵ)与(θ+ϵ),则点θ的梯度近似等于
对于神经网络中的情况,则有:
由于在backpropagation算法中我们一直能得到J(θ)的导数D(derivative),那么就可以将这个近似值与D进行比较
Summary:
(1) 在backpropagation中计算出J(θ)对θ的导数D并组成vector(Dvec)
(2) 用numerical gradient checking方法计算大概的梯度
(3) 看是否得到相同(or相近)的结果
(4) (非常重要)停止checking,只用 backpropagation 进行神经网络学习,否则会非常非常慢
4. Backpropagation in Practice
这一节我们来看看实际 octave/MATLAB 编程中的一些技巧,例如对于神经网络如下:
当s1=10,s2=10时,则有θ(1)∈R10×11,θ(2)∈R10×11,一般来说,为了方便变形与传递参数,我们是将所有θ展开成一个完整的变量:
thetaVec=[Theta1(:);Theta2(:);Theta3(:)]
再次展开的时候,例如重组为θ(1)时,取出其中前110个重组就好:
Theta1=reshape(thetaVec(1:110),10,11)
如何初始化各层的参数呢?这同样是一个需要注意的地方:不能将各层的各个神经元的参数赋值为相同的数。
有兴趣的同学可以计算一下,这样神经网络的某一层内的所有神经元计算都变得相同,这样神经网络的非线性程度就降低了。一般来说,都是在(+ϵ,−ϵ)之间随机赋值
我的神经网络需要有多少层呢?同样是个有趣的问题,一般来说,三层结构(仅仅一个隐藏层)已经足够来处理大部分非线性情况。如果分类效果不好,可以尝试使用更多的隐藏层,但需要保证每个隐藏层的神经元个数相同,层数越多就越慢,当然一般来说分类效果就更好
每层神经网络需要多少个神经元?能确定的只有输入层与输出层:1
2
3No. of input units: Dimension of features
No. output units: Number of classes
Other units: who knows… usually the more the better
5. Put it together
最终我们回顾一下神经网络的主要步骤:
randomly initialize weights
(for 1 to m) forward-propagation
(for 1 to m) cost function
(for 1 to m) backward-propogation
gradient checking, then stop