1. 为什么我们需要超越梯度下降?
在机器学习和深度学习的入门阶段,梯度下降(Gradient Descent)几乎是我们接触到的第一个优化算法。它简单、直观,就像数学分析中的求导过程一样自然。但当我们真正开始构建复杂的模型,处理大规模数据集时,会发现这个看似完美的算法存在诸多局限。
我曾在训练一个图像分类模型时遇到这样的困境:使用标准梯度下降时,模型在训练初期收敛很快,但到了后期却像陷入泥潭一样停滞不前。调整学习率要么导致前期震荡剧烈,要么后期收敛过慢。这就是典型的"梯度下降困境"——它在高维非凸优化问题中表现出的病态行为。
梯度下降的核心思想是沿着当前点的梯度方向进行更新,这个方向确实是函数在该点局部下降最快的方向。但问题在于,这个"局部最优"方向往往不是全局最优方向。特别是在损失函数的等高线呈狭长椭圆形时(这在神经网络中非常常见),梯度下降会沿着陡峭的方向快速下降,但在平缓方向进展缓慢,形成之字形路径。
提示:理解优化算法的关键在于认识到不同算法对损失函数几何特性的假设不同。梯度下降实际上假设损失函数在任何点都是各向同性的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从一阶到二阶:牛顿法的哲学突破
2.1 牛顿法的数学本质
牛顿法(Newton's Method)代表着优化算法的一次重大飞跃——从仅利用一阶信息(梯度)到利用二阶信息(Hessian矩阵)。我第一次实现牛顿法时,被它在某些问题上的收敛速度震惊了:只需要3-4次迭代就能达到梯度下降需要上千次迭代才能达到的精度。
牛顿法的更新公式为:
θ_{k+1} = θ_k - H^{-1}(θ_k)∇f(θ_k)
其中H是Hessian矩阵。这个公式的美妙之处在于它考虑了损失函数的曲率信息。H^{-1}∇f实际上给出了一个经过曲率校正的搜索方向,使得算法能够自适应地调整在不同方向上的步长。
2.2 牛顿法的实践挑战
然而,当我尝试将牛顿法应用于真实世界的机器学习问题时,很快就遇到了三个主要障碍:
-
计算复杂度:对于n维参数空间,Hessian矩阵是n×n的,存储和求逆的复杂度都是O(n^3)。对于现代深度学习模型动辄数百万的参数,这完全不现实。
-
非凸问题中的不定Hessian:在鞍点附近,Hessian矩阵可能不定,导致算法行为不稳定。我曾亲眼目睹牛顿法在某些情况下竟然朝着梯度上升的方向移动!
-
Hessian的正定性保证:即使原始Hessian是正定的,数值计算中的舍入误差也可能导致求逆失败。这迫使我不得不研究各种正则化技巧。
3. 拟牛顿法:平衡的艺术
3.1 BFGS算法的精妙设计
拟牛顿法(Quasi-Newton Methods)的出现完美解决了牛顿法的计算瓶颈。其中最具代表性的是BFGS算法(以其发明者Broyden、Fletcher、Goldfarb和Shanno命名)。当我第一次理解BFGS的更新机制时,不禁为它的数学美感所折服。
BFGS的核心思想是通过迭代的方式近似Hessian矩阵的逆B_k ≈ H_k^{-1},满足所谓的"拟牛顿条件":
B_{k+1}(∇f_{k+1}-∇f_k) = θ_{k+1}-θ_k
这个条件的直观解释是:我们希望近似的Hessian逆能够正确预测参数空间中的位移与梯度变化之间的关系。BFGS更新公式为:
B_{k+1} = (I - ρ_k s_k y_k^T)B_k(I - ρ_k y_k s_k^T) + ρ_k s_k s_k^T
其中s_k = θ_{k+1}-θ_k,y_k = ∇f_{k+1}-∇f_k,ρ_k = 1/(y_k^T s_k)
3.2 L-BFGS的内存优化
尽管BFGS避免了显式计算Hessian,但仍需存储n×n的B_k矩阵。L-BFGS(Limited-memory BFGS)通过只保存最近的m组(s_k,y_k)对,动态计算Hessian逆的近似,将空间复杂度从O(n^2)降至O(mn)。在实际应用中,m通常取5-20就能取得很好的效果。
我在一个自然语言处理项目中对比了各种优化器,发现L-BFGS在中等规模问题上(参数维度约10^5)表现出色:它不仅收敛速度快,而且最终解的质量往往比一阶方法更好。不过当参数规模超过百万时,即使是L-BFGS也会遇到瓶颈。
4. 共轭梯度法:线性与非线性场景的桥梁
4.1 线性共轭梯度法的几何洞察
共轭梯度法(Conjugate Gradient, CG)最初是为求解线性方程组Ax=b设计的,但它同样适用于二次函数的优化。我第一次接触CG时,对其中的"共轭方向"概念感到困惑,直到我画出了二维情况下的搜索路径才恍然大悟。
对于二次函数f(x) = 1/2 x^T A x - b^T x,CG通过构造一组A-共轭的搜索方向{d_k},保证每个方向上的最优步长只需计算一次。数学上,这组方向满足:
d_i^T A d_j = 0, ∀i≠j
这种构造的妙处在于:在n维空间中,最多n步就能找到精确解(理论上)。在实际应用中,由于数值误差,通常需要更多迭代,但收敛速度仍然惊人。
4.2 非线性共轭梯度法的扩展
将CG推广到非线性优化时,面临的主要挑战是如何在非二次情况下构造共轭方向。最流行的两种方案是:
-
Fletcher-Reeves:
β_k^{FR} = ∇f_{k+1}^T ∇f_{k+1} / ∇f_k^T ∇f_k -
Polak-Ribière:
β_k^{PR} = ∇f_{k+1}^T (∇f_{k+1} - ∇f_k) / ∇f_k^T ∇f_k
我在实践中发现,PR公式通常表现更好,但需要添加β_k = max(β_k^{PR}, 0)的约束来保证收敛性。此外,定期重置搜索方向为负梯度方向(如每n步一次)也很重要。
5. 现代优化算法的融合趋势
5.1 自适应学习率方法的兴起
近年来,Adam等自适应学习率方法在深度学习领域大放异彩。当我深入研究Adam的设计原理时,发现它实际上融合了动量法和RMSprop的思想,同时借鉴了二阶方法的一些洞见。
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} - α m̂_t / (√v̂_t + ε)
这种设计使得Adam能够自动调整每个参数的学习率,在平坦方向加大步长,在陡峭方向减小步长,某种程度上模拟了二阶方法的行为。
5.2 二阶方法与深度学习的结合尝试
尽管传统的二阶方法难以直接应用于深度学习,但研究者们提出了许多创新方案。例如:
-
K-FAC(Kronecker-factored Approximate Curvature):通过对Hessian矩阵的Kronecker分解来降低计算复杂度。
-
Shampoo:通过维护统计量来近似Hessian的对角分块矩阵。
我在一个计算机视觉项目中尝试了K-FAC,发现它确实能加速训练,但实现复杂度高且对超参数敏感。这反映了二阶方法在深度学习中的应用仍面临挑战。
6. 优化算法选择的实用指南
经过多年实践,我总结出以下算法选择经验:
-
小规模凸问题(n<10^4):牛顿法或BFGS是首选,收敛快且稳定。
-
中等规模问题(10^4<n<10^6):L-BFGS通常表现最佳,内存效率高。
-
大规模非凸问题(如深度学习):Adam或带动量的SGD更实用,尽管理论保证较弱。
-
特殊结构问题(如最小二乘):共轭梯度法往往出人意料地高效。
值得注意的是,没有放之四海而皆准的"最佳"优化器。我在不同项目中经常需要根据问题特性进行选择,有时甚至需要组合多种方法。例如,先用Adam快速收敛到附近,再切换到L-BFGS进行精细优化。
优化算法的研究仍在快速发展,了解这些经典方法的第一性原理,能帮助我们在面对新算法时更快抓住本质。正如我的导师常说:"掌握优化算法不在于记住公式,而在于理解它们背后的几何直观。"
