美文网首页
Machine Learning - Andrew Ng 笔记(

Machine Learning - Andrew Ng 笔记(

作者: nafoahnaw | 来源:发表于2019-09-29 10:10 被阅读0次

Neural Networks

为什么需要神经网络算法?

Non-Linear Hypotheses
如上图,我们需要对复杂的样本进行分类,那么Linear的肯定不能满足我们的要求,但是如果使用Non-Linear的会产生过多的特征,(上图假设原特性有100个的话,如果是二次多项式展开,那么特性会膨胀到将近5000个)过多的特征将会导致overfitting,而Neural Networks恰好可以解决这个问题,这就是学习Neural Networks的动机.

Model Representation I

神经网络算法是用来模拟人类大脑行为的算法,具体来说就是模拟人类神经元的工作流程,神经树突作为输入(对应特性),神经细胞作为计算,神经轴作为输出(对应h_\theta(x)的值),如下图:

Neural Network
其中Layer1被称为Input Layer,Layer2被称为Hidden Layer, 等被称为activation function(sigmoid是一种常见的激活函数),Layer3被称为output layer, 被称为bias unit.
Neural Network
为的原因:是layer j 映射到 layer (j+1)的函数的参数,想象,加上bias unit之后,X是一个的矩阵,是一个的矩阵,那么可以推导出必须要是一个的矩阵.

Model Representation II

recap
a=g(z)
在这里我们用sigmoid函数作为layer2的激活函数,可以得到上面的表达式,继续精简,将vector x看作,则有,

vectorization

z^{(j)}=\Theta^{(j-1)}a^{(j-1)}
a^{(j)}=g(z^{(j)})
假设j+1层是output layer,那么有:
h_\Theta^{(x)}=a^{(j+1)}=g(z^{(j+1)})

Neural Network architecture

forward propagation

Neural Network做的事情就是,把原始的特征x_1,x_2...x_n经过\Theta^{(1)}处理的输出作为layer 2的输入,layer 2的新特征a_1,a_2...a_{n_2}经过\Theta^{(2)}的处理得到输出作为layer 3的输入,依次往前传播.仔细观察最后一层(如上图layer4),layer3 -> layer4的处理如果使用的激活函数是sigmoid函数的化,实际上就是之前讲过的logistic regression,只是不同的是他不再局限于使用原始的特征,而是通过中间的hidden layers加工后的新特征当作新特征,这样做的好处就是可以得到更灵活的h_\Theta(x)(对比本笔记最开始那张图中僵硬的x的多项展开式).

Examples and Intuitions

OR NOR

Multiclass Classification

One vs all

之前讨论的分类问题都是binary的,实际情况中可能如上图所示,结果并不是binary的,解决的办法还是和之前logistic regression一样使用one vs all的思想,此时我们最后一层返回的不是一个标量,而是一个向量:


y

以上4种情况分别对应行人,汽车,摩托车,卡车.

Cost Function

Neural Networking的代价函数如下:

Neural Networking Cost Function
其中:
L = 网络中layer的数量
= 第层中unit的数量(不包含bias unit)
K = output layer中unit的数量?
对比logistic regression的代价函数(如下),可以发现两者之间的形式相同:
Logistic Regression Cost Function
  • "[","]"中的值都是某个样本在某种预测下的代价,只不过对于Neural Networking来说,output layer的unit可能有多个,所以需要全部累加
  • regularization部分做的都是将所有\theta^2相加(除了\theta_0),只不过对于Neural Networking来说,\Theta^{(i)}是一个矩阵而已
    Cost part & Regularization part

Backpropagation Algorithm

Backpropagation算法就是用在Neural Networking中用来求梯度的算法,之后我们可以通过梯度下降或者其他advanced optimization methods来求出最优的\theta使得J(\theta)最小.
该算法分两个阶段,第一步forward propagation求a^{(j)}

forward propagation
第二步back propagation
back propagation

Backpropagation Intuition

Error Compute Error
从数学形式上来看,BP算法和FP类似,只不过是换了个方向:
FP


BP


可以看到FP和BP计算时形式几乎一致,只不过FP时from left to right依次计算,BP是from right to left依次计算(注意:\delta_1^{(4)}=a_1^{(4)} - y^{(i)},上图有误)

Unrolling Parameters

上文中我们得到了costFunction的定义,也有了partial derivative,所以我么可以和之前一样用fminunc()方法来costFunction的局部最优解,fminunc()定义如下:

fminunc
可以看到fminunc函数需要传入的参数都是vector,但是在Neural networking中,无论是(多个vector),还是(partial derivative)都是matrices,所以我们需要unrolling操作将上两者转换成vector给到fminunc函数.
unrolling
如上图,thetaVector将作为initalTheta给到fminunc函数,用于fminunc函数的costFunction基本如下:
costFunction
上图中,由thetaVec还原得到我们可以使用reshape函数,如下:
reshape

Gradient Checking

backprop算法会有些bug使得我们在运算的过程中出现J(\Theta)确实在下降但是实际上Neural Networking没有正常在工作.
所以一般来说我们需要实现Gradient Checking来校验backprop算法是否正确工作,实现细节如下:
首先对于J{(\Theta)}来说,求导公式如下:

derivative of cost function
因为是一个matrix,我们将其unrolling成vector之后可以方便的循环求出对于矩阵中每个的偏导数,如下:
partial derivative
最后如果backprop算法求得的gradVecgradApprox则证明backprop在正常工作.在校验过bakprop算法正确性之后我们就可以将计算过程中的Gradient Checking功能关闭,因为他实在是太慢了.

Random Initialization

对于Neural Networking来说,在优化J(\Theta)的时候,无论是用fminunc还是其他优化算法,初始的\Theta不能设置为相同(比如zeros(m*n)直接丢到fminunc中去),因为这样会导致hidden layer中每一个激活函数计算的值都是一样,不仅如此,每一层的\delta值也会一样,J(\Theta)对每一个\Theta_{i,j}^{(l)}求偏导值也一样,这意味着即使更新过\Theta之后\Theta中的元素依然会保持一致.所以我们需要使用Random Initialization,如下:

Random Initialization
注意:
  • 这里的\epsilon和Gradient Checking中的没有关系
  • rand(x,y)返回的矩阵元素在(0,1)之间,所以可以确保经过处理之后的-\epsilon<\Theta<\epsilon

Putting it Together

梳理下Neural Networking全过程:
1.构建一个网络架构,input layer unit num?hidden layer num/unit num?output layer num.

Pick a network architecture
2.训练Neural network,初始化,对于每一个样本计算,实现代价函数,实现backprop,使用gradient checking校验backprop是否正常工作,使用比如fminunc求出最优
for loop
Neural networking intuition
注意:不同于之前的,Neural Network的代价函数是非凸的(non-convex),即很可能无法到达global minimum,不过local minimum也ok.

总结

做过ex4的练习之后,发现完成一个NN算法要经过以下几个主要步骤:
1.可以使用vectorization形式计算forward propagation部分
2.之后对于每个样本,我们去求每一个\delta^{(l)},并且在每一次循环中修改\Delta^{(l)}
3.循环结束之后对\Delta^{(l)}进行regularization,即是D^{(l)}
以上过程要谨记\Delta^{(l)}\Theta^{(l)}矩阵形式是一致的
4.再得到D^{(l)}之后我们需要使用Gradient Checking去校验BP是否正常工作.
5.至此我们已经得到了正确的costFunction和grad,之后在使用fminunc获得最优\Theta,这样一来NN算法就完整了
6.之后就是给训练集之外的数据看看classification的准确性之类的

相关文章

网友评论

      本文标题:Machine Learning - Andrew Ng 笔记(

      本文链接:https://www.haomeiwen.com/subject/qkspyctx.html