L04_机器学习:批次与动量
机器学习:批次(Batch)与动量(Momentum)
回顾:使用Batch进行最优化
在实际的最优化过程中,我们将很多的数据分成好多份,每一份算出一个出来,然后使用它迭代计算。具体过程如下图所示:

:是使用一个中的数据训练出的迭代一次。
:使用每一个迭代过一次,每一个epoch之后会重新分配batch进行训练(Shuffle)。
Small Batch v.s. Large Batch
假设总共有20个数据。(N=20)
Large Batch
每一批的数据大小为20个,也就是说不分批次训练(Full Batch)。这样的话,每次更新都是使用所有数据进行更新参数,每一次更新耗费时间较长,但是走的方向比较稳健,更容易向准确的方向走。
Small Batch
每一批数据的大小为1个,也就是说分成20个Batch。更新次数比较多,每一个epoch会更新20次。但是这样每一次更新找到的更新方向不会太准确。
但是,如果考虑并行Large Batch花费的时间不一定比Small Batch 花费的时间长。
具体训练效果对比
更新时间对比

通过对比可以发现,在batch大小在1000以内时,每一次更新时间相差无几,但是,当batch相对较大的时候,每一个epoch的更新次数就会减少,因此一个epoch所耗费的时间更少。
不同大小的batch训练出的模型的准确率对比
可以发现,小的Batch Size在训练模型上有更好的表现。而大的Batch Size表现不好是因为最优化失败。"Noisy"的更新对训练模型有帮助。
为什么小的Batch Size 会有比较好的结果?
对于Full Batch
,只有一个损失函数,很容易就会卡在critical point
上,但是Small Batch
每一次进行更新所使用的损失函数是不一样的,可能参数更新卡在了Batch1的损失函数上,但是Batch2的损失函数可能就可以继续进行更新。因此,Noisy的Gradient有帮助
Small Batch在测试集上更好
当解决了Large Batch最优化的问题,从实际案例中可以发现训练时Small Batch和Large Batch得到几乎一样的结果,但是测试阶段Small Batch表现的更好。
Small Batch更好的原因
具体的原因有待研究,但是现在有一种解释方法。

对于局部最小值也有好有坏,比如认为平原(Flat Minima)就要比峡谷(Sharp Minima)更好。如上图所示,假设测试损失函数相比于训练损失函数有一点小小的平移,那么对于平原来说影响并不是很大,但是对于峡谷来说,一个微小的移动就会使测试损失函数发生较大的变化。一般认为Small Batch更新的方向比较Noisy,不容易进入峡谷的狭口里边,而Large Batch更新方向比较稳定,很容易就会进入到峡谷里边。
将两种方法的优点相结合
经过对比可以发现,不同的Batch Size具有不同的优缺点,如下图所示:

现在有一些算法可以通过增加Batch Size来缩短训练时间,通过一些其他的方式解决Large Size出现的问题,从而提高训练模型的效率。
动量(Momentum)
有可能对抗一些Local Minima和Saddle Point,假设损失函数的曲线就是物理世界中的斜坡,而参数是一个移动的球,,把球从斜坡上滚下,如果动量够大就会有可能跳出一些Local Minima和Saddle Point。
具体实现
Gradient Descent回顾
每到一个位置,会计算这个位置的梯度,向梯度反方向前进一小段距离,然后重新计算梯度,并且以此循环,如下图所示:

Gradient Descent + Momentum
每一次的移动方向不仅仅为梯度反方向,还要加上上一步移动的方向,共同决定当前参数更新的方向。
是先前所有梯度的加权和:
文中图片均来自李宏毅老师机器学习(2021)课程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律