代价函数(神经网络在分类问题中的应用)
分类问题为多元分类和二元分类
反向传播算法
delta是没有1层的,因为第一层是我们的观测值,没有误差
经过后面的推导,忽略了λ(正则项),就会得到左下角代价函数的偏导项
反向传播算法计算后,累计误差的结果等于对代价函数的偏导。
i 指的是第几个样本
j 指的是第 l 层的第 j 个节点
通过上面的代价函数,和对应的梯度,可以使用高级优化算法,实现参数求解
理解反向传播
反向传播具体的“error计算过程”
使用高级优化算法时,注意的参数展开
theta 展开成向量
代价函数的返回值如何计算?先通过theta计算得来每层的 “error”,然后将“error”也向量化返回,同时计算代价函数返回
梯度检测
通过定义算来的梯度和反向传播法算来的梯度进行比较,如果接近的话,就可以放到高级优化算法里面进行theta的求解
运行梯度检验算法时注意的事项
初试随机化
全0初始化不再适用于神经网络
要使用随机初始化思想
在正负对称的区间随机生成初始化theta矩阵
总结在一起实现神经网络(putting it together)
step1:选择一个网络结构
选择原则:
1)特征的维数决定了选择输入端的units个数;
2)最终要分成的类别的多少决定了输出单元的个数;
3)3个特征时,一个隐藏层,5个隐藏单元是比较合理的结构;可以增加隐藏层的层数,也可以增加每层的隐藏单元的个数(越多越好),不过随之而来的计算量需要考虑进去;需要注意的是尽量保持每个隐藏层的单元个数一致,并且单元个数一定要大于特征数(2,3,5倍都是可以的);
step2:初始化随机权重theta
一般情况下,初始化为对称区间的接近于0的值,当然这些都是随机的;
step3:执行向前传播算法
执行向前传播算法,利用每个输入样本特征x(i),根据初始化的theta,计算出 h(x(i));
step4:计算代价
由于已经算出来了预测值,则可以根据代价函数算出此样本条件下的代价 J(theta);
step:5:反向传播算法
第3步到第5步是需要重复m(样本数)次,每次都能得到所有层的节点激励项值 al 和“ δl ”,于是就可以计算出单个样本的theta的梯度,运行m次以后,就可以得到这m个训练样本在当前theta下的总的误差值,然后求平均后,再考虑正则化,最后两者相加构成最终的对于theta的梯度D。(详尽的公式 见 “反向传播算法” 图)
step6:梯度检测
将上述步骤得来的梯度与数值法(偏导数的定义方法)得来的梯度进行比较检测确保两者接近后,然后关闭这个梯度检测算法,因为我们只需要检测一次我们反向传播算法是正确的即可,否则运算量将太过庞大;
step6:梯度下降或者高级优化算法
最后,我们已经利用反向传播算法计算出了代价函数的偏导数,也就是theta的梯度值,然后可以借助梯度下降算法,或者其他高级优化算法使得代价函数最小化,从而得到神经网络的参数(parameters):theta。
需要注意的是,这里的代价函数是非凸的,因此无论是梯度下降算法,还是高级优化算法都有可能求得的值是局部最优解,尽管如此,得到的最后的解还是可以接受的。