第 9 章 神经网络的学习
这一章讨论如何训练神经网络,核心是代价函数、反向传播、梯度检验、随机初始化和完整训练流程。
9.1 代价函数
神经网络的代价函数是逻辑回归代价函数在多输出单元上的推广。
对于 K 个输出类别,代价函数会对每个训练样本、每个输出单元的误差求和,并加入正则化项。
正则化时不包含每层的偏置项参数。
9.2 反向传播算法
反向传播用于高效计算神经网络中所有参数的偏导数。
训练样本先进行前向传播,得到各层激活值。然后从输出层开始计算误差,并把误差逐层向前传回。
输出层误差:
隐藏层误差由后一层误差和参数矩阵反推。
反向传播的大致流程:
- 对每个训练样本做前向传播。
- 计算输出层误差。
- 从后往前计算各隐藏层误差。
- 累加每层参数的梯度。
- 加上正则化项得到最终梯度。
9.3 反向传播算法的直观理解
反向传播中的 delta 可以理解为每个神经元对最终误差的“责任”。
如果某个神经元的输出对最终预测错误影响很大,那么它对应的误差项就会更大,参数更新也会更明显。
前向传播负责计算预测,反向传播负责把预测误差分配回各层参数。
9.4 实现注意:展开参数
高级优化函数通常要求参数是一个长向量,而神经网络参数天然是多个矩阵。
因此实现时需要在矩阵和向量之间转换。
展开参数:
matlab
thetaVec = [Theta1(:); Theta2(:); Theta3(:)]还原参数:
matlab
Theta1 = reshape(thetaVec(1:110), 10, 11)
Theta2 = reshape(thetaVec(111:220), 10, 11)
Theta3 = reshape(thetaVec(221:231), 1, 11)梯度也要用同样方式展开,交给优化函数。
9.5 梯度检验
梯度检验用于确认反向传播实现是否正确。
用数值方法近似梯度:
如果数值梯度和反向传播算出的梯度非常接近,说明实现大概率正确。
梯度检验很慢,只用于调试。确认反向传播正确后,训练时应关闭梯度检验。
9.6 随机初始化
神经网络不能把所有参数初始化为 0。
如果所有参数相同,隐藏层单元会学到完全一样的东西,无法打破对称性。
应该把参数随机初始化为一个较小范围内的值。
matlab
Theta = rand(out, in + 1) * 2 * epsilon - epsilon9.7 综合起来
训练神经网络的一般步骤:
- 选择网络结构。
- 随机初始化参数。
- 实现前向传播,计算代价函数。
- 实现反向传播,计算梯度。
- 用梯度检验检查实现。
- 使用优化算法最小化代价函数。
隐藏层单元数通常需要根据问题调节。隐藏单元越多,模型表达能力越强,但计算量也更大。
9.8 自主驾驶
课程用自动驾驶作为神经网络应用示例。
系统通过观察人类驾驶数据,学习图像输入和方向盘控制之间的关系。这说明神经网络可以从大量样本中学习复杂映射,而不需要人手写出所有规则。