八、神经网络的学习(Neural Networks: Learning)
在本节,我们学习一个新的神经网络算法.它能在给定训练集的同时,为神经网络拟合参数.与其他算法一样,我们从代价函数开始.
8.1 代价函数
首先引入一些便于稍后讨论的新标记方法:
假设神经网络的训练样本有\(m\)个,每个包含一组输入\(x\)和一组输出信号\(y\),\(L\)表示神经网络层数,\(s_l\)表示第\(l\)层的单元(神经元)数,但不包括偏差单元,\(S_L\)(因为\(L\)=4
)代表最后一层中处理单元的个数.
将神经网络的分类定义为两种情况:二类分类和多类分类.
现在来为我们的神经网络定义代价函数.我们回顾逻辑回归问题中我们的代价函数为:
在逻辑回归中,我们只有一个输出变量,又称标量(scalar
),也只有一个因变量.但是在神经网络中,我们可以有很多输出变量,我们的\(h_{\theta}(x)\)是一个维度为\(K\)的向量,并且我们训练集中的因变量也是同样维度的一个向量.因此我们的代价函数会比逻辑回归更加复杂一些,为:
\(h_{\theta}(x) \in R^K\),并且
因为我们比逻辑回归问题多了\(k-1\)个分类器(输出).所以需要\(\sum_{k=1}^k\).代价函数的第二项类似正则化的代价,不需要算偏差值的项的代价(也就是\(i=0\)的\(\theta\)).
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出\(K\)个预测.基本上我们可以利用循环,对每一行特征都预测\(K\)个不同的结果.然后在利用循环在\(K\)个猜测里选可能性最高的那一个.将其与\(y\)的实际数据比较.
正则化的那一项只是排除了每一层\(\theta_0\)后,每一层的\(\theta\)矩阵的和.最里层的循环\(j\)循环所有的行(由\(s_{l+1}\)层的激活单元数决定).请注意不是\(s_l+1\).循环\(i\)则循环所有的列,由该层(\(s_l\)层)的激活单元数所决定.即:\(h_{\theta}(x)\)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization
的bias
项处理所有参数的平方和.
同样,这个代价函数就算计入了\(\theta_0\)也不会与原来的有较大差别.但是我们更多采用不计入的规则.
9.2 反向传播算法
本节我们讲述如何最小化神经网络的代价函数的方法.
下面是我们的代价函数,我们要做的就是找到参数\(\theta\)以此最小化代价函数.为了使用梯度下降或者其他优化算法,我们需要代码计算\(J(\theta)\)和它的偏导数.显然\(\theta\)在每层都是一个矩阵,我们要对每一个进行偏导.
计算成本函数只需要上面的公式,所以本节注重偏导数计算.
我们从样本集中只有一个样本的情况开始说起: