利用曲率
梯度下降只知道斜率。牛顿法还利用曲率:在当前点附近用与 f 的值、梯度和 Hessian 都相同的二次函数代替 f,并直接跳到该二次函数的极小点。步长为 w←w−H−1g。对严格二次的函数,无论条件数如何,一步就落在极小点上。在任何光滑函数的极小点附近,收敛是二次的:误差每步大致平方,正确数字的位数大约翻倍。
wk+1=wk−H(wk)−1∇f(wk),∥wk+1−w∗∥ ≲ C∥wk−w∗∥2(1) 对 e^x − 2x 用牛顿法最小化
f(x)=ex−2x,其极小点为
x∗=ln2=0.693147。这里
f′=ex−2,
f′′=ex。从
x0=0 出发:
x1=0−(−1)/1=1,然后
x2=1−0.7183/2.7183=0.7358,
x3=0.6940,
x4=0.693148。误差
0.307, 0.0426, 0.0009, 4⋅10−7 的缩小速度超过任何固定倍数。在二维情形,对
f=(x−1)2+2(y+2)2 在
(3,0) 处有
g=(4,8)、
H=diag(2,4),步长为
−H−1g=(−2,−2),一步就到达极小点
(1,−2)。
牛顿法是有代价的。有 n 个参数时 Hessian 有 n2 个元素,用它求解约需 n3 次运算,几百个参数还行,几百万个就不可能了。远离极小点或 H 不正定时,牛顿步甚至可能指向上坡,因此实用版本会用线搜索来阻尼步长。拟牛顿法在不付出这些代价的情况下保留了大部分速度。BFGS 用观测到的变化 s=wk+1−wk 与 y=gk+1−gk 构造 Hessian 逆的近似,并强制满足割线条件 Bs=y。它只需要梯度,每步代价 O(n2),超线性收敛。L-BFGS 只存最近 m 对向量(通常 5 到 20 对),内存为 O(mn),是平滑校准和极大似然估计的常用主力,SciPy 的默认优化器就是如此。
- 牛顿法:w←w−H−1g;二次函数一步到位,极小点附近二次收敛。
- BFGS:由梯度差学习 Hessian 逆的近似,无需二阶导数。
- L-BFGS:只保留最近几对向量,因此可扩展到大量参数。
牛顿法需要保护措施纯牛顿法从糟糕的起点出发可能越过目标甚至发散。库的实现会加上线搜索或信赖域,并在 Hessian 不正定时退回到梯度步。做校准时不要手写没有这些保护的裸牛顿循环。
实验:评分内容
- 第一步牛顿迭代15 分
- 第二步牛顿迭代15 分
- 二元牛顿步15 分
- 二次函数上的步数15 分
- 割线条件15 分
- 方法与思想10 分
- 为什么巨型问题要避免精确牛顿法15 分