在本系列博客的第一部分,讨论了与欠拟合和过拟合相关的概念,并学习了以下三种防止神经网络过拟合的方法:降低模型复杂度、数据增强和权重正则化。本文将继续介绍以下防止过拟合的技术:Dropout、早停和权重衰减。
Dropout是另一种防止神经网络过拟合的正则化技术。与L1和L2等通过修改代价函数来减少过拟合的方法不同,Dropout通过修改网络本身来防止过拟合。其工作原理是在每次迭代中随机丢弃一些神经元(除了输出层),或者为网络中的所有神经元分配一个概率p,使它们在计算中暂时被忽略。这个概率p被称为Dropout率,通常设置为0.5。随着每次迭代的进行,每层中概率最高的神经元会被丢弃,从而在每次遍历训练数据集时创建一个更小的网络。由于每次迭代中随机输入值可能被消除,网络尝试平衡风险,不偏袒任何特征,从而减少偏差和噪声。
有时,这种技术也被称为神经网络的集成技术,因为当丢弃不同的神经元集合时,它相当于训练不同的神经网络。因此,在这种技术中,不同的网络将以不同的方式过拟合,Dropout的净效果将是减少过拟合。这种防止过拟合的技术已被证明可以减少包括图像分类、图像分割、词嵌入、语义匹配等多种问题陈述中的过拟合。
问题1:认为Dropout率和正则化之间有联系吗?对于这个问题,需要考虑Dropout率作为保持神经元活跃的概率。
问题2:假设有一个5层的神经网络,在4GB VRAM的GPU上训练需要4小时。在测试时,单个数据的测试时间为3秒。现在修改架构,在第2层和第4层后分别添加Dropout,Dropout率分别为0.3和0.5。那么,对于这个新架构的测试时间,认为是少于3秒、正好3秒还是多于3秒?
早停是一种正则化技术,适用于使用迭代方法(如梯度下降)训练模型时。由于所有神经网络都是借助梯度下降等优化算法学习的,因此早停是一种适用于所有问题的技术。这种技术通过更新模型来防止过拟合,使模型更好地适应训练数据。知道,神经网络的过度训练会导致网络过拟合于训练数据。在某个点之前,模型在测试集上的性能会有所提升。然而,在那个点之前,提高模型对训练数据的拟合度会导致泛化误差增加。这种正则化技术为提供了一个指导,即在模型开始过拟合之前可以运行多少次迭代。
如下面的图表所示,经过几次迭代后,测试误差开始增加,而训练误差仍在下降。因此,模型正在过拟合。为了解决这个问题,在这种情况开始发生时停止模型。早停点的网络参数被认为是模型的最佳拟合。为了在早停点之后降低测试误差,可以使用以下方法:减小学习率,建议使用学习率调度算法;使用不同的优化算法;使用L1或L2正则化等权重正则化技术。
在图像识别任务中,在训练神经网络时绘制训练误差和验证误差的图表以调试网络。那么,根据观点,在图表中的A、B、C和D中,早停的最佳位置是哪里?
在第一部分文章中,描述了数据增强技术有助于深度学习模型泛化良好。这是数据方面的事情。那么,模型方面呢?
问题来了:在训练模型时,能做些什么,使模型泛化良好?模型的参数如上图所示,有一组数据点,使用直线无法很好地拟合它们。因此,尝试使用二阶多项式来拟合,但注意到当多项式的阶数超过某个点时,模型变得过于复杂并开始过拟合。
从上面的图表中,可以了解到,为了防止过拟合,不应该让模型变得过于复杂。不幸的是,这导致了深度学习中的一个误解,即不应该使用太多的参数(以防止模型变得过于复杂)。
权重衰减的起源?首先,必须理解,现实世界的数据不会像上图中显示的那样简单。现实世界的数据非常复杂,要解决复杂的问题,需要复杂的解决方案。拥有少量可学习的参数只是防止模型过拟合的一种方式。但这实际上是一个非常有限的策略。并且值得注意的是,随着网络中参数的增加,它会导致神经网络的各个部分之间有更多的相互作用。更多的相互作用意味着更多的非线性。这些非线性帮助解决复杂的问题。
然而,目标是保持这些相互作用,或者不希望这些相互作用失控。那么,如果惩罚复杂性呢?在惩罚复杂性之后,仍然会使用那么多参数,但目标是防止模型变得过于复杂。这正是权重衰减技术防止神经网络过拟合的想法。
这种被称为权重衰减的东西为了惩罚模型,惩罚其复杂性的一种技术是将所有参数(权重)添加到损失函数中。嗯,那不太好用,因为有些参数是正的,有些是负的。所以,尝试将所有参数的平方添加到损失函数中。然而,这样做的问题是,它可能会导致损失变得如此巨大,以至于最佳模型将是将所有参数设置为0。
为了解决上述问题,将整体平方和乘以另一个较小的数字,这被称为权重衰减或wd。因此,新损失函数变为:Loss = MSE(y_hat, y) + wd * sum(w^2),其中y_hat和y分别是预测值和实际值。MSE代表均方误差。现在,使用梯度下降,根据以下公式更新权重:w(t) = w(t-1) – lr * dLoss / dw。在惩罚之后,损失函数有两个组成部分,因此第二项关于w的导数是:d(wd * w^2) / dw = 2 * wd * w(类似于d(x^2)/dx = 2x)。从现在起,将应用这个公式,它不仅从权重中减去学习率*梯度,还减去2 * wd * w。从原始权重中减去常数倍的权重。这就是为什么它被称为权重衰减。
在学习了权重衰减技术之后,它可能看起来与L2正则化相同。认为这是真的吗?为什么或为什么不?