Neural Networks
为什么需要神经网络算法?
如上图,我们需要对复杂的样本进行分类,那么Linear的肯定不能满足我们的要求,但是如果使用Non-Linear的会产生过多的特征,(上图假设原特性有100个的话,如果是二次多项式展开,那么特性会膨胀到将近5000个)过多的特征将会导致overfitting,而Neural Networks恰好可以解决这个问题,这就是学习Neural Networks的动机.
Model Representation I
神经网络算法是用来模拟人类大脑行为的算法,具体来说就是模拟人类神经元的工作流程,神经树突作为输入(对应特性),神经细胞作为计算,神经轴作为输出(对应的值),如下图:
其中Layer1被称为Input Layer,Layer2被称为Hidden Layer, 等被称为activation function(sigmoid是一种常见的激活函数),Layer3被称为output layer, 被称为bias unit.
为的原因:是layer j 映射到 layer (j+1)的函数的参数,想象,加上bias unit之后,X是一个的矩阵,是一个的矩阵,那么可以推导出必须要是一个的矩阵.
Model Representation II
在这里我们用sigmoid函数作为layer2的激活函数,可以得到上面的表达式,继续精简,将vector x看作,则有,
vectorization
假设j+1层是output layer,那么有:
forward propagation
Neural Network做的事情就是,把原始的特征经过处理的输出作为layer 2的输入,layer 2的新特征经过的处理得到输出作为layer 3的输入,依次往前传播.仔细观察最后一层(如上图layer4),layer3 -> layer4的处理如果使用的激活函数是sigmoid函数的化,实际上就是之前讲过的logistic regression,只是不同的是他不再局限于使用原始的特征,而是通过中间的hidden layers加工后的新特征当作新特征,这样做的好处就是可以得到更灵活的(对比本笔记最开始那张图中僵硬的x的多项展开式).
Examples and Intuitions
Multiclass Classification
之前讨论的分类问题都是binary的,实际情况中可能如上图所示,结果并不是binary的,解决的办法还是和之前logistic regression一样使用one vs all的思想,此时我们最后一层返回的不是一个标量,而是一个向量:
以上4种情况分别对应行人,汽车,摩托车,卡车.
Cost Function
Neural Networking的代价函数如下:
其中:
L = 网络中layer的数量
= 第层中unit的数量(不包含bias unit)
K = output layer中unit的数量?
对比logistic regression的代价函数(如下),可以发现两者之间的形式相同:
- "[","]"中的值都是某个样本在某种预测下的代价,只不过对于Neural Networking来说,output layer的unit可能有多个,所以需要全部累加
- regularization部分做的都是将所有相加(除了),只不过对于Neural Networking来说,是一个矩阵而已
Backpropagation Algorithm
Backpropagation算法就是用在Neural Networking中用来求梯度的算法,之后我们可以通过梯度下降或者其他advanced optimization methods来求出最优的使得最小.
该算法分两个阶段,第一步forward propagation求
第二步back propagation
Backpropagation Intuition
从数学形式上来看,BP算法和FP类似,只不过是换了个方向:
FP
BP
可以看到FP和BP计算时形式几乎一致,只不过FP时from left to right依次计算,BP是from right to left依次计算(注意:,上图有误)
Unrolling Parameters
上文中我们得到了costFunction的定义,也有了partial derivative,所以我么可以和之前一样用fminunc()方法来costFunction的局部最优解,fminunc()定义如下:
可以看到fminunc函数需要传入的参数都是vector,但是在Neural networking中,无论是(多个vector),还是(partial derivative)都是matrices,所以我们需要unrolling操作将上两者转换成vector给到fminunc函数.
如上图,thetaVector将作为initalTheta给到fminunc函数,用于fminunc函数的costFunction基本如下:
上图中,由thetaVec还原得到我们可以使用reshape函数,如下:
Gradient Checking
backprop算法会有些bug使得我们在运算的过程中出现确实在下降但是实际上Neural Networking没有正常在工作.
所以一般来说我们需要实现Gradient Checking来校验backprop算法是否正确工作,实现细节如下:
首先对于来说,求导公式如下:
因为是一个matrix,我们将其unrolling成vector之后可以方便的循环求出对于矩阵中每个的偏导数,如下:
最后如果backprop算法求得的gradVecgradApprox则证明backprop在正常工作.在校验过bakprop算法正确性之后我们就可以将计算过程中的Gradient Checking功能关闭,因为他实在是太慢了.
Random Initialization
对于Neural Networking来说,在优化的时候,无论是用fminunc还是其他优化算法,初始的不能设置为相同(比如zeros(m*n)直接丢到fminunc中去),因为这样会导致hidden layer中每一个激活函数计算的值都是一样,不仅如此,每一层的值也会一样,对每一个求偏导值也一样,这意味着即使更新过之后中的元素依然会保持一致.所以我们需要使用Random Initialization,如下:
注意:
- 这里的和Gradient Checking中的没有关系
- rand(x,y)返回的矩阵元素在(0,1)之间,所以可以确保经过处理之后的
Putting it Together
梳理下Neural Networking全过程:
1.构建一个网络架构,input layer unit num?hidden layer num/unit num?output layer num.
2.训练Neural network,初始化,对于每一个样本计算,实现代价函数,实现backprop,使用gradient checking校验backprop是否正常工作,使用比如fminunc求出最优
注意:不同于之前的,Neural Network的代价函数是非凸的(non-convex),即很可能无法到达global minimum,不过local minimum也ok.
总结
做过ex4的练习之后,发现完成一个NN算法要经过以下几个主要步骤:
1.可以使用vectorization形式计算forward propagation部分
2.之后对于每个样本,我们去求每一个,并且在每一次循环中修改
3.循环结束之后对进行regularization,即是
以上过程要谨记和矩阵形式是一致的
4.再得到之后我们需要使用Gradient Checking去校验BP是否正常工作.
5.至此我们已经得到了正确的costFunction和,之后在使用fminunc获得最优,这样一来NN算法就完整了
6.之后就是给训练集之外的数据看看classification的准确性之类的