梯度下降与牛顿下降
📚牛顿下降法 (Newton’s Method / Newton-Raphson Method)
用于求方程的根(牛顿迭代法),也可以用于求函数的极小值(牛顿下降法)。
1. 核心公式
1.1 求方程的根 (单变量)
- 基本思想: 在当前点 xk 附近,用函数的切线去逼近函数本身。切线与 x 轴的交点 xk+1 就是下一个迭代点。
- 几何意义: 逼近 f(x) 在 xk 处的线性近似。
寻找 f(x)=0 的根:
xk+1=xk−f′(xk)f(xk)
1.2 求函数的极小值 (多变量)
- 基本思想: 求解 ∇L(x)=0 的根(即寻找梯度为零的点,通常是极值点)。它通过在当前点使用函数的二次泰勒展开式来近似目标函数,并直接求出近似函数的最小值点作为下一个迭代点。
寻找函数 L(x) 的极小值:
xk+1=xk−Hk−1∇L(xk)
其中:
-
∇L(xk):目标函数 L(x) 在 xk 处的**梯度向量**(一阶导数)。
-
Hk:目标函数 L(x) 在 xk 处的 **Hessian 矩阵**(二阶导数矩阵)。
-
Hk−1:Hessian 矩阵的逆。
加入步长(阻尼牛顿法):
xk+1=xk−αkHk−1∇L(xk)
其中 αk 是步长(或学习率),通常通过线搜索确定。
简易来讲,求根是让目标函数为0,求极小值是让一阶导数为0
0=f(x)≈f(xk)+f′(xk)(xk+1−xk)
0=f′(x)≈f′(xk)+f′′(xk)(xk+1−xk)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| double func(double x) { return x*x + 3*x + exp(x); }
double getdiff(double x, double (*func)(double)) { return (func(x + 1e-6) - func(x)) / 1e-6; }
double newton(double x0, double (*func)(double), double (*getdiff)(double, double (*func)(double))) { double func_val = func(x0); while (abs(func_val) > 1e-6) { double diff = getdiff(x0, func); if (abs(diff) < 1e-12) { break; } x0 -= func_val / diff; func_val = func(x0); } return x0; }
double L_double_prime(double x, double (*func)(double)) { const double h = 1e-6;
double L_prime_at_x_plus_h = L_prime_value(x + h, func);
double L_prime_at_x = L_prime_value(x, func);
return (L_prime_at_x_plus_h - L_prime_at_x) / h; }
double newton_optimizer(double x0, double (*func)(double)) { double L_prime_val = L_prime_value(x0, func); int max_iter = 100;
while (abs(L_prime_val) > 1e-6 && max_iter-- > 0) { double L_double_prime_val = L_double_prime(x0, func);
if (abs(L_double_prime_val) < 1e-12) { std::cerr << "Warning: Second derivative close to zero, stopping." << std::endl; break; }
x0 -= L_prime_val / L_double_prime_val; L_prime_val = L_prime_value(x0, func); } return x0; }
|
梯度下降法
从当前位置开始,每一步都沿着负梯度方向(最快下降方向)走一小段距离
xk+1=xk−α∇L(xk)
局限性:
收敛速度: 梯度下降是线性收敛的,在某些地形(如狭长的“山谷”)中会走“锯齿”路线,效率低下。
局部最优: 在非凸函数中,它可能陷入不是全局最优的局部最小值。