Skip to content

第 9 章 神经网络的学习

这一章讨论如何训练神经网络,核心是代价函数、反向传播、梯度检验、随机初始化和完整训练流程。

9.1 代价函数

神经网络的代价函数是逻辑回归代价函数在多输出单元上的推广。

对于 K 个输出类别,代价函数会对每个训练样本、每个输出单元的误差求和,并加入正则化项。

J(Θ)=1mi=1mk=1K[yk(i)log(hΘ(x(i))k)+(1yk(i))log(1hΘ(x(i))k)]+λ2mlij(Θji(l))2

正则化时不包含每层的偏置项参数。

9.2 反向传播算法

反向传播用于高效计算神经网络中所有参数的偏导数。

训练样本先进行前向传播,得到各层激活值。然后从输出层开始计算误差,并把误差逐层向前传回。

输出层误差:

δ(L)=a(L)y

隐藏层误差由后一层误差和参数矩阵反推。

反向传播的大致流程:

  1. 对每个训练样本做前向传播。
  2. 计算输出层误差。
  3. 从后往前计算各隐藏层误差。
  4. 累加每层参数的梯度。
  5. 加上正则化项得到最终梯度。

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 梯度检验

梯度检验用于确认反向传播实现是否正确。

用数值方法近似梯度:

θJ(θ)J(θ+ϵ)J(θϵ)2ϵ

如果数值梯度和反向传播算出的梯度非常接近,说明实现大概率正确。

梯度检验很慢,只用于调试。确认反向传播正确后,训练时应关闭梯度检验。

9.6 随机初始化

神经网络不能把所有参数初始化为 0

如果所有参数相同,隐藏层单元会学到完全一样的东西,无法打破对称性。

应该把参数随机初始化为一个较小范围内的值。

matlab
Theta = rand(out, in + 1) * 2 * epsilon - epsilon

9.7 综合起来

训练神经网络的一般步骤:

  1. 选择网络结构。
  2. 随机初始化参数。
  3. 实现前向传播,计算代价函数。
  4. 实现反向传播,计算梯度。
  5. 用梯度检验检查实现。
  6. 使用优化算法最小化代价函数。

隐藏层单元数通常需要根据问题调节。隐藏单元越多,模型表达能力越强,但计算量也更大。

9.8 自主驾驶

课程用自动驾驶作为神经网络应用示例。

系统通过观察人类驾驶数据,学习图像输入和方向盘控制之间的关系。这说明神经网络可以从大量样本中学习复杂映射,而不需要人手写出所有规则。

Powered by VitePress