Skip to content

训练前打乱数据

Shuffle Data Before Training

深度学习模型可能由于各种

ds p72 1

原因而无法收敛。一些原因显而易见且常见,因此可以迅速纠正,比如学习率过高或过低、没有进行数据归一化、没有进行批次归一化等等。

但当原因不那么明显时,问题就出现了。因此,如果你不了解这些问题,调试起来可能要花上不少时间。在本章中,我想谈谈这样一个与数据相关的错误,那是我在机器学习早期曾经犯过的。不可否认,当时我花了相当长的时间才弄清楚,因为我对这个问题一无所知。

考虑一个使用小批次梯度下降(gradient descent)训练的分类神经网络(neural network)。其核心思想是:我们每次向网络喂入一个批次的数据,并据此进行更新。

ds p72 2

ds p73 1

在这里,我们训练两个不同的神经网络:

  • 版本 1:数据集按标签排序。
  • 版本 2:数据集按标签进行了充分打乱。

当然,在训练之前,我们确保两个网络具有相同的初始权重、学习率以及其他设置。

ds p73 2

这张图描绘了两个模型逐 epoch 的性能表现。左边是在按标签排序的数据上训练的模型,右边是在打乱的数据集上训练的模型。

可以清楚地看到,接收按标签排序数据集的模型惨痛地无法收敛,而另一个模型虽然过拟合(overfitting),但表明模型已经有效地进行了学习。

现在,如果你稍加思考,总体而言,两个模型接收到的数据是一样的,不是吗?然而,数据被喂给这些模型的顺序完全决定了它们的性能。我清楚地记得,当我遇到这个问题时,我知道我的数据是按标签排序的。

然而,我从未想到排序会影响模型的性能,因为无论怎样排序,数据始终是一样的。

ds p74 1

但后来我意识到,这一点只有在模型一次性看到全部数据并一次性更新模型权重时才成立,也就是在批次梯度下降中,如下图所示。

但在小批次梯度下降的情况下,权重会在每个小批次之后更新。因此,对后续小批次的预测和权重更新会受到之前小批次的影响。

ds p74 2

在按标签排序的数据中,同一类别的样本被聚集在一起,小批次梯度下降会引导模型去学习它在训练早期过度看到的那个类别所特有的模式。相比之下,随机排序的数据能确保每个小批次都包含各类别的均衡表示。这使得模型在整个训练过程中能够学到更全面的特征(feature)。当然,打乱的做法对于时间序列数据集并不适用,因为其时间结构很重要。好消息是,如果你使用的是比如 PyTorch DataLoader,那你是安全的,因为它已经实现了打乱。但如果你有自己的自定义实现,请确保没有犯这样的错误。在结束之前,有一件事你在训练神经网络时必须始终牢记:这些模型能够非常熟练地学习关于你数据集的、完全不存在的模式。所以永远不要给它们任何这样做的机会。

本站内容仅供学习交流,版权归原作者所有。