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