Coursera-Machine-Learning-Review-W5
Cost Function and Backpropagation
下面我们讨论如何利用神经网络进行学习。
首先引入一些标记,L表示神经网络总层数,sl表示第l层的神经单元个数(不包括偏置单元),对于二元分类问题,只需要一个输出单元,令输出为0或1。对于多元分类问题,分成k类,则输出单元为k个k维向量。
关于代价函数,我们沿用逻辑回归中的代价函数,但是由于输出不为单一输出,所以这里使用更一般的形式,对输出层所有单元进行求和,而正则化的求和即为对每层之间的权重矩阵进行全部元素求和,所以有三个求和符号。
然后我们了解一下让代价函数最小化的算法--反向传播算法。根据我们之前的经验,为了让代价函数最小化,我们可以在知道代价函数和代价函数对于每一个参数θ求偏导的算式的情况下算出。而我们如何得到偏导数项呢?首先我们已知如何求神经网络中每一个层的激励值:
我们首先引入一个变量,记录每个神经单元的误差值。首先我们知道训练集标准答案的情况下,可以知道最后一层输出层的误差,然后我们又知道每一层的误差都和其上一层的误差存在关系,这个关系推导起来很复杂,所以我们只要知道结论就行了。然后我们只要利用这个关系就可以一层一层的反向算出所有层的误差。这就是整个算法的过程。可能这里看起来大家一头雾水,但是在应用层面我们只要知道可以这么做就可以了。
算出所有的误差项后,我们利用Δ积累所有的误差项,然后就可以通过公式计算出所有参数θ的偏导项。
Backpropagation in Practice
在实现反向传播算法的过程中,我们会使用很多的矩阵运算,为了能够使用fminunc()方法,我们需要把矩阵展开成一个长向量,在Octave中操作如下,并且可以通过reshape方法还原:
在计算梯度下降的过程中,课程为我们介绍了一种方法来确保我们梯度下降可以正确进行,叫做梯度检验。通过公式近似计算每个参数θ的偏导数近似值,与我们代码中的值进行比较,大约相等那么我们就可以认为梯度下降在正确进行。当我们验证了梯度下降没有问题后,我们关闭梯度检验,开始迭代训练,否则会大大降低算法运行速度。
fminunc()方法中需要initialTheta参数,我们如果将权重矩阵全部设为0,无法进行自动更新,所以我们倾向于把θ随机初始化为一个很小的数以打破矩阵对称性。
总结一下,为了建立一个神经网络学习系统,我们的流程大概如下:
1、选择一个结构,包括隐藏层数目,神经元数量。(互相匹配)
2、初始化权重矩阵。
3、使用前向传播算法,计算出对应的假设输出值。
4、计算代价函数值。
5、使用反向传播算法,计算出每个偏导项。
6、使用梯度检验,验证算法实现正确性,然后关闭检验。
7、使用优化算法最小化代价函数,得到θ的值。(不一定是全局最优值,在函数非凸情况下)