本周的内容更主要涉及神经网络的学习的理论部分,包括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