关于神经网络中的网络训练过程中的验证集validation_data的认识
validation_data
中包含了 幅数字图像,这些图像和训练数据集中的 幅图像以及测试数据集中的 幅都不相同。我们会使用 validation_data
来防止过匹配。我们会使用和上面应用在 test_data
的策略。我们每个回合都计算在 validation_data
上的分类准确度。一旦分类准确度已经饱和,就停止训练。这个策略被称为 提前停止(Early stopping)。当然,实际应用中,我们不会立即知道什么时候准确度会饱和。相反,我们会一直训练知道我们确信准确度已经饱和。
这里需要一些判定标准来确定什么时候停止。在我前面的图中,将 回合看成是饱和的地方。可能这有点太悲观了。因为神经网络有时候会训练过程中处在一个平原期,然后又开始提升。如果在 回合后,性能又开始提升(也许只是一些少量提升),那我也不会诧异。所以,在提前停止中采取一点激进的策略也是可以的。
为何要使用 validation_data
来替代 test_data
防止过匹配问题?实际上,这是一个更为一般的策略的一部分,这个一般的策略就是使用 validation_data
来衡量不同的超参数(如训练回合,学习率,最好的网络架构等等)的选择的效果。我们使用这样方法来找到超参数的合适值。因此,尽管到现在我并没有提及这点,但其实本书前面已经稍微介绍了一些超参数选择的方法。
当然,这对于我们前面关于 validation_data
取代 test_data
来防止过匹配的原因仍旧没有回答。实际上,有一个更加一般的问题,就是为何用validation_data
取代 test_data
来设置更好的超参数?为了理解这点,想想当设置超参数时,我们想要尝试许多不同的超参数选择。如果我们设置超参数是基于 test_data
的话,可能最终我们就会得到过匹配于 test_data
的超参数。也就是说,我们可能会找到那些 符合 test_data
特点的超参数,但是网络的性能并不能够泛化到其他数据集合上。我们借助 validation_data
来克服这个问题。然后一旦获得了想要的超参数,最终我们就使用 test_data
进行准确度测量。这给了我们在 test_data
上结果是一个网络泛化能力真正的度量方式的信心。换言之,你可以将验证集看成是一种特殊的训练数据集能够帮助我们学习好的超参数。这种寻找好的超参数的观点有时候被称为 hold out 方法,因为 validation_data
是从训练集中保留出来的一部分。
在实际应用中,甚至在衡量了测试集上的性能后,我们可能也会改变想法并去尝试另外的方法——也许是一种不同的网络架构——这将会引入寻找新的超参数的的过程。如果我们这样做,难道不会产生过匹配于 test_data
的困境么?我们是不是需要一种潜在无限大的数据集的回归,这样才能够确信模型能够泛化?去除这样的疑惑其实是一个深刻而困难的问题。但是对实际应用的目标,我们不会担心太多。相反,我们会继续采用基于 training_data, validation_data, and test_data
的基本 hold out 方法。
如你所见,测试集和训练集上的准确度相比我们使用 个训练数据时相差更小。特别地,在训练数据上的最佳的分类准确度 97.86% 只比测试集上的 95.33% 准确度高一点点。而之前的例子中,这个差距是 17.73%!过匹配仍然发生了,但是已经减轻了不少。我们的网络从训练数据上更好地泛化到了测试数据上。一般来说,最好的降低过匹配的方式之一就是增加训练样本的量。有了足够的训练数据,就算是一个规模非常大的网络也不大容易过匹配。不幸的是,训练数据其实是很难或者很昂贵的资源,所以这不是一种太切实际的选择。
规范化
增加训练样本的数量是一种减轻过匹配的方法。还有其他的一下方法能够减轻过匹配的程度么?一种可行的方式就是降低网络的规模。然而,大的网络拥有一种比小网络更强的潜力,所以这里存在一种应用冗余性的选项。
幸运的是,还有其他的技术能够缓解过匹配,即使我们只有一个固定的网络和固定的训练集合。这种技术就是规范化。本节,我会给出一种最为常用的规范化手段——有时候被称为权重下降(weight decay)或者 L2规范化。L2 规范化的想法是增加一个额外的项到代价函数上,这个项叫做 规范化 项。下面是规范化交叉熵:
训练集上的代价函数持续下降,和前面无规范化的情况一样的规律:
但是这里测试集上的准确度是随着回合次数持续增加的:
显然,规范化的使用能够解决过匹配的问题。而且,准确度相当搞了,最高处达到了 87.1%,相较于之前的 82.27%。因此,我们几乎可以确信持续训练会有更加好的结果。实验起来,规范化让网络具有更好的泛化能力,显著地减轻了过匹配的效果。
如果我们换成全部的训练数据进行训练呢?当然,我们之前已经看到过匹配在大规模的数据上其实不是那么明显了。那规范化能不能起到相应的作用呢?保持超参数和之前一样。不过我们这里需要改变规范化参数。原因在于训练数据的大小已经从 改成了 ,这个会改变权重下降因子 。如果我们持续使用 就会产生很小的权重下降,因此就将规范化的效果降低很多。我们通过将 来补偿这种下降。
参考:https://tigerneil.gitbooks.io/neural-networks-and-deep-learning-zh/content/chapter3a.html