深度炼丹入坑许久,记录一些过程中遇到的问题,不定时更新。
NO FREE LUNCH定理:如果不考虑具体问题,所有的算法都是随机猜测,没有好坏之分。
1、训练数据集shuffle的作用
在将训练数据送入网络之前,一般均会对数据集做shuffle,打乱数据之间的顺序,让数据随机化,这样可以避免过拟合。
如果不shuffle,模型短期时间内可能会连续遇见到A类型样本,可能会出现过拟合,而另一段时间内又过拟合于B类型样本,忘记之前学习到的A样本,这样的模型泛化能力必然很差。那如果A和B样本一直交替,还会过拟合吗?
依然会过拟合,模型是会记住训练数据的路线,因为固定的数据集顺序,意味着给定迭代步,对应此迭代步的训练数据是固定的。 假如目标函数是J=f(w1, w2),使用梯度下降优化J。给定权重取值w1、w2和迭代步step的情况下,固定的数据集顺序意味着固定的训练样本,也就意味着权值更新的方向是固定的,而无顺序的数据集,意味着更新方向是随机的。在更新的过程中,若沿着固定的方向更新,则可能很难收敛到最优点,而如果更新方向是随机的,则有可能收敛到最优点。所以参数更新的过程,叫随机梯度下降。
固定的数据集顺序,严重限制了梯度优化方向的可选择性,导致收敛点选择空间严重变少,容易导致过拟合。模型是会记住数据路线的,因此一般都会shuffle。
总结:shuffle开了叫随机梯度下降,不开叫梯度下降。从优化角度来说区别巨大。实际角度来说,不shuffle的话神经网络会记住特定的example顺序。
Reference:
【1】https://juejin.im/post/5c6b989bf265da2ddd4a5261
2、shuffle一定要用吗?
不一定,视具体任务而定。尽信书不如无书。
脱离了具体任务、场景,讲炼丹技巧,都是耍流氓。
Shuffle是一种训练的技巧,因为机器学习其假设和对数据的要求就是要满足独立同分布,打乱数据可以让输入近似满足条件,也有利于模型的收敛。所以任何样本的出现都需要满足“随机性”。所以在数据有较强的“人为”次序特征的情况下,Shuffle显得至关重要。
但是模型本身就为序列模型,则数据集的次序特征为数据的主要特征,并且模型需要学到这种次序规律时,则不可以使用Shuffle。否则会将数据集中的特征破坏。
监督学习中,有一个基本的假设是独立同分布假设,即所有样本都是从相同的概率分布中抽取出来的,并在统计上相互独立。基于这个假设,打乱数据不会影响机器学习的结果。并有以下优点:
- 提升模型质量
- 提升预测表现
需注意的是,并不是所有数据满足独立同分布假设。有时间相关性的数据,如temporal data, time-series data是不能打乱进行机器学习的。
Shuttle阻隔数据间本身顺序的相关性。
对比一下,如果你期望的是预测任意出现的新sample,那么打乱训练数据阻隔本身顺序相关性理所当然,如果期望预测有序出现的新sample,那么保持顺序信息是必须的。
总结:还是看具体任务和实验结果而定,毕竟炼丹是一门实验科学。
Reference:
【1】https://blog.csdn.net/qq_19672707/article/details/88864207
【2】https://blog.csdn.net/leayc/article/details/79484758
【3】李航 《统计学习方法》
3、如果shuffle后,采用mini-batch训练的话,每一个batch里面的样本间,有没有顺序性?
无。因为mini-batch采样的时候,也是在已经打乱后的数据集上进行的,而已经打乱后的数据集中,已没有原始的顺序性,所以每一个batch里面的这些样本,之间也是乱序的。