梯度下降法

发布时间 2023-12-15 19:40:28作者: PlutoWan

1 梯度下降法

\(\qquad\) 梯度下降法又称最速下降法,是最优化方法中最基本的一种方法。所有无约束最优化问题都是在求解如下的无约束优化问题:$$\min_{x \in R^n} f(x)$$

将初始点\(x_0\)逐步迭代到最优解所在的点\(x^*\),那么考虑搜索点迭代过程:$$x_{t+1} = x_t + \gamma_td_t$$

其中\(d_t\)是我们根据目标函数在\(x_t\)的情况确定的搜索方向,而\(\gamma_t\)则成为迭代点\(x_t\)沿搜索方向的步长。其实就是:已知函数\(f\)和迭代点\(x_t\),能够使用一种算法算出搜索方向\(d_t\),使得\(x_t\)在这个搜索方向下得到的点能够使\(f\)变小,即$$f(x_{t+1}) < f(x_t)$$

梯度下降希望得到一个方向,这个方向是在该点下降最快的,因此在函数一阶可微情况下,直接求\(\nabla f(x_t)\),取\(d_t = - \nabla f(x_t)\)

注意: 下降最快不一定是降幅最大

证明:设目标函数\(f\)连续可微,将\(f\)\(x_t\)处Taylor展开:$$f(x) = f(x_t) + \nabla f(x_t)^T(x-x_t) + o(|x-x_t|)$$
\(x=x_{t+1}\),有$$f(x_{t+1})=f(x_t)+ \gamma_t \nabla f(x_t)^T d_t + o(|x_{t+1}-x_t|)$$
为了能使\(f(x_{t+1}) < f(x_t)\),可以明显看到\(\gamma_t \nabla f(x_t)^T d_t = \frac{\partial f}{\partial \gamma} < 0\);我们希望\(f(x_{t+1})\)下降得尽可能快,即需要满足 $$d_t^* = arg \min_{d_t} \frac{\partial f}{\partial \gamma} = arg \max_{d_t} - \frac{\partial f}{\partial \gamma}$$
由Cauchy不等式,$$- \frac{\partial f}{\partial \gamma} = - \nabla f(x_t)^T d_t \leq | \nabla f(x_t)| \cdot |d_t|, \text{iff }d_t与 - \nabla f(x_t)同向$$

已知迭代的终止条件参数 \(\epsilon\),初始迭代点为\(x_0\),重复以下操作:
1、计算\(d_t = \nabla f(x_t)\),若\(\|d_t\| < \epsilon\),迭代终止
2、通过线搜索确定步长\(\gamma_t\)
3、通过迭代更新得到下一个迭代点

2 精确线搜索

只适用于\(argmin_{\gamma}f(x_t+\gamma d_t)\)的迭代过程。

\(f(x) = \frac{1}{2} x^TQx + b^Tx + c\),其中\(x\)\(n\)维列向量,\(Q\)是实对称正定矩阵,\(b\)\(x\)同维度的列向量,\(c\)是实数。

\(g_t = \nabla f(x_t)\), 我们可以计算最优步长\(\gamma^*\):

\[\begin{aligned} \gamma^* & = arg \min_{\gamma} f(x_t + \gamma d_t) \\ & = arg \min_{\gamma} f(x_t - \gamma g_t) \\ & = arg \min_{\gamma} (\frac{1}{2} g_t^TQg_t \gamma^2 - g_t^Tg_t\gamma + f(x_t)) \end{aligned} \]

可以得到最优步长\(\gamma^*\)为:

\[\gamma^* = \frac{g_t^Tg_t}{g_t^TQg_t} \]

那么对正定二次型,其更新迭代公式为:$$x_{t+1} = x_t - \frac{g_t^T g_t}{g_t^TQg_t}(Qx_t+b)$$

已知迭代的终止条件参数 \(\epsilon\),初始迭代点为\(x_0\),记\(g_t = \nabla f(x_t)\),重复以下操作:
1、计算\(d_t = \nabla f(x_t)\),若\(\|d_t\| < \epsilon\),迭代终止
2、通过线搜索确定步长\(\gamma_t \frac{g_t^Tg_t}{g_t^TQg_t}\)
3、通过迭代更新得到下一个迭代点

3 非精确线搜索

Goldstein准则

如图所示,从\((0, f(x_k))\)处引出两条射线,选取的\(\gamma_k\)于原单值函数上的映射值位于\(\gamma_k\)在这两条直线上的映射值之间,于是构成它们的约束区间\([b, c]\),那么这一步我们要寻找的步长\(\gamma_k\)就位于\([b, c]\)之间。

\(\varphi(\gamma)=f(x_k + \gamma d_k)\),则两条线的约束可写成

\[\varphi(\gamma_k) \leq \varphi(0) + \rho \gamma_k \varphi'(0) \tag{1} \]

\[\varphi(\gamma_k) \geq \varphi(0) + (1- \rho) \gamma_k \varphi'(0) \tag{2} \]

其中 \(0 < \varphi < \frac{1}{2}\)

Goldstein准则非精确先搜索算法

我们根据上式(1)(2),得到算法
1、选取初始搜索区间[0, sup(\gamma)]中选取初始点\(\gamma_0\),搜索区间\([a_0, b_0]\),计算\(\varphi(0), \varphi'(0)\),给出 \(\rho \in (0, \frac{1}{2}), t > 1, k = 0\)
2、若\(\gamma_k\)满足(1),转到第三步;否则 \(a_{k+1} = a_k, b_{k+1} = \gamma_k\),转到第四步
3、若\(\gamma_k\)满足(2),则输出\(\gamma_k\),迭代结束;
否则令\(a_{k+1}=\gamma_k,b_{k+1}=b_k\);若\(b_{k+1} < sup(\gamma)\),转第四步;
否则令\(\gamma_{k+1} = t \gamma_k, k += 1\),转第二步;
4、令 \(\gamma_{k+1} = \frac{a_{k+1}+b_{k+1}}{2}, k += 1\),转第二步