L1正则化
除了L2正则化之外,还有许多正则化技术。事实上,已经开发出了如此多的技术,以至于我不可能总结它们。在本节中,我简要介绍了三种减少过拟合的其他方法:L1正则化、dropout和人为增加训练集大小。我们不会像之前那样深入研究这些技术。相反,目的是熟悉主要思想,并体会到可用的正则化技术的多样性。
L1正则化:在这种方法中,我们通过添加权重的绝对值之和来修改未正则化的损失函数:
C = C 0 + λ n ∑ w ∣ w ∣ . (95) C = C_0 + \frac{\lambda}{n} \sum_w |w|.\tag{95} C=C0+nλw∑∣w∣.(95)
直觉上,这与L2正则化类似,惩罚大的权重,倾向于使网络偏好小的权重。当然,L1正则化项并不同于L2正则化项,因此我们不应该期望得到完全相同的行为。让我们试着理解使用L1正则化训练的网络的行为与使用L2正则化训练的网络有何不同。
为了做到这一点,我们将查看损失函数的偏导数。对(95)进行微分,我们得到:
∂ C ∂ w = ∂ C 0 ∂ w + λ n s g n ( w ) , (96) \frac{\partial C}{\partial w} = \frac{\partial C_0}{\partial w} + \frac{\lambda}{n} \, {\rm sgn}(w), \tag{96} ∂w∂C=∂w∂C0+nλsgn(w),(96)
其中sgn(w)是w的符号,即如果w为正则为+1,如果w为负则为−1。利用这个表达式,我们可以轻松地修改反向传播,以使用L1正则化进行随机梯度下降。L1正则化网络的更新规则如下:
w → w ′ = w − η λ n s g n ( w ) − η ∂ C 0 ∂ w , (97) w \rightarrow w' = w-\frac{\eta \lambda}{n} {sgn}(w) - \eta \frac{\partial C_0}{\partial w}, \tag{97} w→w′=w−nηλsgn(w)−η∂w∂C0,(97)
与通常情况一样,如果我们希望,可以使用小批量平均来估计∂C0/∂w。与L2正则化的更新规则进行比较(参见方程(93)),
w → w ′ = w ( 1 − η λ n ) − η ∂ C 0 ∂ w . (98) w \rightarrow w' = w\left(1 - \frac{\eta \lambda}{n} \right)- \eta \frac{\partial C_0}{\partial w}.\tag{98} w→w′=w(1−nηλ)−η∂w∂C0.(98)
在这两个表达式中,正则化的效果都是使权重收缩。这符合我们的直觉,即两种类型的正则化都惩罚大的权重。但权重收缩的方式是不同的。在L1正则化中,权重以恒定的量朝0方向收缩。而在L2正则化中,权重以与w成比例的量收缩。因此,当特定权重具有较大的幅度|w|时,L1正则化使权重收缩的程度要比L2正则化小得多。相反,当|w|很小时,L1正则化使权重收缩得比L2正则化更多。总的结果是,L1正则化倾向于将网络的权重集中在相对较少数量的高重要性连接中,而其他权重则被推向零。
在上述讨论中,我忽略了一个问题,即当w=0时,偏导数∂C/∂w未定义。原因是函数|w|在w=0处具有尖锐的“角”,因此在该点不可微。不过,这没关系。我们将在w=0时使用通常的(未正则化的)随机梯度下降规则。直观地说,正则化的效果是使权重收缩,显然不能收缩已经为0的权重。更精确地说,我们将使用方程(96)和(97),其中sgn(0)=0的约定。这给了我们一个简洁的规则,用于使用L1正则化进行随机梯度下降。
Dropout(随机失活)
Dropout是一种完全不同的正则化技术。与L1和L2正则化不同,dropout不依赖于修改成本函数。相反,在dropout中,我们修改网络本身。让我描述一下dropout的基本原理,然后再讨论它的原理以及结果是什么。
假设我们正在尝试训练一个网络
特别是,假设我们有一个训练输入 x 和相应的期望输出 y。通常情况下,我们会通过网络前向传播 x,然后进行反向传播以确定对梯度的贡献。使用dropout时,这个过程会有所修改。我们首先随机(临时地)删除网络中一半的隐藏神经元,同时保留输入和输出神经元不变。这样做之后,我们得到的网络如下所示。请注意,dropout神经元,即临时删除的神经元,仍然显示在图中:
我们将输入 x 通过修改后的网络进行前向传播,然后通过修改后的网络进行反向传播。在对一小批样本执行此操作之后,我们更新相应的权重和偏差。然后,我们重复这个过程,首先恢复dropout神经元,然后选择一个新的随机隐藏神经元子集进行删除,估计另一个小批样本的梯度,并更新网络中的权重和偏差。
通过反复执行这个过程,我们的网络将学习到一组权重和偏差。当然,这些权重和偏差是在一半的隐藏神经元被丢弃的情况下学习的。当我们实际运行完整网络时,这意味着有两倍多的隐藏神经元将处于活跃状态。为了补偿这一点,我们将从隐藏神经元传出的权重减半。
这个dropout过程可能看起来奇怪和临时性。为什么我们期望它有助于正则化?为了解释其中的原理,我希望你暂时停止考虑dropout,而是想象以标准方式(不使用dropout)训练神经网络。特别是,想象我们训练了几个不同的神经网络,它们都使用相同的训练数据。当然,这些网络可能一开始并不相同,因此在训练之后它们有时可能会给出不同的结果。当发生这种情况时,我们可以使用某种平均或投票方案来决定接受哪个输出。例如,如果我们训练了五个网络,并且其中三个将一个数字分类为“3”,那么它可能确实是“3”。其他两个网络可能只是犯了一个错误。这种平均方案通常被发现是一种有效的(尽管昂贵)减少过拟合的方法。原因是不同的网络可能以不同的方式过拟合,而平均可能有助于消除这种过拟合。
这与dropout有什么关系?从启发式的角度来看,当我们随机删除不同的神经元集时,就好像我们在训练不同的神经网络。因此,dropout过程就像是对大量不同网络效果进行平均。不同的网络会以不同的方式过拟合,因此,希望dropout的净效果是减少过拟合。
在使用该技术的最早论文之一中给出了有关dropout的一个相关启发式解释:“这种技术减少了神经元的复杂共适应,因为神经元不能依赖于特定其他神经元的存在。因此,它被迫学习更加稳健的特征,这些特征在与其他神经元的许多不同的随机子集一起使用时是有用的。”换句话说,如果我们将我们的网络视为进行预测的模型,那么我们可以将dropout视为确保模型对于丢失任何单个证据都具有稳健性的一种方式。在这方面,它与L1和L2正则化有些相似,后者倾向于减小权重,从而使网络更具稳健性,以抵御在网络中丢失任何单个连接的风险。
当然,dropout的真正衡量标准是它在提高神经网络性能方面取得了巨大成功。最初的论文应用了这项技术到许多不同的任务中。对我们来说,特别有趣的是,他们将dropout应用到了MNIST数字分类中,使用了类似于我们一直在考虑的基本前馈神经网络的模型。该论文指出,截至当时,使用这种架构达到的最佳结果是在测试集上达到了98.4%的分类准确率。他们使用了dropout和一种修改过的L2正则化的组合,将准确率提高到了98.7%。类似的令人印象深刻的结果已经在许多其他任务中获得,包括图像和语音识别以及自然语言处理的问题。dropout在训练大型、深度网络方面特别有用,这些网络往往容易出现过拟合问题。
人为扩展训练数据
我们之前已经看到,当我们只使用1,000个训练图像时,我们的MNIST分类准确率下降到了85%左右。这并不令人意外,因为较少的训练数据意味着我们的网络将接触到更少的人类书写数字的变化方式。让我们尝试使用各种不同大小的训练数据集来训练我们的30个隐藏神经元网络,以查看性能如何变化。我们使用的是小批量大小为10,学习率 η=0.5,正则化参数 λ=5.0,以及交叉熵损失函数进行训练。当使用完整的训练数据集时,我们将进行30个时期的训练,并且在使用较小的训练集时按比例增加时期的数量。为了确保权重衰减因子在各个训练集中保持一致,我们将在使用完整训练数据集时使用正则化参数 λ=5.0,并在使用较小的训练集时按比例减少 λ。
正如您所看到的,随着我们使用更多的训练数据,分类准确率显着提高。可以推测,如果有更多的数据可用,这种改进可能会进一步持续。当然,从上面的图表可以看出,我们似乎已经接近饱和状态。然而,假设我们使用对数标度重新绘制训练集大小的图表:
图表显然还在朝着末尾上升。这表明,如果我们使用大量更多的训练数据——比如说,数百万甚至数十亿手写样本,而不仅仅是 50,000 个——那么即使是这个非常小的网络,我们可能会得到更好的性能。
获得更多的训练数据是一个好主意。不幸的是,这可能会很昂贵,因此在实践中并不总是可行的。然而,还有另一个几乎同样有效的方法,那就是人为地扩展训练数据。比如,假设我们拿到了一个 MNIST 的训练图像,上面是一个数字“5”。
然后将其旋转一小部分,比如说 15 度:
这个图像仍然可以明显地识别为相同的数字。但在像素级别上,它与MNIST训练数据中的任何图像都有很大不同。将这个图像添加到训练数据中可能有助于我们的网络学习如何对数字进行分类。此外,显然我们不仅限于添加这一个图像。我们可以通过对所有MNIST训练图像进行许多小幅度旋转来扩展我们的训练数据,然后使用扩展的训练数据来提高网络的性能。
这个想法非常强大,已经被广泛应用。让我们来看一些论文中的结果,这篇论文应用了这个想法的几种变体到MNIST数据集中。他们考虑的一个神经网络架构与我们一直在使用的类似,是一个具有800个隐藏神经元并使用交叉熵损失函数的前馈网络。在标准的MNIST训练数据上运行网络时,他们在测试集上实现了98.4%的分类准确率。但后来,他们扩展了训练数据,不仅像我上面描述的旋转,还平移和倾斜了图像。通过在扩展的数据集上进行训练,他们将网络的准确率提高到了98.9%。他们还尝试了他们称之为“弹性扭曲”的技术,这是一种特殊的图像扭曲,旨在模拟手部肌肉中的随机振动。通过使用弹性扭曲来扩展数据,他们实现了更高的准确率,达到了99.3%。实际上,他们通过让网络接触到真实手写中存在的各种变化,来丰富网络的经验。
这个想法的变体可以用于改善许多学习任务的性能,不仅限于手写识别。总的原则是通过应用反映真实世界变化的操作来扩展训练数据。想要做到这一点并不难。例如,假设你正在构建一个用于语音识别的神经网络。我们人类即使在背景噪音等扭曲存在的情况下也能识别语音。因此,您可以通过添加背景噪音来扩展您的数据。我们还可以在语音被加速或减速的情况下进行识别。所以这是我们可以扩展训练数据的另一种方式。这些技术并不总是被使用 - 例如,与其通过添加噪音来扩展训练数据,可能更有效的方法是首先应用噪声减少滤波器来清理网络的输入。然而,记住扩展训练数据的想法,并寻找应用它的机会是值得的。
关于大数据以及比较分类准确度的含义
让我们再次看一下我们的神经网络在不同训练集大小下的准确率变化情况:
假设我们不是使用神经网络,而是使用其他一些机器学习技术来对数字进行分类。例如,让我们尝试使用支持向量机(SVM),我们在最前面简要介绍过。如果您对SVM不熟悉也不用担心,我们不需要了解其详细信息。相反,我们将使用由scikit-learn库提供的SVM。下面是SVM性能随着训练集大小变化的情况。我也绘制了神经网络的结果,以便进行比较。
这张图的第一印象可能是我们的神经网络在每个训练集大小下都优于SVM。这很好,尽管您不应过多解读,因为我只是使用了scikit-learn的SVM的默认设置,而我们在改进我们的神经网络时做了大量工作。这张图更微妙但更有趣的一点是,如果我们使用50,000张图像来训练我们的SVM,那么它的性能实际上会更好(准确率为94.48%),而我们的神经网络在使用5,000张图像进行训练时的性能则不及它(准确率为93.24%)。换句话说,更多的训练数据有时可以弥补机器学习算法之间的差异。
更有趣的情况可能会发生。假设我们正在尝试使用两种机器学习算法A和算法B来解决一个问题。有时候,算法A在一个训练数据集上的表现会优于算法B,而算法B在另一个训练数据集上的表现则会优于算法A。我们在上面的图中没有看到这种情况 - 它需要两个图交叉 - 但它确实会发生。对于问题“算法A是否比算法B更好?”的正确回答实际上是:“您正在使用哪个训练数据集?”
所有这些都是需要谨记的警示,无论是在开发过程中还是在阅读研究论文时。许多论文侧重于发现新的技巧,以在标准基准数据集上提高性能。“我们的新技术在标准基准Y上使性能提高了X个百分点”是研究论断的一个典型形式。这样的论断通常确实很有趣,但必须理解为仅适用于特定训练数据集的情况。想象一下一个另类历史,在这个历史中,最初创建基准数据集的人有了更大的研究经费。他们可能会利用额外的资金来收集更多的训练数据。完全有可能,“由于这个新技术带来的”改进“在更大的数据集上会消失。换句话说,所谓的改进可能只是历史的偶然事件。要特别注意的是,在实际应用中,我们需要的是更好的算法和更好的训练数据。寻找更好的算法是可以的,但确保你不是只关注更好的算法而忽视了获取更多或更好的训练数据这一简单的胜利。
总结一下:我们已经完成了对过拟合和正则化的深入探讨。当然,我们会再次回到这个问题上。正如我多次提到的,过拟合是神经网络中的一个重大问题,特别是随着计算机变得更加强大,我们有能力训练更大的网络。因此,迫切需要开发强大的正则化技术来减少过拟合,而这是当前工作中非常活跃的一个领域。