保研开始复习数理基础课和专业课了,不定期整理一些线代和概率论、优化、机器学习和深度学习的内容,或者填一下以前写的文章的坑之类的。不想复习 408,好烦。可能还会再补一下随机过程。 其实还想看看组合数学、抽代、组合优化和整数规划和精确/近似/随机算法的内容,但是感觉时间明显不是很够。 甚至想看看 CUDA 和并行计算,但是也没咋去上课,实验也没做,可能更想知道 LLM 训练推理等的加速的相关优化。 寄,好久没做算法题了。 球球了,想有篇在投。
.
设样本一共有
批量梯度下降法 (BGD) 直接使用最朴素的梯度下降法优化函数
当
随机梯度下降法 (SGD) 在 BGD 的基础上改善了更新参数的方式,
由全部的样本改成了随机的一个样本, 也就是说每一次更新参数随机选择一个
然而由于 SGD 每次只能随机选择一个样本, 如果数据集中有噪声或者离群值, 将会导致迭代的方向不是朝着整体最优的方向; 但是这个随机性将使跳出局部极小点的成为可能, 同时也带来了更新参数时函数值震荡的后果; 并且可以进行在线学习.
实际上在训练时常用的优化器 torch.optim.SGD
并不是上文中的 SGD, 应该称为 mini-Batch Gradient Descent 即 MBGD,
这是因为深度学习中对于大量的数据通常会将其分为
这样看来, MBGD 实际上时 BGD 和 SGD
之中的一种折中的方式, 不仅避免了 SGD
迭代过程中的不稳定, 也防止由于数据集过大造成的迭代速度过慢, 但是要注意
batch_size 的设置需要合理. 当
设
这边就直接叙述 pytorch 中 torch.optim.SGD
的实现,
参考官方文档
的内容.
设
那么算法的流程为:
从
最终返回
权重衰减实际上是对目标函数进行了
主要思想是当前对参数的更新要考虑到上一次对参数的更新量, 用之前迭代的更新量来平滑这一次迭代的梯度方向. 从物理的角度来看, 就好像小球从一个曲面上滚落时, 当前移动的方向会受到历史动量的影响, 因此迭代的时候就能更加平稳, 快速地冲向局部极小点.
设上一次对参数的更新量为
torch.optim.SGD
中还对上式的引入了系数 , 其中 称作 dampening, 具体作用不详. 当 时, 上式是 和 的加权平均.
然后参数更新的式子就为
按照上图的例子, 这可以改善在沟壑的斜坡上震荡的情况; 同时
简称 NAG. 动量方法对参数的更新实际上就是多了
设
不是很清楚 Pytorch 的算法为什么要那样写. 也许用了什么等价的魔法.
NAG 的收敛速度比 momentum
更快,许多文章解释为:能够让算法提前看到前方的地形梯度,如果前面的梯度比当前位置的梯度大,那我就可以把步子迈得比原来大一些,如果前面的梯度比现在的梯度小,那我就可以把步子迈得小一些。这个大一些、小一些,都是相对于原来不看前方梯度、只看当前位置梯度的情况来说的。如果展开
抄老师 PPT.
参考官方文档.
Adagrad 对不同的参数使用不同的学习率,
tmd不看官方文档了, 怎么那么不一致, 难道还要看源码?
SGD有多种改进的形式(RMSprop,Adadelta等),为什么大多数论文中仍然用SGD? - 知乎 (zhihu.com)
怎么通俗易懂的理解SGD中Momentum的含义? - 知乎 (zhihu.com)
如何理解Adam算法(Adaptive Moment Estimation)? - 知乎 (zhihu.com)