Machine Learning 学习笔记 Week5 _ _ 神经网络之学习

       本周的内容更主要涉及神经网络的学习的理论部分,包括costFunction,Backpropagation 算法;同时还讲了很多在神经网络实践中一些实用的方法:包括如何检验算法是否运行正确的梯度检验法、还有向量和矩阵之间的形式互换、求解参数时初始参数的随机初始化。

1、CostFunction

          正如我们前面学习的线性回归和逻辑回归,我们还是首先来看看神经网络算法的costFunction,然后再通过最优化costFunction来得到符合我们要求的参数。

       首先定义几个我们后面需要使用的变量:





      从以上定义不难发现,神经网络的costFunction和我们前面学的逻辑回归的costFunction非常相似,区别就是求和时多了个K,这是因为这是一个multi-class分类,有K个类别,对每个分类所造成的cost都要进行求和。

2、Backpropagation 算法

backpropagation是神经网络中用来最小化cost function的一种技术。正如同我们在前面线性回归中利用梯度下降法所做的那样。

我们的目标就是。

要达到这个目的,如前面的所言,我们首先要计算下面两项:

 

然后再利用一些高级的优化算法即可。所以这里的重点就是如何求了。

在backpropagation中,我们将要在每个节点计算:

:第l层第j个节点的误差

l层第j个节点的激励

backpropagation,顾名思义,我们从最后一层往前面推。

对于最后一层L,我们可以得到:

其中L就是我们之前定义的神经网络的层数;是最后一层各个单元的激励的向量形式;因此最后一层的误差就是简单的输出和正确的值y的差。

为了得到前面每层的的值,我们可以用下面这个公式从右往左推导:


上面这个公式需要说明的是“”代表的是对应元素相乘;激励函数g,是其输入。利用微积分知识可以推出:


将式子代入,可以得到完整的表达式:


上式得推导和证明很复杂,但是我们可以使用它进行计算而忽略其中的细节。

计算所有的值完后,我们可以得到:


这个公式没有加上正则化。

接下来我们把上面所有的等式放在一起总结一下Backpropagation Algorithm:

1、给定一个数据集

2、对所有的,

3、对于每个训练数据

----

-----利用forward propagation计算每一层

----- 

-----利用计算

-----

4、   

5、      

而这就是我们需要求得导数:

3、unrolling matrix to vector

当我们得到上述的cost Function和其导数后,我们可以利用类似于“fminunc”这些函数、高级算法求解最优化问题,可是在这些函数、算法中变量一般是以vector形式存在的;但是我们上面求得的变量:都是以矩阵形式存在的,因此为了方便计算,我们需要将矩阵变换为长向量形式。

在matlab中,例如:假设是一个10*11的矩阵

%将矩阵拼凑成长向量

%去除长向量中对应得部分并变形成矩阵形式


4、梯度检验

神经网络由于太过复杂,我们甚至有时都搞不懂背后到底是怎么在运作的,所以有时候可能出现错误我们难以发现。

因此下面我们就来介绍一种方法--梯度检验法,用于确定我们的算法是否运行正确。

我们可以近似的计算cost function的导数:


因为我们的神经网络中参数很多,因此对每一个参数导数:


显然,越小,导数越接近,可是当它太小时,会导致数值问题;Ng. Andrew一般使用

在matlab中,可以参考以下代码:

epsilon = 1e-4;
for i = 1:n,
  thetaPlus = theta;
  thetaPlus(i) += epsilon;
  thetaMinus = theta;
  thetaMinus(i) -= epsilon;
  gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end;

接下来我们就检验 gradApprox  deltaVector

验证完后,大家一定要记住,关掉梯度检验,因为这个过程非常缓慢。


5、参数随机初始化

在我们之前介绍过的线性回归中,当我们求解theta参数时,首先一般是将它们初始化为0。

但是在神经网络中,假如我们也这样做的话,会发生什么情况呢?


图中,线相同的代表权重一样。那么根据我们前面的公式有:

  由于一样,x一样,就造成输出一样了。假设我们有n个unit,最终都输出一样,那么显然这n个unit所涵盖的信息量也就是一个unit所涵盖的信息量了。因此我们必须避免这种情况的发生。

引入了参数随机初始化:

我们把每个参数初始化为中的一个数:


(Linput:输入项个数;Loutput:输出项个数;rand()函数会随机产生一个在0-1之间的数)


总结:

第一步,选择一个网络架构;选择神经网络每个隐藏层包含的units数目,和总共的层数

输入的units数=特征的维数

输出的untis数=类别的数目

每个隐藏层包含多少个units=通常来说。越多越好(但是要考虑到计算量也会随之急剧增加)

通常来说,我们会选择一个隐藏层;当多余一个隐藏层的时候,每个隐藏层的单元数目是一样多的。


训练一个神经网络:

1、随机初始化权重(theta参数)

2、执行前向传输算法得到

3、执行cost function

4、执行后向传输算法计算偏导数

5、使用梯度检验方法确认算法是否运行正确,然后关闭梯度检验算法

6、使用梯度下降或者更高级的优化算法最优化cost function

对每一个训练数据,采取循环的方式:

for i = 1:m,
   Perform forward propagation and backpropagation using example (x(i),y(i))
   (Get activations a(l) and delta terms d(l) for l = 2,...,L


你可能感兴趣的:(机器学习,人工智能,神经网络)