当前位置: 首页 > 科技观察

Epoch不仅过时,而且有害?Reddit机器学习版块讨论

时间:2023-03-15 09:31:51 科技观察

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。一天,一个条占侠正在训练一个深度学习模型。要使用的两个数据集的损失函数是不同的。数据集的大小不是固定的,每天都在增加。他有些担心,纪元号怎么设置?在挣扎的过程中,他突然想到:为什么一定要设置一个Epoch号呢?只要每个batch独立同分布抽样(IIDSampling)是不够的。为了验证这个想法,刁申侠看了很多论文。发现越来越多的人在介绍自己的训练方法时,只说进行了多少次迭代,而放弃了Epoch。他突然想到,Epoch暗示并强调数据集是有限的,这不仅麻烦,而且可能“有害”。去掉Epoch,减少循环嵌套的层数,总是好的。于是他在Reddit上发起了一场讨论:Epoch是否过时,甚至有害?Epoch是多余的吗?有人认同这个观点:有道理。当数据集大小差距较大,Batchsize相同时,设置相同的Epochs数,意味着大数据集的参数会更新更多次,而小数据集的参数set更新频率会降低,这似乎不对。Epoch最大的好处是保证每个样本都被定期使用。使用IID采样时,您只需找到一种方法来确保所有样本的使用频率相同。但田占霞认为每个样本是否定期使用是他疑惑的地方。IID采样已经保证了相同的分布,让它们以相同的频率使用是有误导性的。反对者认为:不能因为觉得车不在路中间就松开方向盘。虽然大量的驾驶不会改变你在路中间的概率,但它增加了方差。调神侠最后得出的结论是,这场争论有点像统计学中的“频率论与贝叶斯论”,即数据集应该是确定性的还是不确定性的。如何比较模型?跳神侠也注意到有人用BatchLoss做损失曲线。他认为比EpochLoss更有参考价值。反对者认为你的方法很好,但是Epoch还是有用的。因为即使在同一个硬件上,不同模型的不同算法效率也会带来巨大的差异。各种Transformer和CNN的底层代码实现大同小异,但其他模型可能差别很大。例如,我们自己的CUDALSTM实现至少与CudnnLSTM一样快,比原始TensorFlow实现快约4倍。最后,有网友以CV模型为例对本题进行了精彩总结,罗列了4种loss可视化方法,并介绍了在什么情况下使用哪一种。Loss/Epoch告诉您模型必须查看同一张图像多少次才能理解它。损失/迭代告诉您需要多少参数更新。这在比较优化器时很有用,可以帮助您加快训练速度或获得更高的准确性。Loss/TotalImageSeen告诉您算法看到多少图像时的损失。有助于比较两种算法使用数据的效率。如果您的算法在500,000时执行70%,在100万时执行75%,那么这可能优于500,000时的50%和100万时的80%。此外,它还消除了BatchSize的影响。这允许在不同GPU上训练的具有不同批量大小的模型之间进行公平比较。Loss/Time也很重要,因为如果一个新模型减少了100个Epoch,但是每次Iteration都慢了100倍,我是不会选择这个模型的。Loss/Time虽然和硬件的具体性能有关,但是不够准确,所以我不会把这个写进论文里。但是在自己的机器上评估模型的参数就好了。使用数据增强时怎么样?有网友提出,Epoch在DataAugmentation的时候也有点多余。由于数据集太小,每个样本人为加入了很多只有很小差距的版本,没有必要以相同的频率使用。反对者认为,数据增强作为一种正则化形式可以减少过度拟合,但您在训练模型时引入的实际信息仍然仅限于原始数据集。如果你的原始数据集足够小,Epoch意味着你向模型展示了整个训练集,它仍然有意义。有人问:你是想表达大纪元的终结吗?调神侠:对,现在是“时代”的时代。△ERA为EndlessRandomEnhancement的缩写,意为“时代”