前言
诺贝尔奖获得者、物理学家恩里科·费米曾被问及对一位同事提出的数学模型作为重要未解物理问题的解决方案的看法。该模型与实验结果非常吻合,但费米持怀疑态度。他询问该模型中有多少自由参数可供设置。答案是“四个”。费米回答道:“我记得我的朋友约翰尼·冯·诺伊曼曾经说过,用四个参数我可以拟合一只大象,用五个我可以让它摇摆象鼻。”
当然,重点是,具有大量自由参数的模型可以描述各种各样的现象。即使这样的模型与现有数据非常吻合,也不代表它是一个好模型。这可能只意味着模型中有足够的自由度,可以描述几乎任何给定大小的数据集,而不捕捉到底层现象的任何真正见解。当这种情况发生时,模型将在现有数据上表现良好,但将无法推广到新情况。一个模型的真正测试是其在以前未曝光的情况下进行预测的能力。
费米和冯·诺伊曼对具有四个参数的模型持怀疑态度。我们用于分类MNIST数字的30个隐藏神经元网络几乎有24,000个参数!这是相当多的参数。我们的100个隐藏神经元网络有近80,000个参数,而最先进的深度神经网络有时包含数百万甚至数十亿个参数。我们应该相信这些结果吗?
让我们通过构建一个情境,使我们的网络在推广到新情况时表现不佳,来清晰地阐明这个问题。我们将使用我们的30个隐藏神经元网络,其具有23,860个参数。但我们不会使用所有50,000个MNIST训练图像来训练网络。相反,我们只会使用前1,000个训练图像。使用这个受限制的数据集将使泛化问题更加明显。我们将以与之前类似的方式进行训练,使用交叉熵损失函数,学习率为η=0.5,迷你批次大小为10。然而,我们将进行400个时期的训练,比之前的数量稍多一些,因为我们没有使用太多的训练示例。让我们使用network2来观察损失函数的变化方式:
>>> import mnist_loader
>>> training_data, validation_data, test_data = \
... mnist_loader.load_data_wrapper()
>>> import network2
>>> net = network2.Network([784, 30, 10], cost=network2.CrossEntropyCost)
>>> net.large_weight_initializer()
>>> net.SGD(training_data[:1000], 400, 10, 0.5, evaluation_data=test_data,
... monitor_evaluation_accuracy=True, monitor_training_cost=True)
利用这些结果,我们可以绘制网络学习过程中成本变化的方式。
这看起来令人鼓舞,显示了成本的平滑下降,正如我们所预期的那样。请注意,我只显示了训练时期200到399。这让我们可以清晰地观察到学习的后期阶段,正如我们将看到的,这正是有趣的地方。
现在让我们看一下随着时间推移测试数据的分类准确率如何变化:
再次,我进行了相当大幅度的放大。在前200个时期(未显示)中,准确率上升到了接近82%。然后学习逐渐减缓。最后,大约在第280个时期,分类准确率几乎停止提高。后来的时期仅仅是在第280个时期的准确率值附近出现了小的随机波动。与之前的图形形成鲜明对比,其中与训练数据相关的成本继续平稳下降。如果我们只看这个成本,似乎我们的模型仍在变得“更好”。但测试准确率结果显示,这种改善是一种幻觉。就像费米不喜欢的模型一样,我们的网络在第280个时期之后学到的内容不再推广到测试数据。因此,这是无用的学习。我们说网络在第280个时期之后过度拟合或过度训练。
你可能会想知道这里的问题是否在于我看的是训练数据上的成本,而不是测试数据上的分类准确率。换句话说,也许问题在于我们在进行苹果和橙子的比较。如果我们将训练数据上的成本与测试数据上的成本进行比较,从而比较类似的指标,会发生什么情况?或者我们可以比较训练数据和测试数据上的分类准确率?事实上,无论我们如何进行比较,基本上都会出现相同的现象。然而,细节确实会发生变化。例如,让我们看看测试数据上的成本:
我们可以看到,测试数据上的成本在大约第15个时期开始改善,但在那之后实际上开始恶化,尽管训练数据上的成本仍在继续改善。这是我们的模型过拟合的另一个迹象。然而,这也带来了一个谜题,即我们应该将第15个时期或第280个时期视为过拟合开始主导学习的时刻?从实际的角度来看,我们真正关心的是在测试数据上提高分类准确率,而测试数据上的成本只是分类准确率的代理。因此,将第280个时期视为我们神经网络中过拟合开始主导学习的时刻是最合理的。
过拟合的另一个迹象可能在训练数据上的分类准确率中看到:
准确率一直上升到100%。也就是说,我们的网络正确分类了所有1,000个训练图像!与此同时,我们的测试准确率仅达到了82.27%。因此,我们的网络确实在学习训练集的特异性,而不仅仅是普遍地识别数字。我们的网络几乎就像是仅仅在记忆训练集,而没有足够深入地理解数字以推广到测试集一样。
过拟合是神经网络中的一个主要问题。在现代网络中,这一点尤为明显,因为它们通常具有非常庞大的权重和偏置数。为了有效地训练,我们需要一种检测过拟合的方法,以便我们不会过度训练。我们还希望有一些减少过拟合影响的技术。
检测过拟合的明显方法是使用上述方法,跟踪网络训练时测试数据上的准确率。如果我们发现测试数据上的准确率不再提高,那么我们应该停止训练。当然,严格来说,这未必一定是过拟合的迹象。可能是测试数据和训练数据上的准确率同时停止提高。尽管如此,采用这种策略将防止过拟合。
事实上,我们将采用这种策略的一种变体。回想一下,当我们加载MNIST数据时,我们加载了三个数据集:
>>> import mnist_loader
>>> training_data, validation_data, test_data = \
... mnist_loader.load_data_wrapper()
到目前为止,我们一直在使用训练数据和测试数据,而忽略了验证数据。验证数据包含了10,000张数字图像,这些图像与MNIST训练集中的50,000张图像和MNIST测试集中的10,000张图像不同。我们将使用验证数据而不是测试数据来防止过拟合。为此,我们将采用与上述测试数据相同的策略。也就是说,我们将在每个时期结束时计算验证数据上的分类准确率。一旦验证数据上的分类准确率饱和,我们就停止训练。这种策略称为早期停止。当然,在实践中,我们不会立即知道准确率何时饱和。相反,我们会继续训练,直到我们有信心准确率已经饱和。确定何时停止需要一些判断。在我之前的图表中,我确定了第280个时期是准确率饱和的时刻。这可能过于悲观了。神经网络有时在训练过程中会暂时停滞,然后继续改善。我不会感到惊讶,即使在第400个时期之后仍然可能发生更多的学习,尽管进一步改善的幅度可能很小。因此,可以采用更积极或更保守的早期停止策略。
为什么要使用验证数据来防止过拟合,而不是使用测试数据?实际上,这是更一般策略的一部分,即使用验证数据来评估不同的超参数试验选择,如训练的时期数、学习率、最佳网络架构等。我们使用这些评估来找到并设置好的超参数值。实际上,尽管直到现在我还没有提到过,但部分超参数选择是如何在本书前面确定的。(后面会更详细解释这一点。)
当然,这并不能解答为什么我们使用验证数据来防止过拟合,而不是使用测试数据的问题。相反,它将其替换为一个更一般的问题,即为什么我们使用验证数据而不是测试数据来设置好的超参数?为了理解为什么,考虑到在设置超参数时,我们可能会尝试许多不同的超参数选择。如果我们基于测试数据的评估来设置超参数,可能会导致我们过度拟合超参数到测试数据上。也就是说,我们可能会找到适应测试数据特定特性的超参数,但网络的性能可能不会推广到其他数据集上。我们通过使用验证数据来确定超参数来防范这种情况。然后,一旦我们得到了想要的超参数,我们会使用测试数据进行最终的准确度评估。这使我们有信心,我们在测试数据上的结果是神经网络泛化能力的真实衡量标准。换句话说,你可以将验证数据看作是一种帮助我们学习好超参数的训练数据。这种寻找好超参数的方法有时被称为留出法,因为验证数据被保持或“留出”于训练数据之外。
实际上,在评估测试数据性能后,我们可能会改变主意,想尝试另一种方法——也许是不同的网络架构——这将涉及找到新的超参数集。如果我们这样做,难道我们不会过度拟合到测试数据上吗?我们是否需要一个潜在无限的数据集循环,以便我们能够确信我们的结果将会推广?全面解决这个问题是一个深奥而困难的问题。但就我们的实际目的而言,我们不会过多担心这个问题。相反,我们将继续前进,使用基本的留出法,根据前面描述的训练数据、验证数据和测试数据。
到目前为止,我们一直在研究当我们只使用1,000个训练图像时的过拟合情况。当我们使用全部50,000个图像的完整训练集时会发生什么?我们将保持所有其他参数不变(30个隐藏神经元,学习率0.5,迷你批次大小为10),但是使用所有50,000个图像进行30个时期的训练。下面是显示训练数据和测试数据分类准确率结果的图表。请注意,我在这里使用了测试数据,而不是验证数据,以便与前面的图表结果进行直接比较。
正如你所看到的,测试数据和训练数据的准确率仍然比我们使用1,000个训练示例时要接近得多。特别是,训练数据上的最佳分类准确率为97.86%,仅比测试数据上的95.33%高出2.53%。这与我们之前的17.73%的差距相比要小得多!过拟合仍在进行,但已经大大减少。我们的网络从训练数据到测试数据的泛化能力大大提高。通常,减少过拟合的最佳方法之一是增加训练数据的大小。即使是非常大的网络,如果有足够的训练数据,也很难出现过拟合。不幸的是,训练数据可能成本高或难以获取,因此这并不总是一个实际的选择。
正则化(Regularization)
增加训练数据量是减少过拟合的一种方法。我们还能采取其他方法来减少过拟合的程度吗?一种可能的方法是减少网络的大小。然而,大型网络可能比小型网络更强大,因此这只是我们不情愿采纳的一个选择。
幸运的是,还有其他技术可以在网络大小和训练数据固定的情况下减少过拟合。这些技术被称为正则化技术。在本节中,我将描述其中最常用的正则化技术之一,有时称为权重衰减或L2正则化的技术。L2正则化的思想是在成本函数中添加一个额外项,称为正则化项。下面是经过正则化的交叉熵:
C
=
−
1
n
∑
x
j
[
y
j
ln
a
j
L
+
(
1
−
y
j
)
ln
(
1
−
a
j
L
)
]
+
λ
2
n
∑
w
w
2
.
(85)
C = -\frac{1}{n} \sum_{xj} \left[ y_j \ln a^L_j+(1-y_j) \ln (1-a^L_j)\right] + \frac{\lambda}{2n} \sum_w w^2. \tag{85}
C=−n1xj∑[yjlnajL+(1−yj)ln(1−ajL)]+2nλw∑w2.(85)
第一个项只是交叉熵的常规表达式。但我们添加了第二项,即网络中所有权重的平方和。这由一个因子λ/2n进行缩放,其中λ>0被称为正则化参数,n通常是我们的训练集的大小。我将稍后讨论如何选择λ。值得注意的是,正则化项不包括偏置。我也会在下面回来讨论这一点。
当然,也可以对其他成本函数进行正则化,比如二次成本。可以用类似的方式进行:
C
=
1
2
n
∑
x
∥
y
−
a
L
∥
2
+
λ
2
n
∑
w
w
2
.
(86)
C = \frac{1}{2n} \sum_x \|y-a^L\|^2 + \frac{\lambda}{2n} \sum_w w^2. \tag{86}
C=2n1x∑∥y−aL∥2+2nλw∑w2.(86)
在这两种情况下,我们可以将正则化的成本函数写为:
C
=
C
0
+
λ
2
n
∑
w
w
2
,
(87)
C = C_0 + \frac{\lambda}{2n} \sum_w w^2, \tag{87}
C=C0+2nλw∑w2,(87)
其中 C 0 C_0 C0是原始的、未正则化的成本函数。
直观地说,正则化的效果是使网络更倾向于学习小的权重,其他条件相同的情况下。只有当大的权重能够显著改善成本函数的第一部分时,才允许存在大的权重。换句话说,正则化可以看作是在找到小权重和最小化原始成本函数之间进行妥协的一种方式。这种妥协的两个要素的相对重要性取决于λ的值:当λ很小时,我们更倾向于最小化原始成本函数,但是当λ很大时,我们更倾向于小权重。
现在,为什么做这种妥协能够帮助减少过拟合,这实在并不明显!但事实证明它确实有所帮助。我们将在后面讨论为什么它有助于解决问题。但首先,让我们通过一个示例来证明正则化确实可以减少过拟合。
要构造这样一个例子,我们首先需要弄清楚如何在正则化的神经网络中应用随机梯度下降学习算法。特别是,我们需要知道如何计算网络中所有权重和偏置的部分导数∂C/∂w和∂C/∂b。对方程式(87)进行偏导数运算得到:
∂
C
∂
w
=
∂
C
0
∂
w
+
λ
n
w
(88)
\frac{\partial C}{\partial w} = \frac{\partial C_0}{\partial w} + \frac{\lambda}{n} w \tag{88}
∂w∂C=∂w∂C0+nλw(88)
∂
C
∂
b
=
∂
C
0
∂
b
.
(89)
\frac{\partial C}{\partial b} = \frac{\partial C_0}{\partial b}. \tag{89}
∂b∂C=∂b∂C0.(89)
可以使用反向传播计算∂C0/∂w和∂C0/∂b项,就像上一章节中描述的那样。因此我们可以看到,计算正则化成本函数的梯度是很容易的:只需像往常一样使用反向传播,然后在所有权重项的偏导数上加上
λ
n
w
\frac{\lambda}{n} w
nλw。相对于偏置的偏导数不变,因此偏置的梯度下降学习规则与通常的规则相同:
b
→
b
−
η
∂
C
0
∂
b
.
(90)
b \rightarrow b -\eta \frac{\partial C_0}{\partial b}.\tag{90}
b→b−η∂b∂C0.(90)
权重的学习规则变为:
w
→
w
−
η
∂
C
0
∂
w
−
η
λ
n
w
(91)
w \rightarrow w-\eta \frac{\partial C_0}{\partial w}-\frac{\eta \lambda}{n} w \tag{91}
w→w−η∂w∂C0−nηλw(91)
= ( 1 − η λ n ) w − η ∂ C 0 ∂ w . (92) = \left(1-\frac{\eta \lambda}{n}\right) w -\eta \frac{\partial C_0}{\partial w}. \tag{92} =(1−nηλ)w−η∂w∂C0.(92)
这与通常的梯度下降学习规则完全相同,只是我们首先将权重w缩放了一个因子 1 − η λ n 1-\frac{\eta \lambda}{n} 1−nηλ。这种缩放有时被称为权重衰减,因为它使权重变小。乍一看,这似乎意味着权重被无法阻止地推向零。但这并不正确,因为如果这样做会导致未经正则化的成本函数减小,另一个项可能会导致权重增加。
好的,这就是梯度下降的工作原理。那么随机梯度下降呢?嗯,就像在未经正则化的随机梯度下降中一样,我们可以通过对m个训练示例的小批量平均来估计∂C0/∂w。因此,随机梯度下降的正则化学习规则变为(参见方程(20)):
w → ( 1 − η λ n ) w − η m ∑ x ∂ C x ∂ w , (93) w \rightarrow \left(1-\frac{\eta \lambda}{n}\right) w -\frac{\eta}{m} \sum_x \frac{\partial C_x}{\partial w}, \tag{93} w→(1−nηλ)w−mηx∑∂w∂Cx,(93)
其中求和是在小批量中的训练示例x上进行的,Cx是每个训练示例的(未经正则化的)成本。这与随机梯度下降的通常规则完全相同,除了 1 − η λ n 1-\frac{\eta \lambda}{n} 1−nηλ的权重衰减因子。最后,为了完整起见,让我陈述一下偏置的正则化学习规则。这当然与未经正则化的情况完全相同(参见方程(21)),
b → b − η m ∑ x ∂ C x ∂ b , (94) b \rightarrow b - \frac{\eta}{m} \sum_x \frac{\partial C_x}{\partial b}, \tag{94} b→b−mηx∑∂b∂Cx,(94)
求和是在小批量中的训练示例x上进行的。
让我们看看正则化如何改变我们神经网络的性能。我们将使用一个具有30个隐藏神经元、迷你批量大小为10、学习率为0.5和交叉熵成本函数的网络。但是,这次我们将使用λ=0.1的正则化参数。请注意,在代码中,我们使用变量名lmbda,因为lambda是Python中的保留字,具有不相关的含义。我还再次使用了test_data,而不是validation_data。严格来说,我们应该使用validation_data,出于我们之前讨论的所有原因。但我决定使用test_data,因为它使结果与我们之前的未正则化结果更直接地可比较。您可以轻松地更改代码以改用validation_data,您会发现它给出了类似的结果。
>>> import mnist_loader
>>> training_data, validation_data, test_data = \
... mnist_loader.load_data_wrapper()
>>> import network2
>>> net = network2.Network([784, 30, 10], cost=network2.CrossEntropyCost)
>>> net.large_weight_initializer()
>>> net.SGD(training_data[:1000], 400, 10, 0.5,
... evaluation_data=test_data, lmbda = 0.1,
... monitor_evaluation_cost=True, monitor_evaluation_accuracy=True,
... monitor_training_cost=True, monitor_training_accuracy=True)
训练数据上的成本在整个过程中都在下降,就像之前未进行正则化时一样。这和接下来的两张图表都是使用 overfitting.py 程序生成的。
但是这次,测试数据的准确率在整个400个时期内都在持续增加:
显然,使用正则化抑制了过拟合。而且,准确率明显提高,最高分类准确率达到了87.1%,而未正则化情况下的最高准确率仅为82.27%。实际上,如果继续训练超过400个时期,我们几乎肯定可以获得更好的结果。经验上看,正则化似乎使我们的网络更好地泛化,并显著减少了过拟合的影响。
如果我们离开只有1,000个训练图像的人工环境,重新回到完整的50,000张图像训练集,会发生什么呢?当然,我们已经看到完整的50,000张图像时过拟合的问题要少得多。正则化是否进一步有所帮助?让我们保持超参数与之前相同——30个时期、学习率0.5、迷你批量大小为10。然而,我们需要修改正则化参数。原因是训练集的大小n已经从n=1,000变为了n=50,000,这改变了权重衰减因子 1 − η λ n 1 -\frac{\eta \lambda}{n} 1−nηλ。如果我们继续使用λ=0.1,那意味着更少的权重衰减,因此正则化效果将减弱。我们通过改用λ=5.0来进行补偿。
好的,让我们训练我们的网络,首先停下来重新初始化权重:
>>> net.large_weight_initializer()
>>> net.SGD(training_data, 30, 10, 0.5,
... evaluation_data=test_data, lmbda = 5.0,
... monitor_evaluation_accuracy=True, monitor_training_accuracy=True)
我们得到以下结果:
这里有很多好消息。首先,我们在测试数据上的分类准确率提高了,从未进行正则化时的95.49%提高到了96.49%。这是一个很大的改进。其次,我们可以看到训练数据和测试数据之间的差距比以前要小得多,不到1%。这仍然是一个显著的差距,但我们显然已经取得了大幅减少过拟合的进展。
最后,让我们看看当我们使用100个隐藏神经元和一个正则化参数λ=5.0时,我们得到的测试分类准确率是多少。我不会在这里进行详细的过拟合分析,这纯粹是为了好玩,只是想看看当我们使用我们的新技巧时,即交叉熵成本函数和L2正则化时,我们能获得多高的准确率。
>>> net = network2.Network([784, 100, 10], cost=network2.CrossEntropyCost)
>>> net.large_weight_initializer()
>>> net.SGD(training_data, 30, 10, 0.5, lmbda=5.0,
... evaluation_data=validation_data,
... monitor_evaluation_accuracy=True)
最终的结果是在验证数据上达到了97.92%的分类准确率。这与30个隐藏神经元的情况相比有了很大的提升。事实上,再微调一点,在η=0.1、λ=5.0的情况下,训练60个时期,我们突破了98%的界限,在验证数据上达到了98.04%的分类准确率。对于仅仅152行代码来说,这个结果还不错!
我已经将正则化描述为减少过拟合和提高分类准确性的一种方法。事实上,这不是唯一的好处。根据经验,在进行多次运行我们的MNIST网络时,但是采用不同的(随机的)权重初始化,我发现未经正则化的运行有时会“卡住”,显然陷入成本函数的局部最小值中。结果是不同的运行有时会提供相当不同的结果。相比之下,正则化的运行提供了更容易复制的结果。
为什么会这样呢?从启发式的角度来看,如果成本函数未经正则化,那么权重向量的长度可能会增长,其他条件相同。随着时间的推移,这可能导致权重向量变得非常大。这可能会导致权重向量因为梯度下降只对方向进行微小的变化,而几乎保持在相同的方向上。我相信这种现象使得我们的学习算法难以正确地探索权重空间,因此更难找到成本函数的良好最小值。
为什么正则化有助于减少过拟合?
我们已经从经验上看到正则化有助于减少过拟合。这是令人鼓舞的,但不幸的是,为什么正则化有助于减少过拟合并不明显!人们通常讲述的一个标准故事是:更小的权重在某种意义上是更低复杂度的,因此提供了对数据更简单、更强大的解释,因此应该更受青睐。但这是一个相当简洁的故事,其中包含了一些可能看起来令人怀疑或神秘的元素。让我们分解这个故事并进行批判性地审视。为了做到这一点,让我们假设我们有一个简单的数据集,我们希望构建一个模型:
在这里,我们隐含地研究了一些真实世界的现象,其中 x 和 y 代表真实世界的数据。我们的目标是构建一个模型,让我们能够预测 y 作为 x 的函数。我们可以尝试使用神经网络来构建这样一个模型,但我要做的更简单:我将尝试将 y 建模为 x 的多项式。我之所以这样做,而不是使用神经网络,是因为使用多项式会使事情特别透明。一旦我们理解了多项式的情况,我们就会转换到神经网络。现在,图中有十个点,这意味着我们可以找到一个唯一的9阶多项式
y
=
a
0
x
9
+
a
1
x
8
+
…
+
a
9
y = a_0 x^9 + a_1 x^8 + \ldots + a_9
y=a0x9+a1x8+…+a9,它完全适合数据。这是该多项式的图形我不会明确显示系数,尽管使用类似Numpy的 polyfit 程序很容易找到它们。
这提供了一个完美的拟合。但我们也可以使用线性模型 y=2x 得到一个很好的拟合:
哪一个模型更好?哪一个更可能是真实的?哪一个模型更可能对同一基础真实世界现象的其他示例进行良好的泛化?
这些都是困难的问题。事实上,我们没有足够的信息来确定上述问题的答案。但让我们考虑两种可能性:(1) 第9次多项式实际上是真实描述实际现象的模型,因此该模型将完美地泛化;(2) 正确的模型是 y=2x,但由于例如测量误差等原因,存在一些额外的噪声,这就是为什么该模型不是一个完美的拟合。
在没有更多关于潜在真实世界现象的信息的情况下,我们无法确定这两种可能性中的哪一种是正确的。(或者,确实有第三种可能性)。从逻辑上讲,两种情况都有可能是正确的。而且这并不是一个微不足道的差异。在提供的数据上,这两种模型之间的差异很小是事实。但是假设我们想要预测对应于图上未显示的某个大值 x 的 y 值。如果我们试图这样做,那么两种模型的预测之间将会有很大的差异,因为第9次多项式模型将被 x 9 x^9 x9 项所主导,而线性模型将保持线性。
一个观点是说,在科学中,我们应该选择更简单的解释,除非有强烈的理由不这样做。当我们找到一个简单的模型似乎能解释许多数据点时,我们会感到兴奋不已!毕竟,一个简单的解释不太可能仅仅是巧合。相反,我们怀疑该模型必须表达某种关于现象的基本真理。在这个情况下,模型 y=2x+noise 似乎比 y = a 0 x 9 + a 1 x 8 + … y = a_0 x^9 + a_1 x^8 + \ldots y=a0x9+a1x8+…更简单。如果这种简单性仅仅是偶然发生的,那将是令人惊讶的,因此我们怀疑 y=2x+noise 表达了某种潜在的真相。从这个观点来看,第9次多项式模型实际上只是在学习局部噪声的影响。因此,尽管9次多项式模型对这些特定数据点完美地工作,但该模型将无法推广到其他数据点,并且有噪声的线性模型将具有更强的预测能力。
让我们来看看这种观点对神经网络意味着什么。假设我们的网络大部分权重都很小,这在一个正则化的网络中往往会发生。权重的小性意味着如果我们在这里或那里随机改变一些输入,网络的行为不会发生太大变化。这使得正则化网络难以学习数据中的局部噪声的影响。可以将其看作是一种使单个证据对网络输出影响不大的方式。相反,正则化网络学会响应训练集中经常出现的证据类型。相比之下,一个具有大权重的网络可能会对输入的微小变化产生相当大的行为变化。因此,一个未正则化的网络可以利用大权重来学习一个复杂的模型,其中包含大量关于训练数据中噪声的信息。简而言之,正则化网络被限制在基于训练数据中经常出现的模式构建相对简单的模型,并且对训练数据中噪声的特殊学习具有抵抗力。希望这将迫使我们的网络真正学习到手头的现象,并从所学到的内容中更好地进行泛化。
话虽如此,更喜欢简单解释的这种想法可能会让你感到紧张。人们有时会将这种想法称为“奥卡姆剃刀”,并会将其视为某种普遍科学原理的地位来积极应用。但是,当然,并没有先验逻辑理由更喜欢简单的解释而不是更复杂的解释。事实上,有时更复杂的解释会被证明是正确的。
让我描述两个更复杂的解释被证明正确的例子。在1940年代,物理学家马塞尔·施恩宣布发现了一种新的自然粒子。他工作的公司,通用电气,感到非常兴奋,并广泛宣传了这一发现。但物理学家汉斯·贝特持怀疑态度。贝特拜访了施恩,并查看了显示施恩新粒子轨迹的平板。施恩向贝特展示了一个接一个的平板,但在每个平板上,贝特都发现了一些问题,表明数据应该被舍弃。最后,施恩向贝特展示了一个看起来不错的平板。贝特说这可能只是一个统计偶然。施恩说:“是的,但即使按照你自己的公式,这样的情况发生的概率也是五分之一。”贝特:“但我们已经看了五张平板了。”最后,施恩说:“但在我的平板上,每一张好的平板,每一张好的图片,你都用不同的理论来解释,而我有一个假设可以解释所有的平板,那就是它们是[新粒子]。”贝特回答道:“你和我的解释之间唯一的区别是,你的是错误的,而我的全部是正确的。你的单一解释是错误的,而我的多重解释都是正确的。”随后的工作证实了自然与贝特一致,施恩的粒子已不复存在。
作为第二个例子,1859年,天文学家乌尔班·勒维里尔观察到,水星的轨道形状与牛顿的万有引力理论预言的形状并不完全一致。这是与牛顿理论的微小偏差,当时提出的一些解释基本上都是说牛顿的理论在某种程度上是正确的,但需要进行微小的修改。1916年,爱因斯坦证明了可以用他的广义相对论非常好地解释这一偏差,这是一种与牛顿引力理论根本不同、基于更复杂数学的理论。尽管存在额外的复杂性,但今天人们普遍认为爱因斯坦的解释是正确的,而牛顿的引力理论,即使在其修改形式中,也是错误的。这部分是因为我们现在知道,爱因斯坦的理论解释了许多牛顿理论难以解释的现象。此外,更令人印象深刻的是,爱因斯坦的理论准确预测了几个根本不被牛顿引力理论预测的现象。但这些令人印象深刻的特点在早期并不完全明显。如果仅仅从简单性的角度来判断,那么某种修改后的牛顿理论可能会更具吸引力。
从这些故事中可以得出三个道理。首先,决定哪种解释真正“简单”可能是一项相当微妙的工作。其次,即使我们能够做出这样的判断,简单性也必须谨慎使用!第三,模型的真正测试不是简单性,而是它在预测新现象、在新行为范围内的表现如何。
话虽如此,在谨慎的基础上,经验证实,正则化的神经网络通常比未正则化的网络更具一般化能力。因此,在本书的其余部分,我们将经常使用正则化。我以上述故事仅仅是为了帮助传达为什么至今还没有人能够提出完全令人信服的理论解释正则化如何帮助网络一般化。事实上,研究人员继续撰写论文,尝试不同的正则化方法,比较它们的效果,并试图理解为什么不同的方法效果好坏不一。因此,你可以将正则化视为一种权宜之计。虽然它通常有所帮助,但我们对正在发生的事情并没有完全令人满意的系统性理解,只有不完整的启发式和经验法则。
这里涉及到一系列更深层次的问题,这些问题涉及科学的核心。这是关于我们如何进行概括的问题。正则化可能给我们提供一种使网络更好地一般化的计算魔棒,但它并没有给我们提供概括工作的原则性理解,也没有给出最佳方法。
这特别让人沮丧,因为在日常生活中,我们人类概括能力非常出色。向孩子展示几张大象的图片,他们很快就能学会识别其他的大象。当然,他们偶尔可能会犯错,也许会把犀牛误认为大象,但总体来说,这个过程非常准确。所以我们有一个系统 - 人类大脑 - 具有大量的自由参数。在仅仅展示了一张或几张训练图像后,该系统就能够学会将概括应用于其他图像。从某种意义上说,我们的大脑在非常出色地进行规范化!我们是如何做到的呢?目前我们还不清楚。我期待着在未来几年我们将开发出更强大的正则化技术,这些技术最终将使神经网络即使在小数据集上也能很好地进行概括。
事实上,我们的网络已经比人们预期的要好得多地进行了概括。一个具有 100 个隐藏神经元的网络有近 80,000 个参数。而我们的训练数据中只有 50,000 张图像。这就好比试图将一个 80,000 次多项式拟合到 50,000 个数据点上。按理说,我们的网络应该会严重过拟合。然而,正如我们之前所见,这样的网络实际上做得相当好。为什么会这样呢?这还不清楚。有人推测**在 Yann LeCun、Léon Bottou、Yoshua Bengio 和 Patrick Haffner 于 1998 年的论文《应用于文档识别的基于梯度的学习》中提出,“多层网络的梯度下降学习动态具有自我正则化效应”。这是非常幸运的,但也有点令人不安的是我们不知道为什么会这样。在此期间,我们将采取务实的方法,尽可能使用正则化。我们的神经网络将因此变得更好。
让我在结束本节时回到之前未解释的一个细节:L2 正则化不约束偏差。当然,修改正则化过程以使偏差也受到正则化会很容易。从经验上看,这样做通常不会对结果产生太大影响,所以在某种程度上,是否对偏差进行正则化只是一种惯例。然而,值得注意的是,拥有大偏差并不会像拥有大权重那样使神经元对其输入敏感。因此,我们不需要担心大偏差会使我们的网络学习训练数据中的噪声。与此同时,允许大偏差可以使我们的网络行为更加灵活 - 特别是,大偏差使神经元更容易饱和,这有时是可取的。基于这些原因,通常在正则化时不包括偏差项。