上一篇博文,已经直观地了解了神经网络结构及计算假设函数过程。我们这节课主要学习,给定训练集,如何拟合神经网络的参数。
1、代价函数
以神经网络在分类中的应用为例,二元分类只有一个输出单元,k元分类对应有k个输出单元(k>2),这与我们之前在学习逻辑回归的时候,讲到的多对多分类时,每一类别需要一个分类器,这是一个输出单元看作一个分类器,K类需要K个分类器,即K个输出单元。神经网络输出的是一个K维的实数向量,当神经网络为二分类时输出的是一个实数。
刚刚学习了,神经网格的每个输出单元看似逻辑回归的一个分类器,如下图我们回顾一下逻辑回归的代数函数,J由蓝色线标注的拟合项和“+”后面的正则化项组成
而神经网络可能由不止一个逻辑回归输出单元组成,它的代数函数改如何表示呢?这时神经网络输出的是一个K维的实数向量,i表示输出单元的下标,它的拟合目标项和正则化增加K维,具体如下
2、反向传播算法
1)梯度下降求解最小化J,我们需要计算J和偏导项,主要是偏导项的计算。
2)我们先来回顾一下什么是“前向传播”,如下图,有个单训练样本,从输入单元开始往下计算,求出每个神经元的激活值,直到计算出h(x),这样称为“前向传播”。前向传播可以计算出神经网络中每个神经元的激活值。
为了计算偏导数项,采用了一种叫做反向传播(Backpropagation)的算法。我们知道了每个神经元的激活值,可用真实值和激活值求得误差项。如下图,求得第四层的某个节点神经元的误差项为
,如果把一个层当成向量的话,误差层也可以视为一个k向量
(k等于输出层的神经单元数)。由
可以反向求出
,依次类推求出
等等(我们不对输入层考虑误差项)。这里不做详细推导
3)当我们大量的训练样本时,是这样做的:为大写的
,将每个误差项等于0去计算偏导项,这些误差
作为累加项,用来计算偏导数,计算过程如下图:最后得到
,这样就可以用反向传播(Backpropagation)的算法算出代价函数对于每个参数的偏导项了。因为这推导过程比较复杂而且里面有很多细节的东西,这里只要知道这么一个计算过程就好了,不建议去推导。
3、理解反向传播
某一节点神经元的造成误差,实际为该节点的cost函数在对激活值a的误差,也是cost函数对特征值z的偏导数。由,可以得到第l层的误差项。跟像“前向传播”一样,第l-1层项的激活值向第l层传播时,有一参数
,所以有
,同理可以往前递推,求得各神经元的误差项。
使用注意:展开参数,把矩阵转换成向量,以便我们在高级最优步骤中使用。
4、梯度检测
反向传播算法含有很多细节,实现比较困难,并且会存在缺点:会出现一些微妙的BUG,当它和梯度下降或者其它算法一起工作时,代价函数J一直在下降看起来运行正常,但是你最后得到的神经网络其误差将会比无BUG情况下,高出一个量级。并且你很难会察觉这个BUG的存在。梯度检测就是一种用于解决反向传播算法用于梯度下降等方法时,出现这样的BUG的算法。能完全保证你的前向传播和反向传播的正确性。
1)数值导数估计
当参数为实数时,某点代价函数对参数的导数为
当参数组为向量时,我们可以用同样的方法来估计任意点代价函数对参数偏导的估计:
2)梯度检验的思想
梯度检验主要是根据反向传播计算出来的偏导项跟我们用数值导数估计计算出来的偏导项进行比较,保证它们的值非常相近,说明反向传播算法正确。但是由于数值导数估计的计算量巨大,我们验证完算法正确性之后,记得关闭梯度验证的代码,不然运算速度回非常慢。
5、随机初始化
我们在求解最优参数时,我们得先初始化,即给定参数组一个初始值。很多时候我们都是设为零,但是在神经网络中,初始化参数组都设为0的话,都在计算相同的特征,最后神经网络输出同一个特征,阻止了神经网络去学习有趣的东西,会产生高度冗余现象。所以引入了随机初始化的思想,用随机函数生成参数组。
6、整合过程
1)选择模型架构:模型架构包括三层(输入层、隐藏层和输出层)
我们选择的时候需要注意的是:输入层的神经元由特征数量决定,输出层的神经元数由类别数量决定。隐藏层的数量是架构选择的主要变动选择,一般来说隐藏层越多模型效果越好,但计算量越大。可以根据每个人的习惯很侧重点来选择隐藏层的数量。
2)训练模型
①随机选择初始参数,初始参数为很小接近于0的值
②执行前向传播,计算该神经网络模型任意特征x下得到的y(即)
③计算代价函数
④反向传播算法计算偏导项
⑤梯度检验(验证反向传播算法的正确性)
⑥将反向传播算法和梯度下降或高级优化算法结合