【Datawhale X 李宏毅苹果书 AI夏令营】深度学习详解笔记 3.2
第 3 章 深度学习基础
3.2 批量和动量
3.2.1 批量大小对梯度下降法的影响
每次在更新参数的时候,并不是对所有数据的损失 计算梯度,而是把所有的数据分成一个一个的包含等量数据的批量(batch),每次取出一个批量用来计算出损失和梯度更新参数。
遍历所有批量的过程称为一个回合(epoch)。
两个最极端的情况:
- 批量大小为训练数据的大小,这种使用全批量(fullbatch)的数据来更新参数的方法即批量梯度下降法(Batch Gradient Descent,BGD)。模型必须把全部训练数据都看完,才能够计算损失和梯度,参数才能够更新一次。
- 批量大小等于 1,此时使用的方法即随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法。只要取出一笔数据即可计算损失、更新一次参数。
- (随机梯度下降的梯度上引入了随机噪声,因此在非凸优化问题中,其相比批量梯度下降更容易逃离局部最小值)
对比大批量与小批量
TL;DR:
评价标准 | 小批量 | 大批量 |
---|---|---|
一次更新的速度(无并行计算) | 略快 | 略慢 |
一次更新的速度(有并行计算) | 速度接近 | 速度接近(批量不是很大) |
一个回合的速度 | 更慢 | 更快 |
梯度 | 有噪声 | 稳定 |
优化(训练) | 更好 | 更坏 |
泛化(训练->测试) | 更好 | 更坏 |
(1)批量梯度下降每次迭代的计算量大。实际上,考虑并行运算,批量梯度下降花费的时间不一定更长。
可能的解释:在有并行计算的情况下,小的批量跟大的批量运算的时间并没有太大的差距。除非大的批量非常大,才会显示出差距。也正因为有并行计算的能力,因此实际上当批量大小小的时候,要“跑”完一个回合,花的时间是比较大的。
大的批量大小反而是较有效率的,对于一个回合,大的批量花的时间反而是比较少的。
(2)大的批量大小优化可能会有问题,小的批量大小优化的结果反而是比较好的。批量大小越大,验证集准确率越差。
可能的解释:大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的(noisy)。小批量梯度下降法(mini-batch gradient descent)每次是挑一个批量计算损失,所以每一次更新参数的时候所使用的损失函数是有差异的。有噪声的更新方式反而对训练其实是有帮助的。
(3)其实小的批量也对测试有帮助。假设有一些方法(比如调大的批量的学习率)可以把大的批量跟小的批量训练得一样好,实验结果发现小的批量在测试的时候会是比较好的。就算是在训练的时候准确率结果差不多,测试的时候,大的批量比小的批量差(代表过拟合)。
可能的解释:局部最小值有好最小值跟坏最小值之分,如果局部最小值在一个“峡谷”里面,它是坏的最小值;如果局部最小值在一个平原上,它是好的最小值。对在一个“盆地”里面的最小值,其在训练跟测试上面的结果不会差太多,只差了一点点。但对在右边在“峡谷”里面的最小值,一差就可以天差地远 。虽然它在训练集上的损失很低,但训练跟测试之间的损失函数不一样,因此测试时,损失函数一变,计算出的损失就变得很大。大的批量大小会让我们倾向于走到“峡谷”里面,而小的批量大小倾向于让我们走到“盆地”里面。小的批量有很多的损失,其更新方向比较随机,其每次更新的方向都不太一样。即使“峡谷”非常窄,它也可以跳出去,之后如果有一个非常宽的“盆地”,它才会停下来。
3.2.2 动量法
动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。
类似于往运动中引入惯性。
引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。
原梯度下降()
每一步的移动都用 来表示,则引入动量:
也可以写成之前所有计算的梯度的加权和(略)。可以认为加上动量的时候,更新的方向不是只考虑现在的梯度,而是考虑过去所有梯度的总和。
优点:一般梯度下降走到一个局部最小值或鞍点时,就被困住了。但有动量还是有办法继续走下去,因为动量不是只看梯度,还看前一步的方向。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律