1. 项目概述当SGD遇上高斯牛顿一次计算开销不变的“降维打击”在机器学习的优化工具箱里随机梯度下降SGD无疑是那个最常用、也最让人又爱又恨的工具。爱它的简单高效恨它在某些问题上的“磨蹭”——尤其是在损失函数地形平坦的区域SGD的收敛速度会显著下降让人等得心焦。为了解决这个问题社区里涌现了动量法、自适应学习率如Adam等一众“加速器”。但今天我想和你聊点不一样的一种能利用二阶曲率信息却几乎不增加额外计算成本的算法——增量高斯牛顿下降Incremental Gauss-Newton Descent, IGND。简单来说IGND的核心思想是用高斯牛顿法Gauss-Newton的智慧来重新“校准”SGD的每一步更新。传统的高斯牛顿法需要构造并求解一个可能非常庞大的线性系统涉及雅可比矩阵的乘积这对于动辄百万甚至上亿参数的现代机器学习模型来说计算和存储都是噩梦。IGND的巧妙之处在于它发现在增量学习每次只处理一个样本的场景下完整的高斯牛顿更新方向可以被压缩成一个简单的标量缩放因子。这个因子只依赖于当前样本对应的模型输出梯度向量的模长平方计算它只需要一次向量内积和一个标量除法。这意味着什么意味着你几乎可以用和SGD完全一样的计算开销一次前向传播、一次反向传播却获得一个近似二阶优化方法的更新步长。这个步长自带“尺度不变性”Scale Invariance也就是说无论你的模型参数或输入特征被放大或缩小了多少倍算法实际的更新效果是稳定的。这极大地降低了对学习率超参数调优的依赖提升了算法的鲁棒性。无论是监督学习中的回归、分类任务还是强化学习中的价值函数拟合只要你的损失函数可以或近似可以写成最小二乘的形式IGND就可能为你带来惊喜。2. 核心原理从SGD到高斯牛顿再到一个神奇的标量要理解IGND我们需要先理清SGD和高斯牛顿法之间的关系以及IGND是如何在两者之间架起一座高效桥梁的。2.1 SGD的局限与二阶方法的诱惑标准的SGD更新规则非常直观w_{t1} w_t - α_t * g_t其中w_t是第t次迭代的参数α_t是学习率g_t ∇L(w_t)是损失函数L在当前参数和随机样本下的梯度。SGD的问题在于它只使用了一阶梯度信息。梯度方向指向当前点处函数值下降最快的方向但步长α_t是人为设定的它没有考虑损失函数在该方向上的“弯曲程度”曲率。在曲率很大的陡峭区域过大的步长可能导致震荡甚至发散在曲率很小的平坦区域过小的步长又会导致收敛缓慢。二阶优化方法如牛顿法通过引入海森矩阵Hessian MatrixH即损失函数的二阶导数矩阵来修正这个问题。其更新方向为d -H^{-1} g。这个方向不仅考虑了下降方向还通过海森矩阵的逆对梯度进行了缩放相当于在参数空间的不同方向上使用了自适应的学习率。然而计算和存储完整的海森矩阵对于大规模模型是不现实的其复杂度是参数数量的平方甚至立方级。2.2 高斯牛顿近似针对最小二乘的“瘦身”术高斯牛顿法是解决非线性最小二乘问题的一把利器。当损失函数是残差平方和的形式时L(w) 1/2 ||r(w)||^2r是残差向量其海森矩阵有一个特殊的结构H J^T J S其中J是残差r对参数w的雅可比矩阵S是包含残差与残差二阶导数的项。高斯牛顿法的核心洞察是在接近最优解时残差r很小因此S项通常可以被忽略。于是我们得到了一个既正定或半正定又无需计算二阶导数的海森矩阵近似H_GN ≈ J^T J。对应的更新方向高斯牛顿方向需要通过求解线性系统(J^T J) d -J^T r来获得。即使有了这个近似对于大规模问题构造J^T J一个m×m的矩阵m为参数数量和求解这个线性系统仍然是沉重的负担。这就是为什么高斯牛顿法在传统机器学习优化中并不主流。2.3 IGND的魔法当雅可比矩阵退化为一个向量IGND的突破点在于它聚焦于增量Incremental或在线Online学习场景即每次迭代只使用一个数据样本N1。在这个设定下残差r变成了一个标量其雅可比矩阵J退化成了一个行向量或者说梯度向量∇r。此时高斯牛顿矩阵H_GN J^T J (∇r)(∇r)^T。这是一个秩为1的矩阵显然是奇异的不可逆。直接套用公式d -(J^T J)^{-1} J^T r行不通。传统的思路可能是添加正则项如Levenberg-Marquardt方法但这又会引入新的超参数并增加计算。IGND的推导从一个巧妙的优化问题出发。它寻找一个更新方向d使得在满足线性化残差变化最小的同时避免在损失函数梯度为零的方向即雅可比矩阵的零空间上移动。这个问题的数学形式是argmin_{Δw} 1/2 ||r (∇r)^T Δw||^2 1/2 ||Z^T Δw||^2其中Z是∇r的零空间基向量组成的矩阵。这个问题的解经过严谨的数学证明见原论文定理3.2具有一个极其简洁的形式d -ξ * (∇r) * r 其中ξ 1 / (∇r^T ∇r)这就是IGND的核心公式。让我们拆解一下∇r当前样本下标量残差r对模型参数w的梯度向量。在最小二乘损失下r y - f(x)所以∇r -∇f即模型输出f(x)对参数的梯度的相反数。∇r^T ∇r这个梯度向量的内积也就是它的L2范数的平方||∇r||^2。ξ那个神奇的标量缩放因子。它就是梯度向量模长平方的倒数。整个更新量Δw α * ξ * (∇r) * r。对比SGD的Δw_SGD α * (∇L) α * r * (∇r)你会发现IGND只是多乘了一个因子ξ。关键洞察这个ξ因子正是高斯牛顿信息在单样本情况下的精髓体现。它自动地根据当前参数梯度的大小来调整更新步长。梯度模长大曲率可能大时ξ小步长被抑制梯度模长小曲率可能小时ξ大步长被放大。这实现了某种程度的自适应预条件Preconditioning。2.4 与梯度裁剪/归一化的本质区别你可能会联想到梯度裁剪Gradient Clipping或梯度归一化Normalized Gradient Descent。它们也涉及对梯度进行缩放但逻辑完全不同梯度裁剪/归一化缩放基于损失函数梯度∇L的范数即||r * ∇r||。其目的是防止更新步长过大稳定训练。IGND缩放基于函数近似器梯度∇f或∇r的范数平方即||∇r||^2。其目的是近似二阶曲率信息实现尺度不变性。一个至关重要的区别是在收敛点附近损失L趋近于最小值其梯度∇L也趋近于零。如果用||∇L||来做分母进行缩放会导致数值不稳定除以一个非常小的数。而||∇f||或||∇r||代表的是模型输出对参数的敏感度在收敛时并不一定趋于零因此IGND的缩放因子ξ通常是良定义的。3. 算法实现与实操要点理解了原理我们来看如何将IGND付诸实践。其算法框架清晰得令人惊讶。3.1 基础IGND算法流程以下是IGND的核心伪代码我已将其转化为更易理解的步骤说明初始化设定学习率α可选的正则化参数ϵ通常设为很小的数如1e-8防止除零随机初始化模型参数w。循环迭代直到满足停止条件如达到最大轮数或损失不再下降 a.采样从训练集D中随机抽取一个样本(x_t, y_t)。 b.前向与梯度计算 - 计算模型预测值f_t f(w_t, x_t)。 - 计算残差r_t y_t - f_t对于最小二乘损失。 -关键步骤通过反向传播计算模型输出f_t对参数w_t的梯度向量g_f ∇f(w_t, x_t)。注意这里计算的是f的梯度而不是损失L的梯度。在PyTorch或TensorFlow中这通常意味着在计算图中对f本身调用backward()或gradient()而不是对(y-f)^2调用。 c.计算缩放因子ξ_t 1 / (g_f^T * g_f ϵ)。这里g_f^T * g_f就是向量内积得到标量。 d.参数更新w_{t1} w_t α * ξ_t * g_f * r_t。 - 回忆一下损失梯度∇L r_t * g_f因为L 1/2 * r^2∇L r * ∇r -r * ∇f我们这里用g_f即∇f所以符号是。 - 因此更新式可写为w_{t1} w_t α * ξ_t * (-∇L)。这更直观地体现了它是SGD的一个缩放版本。3.2 关键实现细节与陷阱1. 梯度计算的对象是f不是L这是实现中最容易出错的地方。在大多数深度学习框架中我们习惯计算损失函数的梯度。对于IGND你必须计算模型输出f(x)对于参数w的梯度。PyTorch示例# 假设 model 是你的神经网络 criterion 是MSELoss x, y data f model(x) # 模型输出 loss criterion(f, y) # 错误做法计算loss的梯度 # loss.backward() # 这得到的是 d(loss)/dw # 正确做法计算 f 的梯度 model.zero_grad() # 创建一个与 f 形状相同的“权重”张量对于标量输出就是1。 # 如果 f 是多维的如多输出回归这里需要根据残差定义调整。 f.backward(gradienttorch.ones_like(f)) g_f [p.grad.clone() for p in model.parameters()] # 获取 ∇f # 然后手动计算 g_f 的内积和更新参数TensorFlow 2.x 示例import tensorflow as tf with tf.GradientTape() as tape: f model(x, trainingTrue) # 前向传播 # 计算 f 对可训练变量的梯度 g_f tape.gradient(f, model.trainable_variables) # g_f 是一个列表包含每个变量的梯度张量2. 缩放因子 ξ 的计算与数值稳定计算ξ 1 / (||g_f||^2 ϵ)时必须添加一个小的正则化常数ϵ例如1e-8。这有两个目的防止当||g_f||^2接近零时出现除零错误。这等价于在高斯牛顿矩阵H_GN上添加了一个ϵ * I的正则项即Levenberg-Marquardt正则化能保证更新方向总是良定义的。3. 与SGD的代码对比改动其实非常小。一个标准的SGD训练循环中你将optimizer.step()替换为手动更新并插入计算ξ和缩放梯度的步骤即可。4. 扩展到小批量Mini-batch情况原论文主要聚焦于纯增量N1情况。对于更常用的小批量训练直接应用IGND公式需要对批量内每个样本单独计算ξ_i和更新然后取平均或者探索其他近似方式。论文提到这是未来研究方向。在实践中对小批量数据直接计算整个批量的∇f一个矩阵的范数可能会得到不同的近似需要谨慎尝试和验证。3.3 尺度不变性一个直观的例子为什么IGND对参数缩放更鲁棒考虑一个最简单的线性模型f(w, x) w^T x。如果我们将输入特征x缩放φ倍即使用新特征x φx。为了保持模型输出不变最优权重会变为w* w*/φ。SGD更新为Δw α * r * x。缩放后Δw α * r * (φx) φ * Δw。权重更新量被放大了φ倍这改变了优化路径可能需要重新调整学习率α。IGND∇f x所以||∇f||^2 x^T x。缩放后∇f φx||∇f||^2 φ^2 x^T x。因此缩放因子ξ 1/(φ^2 ||x||^2) ξ / φ^2。更新量变为Δw α * (ξ/φ^2) * r * (φx) (α * ξ * r * x) / φ Δw / φ。恰好与最优权重w* w*/φ的变化比例一致IGND自动补偿了特征缩放带来的影响使得算法在缩放后的参数空间里其更新行为与原始空间一致。对于非线性模型这种尺度不变性是近似的但在模型拟合较好残差小时近似程度很高。这意味着使用IGND时你对数据做标准化预处理的需求可能降低或者算法对未完美标准化的数据更具包容性。4. 理论保障IGND的收敛性证明一个实用的算法需要有理论背书。IGND在满足一定条件下被证明是收敛的。这些条件与分析SGD收敛性时类似但针对IGND的特定更新形式进行了调整。核心假设函数梯度有界模型输出f的梯度范数||∇f||^2存在一个上界Q。这是一个温和的假设确保缩放因子ξ有下界ξ ≥ 1/(Qϵ)更新步长不会无限大。损失函数光滑总体损失函数L̄(w)是连续可微的且其梯度是Lipschitz连续的常数为L。这保证了损失函数不会变化得太剧烈是梯度类方法的标准假设。更新方向与方差条件存在正常数μ使得IGND的更新方向-ξg与真实梯度-∇L̄的内积期望至少是μ||∇L̄||^2。这保证了平均而言IGND方向是下降方向。更新方向ξg的方差是有界的且其界与当前梯度范数||∇L̄||^2有关。这控制了随机噪声的大小。学习率衰减学习率序列{α_t}满足Robbins-Monro条件Σ α_t ∞保证能到达最优点Σ α_t^2 ∞保证噪声能被平均掉。典型选择是α_t c / t或α_t c / sqrt(t)。在这些假设下论文证明了定理3.5lim_{T→∞} E[ Σ_{t1}^T α_t ||∇L̄(w_t)||^2 ] ∞并且如果进一步假设目标函数二阶可微等条件可以推出更强的结论推论3.6lim_{t→∞} E[ ||∇L̄(w_t)||^2 ] 0这意味着算法最终会收敛到一个平稳点梯度为零的点。这为IGND的实际应用提供了理论上的安全保证。实操心得这些理论条件在实际中大多自然满足或可通过设计满足如使用衰减学习率。理论证明的价值在于告诉我们IGND不是一个随意的启发式方法而是一个有扎实数学基础的优化算法。5. 高级话题如何加速IGNDIGND的美妙之处在于它保留了SGD的简单计算结构。因此几乎所有为SGD设计的加速技巧都可以几乎原封不动地应用到IGND上。5.1 动量MomentumPolyak动量或Nesterov加速动量可以直接融入IGND。更新规则变为v_{t1} β * v_t ξ_t * g_{f_t} * r_tw_{t1} w_t - α * v_{t1}这里v是速度变量β是动量系数通常为0.9。动量通过累积过去更新方向的信息有助于平滑优化路径、加速穿越平坦区域并抑制震荡。5.2 自适应学习率与Adam风格组合虽然IGND的ξ已经提供了基于当前样本曲率的自适应缩放但我们仍然可以引入更全局的自适应学习率。例如可以构建一个IGND版本的Adam我们暂且称之为IGND-Adam计算当前缩放后的梯度g̃_t ξ_t * g_{f_t} * r_t。计算梯度的一阶矩估计动量m_t β1 * m_{t-1} (1-β1) * g̃_t。计算梯度的二阶矩估计自适应学习率分量v_t β2 * v_{t-1} (1-β2) * g̃_t^2逐元素平方。偏差修正m̂_t m_t / (1 - β1^t),v̂_t v_t / (1 - β2^t)。更新参数w_{t1} w_t - α * m̂_t / (sqrt(v̂_t) ϵ_adam)。这里ξ_t提供了样本级别的、基于曲率的预条件而Adam的机制提供了参数级别的、基于历史梯度幅度的自适应学习率。两者结合可能带来更强大的性能。原论文的实验部分也暗示了这种加速的有效性。5.3 与其他二阶近似方法的对比IGND在“轻量级二阶方法”这个赛道上并非孤例。了解它的“邻居”有助于我们做出选择方法核心思想计算复杂度 (相对于SGD)优点缺点SGD一阶梯度下降基准 (O(m))极其简单内存占用小收敛慢对学习率敏感在平坦区域表现差IGND单样本高斯牛顿标量化几乎相同 (O(m))计算开销极低近似二阶信息尺度不变调参更简单目前理论主要针对纯增量情况小批量扩展是开放问题KFAC使用Kronecker因子近似Fisher矩阵自然梯度较高 (O(m^1.5)?)需计算并逆两个小矩阵对神经网络结构有很好的近似性能提升显著实现复杂内存和计算开销显著高于SGD需存储额外矩阵Shampoo对每层参数使用左、右预条件矩阵高需计算和逆多个矩阵全矩阵预条件理论性质好计算和存储开销大尤其对于宽层SGN小批量高斯牛顿 共轭梯度求解高需迭代求解线性系统更精确的二阶方向每步迭代计算成本高涉及矩阵-向量乘法IGND的定位非常明确它是在不增加或极少增加单次迭代计算成本的前提下获取二阶优化好处的一次极致尝试。它不适合需要极高精度二阶方向的场景但非常适合那些对计算开销敏感、又希望比SGD更稳定更快的大规模训练任务。6. 实战指南与常见问题排查纸上得来终觉浅绝知此事要躬行。让我们聊聊在真实项目中应用IGND可能遇到的问题和技巧。6.1 适用场景与任务选择IGND并非万能药它在以下场景中可能表现突出回归问题损失函数天然是均方误差MSE完美契合最小二乘形式。带有高斯输出层的模型在最大似然估计下等价于最小二乘。强化学习中的价值函数拟合TD误差的平方和常作为损失函数。任何可以近似为最小二乘的损失例如使用Huber损失或某些自定义损失时在大部分区域可视为L2范数。对于标准的交叉熵分类任务严格来说损失函数不是最小二乘形式。但经验表明对于使用softmax交叉熵的神经网络分类器在训练后期当模型预测接近真实标签时其行为常近似于最小二乘问题。因此IGND在分类任务上也可能有效但效果可能不如在回归任务中稳定和显著。可以将其视为一种值得尝试的高级优化器。6.2 超参数调优经验学习率α由于IGND自带缩放因子ξ其对学习率的尺度不那么敏感。通常你可以使用比SGD更大的初始学习率。一个不错的起点是SGD常用学习率的2到10倍。例如如果SGD用0.01IGND可以从0.05或0.1开始尝试。正则化参数ϵ保持默认值1e-8即可。它的主要作用是数值稳定。除非你遇到梯度爆炸||∇f||^2极大导致ξ近乎为零的情况否则不需要调整。如果发生这种情况可以适当增大ϵ到1e-6或1e-4但这通常意味着模型或数据有问题。动量系数β如果加入动量常用值0.9依然是一个稳健的起点。学习率调度与SGD一样使用学习率衰减策略如Step Decay, Cosine Annealing能进一步提升性能。由于IGND可能收敛更快你可以尝试更激进的衰减计划比如更早地开始降低学习率。6.3 常见问题与解决方案问题1训练初期不稳定损失剧烈震荡。可能原因初始学习率α设置过高。尽管IGND有缩放但过大的基础学习率仍会导致不稳定。排查与解决绘制最初几百个迭代的损失曲线和参数更新范数||Δw||。如果更新范数巨大尝试将学习率降低一个数量级例如从0.1降到0.01。考虑在训练初期使用**热身Warm-up**策略即在前几个epoch线性增加学习率从0到目标值。问题2训练后期收敛缓慢甚至停滞。可能原因A学习率衰减过快或最终值太小。解决A检查学习率调度器确保在训练末期学习率没有衰减到近乎为零。可以尝试Cosine Annealing with Restarts或ReduceLROnPlateau当损失平台期时再衰减。可能原因B对于深度网络梯度∇f的范数在反向传播过程中可能变得非常小梯度消失导致缩放因子ξ变得极大更新步长失控实际上由于ξ是1/||∇f||^2如果||∇f||很小ξ会很大但与此同时损失梯度∇L r * ∇f也很小因为∇f小。两者的乘积ξ * ∇L (r * ∇f) / ||∇f||^2其大小取决于残差r和梯度方向。理论上不会单纯因为梯度小就爆炸。但数值不稳定可能发生。解决B确保ϵ参数已设置如1e-8。如果问题持续可以尝试梯度裁剪但裁剪对象是最终的更新方向Δw α * ξ * ∇L而不是原始的∇L。设置一个全局最大更新范数阈值。问题3与SGD相比内存占用或计算时间显著增加。可能原因错误地计算了海森矩阵或进行了昂贵的矩阵运算。IGND不应该这样排查确认你计算的是f的梯度g_f而不是损失L的海森矩阵或任何二阶信息。计算ξ时g_f^T g_f是向量内积复杂度O(m)与计算梯度本身相同。确保你没有不小心构造了g_f的外积矩阵一个m×m的矩阵。使用性能分析工具如PyTorch的torch.profiler定位瓶颈。问题4在小批量Mini-batch上效果不如预期。可能原因原论文理论针对N1。直接对批量数据计算ξ 1 / (平均||∇f_i||^2)可能不是最优近似。尝试方案独立计算平均更新对批量内每个样本i独立计算ξ_i和更新方向d_i然后取平均d (1/B) * Σ d_i。这最符合理论但计算量是B倍。使用批量平均梯度计算批量平均梯度g_f_batch (1/B) Σ ∇f_i然后计算ξ_batch 1 / (||g_f_batch||^2 ϵ)。这是一种启发式方法计算量小但理论依据较弱。实验选择在小数据集上对比两种方案选择效果更好的。社区尚未有定论这是一个实用的开放点。我个人在几个中小规模的回归任务上尝试过IGND最直观的感受是学习率变得“好调”了。以前用SGD或Adam需要仔细地网格搜索学习率否则要么震荡要么慢如蜗牛。换上IGND后在一个相对宽泛的学习率范围内例如0.001到0.1模型都能稳定收敛且最终性能相差不大。这大大减少了超参数调优的成本。对于数据特征尺度差异较大的任务IGND的优势更明显因为它内在的尺度不变性减少了对数据标准化的依赖。当然它也不是银弹。在非常深、非常复杂的网络如Transformer for NLP上其相对于成熟优化器如AdamW的全面优势还有待大规模实验验证。但作为一种思想简洁、实现轻量、理论有趣的新方法IGND无疑为我们优化机器学习模型提供了一个有价值的新选择。尤其是在计算资源受限但又希望获得比SGD更好性能的场景下它值得你放入工具箱一试。
IGND:用单样本高斯牛顿缩放因子,实现SGD计算开销的二阶优化
发布时间:2026/5/24 6:51:12
1. 项目概述当SGD遇上高斯牛顿一次计算开销不变的“降维打击”在机器学习的优化工具箱里随机梯度下降SGD无疑是那个最常用、也最让人又爱又恨的工具。爱它的简单高效恨它在某些问题上的“磨蹭”——尤其是在损失函数地形平坦的区域SGD的收敛速度会显著下降让人等得心焦。为了解决这个问题社区里涌现了动量法、自适应学习率如Adam等一众“加速器”。但今天我想和你聊点不一样的一种能利用二阶曲率信息却几乎不增加额外计算成本的算法——增量高斯牛顿下降Incremental Gauss-Newton Descent, IGND。简单来说IGND的核心思想是用高斯牛顿法Gauss-Newton的智慧来重新“校准”SGD的每一步更新。传统的高斯牛顿法需要构造并求解一个可能非常庞大的线性系统涉及雅可比矩阵的乘积这对于动辄百万甚至上亿参数的现代机器学习模型来说计算和存储都是噩梦。IGND的巧妙之处在于它发现在增量学习每次只处理一个样本的场景下完整的高斯牛顿更新方向可以被压缩成一个简单的标量缩放因子。这个因子只依赖于当前样本对应的模型输出梯度向量的模长平方计算它只需要一次向量内积和一个标量除法。这意味着什么意味着你几乎可以用和SGD完全一样的计算开销一次前向传播、一次反向传播却获得一个近似二阶优化方法的更新步长。这个步长自带“尺度不变性”Scale Invariance也就是说无论你的模型参数或输入特征被放大或缩小了多少倍算法实际的更新效果是稳定的。这极大地降低了对学习率超参数调优的依赖提升了算法的鲁棒性。无论是监督学习中的回归、分类任务还是强化学习中的价值函数拟合只要你的损失函数可以或近似可以写成最小二乘的形式IGND就可能为你带来惊喜。2. 核心原理从SGD到高斯牛顿再到一个神奇的标量要理解IGND我们需要先理清SGD和高斯牛顿法之间的关系以及IGND是如何在两者之间架起一座高效桥梁的。2.1 SGD的局限与二阶方法的诱惑标准的SGD更新规则非常直观w_{t1} w_t - α_t * g_t其中w_t是第t次迭代的参数α_t是学习率g_t ∇L(w_t)是损失函数L在当前参数和随机样本下的梯度。SGD的问题在于它只使用了一阶梯度信息。梯度方向指向当前点处函数值下降最快的方向但步长α_t是人为设定的它没有考虑损失函数在该方向上的“弯曲程度”曲率。在曲率很大的陡峭区域过大的步长可能导致震荡甚至发散在曲率很小的平坦区域过小的步长又会导致收敛缓慢。二阶优化方法如牛顿法通过引入海森矩阵Hessian MatrixH即损失函数的二阶导数矩阵来修正这个问题。其更新方向为d -H^{-1} g。这个方向不仅考虑了下降方向还通过海森矩阵的逆对梯度进行了缩放相当于在参数空间的不同方向上使用了自适应的学习率。然而计算和存储完整的海森矩阵对于大规模模型是不现实的其复杂度是参数数量的平方甚至立方级。2.2 高斯牛顿近似针对最小二乘的“瘦身”术高斯牛顿法是解决非线性最小二乘问题的一把利器。当损失函数是残差平方和的形式时L(w) 1/2 ||r(w)||^2r是残差向量其海森矩阵有一个特殊的结构H J^T J S其中J是残差r对参数w的雅可比矩阵S是包含残差与残差二阶导数的项。高斯牛顿法的核心洞察是在接近最优解时残差r很小因此S项通常可以被忽略。于是我们得到了一个既正定或半正定又无需计算二阶导数的海森矩阵近似H_GN ≈ J^T J。对应的更新方向高斯牛顿方向需要通过求解线性系统(J^T J) d -J^T r来获得。即使有了这个近似对于大规模问题构造J^T J一个m×m的矩阵m为参数数量和求解这个线性系统仍然是沉重的负担。这就是为什么高斯牛顿法在传统机器学习优化中并不主流。2.3 IGND的魔法当雅可比矩阵退化为一个向量IGND的突破点在于它聚焦于增量Incremental或在线Online学习场景即每次迭代只使用一个数据样本N1。在这个设定下残差r变成了一个标量其雅可比矩阵J退化成了一个行向量或者说梯度向量∇r。此时高斯牛顿矩阵H_GN J^T J (∇r)(∇r)^T。这是一个秩为1的矩阵显然是奇异的不可逆。直接套用公式d -(J^T J)^{-1} J^T r行不通。传统的思路可能是添加正则项如Levenberg-Marquardt方法但这又会引入新的超参数并增加计算。IGND的推导从一个巧妙的优化问题出发。它寻找一个更新方向d使得在满足线性化残差变化最小的同时避免在损失函数梯度为零的方向即雅可比矩阵的零空间上移动。这个问题的数学形式是argmin_{Δw} 1/2 ||r (∇r)^T Δw||^2 1/2 ||Z^T Δw||^2其中Z是∇r的零空间基向量组成的矩阵。这个问题的解经过严谨的数学证明见原论文定理3.2具有一个极其简洁的形式d -ξ * (∇r) * r 其中ξ 1 / (∇r^T ∇r)这就是IGND的核心公式。让我们拆解一下∇r当前样本下标量残差r对模型参数w的梯度向量。在最小二乘损失下r y - f(x)所以∇r -∇f即模型输出f(x)对参数的梯度的相反数。∇r^T ∇r这个梯度向量的内积也就是它的L2范数的平方||∇r||^2。ξ那个神奇的标量缩放因子。它就是梯度向量模长平方的倒数。整个更新量Δw α * ξ * (∇r) * r。对比SGD的Δw_SGD α * (∇L) α * r * (∇r)你会发现IGND只是多乘了一个因子ξ。关键洞察这个ξ因子正是高斯牛顿信息在单样本情况下的精髓体现。它自动地根据当前参数梯度的大小来调整更新步长。梯度模长大曲率可能大时ξ小步长被抑制梯度模长小曲率可能小时ξ大步长被放大。这实现了某种程度的自适应预条件Preconditioning。2.4 与梯度裁剪/归一化的本质区别你可能会联想到梯度裁剪Gradient Clipping或梯度归一化Normalized Gradient Descent。它们也涉及对梯度进行缩放但逻辑完全不同梯度裁剪/归一化缩放基于损失函数梯度∇L的范数即||r * ∇r||。其目的是防止更新步长过大稳定训练。IGND缩放基于函数近似器梯度∇f或∇r的范数平方即||∇r||^2。其目的是近似二阶曲率信息实现尺度不变性。一个至关重要的区别是在收敛点附近损失L趋近于最小值其梯度∇L也趋近于零。如果用||∇L||来做分母进行缩放会导致数值不稳定除以一个非常小的数。而||∇f||或||∇r||代表的是模型输出对参数的敏感度在收敛时并不一定趋于零因此IGND的缩放因子ξ通常是良定义的。3. 算法实现与实操要点理解了原理我们来看如何将IGND付诸实践。其算法框架清晰得令人惊讶。3.1 基础IGND算法流程以下是IGND的核心伪代码我已将其转化为更易理解的步骤说明初始化设定学习率α可选的正则化参数ϵ通常设为很小的数如1e-8防止除零随机初始化模型参数w。循环迭代直到满足停止条件如达到最大轮数或损失不再下降 a.采样从训练集D中随机抽取一个样本(x_t, y_t)。 b.前向与梯度计算 - 计算模型预测值f_t f(w_t, x_t)。 - 计算残差r_t y_t - f_t对于最小二乘损失。 -关键步骤通过反向传播计算模型输出f_t对参数w_t的梯度向量g_f ∇f(w_t, x_t)。注意这里计算的是f的梯度而不是损失L的梯度。在PyTorch或TensorFlow中这通常意味着在计算图中对f本身调用backward()或gradient()而不是对(y-f)^2调用。 c.计算缩放因子ξ_t 1 / (g_f^T * g_f ϵ)。这里g_f^T * g_f就是向量内积得到标量。 d.参数更新w_{t1} w_t α * ξ_t * g_f * r_t。 - 回忆一下损失梯度∇L r_t * g_f因为L 1/2 * r^2∇L r * ∇r -r * ∇f我们这里用g_f即∇f所以符号是。 - 因此更新式可写为w_{t1} w_t α * ξ_t * (-∇L)。这更直观地体现了它是SGD的一个缩放版本。3.2 关键实现细节与陷阱1. 梯度计算的对象是f不是L这是实现中最容易出错的地方。在大多数深度学习框架中我们习惯计算损失函数的梯度。对于IGND你必须计算模型输出f(x)对于参数w的梯度。PyTorch示例# 假设 model 是你的神经网络 criterion 是MSELoss x, y data f model(x) # 模型输出 loss criterion(f, y) # 错误做法计算loss的梯度 # loss.backward() # 这得到的是 d(loss)/dw # 正确做法计算 f 的梯度 model.zero_grad() # 创建一个与 f 形状相同的“权重”张量对于标量输出就是1。 # 如果 f 是多维的如多输出回归这里需要根据残差定义调整。 f.backward(gradienttorch.ones_like(f)) g_f [p.grad.clone() for p in model.parameters()] # 获取 ∇f # 然后手动计算 g_f 的内积和更新参数TensorFlow 2.x 示例import tensorflow as tf with tf.GradientTape() as tape: f model(x, trainingTrue) # 前向传播 # 计算 f 对可训练变量的梯度 g_f tape.gradient(f, model.trainable_variables) # g_f 是一个列表包含每个变量的梯度张量2. 缩放因子 ξ 的计算与数值稳定计算ξ 1 / (||g_f||^2 ϵ)时必须添加一个小的正则化常数ϵ例如1e-8。这有两个目的防止当||g_f||^2接近零时出现除零错误。这等价于在高斯牛顿矩阵H_GN上添加了一个ϵ * I的正则项即Levenberg-Marquardt正则化能保证更新方向总是良定义的。3. 与SGD的代码对比改动其实非常小。一个标准的SGD训练循环中你将optimizer.step()替换为手动更新并插入计算ξ和缩放梯度的步骤即可。4. 扩展到小批量Mini-batch情况原论文主要聚焦于纯增量N1情况。对于更常用的小批量训练直接应用IGND公式需要对批量内每个样本单独计算ξ_i和更新然后取平均或者探索其他近似方式。论文提到这是未来研究方向。在实践中对小批量数据直接计算整个批量的∇f一个矩阵的范数可能会得到不同的近似需要谨慎尝试和验证。3.3 尺度不变性一个直观的例子为什么IGND对参数缩放更鲁棒考虑一个最简单的线性模型f(w, x) w^T x。如果我们将输入特征x缩放φ倍即使用新特征x φx。为了保持模型输出不变最优权重会变为w* w*/φ。SGD更新为Δw α * r * x。缩放后Δw α * r * (φx) φ * Δw。权重更新量被放大了φ倍这改变了优化路径可能需要重新调整学习率α。IGND∇f x所以||∇f||^2 x^T x。缩放后∇f φx||∇f||^2 φ^2 x^T x。因此缩放因子ξ 1/(φ^2 ||x||^2) ξ / φ^2。更新量变为Δw α * (ξ/φ^2) * r * (φx) (α * ξ * r * x) / φ Δw / φ。恰好与最优权重w* w*/φ的变化比例一致IGND自动补偿了特征缩放带来的影响使得算法在缩放后的参数空间里其更新行为与原始空间一致。对于非线性模型这种尺度不变性是近似的但在模型拟合较好残差小时近似程度很高。这意味着使用IGND时你对数据做标准化预处理的需求可能降低或者算法对未完美标准化的数据更具包容性。4. 理论保障IGND的收敛性证明一个实用的算法需要有理论背书。IGND在满足一定条件下被证明是收敛的。这些条件与分析SGD收敛性时类似但针对IGND的特定更新形式进行了调整。核心假设函数梯度有界模型输出f的梯度范数||∇f||^2存在一个上界Q。这是一个温和的假设确保缩放因子ξ有下界ξ ≥ 1/(Qϵ)更新步长不会无限大。损失函数光滑总体损失函数L̄(w)是连续可微的且其梯度是Lipschitz连续的常数为L。这保证了损失函数不会变化得太剧烈是梯度类方法的标准假设。更新方向与方差条件存在正常数μ使得IGND的更新方向-ξg与真实梯度-∇L̄的内积期望至少是μ||∇L̄||^2。这保证了平均而言IGND方向是下降方向。更新方向ξg的方差是有界的且其界与当前梯度范数||∇L̄||^2有关。这控制了随机噪声的大小。学习率衰减学习率序列{α_t}满足Robbins-Monro条件Σ α_t ∞保证能到达最优点Σ α_t^2 ∞保证噪声能被平均掉。典型选择是α_t c / t或α_t c / sqrt(t)。在这些假设下论文证明了定理3.5lim_{T→∞} E[ Σ_{t1}^T α_t ||∇L̄(w_t)||^2 ] ∞并且如果进一步假设目标函数二阶可微等条件可以推出更强的结论推论3.6lim_{t→∞} E[ ||∇L̄(w_t)||^2 ] 0这意味着算法最终会收敛到一个平稳点梯度为零的点。这为IGND的实际应用提供了理论上的安全保证。实操心得这些理论条件在实际中大多自然满足或可通过设计满足如使用衰减学习率。理论证明的价值在于告诉我们IGND不是一个随意的启发式方法而是一个有扎实数学基础的优化算法。5. 高级话题如何加速IGNDIGND的美妙之处在于它保留了SGD的简单计算结构。因此几乎所有为SGD设计的加速技巧都可以几乎原封不动地应用到IGND上。5.1 动量MomentumPolyak动量或Nesterov加速动量可以直接融入IGND。更新规则变为v_{t1} β * v_t ξ_t * g_{f_t} * r_tw_{t1} w_t - α * v_{t1}这里v是速度变量β是动量系数通常为0.9。动量通过累积过去更新方向的信息有助于平滑优化路径、加速穿越平坦区域并抑制震荡。5.2 自适应学习率与Adam风格组合虽然IGND的ξ已经提供了基于当前样本曲率的自适应缩放但我们仍然可以引入更全局的自适应学习率。例如可以构建一个IGND版本的Adam我们暂且称之为IGND-Adam计算当前缩放后的梯度g̃_t ξ_t * g_{f_t} * r_t。计算梯度的一阶矩估计动量m_t β1 * m_{t-1} (1-β1) * g̃_t。计算梯度的二阶矩估计自适应学习率分量v_t β2 * v_{t-1} (1-β2) * g̃_t^2逐元素平方。偏差修正m̂_t m_t / (1 - β1^t),v̂_t v_t / (1 - β2^t)。更新参数w_{t1} w_t - α * m̂_t / (sqrt(v̂_t) ϵ_adam)。这里ξ_t提供了样本级别的、基于曲率的预条件而Adam的机制提供了参数级别的、基于历史梯度幅度的自适应学习率。两者结合可能带来更强大的性能。原论文的实验部分也暗示了这种加速的有效性。5.3 与其他二阶近似方法的对比IGND在“轻量级二阶方法”这个赛道上并非孤例。了解它的“邻居”有助于我们做出选择方法核心思想计算复杂度 (相对于SGD)优点缺点SGD一阶梯度下降基准 (O(m))极其简单内存占用小收敛慢对学习率敏感在平坦区域表现差IGND单样本高斯牛顿标量化几乎相同 (O(m))计算开销极低近似二阶信息尺度不变调参更简单目前理论主要针对纯增量情况小批量扩展是开放问题KFAC使用Kronecker因子近似Fisher矩阵自然梯度较高 (O(m^1.5)?)需计算并逆两个小矩阵对神经网络结构有很好的近似性能提升显著实现复杂内存和计算开销显著高于SGD需存储额外矩阵Shampoo对每层参数使用左、右预条件矩阵高需计算和逆多个矩阵全矩阵预条件理论性质好计算和存储开销大尤其对于宽层SGN小批量高斯牛顿 共轭梯度求解高需迭代求解线性系统更精确的二阶方向每步迭代计算成本高涉及矩阵-向量乘法IGND的定位非常明确它是在不增加或极少增加单次迭代计算成本的前提下获取二阶优化好处的一次极致尝试。它不适合需要极高精度二阶方向的场景但非常适合那些对计算开销敏感、又希望比SGD更稳定更快的大规模训练任务。6. 实战指南与常见问题排查纸上得来终觉浅绝知此事要躬行。让我们聊聊在真实项目中应用IGND可能遇到的问题和技巧。6.1 适用场景与任务选择IGND并非万能药它在以下场景中可能表现突出回归问题损失函数天然是均方误差MSE完美契合最小二乘形式。带有高斯输出层的模型在最大似然估计下等价于最小二乘。强化学习中的价值函数拟合TD误差的平方和常作为损失函数。任何可以近似为最小二乘的损失例如使用Huber损失或某些自定义损失时在大部分区域可视为L2范数。对于标准的交叉熵分类任务严格来说损失函数不是最小二乘形式。但经验表明对于使用softmax交叉熵的神经网络分类器在训练后期当模型预测接近真实标签时其行为常近似于最小二乘问题。因此IGND在分类任务上也可能有效但效果可能不如在回归任务中稳定和显著。可以将其视为一种值得尝试的高级优化器。6.2 超参数调优经验学习率α由于IGND自带缩放因子ξ其对学习率的尺度不那么敏感。通常你可以使用比SGD更大的初始学习率。一个不错的起点是SGD常用学习率的2到10倍。例如如果SGD用0.01IGND可以从0.05或0.1开始尝试。正则化参数ϵ保持默认值1e-8即可。它的主要作用是数值稳定。除非你遇到梯度爆炸||∇f||^2极大导致ξ近乎为零的情况否则不需要调整。如果发生这种情况可以适当增大ϵ到1e-6或1e-4但这通常意味着模型或数据有问题。动量系数β如果加入动量常用值0.9依然是一个稳健的起点。学习率调度与SGD一样使用学习率衰减策略如Step Decay, Cosine Annealing能进一步提升性能。由于IGND可能收敛更快你可以尝试更激进的衰减计划比如更早地开始降低学习率。6.3 常见问题与解决方案问题1训练初期不稳定损失剧烈震荡。可能原因初始学习率α设置过高。尽管IGND有缩放但过大的基础学习率仍会导致不稳定。排查与解决绘制最初几百个迭代的损失曲线和参数更新范数||Δw||。如果更新范数巨大尝试将学习率降低一个数量级例如从0.1降到0.01。考虑在训练初期使用**热身Warm-up**策略即在前几个epoch线性增加学习率从0到目标值。问题2训练后期收敛缓慢甚至停滞。可能原因A学习率衰减过快或最终值太小。解决A检查学习率调度器确保在训练末期学习率没有衰减到近乎为零。可以尝试Cosine Annealing with Restarts或ReduceLROnPlateau当损失平台期时再衰减。可能原因B对于深度网络梯度∇f的范数在反向传播过程中可能变得非常小梯度消失导致缩放因子ξ变得极大更新步长失控实际上由于ξ是1/||∇f||^2如果||∇f||很小ξ会很大但与此同时损失梯度∇L r * ∇f也很小因为∇f小。两者的乘积ξ * ∇L (r * ∇f) / ||∇f||^2其大小取决于残差r和梯度方向。理论上不会单纯因为梯度小就爆炸。但数值不稳定可能发生。解决B确保ϵ参数已设置如1e-8。如果问题持续可以尝试梯度裁剪但裁剪对象是最终的更新方向Δw α * ξ * ∇L而不是原始的∇L。设置一个全局最大更新范数阈值。问题3与SGD相比内存占用或计算时间显著增加。可能原因错误地计算了海森矩阵或进行了昂贵的矩阵运算。IGND不应该这样排查确认你计算的是f的梯度g_f而不是损失L的海森矩阵或任何二阶信息。计算ξ时g_f^T g_f是向量内积复杂度O(m)与计算梯度本身相同。确保你没有不小心构造了g_f的外积矩阵一个m×m的矩阵。使用性能分析工具如PyTorch的torch.profiler定位瓶颈。问题4在小批量Mini-batch上效果不如预期。可能原因原论文理论针对N1。直接对批量数据计算ξ 1 / (平均||∇f_i||^2)可能不是最优近似。尝试方案独立计算平均更新对批量内每个样本i独立计算ξ_i和更新方向d_i然后取平均d (1/B) * Σ d_i。这最符合理论但计算量是B倍。使用批量平均梯度计算批量平均梯度g_f_batch (1/B) Σ ∇f_i然后计算ξ_batch 1 / (||g_f_batch||^2 ϵ)。这是一种启发式方法计算量小但理论依据较弱。实验选择在小数据集上对比两种方案选择效果更好的。社区尚未有定论这是一个实用的开放点。我个人在几个中小规模的回归任务上尝试过IGND最直观的感受是学习率变得“好调”了。以前用SGD或Adam需要仔细地网格搜索学习率否则要么震荡要么慢如蜗牛。换上IGND后在一个相对宽泛的学习率范围内例如0.001到0.1模型都能稳定收敛且最终性能相差不大。这大大减少了超参数调优的成本。对于数据特征尺度差异较大的任务IGND的优势更明显因为它内在的尺度不变性减少了对数据标准化的依赖。当然它也不是银弹。在非常深、非常复杂的网络如Transformer for NLP上其相对于成熟优化器如AdamW的全面优势还有待大规模实验验证。但作为一种思想简洁、实现轻量、理论有趣的新方法IGND无疑为我们优化机器学习模型提供了一个有价值的新选择。尤其是在计算资源受限但又希望获得比SGD更好性能的场景下它值得你放入工具箱一试。