九、神经网络II
9-1 代价函数
当用神经网络解决分类问题时,通常分为以下两种情况,二元分类和多元分类
在神经网络中使用的代价函数是逻辑回归中代价函数的一般形式
9-2 反向传播算法
(用于优化代价函数)
- 假设当前只有一个训练样本,使用前向传播计算输出值
反向传播计算梯度:
- 假设当前有m个训练样本,反向传播算法的过程如下
9-3 理解反向传播
为了可以更好地理解反向传播过程,首先研究一下前向传播,如下是含两个输入单元的神经网络结构,第二第三层都有两个隐藏单元,+1均为偏置项
具体的计算方法为:
从偏导数角度理解反向传播过程:
9-4 展开参数
如何把参数有矩阵转化为向量(Octave)
代码
Theta1 = ones(10,11);
Theta2 = 2 * ones(10,11);
Theta3 = 3 * ones(10,11);
ThetaVec = [Theta1(:);Theta2(:);Theta3(:)];//合并为向量
size(ThetaVec);
reshape(ThetaVec(1:110), 10, 11);
reshape(ThetaVec(111:220), 10, 11);
reshape(ThetaVec(221:231), 1, 11);
9-5 梯度检测
反向传播中会存在bug导致很大的误差,对此类问题,用梯度检验方法解决
梯度数值估计方法(θ是实数):
注:双侧差分通常比单侧差分更准确
当θ为向量参数时
步骤总结:
- 通过反向传播计算出导数DVec(代价函数关于所有参数的导数或偏导数)
- 计算出数值上的梯度gradApprox
- 确保DVec和gradApprox值近似
注意:使用反向传播代码进行学习时,要关闭梯度检验,否则计算量过大,程序运行缓慢
9-6 随机初始化
θ的初始化:对于梯度下降算法或其他高级优化算法,需要人为提供θ的初始化值
思想一:将所有参数初始化为0(该方法只适用逻辑回归)
如果将该思想用于神经网络,会导致对称权重问题
思想二:随机初始化
9-6 神经网络算法总结
训练一个神经网络
首先需要选择一个网络架构(神经元之间的连接方式)
输入单元的数目:特征的维度
输出单元的数目:类别数
默认选项:一个隐藏层
具体步骤:
- 随机初始化权重
- 执行前向传播算法
- 通过代码计算出代价函数
- 执行反向传播算法计算出偏导数(建议for循环)
- 使用梯度检查,确保反向传播算法得到的结果是正确的。之后停用梯度检查
- 使用一个优化算法与反向传播相结合,最小化代价函数