深度学习优化器算法中,有哪些巧思可以速览为?

摘要:这一篇博文想写很久了,一直没有下笔,核心原因也是有一些待办的思路在攻关验证。 我们先从一个核心的问题出发, 1. 为什么要研究优化器算法? 它的关联问题:训练为什么要调参,调的是什么参? 如果就这个问题去问各种大语言模型,它们能给出一堆的理
这一篇博文想写很久了,一直没有下笔,核心原因也是有一些待办的思路在攻关验证。 我们先从一个核心的问题出发, 1. 为什么要研究优化器算法? 它的关联问题:训练为什么要调参,调的是什么参? 如果就这个问题去问各种大语言模型,它们能给出一堆的理由。 但就博主而言,答案只有一个: 干掉调参,解放生产力,榨干算力。 说到底就一个字"穷"。 在多年的研发生涯里,对调参这个事深恶痛绝,为什么辛辛苦苦架构出来的模型,一训练就崩,训练收敛慢到龟速,这严重影响了开发进度,并且增加了很多不可抗力的消耗。 我相信有很多业内同行,都有这种痛,训练了很久,效果依旧很差,泛化能力也不行,然后就开始苦恼,为什么自己没有足够的钱,足够的算力。 明明自己很好的思路,戛然而止,退而求其次。 早年间,博主经常半夜醒来,看训练的损失曲线,生怕训崩。就算没有训崩,自己花费了大量时间精力,却没有很好的回报。 一次又一次,是很打击信心的。 在付出了大量时间和人民币之后,博主终于从泥潭里爬出来了,时光荏苒,这个困扰我九年的问题,画上句号了。 那大语言模型是怎么回答这个问题的。 核心就一句话: "没有新优化器,下一代模型根本训不起来。" 从理论上看,它是在解决一个尚未被完全理解的复杂高维优化问题,充满挑战与机遇。 解决基础性训练难题——让模型"能学" 从工程上看,它是降低AI研发成本、推动技术普及的关键杠杆。 追求极致的效率与效益——让模型"快学"且"省学" 从性能上看,它是提升模型最终准确性、鲁棒性和泛化能力的决定性因素。 提升模型的终极性能——让模型"学好" 最终达到,拓展AI的技术边界——让"不可能"成为"可能" 当然就这个问题,大家可以自行去追问各家的大语言模型,给出的结论大同小异。 2. 那博主为什么要写这篇博文? 最基本的还是希望抛砖引玉,希望能有更多的同行在力大砖飞,烧钱的当下,不要放弃底层算法的研究。 同时为更多的深度学习小白提供一个新的视角,学习并应用深度学习,温故而知新。 3. 那什么是优化器算法? 优化器算法是驱动机器学习模型学习的"引擎"。它的核心任务是:在训练过程中,根据损失函数计算出的梯度(即方向),以某种策略更新模型的参数,从而最小化损失函数。 可以将训练过程想象成在复杂地形中寻找最低点: 损失函数:代表地形的高度。 模型参数:代表我们在地形中的位置。 梯度:代表我们脚下最陡峭的下坡方向。 优化器:就是那个决定"往哪个方向走、走多大步、以及是否要考虑之前的惯性"的导航策略。 Adam (Adaptive Moment Estimation) 思想:目前最流行和默认的优化器之一。它结合了Momentum和RMSProp的优点。 它计算梯度的一阶矩(均值,提供动量)和二阶矩(未中心化的方差,用于自适应调整学习率)。 然后对这两个矩进行偏差校正,使其在训练初期不那么偏向于0。 优点: 通常收敛速度快。 对超参数的选择相对鲁棒(默认参数通常就能工作得很好)。 能处理噪声和稀疏梯度。 如果把Adam的一阶矩和二阶矩去掉,它就蜕变为SGD。 而随机梯度下降(朴素SGD)是一种优化算法,通过随机选取单个样本来近似梯度,从而迭代更新模型参数,收敛至最小值。 换句话说,朴素SGD是一个没有应用任何先验补充的野蛮人,较于Adam的平滑学习而言,它就像一只无头苍蝇,到处乱撞,也不知道该撞多少次才能收敛至最小值。 4. Adam相较于朴素SGD,它做了哪些改进? 引入动量缓冲m,也就是一阶矩,指数加权平滑梯度,它积累了历史梯度的方向趋势。使得朴素SGD的动荡趋于平稳平滑。 引入自适应步长v,也就是二阶矩,指数加权平均的平方,它积累了历史梯度平方的值趋势。 最终以 grad = m / sqrt(v) 作为目标梯度进行更新。 对于动量一阶矩,基本没啥好说的,就是求历史平均梯度,使得训练平稳。 核心还是自适应步长v,对于频繁更新、梯度大的参数,其二阶矩估计值大,因此实际更新步长会被调小(除以一个大数),避免"步子太大"而越过最优点。 对于不频繁更新、梯度小的参数,则给予更大的相对步长,鼓励其更新。 所以Adam能加速较于朴素SGD训练收敛,二阶矩功不可没。 原本故事到这里,就接近完结了。 在真实的场景下,我们发现Adam还是不够好。 但它的普及使得深度学习遍地开花。 虽然仍是需要调参,但是不像之前那么"玄学"了。 当然在一些场景下,例如GAN的训练,仍然有所争议。
阅读全文