好的,我注意到您的列表非常详尽,特别留意了“任务调度器”相关的算法已排除。现在,我将为您讲解一个尚未在列表中出现过的深度学习领域的重要算法。
深度学习中优化器的AdaBound算法原理与自适应学习率边界机制
一、题目描述
AdaBound是一种自适应优化算法,旨在结合Adam类算法(如Adam、AMSGrad)在训练初期的快速收敛优势,以及SGD(带动量)在训练后期可能达到的更好泛化性能(更尖锐的最小值)的优势。其核心思想是为自适应优化算法(如Adam)的动态学习率施加一个逐渐缩小的硬性边界(clipping),使得算法在训练早期表现得像Adam一样自适应且快速,在训练后期则逐渐退化为像带动量的SGD一样稳定,从而试图兼具两者的优点。
二、循序渐进解题过程
为了彻底理解AdaBound,我们需要从它所解决的问题和所基于的算法入手。
步骤1:理解背景与动机——为什么需要AdaBound?
-
SGD (with Momentum) 的优缺点:
- 优点:理论上,SGD(特别是带动量的版本)在找到解的“平坦区域”后,由于其固定的或缓慢衰减的学习率,能够在这个区域内进行更精细的探索,最终可能收敛到一个泛化性能更好的(可能更尖锐的)最小值。
- 缺点:学习率需要精心调参。对于不同层、不同参数,其梯度尺度和变化模式不同,一个全局学习率可能不适合所有参数,导致训练初期收敛较慢。
-
Adam 类算法的优缺点:
- 优点:通过为每个参数维护自适应的学习率(一阶矩估计
m用于梯度方向,二阶矩估计v用于调整步长),它对不同尺度的梯度非常鲁棒,训练初期收敛速度通常非常快,且对初始学习率不敏感。 - 缺点:一些研究发现,Adam最终收敛到的解,其测试集(泛化)性能有时不如SGD。一个假设是:Adam自适应的学习率可能会在训练后期变得过小或不稳定,导致它困在某个“狭窄的盆地”里,而无法像SGD那样在解的平坦区域进行有效震荡和选择。
- 优点:通过为每个参数维护自适应的学习率(一阶矩估计
-
核心矛盾:我们既想要Adam早期的快速收敛能力,又想要SGD(Momentum)后期可能达到的更好泛化性能。能否设计一个算法,使其行为在时间维度上从“Adam-like”平滑地过渡到“SGD-like”?
步骤2:剖析AdaBound的核心设计——动态边界
AdaBound的解决思路非常直观:对Adam中计算出的每个参数的自适应学习率,施加一个随时间变化的、逐渐收紧的硬边界(Clipping)。
-
回顾Adam的更新公式(简化版,忽略偏置校正):
- 梯度一阶矩估计:
m_t = β1 * m_{t-1} + (1-β1) * g_t - 梯度二阶矩估计:
v_t = β2 * v_{t-1} + (1-β2) * g_t^2 - 参数更新:
θ_t = θ_{t-1} - (η / (√v_t + ε)) * m_t - 其中
η是初始学习率,√v_t是自适应学习率的分母项。
- 梯度一阶矩估计:
-
AdaBound的改造:
AdaBound不改变m_t和v_t的计算,它只干预最终的更新步长。它为每个参数的自适应学习率项η / (√v_t + ε)设置了下界l(t)和上界u(t)。- 下界函数
l(t): 从0开始,随着训练步数t增加,逐渐上升到一个下限终值η_inf(例如0.1)。 - 上界函数
u(t): 从一个很大的值(例如+∞或一个很大的数)开始,随着训练步数t增加,逐渐下降到一个上限终值η_sup(例如0.1)。 - 边界函数形式: 论文采用了一个简单的线性变换(通过Sigmoid函数实现平滑过渡):
其中l(t) = 0.1 - 0.1 * (1 - β2)^t # 从0渐近到0.1 u(t) = 0.1 + 0.1 * (1 - β2)^t # 从+∞(或0.2)渐近到0.1(1-β2)^t是一个衰减很快的项。实际上,更常用的实现是定义一个final_lr(最终学习率)和gamma(控制过渡速度的参数),来计算边界。
- 下界函数
-
应用边界进行裁剪:
在参数更新前,先计算裁剪后的学习率:clipped_η_t = clip( η / (√v_t + ε), l(t), u(t) )然后进行更新:
θ_t = θ_{t-1} - clipped_η_t * m_t
步骤3:分析AdaBound的动态行为
-
训练早期 (
t很小):l(t) ≈ 0,u(t) ≈ +∞(或一个非常大的值)。- 此时
clip操作几乎不生效,因为η / (√v_t + ε)的值基本落在[0, +∞)内。 - 因此,参数更新公式退化为标准的Adam:
θ_t = θ_{t-1} - (η / (√v_t + ε)) * m_t。算法享受Adam快速收敛的好处。
-
训练后期 (
t很大):l(t) ≈ η_final,u(t) ≈ η_final。例如,当上下界都收敛到0.1时。- 此时
clip操作会将η / (√v_t + ε)严格限制在η_final附近的一个极小区间内。 - 参数更新公式近似为:
θ_t ≈ θ_{t-1} - η_final * m_t。 - 注意
m_t是梯度的一阶矩估计(带有动量),所以这个形式非常接近于带动量(Momentum)的SGD,其中η_final是学习率,m_t是动量项。算法行为向SGD靠拢。
-
平滑过渡:
- 通过
l(t)和u(t)的平滑变化,算法从“Adam模式”无缝地、自动地过渡到“SGD模式”,无需手动切换优化器或调度学习率。
- 通过
步骤4:讨论AdaBound的变体——AMSBound
原始的AdaBound在后期将学习率裁剪到一个固定值。论文作者进一步提出了 AMSBound,它结合了AMSGrad的思想。
- AMSGrad的改进: 在Adam中,
v_t是历史梯度平方的指数移动平均,可能会因某些突然的小梯度导致v_t变小,进而使学习率异常增大。AMSGrad通过维护v_t_hat = max(v_{t_hat-1}, v_t)来保证v_t_hat是非递减的,从而避免了学习率的异常波动。 - AMSBound的公式: 它使用AMSGrad计算出的非递减的
v_t_hat来代替AdaBound公式中的v_t,然后再进行边界裁剪。即:
AMSBound旨在提供更稳定的边界内学习率估计。v_t_hat = max( v_{t_hat-1}, v_t ) clipped_η_t = clip( η / (√(v_t_hat) + ε), l(t), u(t) ) θ_t = θ_{t-1} - clipped_η_t * m_t
步骤5:总结与评价
- 核心贡献: AdaBound/AMSBound提供了一种优雅的、自动的机制,通过时间依赖的动态边界,将自适应优化算法(Adam/AMSGrad)在训练后期“驯化”为类SGD的优化器。
- 目标: 实现 “前期快如Adam,后期稳如SGD” 的训练动态,以期同时获得快速收敛和良好的泛化性能。
- 实际应用: 算法提出后引起了不少关注,因为它直接回应了实践中的一个常见困境。在实际使用中,它确实能在许多任务上提供稳定的性能,减少了对学习率调度策略的依赖。然而,如同所有优化器一样,其最终效果也依赖于具体任务、超参(如
final_lr,gamma,β1,β2)的设置,并非绝对优于精心调参的Adam+Scheduler或SGD+Momentum+Scheduler的组合。 - 内在思想: 它体现了深度学习优化中的一个重要理念:优化算法的动态特性(如学习率)本身可以是随时间变化的、精心设计的函数,而不仅仅是简单的衰减。
通过以上五个步骤,我们详细拆解了AdaBound算法提出的动机、核心原理、具体实现、动态行为以及其变体AMSBound,从而全面理解了这一优化器的设计思想和工作机制。