好的,作为无所不知的大神,我将为你讲解一个尚未出现在你历史列表中的深度学习重要算法。
深度学习中的优化器之AdaHessian算法原理与二阶优化机制
题目描述
在深度学习训练中,我们常使用基于一阶梯度(如SGD、Adam)的优化器。然而,一阶方法只利用了损失函数的一阶导数信息(梯度),忽略了曲率(二阶导数)信息,可能导致在病态条件(如损失函数等高线呈狭长峡谷状)下收敛缓慢或不稳定。AdaHessian是一种旨在高效、自适应地利用二阶信息的优化算法,它通过近似Hessian矩阵的对角线来调整每个参数的学习率,以期实现更鲁棒、更快的收敛,同时尽量控制计算开销。
解题过程:循序渐进讲解
我们的目标是理解AdaHessian如何工作,以及它如何“聪明地”使用二阶信息。
步骤1:回顾一阶优化器的局限性,引出二阶信息的价值
想象你在一个崎岖的山地(损失函数曲面)上蒙眼下山(寻找最小值)。一阶优化器(如SGD)告诉你脚下最陡峭的下降方向(负梯度)。但在“峡谷”地形中,沿着最陡方向可能撞到峡谷壁,导致震荡前进。
- 梯度(一阶导):指向当前点最速上升的方向。
- Hessian矩阵(二阶导):描述了曲面的曲率。其对角线元素
H[i][i]大致反映了参数i方向的弯曲程度。弯曲剧烈的方向(曲率大,Hessian值大),我们应该迈小步;弯曲平缓的方向(曲率小,Hessian值小),我们可以迈大步。
如果知道Hessian,更新规则可以改进为牛顿法风格:参数更新量 = - (Hessian的逆) * 梯度。但这面临两大难题:
- 计算成本:计算和存储完整的
N x NHessian矩阵(N为参数量)对于现代神经网络(N常为百万/千万级)是不可能的。 - 非正定性:Hessian矩阵可能不是正定的,导致更新方向不是下降方向。
步骤2:AdaHessian的核心思想:自适应地近似对角Hessian
AdaHessian巧妙地绕开了这两个难题:
- 只估计对角线:它不计算完整的Hessian,而是估计其对角矩阵。这意味着我们为每个独立的参数估计一个标量的曲率值,存储开销从
O(N^2)降为O(N)。 - 保证正定性:通过对角Hessian估计值取绝对值,确保更新时的缩放因子是正的。
- 自适应与动量:借鉴Adam的成功经验,对梯度(一阶矩)和对角Hessian(二阶矩)都采用指数移动平均(EMA) 来平滑噪声,并引入偏差校正。
步骤3:算法核心组件与详细推导
AdaHessian的更新公式与Adam相似,但用对角Hessian的估计值 D_t 替换了Adam中梯度平方的估计值 v_t。
1. 计算梯度(一阶矩)的指数移动平均(EMA):
这一部分与Adam相同,用于平滑随机梯度中的噪声。
m_t = β1 * m_{t-1} + (1 - β1) * g_t // 一阶矩估计
m_t_hat = m_t / (1 - β1^t) // 偏差校正
其中,g_t 是第 t 步的随机梯度,β1 是动量衰减率(如0.9)。
2. 关键创新:计算对角Hessian(二阶矩)的EMA:
这是AdaHessian的核心。如何高效得到对角Hessian的估计 d_t?
- ** Hutchinson 迹估计法**:AdaHessian使用了一种巧妙的随机算法。对于任意矩阵
A和随机向量z(满足E[z z^T] = I),有E[z ⊙ (A z)] = diag(A)。其中⊙是逐元素乘。 - 应用到Hessian:令
A为当前点的Hessian矩阵H。我们无法直接计算H z,但可以计算H z = ∇(g_t^T z),这可以通过两次自动微分高效实现:- 第一次前向-反向传播得到梯度
g_t。 - 计算
g_t与随机向量z的点积g_t^T z(一个标量)。 - 对这个标量再进行一次反向传播(即求导),得到的结果就是
H z。
- 第一次前向-反向传播得到梯度
- 得到对角估计:然后计算
d_t = z ⊙ (H z)。根据Hutchinson方法,d_t的期望就是Hessian的对角线diag(H)。 - 进行EMA平滑:对多次采样得到的
d_t进行EMA,并取绝对值确保正定性。
d_t = |E[ z ⊙ (H z) ]| // 期望通过多次采样(如1-2次)和EMA来近似
v_t = β2 * v_{t-1} + (1 - β2) * d_t // Hessian对角估计的EMA
v_t_hat = v_t / (1 - β2^t) // 偏差校正
其中,β2 是二阶矩衰减率(如0.999)。
3. 参数更新:
最终的更新公式融合了平滑后的梯度 m_t_hat 和曲率感知的缩放因子 v_t_hat。
θ_t = θ_{t-1} - η * ( m_t_hat / (sqrt(v_t_hat) + ε) )
η:全局学习率。ε:一个极小常数(如1e-8),防止除零。sqrt(v_t_hat):这就是自适应学习率部分。v_t_hat大的参数(曲率大,曲面陡),分母大,更新步长小;v_t_hat小的参数(曲率小,曲面平缓),分母小,更新步长大。
步骤4:算法特性与优势总结
- 曲率感知:相比Adam(仅用梯度幅度调整学习率),AdaHessian直接使用二阶曲率信息,能更好地适应不同参数方向的尺度,在病态问题上理论上收敛更快。
- 内存高效:仅需存储对角矩阵
O(N),而牛顿法需O(N^2)。 - 计算可接受:主要开销是额外的1-2次反向传播(用于计算
H z)。通常每个训练步多消耗2-3倍计算时间,但对于许多问题,其带来的收敛加速可能使得总训练时间减少。 - 自适应与稳定:继承了Adam的自适应学习率和动量机制,并对Hessian估计进行EMA平滑和偏差校正,训练过程相对稳定。
步骤5:与相关优化器的对比
- vs Adam:Adam是AdaHessian最直接的对比。Adam的
v_t是梯度平方的EMA,可以看作是Hessian对角线的一阶近似(根据梯度大小推测曲率)。而AdaHessian的v_t是对角Hessian本身的EMA,是更直接、更准确的曲率信息。 - vs 牛顿法/拟牛顿法(L-BFGS):牛顿法需要精确的Hessian及其逆,计算和内存不可行。L-BFGS近似整个Hessian,但不适合小批量随机优化。AdaHessian为大规模、非凸、随机优化场景设计,是随机、对角化、自适应的二阶方法。
结论:AdaHessian是连接一阶自适应方法(如Adam)和经典二阶方法之间的重要桥梁。它在保持一阶方法可扩展性的同时,通过巧妙的随机算法引入了更准确的曲率信息,为训练某些复杂模型(如Transformer、生成模型)提供了一种新的、更强大的优化选择。其核心贡献在于高效、随机地估计Hessian对角线,并将其无缝融入Adam式自适应框架中。