shuffle理解

在模型训练前,我们往往对数据进行shuffle,即随机打乱数据,为什么要这么做呢?不这么做会出现什么问题?何时应该shuffle,何时不该shuffle呢?

Q1:为什么要进行shuffle?

A1:不论是机器学习还是深度学习,我们总是基于数据独立同分布的假设条件,也就是说,数据的出现应该是随机的,而不是按照某种顺序排列好的。以上就是需要shuffle的根本原因。因此,我们需要在每个epoch的开始把数据shuffle一下
 

Q2:不shuffle会出现什么问题?

A2:泛化能力差。

  • ①模型学到的可能只是数据次序,并未学到有用的信息,导致泛化能力差。
  • ②如果数据是排序过的,比如按类别排序,会导致模型一会儿过拟合这个类,一会儿过拟合那个类,这一方面会使得训练过程的loss周期性震荡;另一方面,在训练结束时,模型总是对最近训练的那类数据过拟合而导致泛化能力差。

比如做公式识别(将图片的公式转换为latex形式),如果不shuffle,按图片的宽高比排列数据,且第一张图片和最后一张图片的宽高比相差很大,在这种情况下,不shuffle直接训练,就会出现loss周期性震荡的现象,比如每个epoch的开始,loss会突然上升很多,然后逐渐下降,等下一个epoch开始的时候,loss又会突然上升,循环往复。
 

Q3:何时应该shuffle,何时不该shuffle呢?

A3:当我们使用优化器进行模型训练时,比如使用SGD优化方法,不可避免地,在结束模型训练时,模型对刚刚学习过的那类数据有着更好的表现。

因此,①如果我们想让模型泛化能力更强,我们应该对数据进行shuffle,这样模型最后见过的数据在一定程度上是能代表总体的,有着更强的泛化能力,通常情况下,我们都是要进行shuffle的。

②如果我们想让模型学会某种次序关系或者我们希望模型对某部分数据表现的更好一点,那么我们则要根据自己的目的来决定数据的顺序,并决定是局部shuffle还是完全不shuffle。比如,对于时间序列数据,根据过去的数据预测未来的数据,我们则希望越近期的数据,模型给予更高的关注度,一种方式就是将近期的数据放在后面,那么等模型训练完的时候,最近见过的数据就是近期的数据,自然对近期数据有更高的关注,这样在预测未来数据的时候,近期的数据能发挥更大的作用。

所以,是否shuffle要具体情况具体分析。

参考:https://blog.csdn.net/G_B_L/article/details/109600536

猜你喜欢

转载自blog.csdn.net/weixin_43135178/article/details/114884377
今日推荐