九、神经网络的学习
9.1 代价函数
???
9.2 反向传播算法
Back Propagation => BP神经网络
δ表示误差值,输出的aj(4)与yi的差值;
先计算结果,在根据误差调整参数,原理和逻辑回归差不多,只是过程复杂了,这个误差就是反向传播算法得到的,而结果则是前向传播算法得出;
前向输出,反向求参!
9.3 理解反向传播
这是前向传播:
再看反向传播:
9.4 梯度检验
使用神经网络进行类梯度下降算法时,最好附加使用梯度检验,能让算法优化一个级别以上,它能保证前向、反向传播百分之百正确;
曲线上某点的导数的近似值:双侧差分
上面考虑θ是一个实数值的情况,下面则会进一步将θ看作向量:
for i = 1 :n,
thetaPlus = theta;
thetaPlus(i) = thetaPlus(i) + EPSILON;
thetaMinus = theta;
thetaMinus(i) = thetaMinus(i) - EPSILON ;
gradApprox(i) = (J(thetaPlus) - J( thetaMinus) )/(2*EPSILON);
end;
接下来检验这个 gradApprox ≈ DVec(反向传播得到的导数)
,从而验证反向传播是正确的;
整体步骤:
- 通过反向传播来计算DVec(D(1),D(2),D(3)的展开形式);
- 实现数值上的梯度检验,计算出gradApprox;
- 确保gradApprox和DVec是相似的值;
- 在训练样本/运行算法前,gradApprox检验程序务必要关闭,因为这个计算导数的程序需要很大的计算量,计算速度很慢,而反向传播中DVec的计算是高性能的;
如果在每次循环,或者每次梯度下降,都进行一次梯度检验,那么程序就会变得非常慢;
9.5 随机初始化
如何对θ初始化?
- 将所以参数初始化为0,在逻辑回归中是允许的,但在训练网络时基本起不到作用;因为在网络训练时,权重都初始化为0,意味着虽然每次都会梯度下降,但θ01(1)=θ02(1)的,这两个参数始终相等,且都不为零;
- 为了解决上面这个问题,神经网络中参数的初始化要具有随机化的思想,打破对称性;
9.6 总体回顾
- 第一步:选择神经网络架构;根据输入单元和输出单元个数选择合适的神经网络架构,一般隐藏层默认为1层(也是最常用的),如果选择大于1层,应保证每个隐藏层的单元个数相等;
- 第二步:训练神经网络;
- 随机初始化权重,权重很小,接近于0;
- 执行前向传播,即根据输入的x(1)得到hθ(x(i)),就是y值;
- 通过代码计算代价函数;
- 执行反向传播,算出偏导数项,也就是J(θ)关于参数θ的偏导数;
- 用for循环对每一个样本执行前向传播和反向传播,特别是第一次使用反向传播时,建议用for循环;
- 梯度检验,将这些偏导数值和数值方法得到的估计值进行比较;如果接近,则说明反向传播计算结果正确;
- 选择一个优化方法,也可以使用高级优化方法,内置到fminunc中,与反向传播相结合,从而最小化J(θ);对于神经网络,代价函数J(θ)为非凸函数,理论上可能停留在局部最小值;虽然不能确定是不是得到的全局最优值,但梯度下降法这样的优化方法通常表现不错,也能得到一个很小的局部最优值;
9.7 神经网络举例:无人驾驶
也需要驾驶员驾驶几分钟,让神经网络充足地学习了,在能够进行简单的自动驾驶,当前面都是路(传来的图片是一整块白色的时),神经网络学习的置信度明显下降,当又走到双车道,回到原来的那样子时,置信度又上升了;