自适应记忆梯度法(Adaptive Memory Gradient Method)基础题
题目描述
考虑如下无约束非线性规划问题:
\[ \min_{x \in \mathbb{R}^n} f(x) \]
其中目标函数 \(f: \mathbb{R}^n \to \mathbb{R}\) 是连续可微且非凸的。我们使用一种结合了历史梯度信息以加速收敛的一阶方法——自适应记忆梯度法(Adaptive Memory Gradient Method, AMGM)来求解此问题。该方法通过在迭代中利用之前若干步的梯度信息来构建搜索方向,并自适应地调整记忆长度(即使用的历史步数),以期在非凸地形中更有效地逃离局部平坦区域或加速收敛。
具体问题:设 \(f(x) = (x_1^2 + x_2 - 11)^2 + (x_1 + x_2^2 - 7)^2\) (Himmelblau函数),初始点 \(x^{(0)} = (0, 0)^T\)。请使用自适应记忆梯度法寻找该函数的一个局部极小点。
解题过程
步骤1:理解自适应记忆梯度法的基本思想
自适应记忆梯度法是一种改进的梯度法,它不仅仅使用当前点的梯度,还利用之前若干步的梯度信息来构造搜索方向。其核心思想是:通过历史梯度信息来估计目标函数曲面的局部几何特征,从而调整搜索方向,可能获得比标准梯度下降更快的收敛速度。记忆长度(记为 \(m\) )决定了使用多少步历史信息,该长度可以根据迭代进程自适应地调整(例如,根据梯度变化的剧烈程度)。
步骤2:算法框架
给定初始点 \(x^{(0)}\),初始记忆长度 \(m_0\)(例如 \(m_0 = 1\)),最大记忆长度 \(M\),梯度阈值 \(\epsilon\) 用于判断收敛,迭代索引 \(k = 0\)。
- 计算梯度:\(g^{(k)} = \nabla f(x^{(k)})\)。
- 检查收敛:如果 \(\| g^{(k)} \| < \epsilon\),则停止,输出 \(x^{(k)}\) 作为近似极小点。
- 构建搜索方向:利用当前梯度及前 \(m_k\) 步的梯度计算搜索方向 \(d^{(k)}\)。一种简单的构建方式为加权组合:
\[ d^{(k)} = -g^{(k)} + \sum_{i=1}^{m_k} \beta_i^{(k)} (g^{(k-i)} - g^{(k)}) \]
其中权重 \(\beta_i^{(k)}\) 可根据历史梯度的内积或梯度变化幅度自适应设定。为简化,本例采用一种常见形式:令 \(y^{(k-1)} = g^{(k)} - g^{(k-1)}\),\(s^{(k-1)} = x^{(k)} - x^{(k-1)}\),则方向可基于拟牛顿思想构造,如记忆梯度法(Memory Gradient Method)中:
\[ d^{(k)} = -g^{(k)} + \gamma_k d^{(k-1)} + \beta_k y^{(k-1)} \]
其中 \(\gamma_k, \beta_k\) 为标量参数,可通过历史信息计算。这里我们采用更简单的形式:若 \(k=0\),取 \(d^{(0)} = -g^{(0)}\);若 \(k \geq 1\),取
\[ d^{(k)} = -g^{(k)} + \beta_k \cdot \frac{g^{(k)T} y^{(k-1)}}{g^{(k-1)T} g^{(k-1)}} d^{(k-1)} \]
这实质上是共轭梯度法(Fletcher-Reeves公式)的一种推广,但这里我们允许 \(\beta_k\) 根据梯度变化自适应调整。
4. 线搜索:沿方向 \(d^{(k)}\) 执行非精确线搜索(如Armijo条件)确定步长 \(\alpha_k > 0\):
\[ f(x^{(k)} + \alpha_k d^{(k)}) \leq f(x^{(k)}) + c_1 \alpha_k g^{(k)T} d^{(k)} \]
其中 \(c_1 \in (0,1)\)(常取 \(10^{-4}\))。
5. 更新迭代点:\(x^{(k+1)} = x^{(k)} + \alpha_k d^{(k)}\)。
6. 自适应调整记忆长度:计算梯度变化率 \(\theta_k = \frac{\| g^{(k+1)} - g^{(k)} \|}{\| g^{(k)} \| + 1}\)。若 \(\theta_k\) 较大(如 \(>0.1\)),表明梯度变化剧烈,可能处于曲率较大区域,则增加记忆长度(如 \(m_{k+1} = \min(m_k + 1, M)\))以利用更多历史信息;若 \(\theta_k\) 很小(如 \(<0.01\)),则减少记忆长度(如 \(m_{k+1} = \max(m_k - 1, 1)\))以避免过度依赖陈旧信息。
7. 更新迭代索引:\(k \leftarrow k+1\),返回步骤1。
步骤3:应用于Himmelblau函数
Himmelblau函数 \(f(x) = (x_1^2 + x_2 - 11)^2 + (x_1 + x_2^2 - 7)^2\) 有四个局部极小点,均为全局极小点(函数值为0),分别位于:
- (3.0, 2.0)
- (-2.805, 3.131)
- (-3.779, -3.283)
- (3.584, -1.848)
梯度计算:
\[\frac{\partial f}{\partial x_1} = 4x_1(x_1^2 + x_2 - 11) + 2(x_1 + x_2^2 - 7) \]
\[ \frac{\partial f}{\partial x_2} = 2(x_1^2 + x_2 - 11) + 4x_2(x_1 + x_2^2 - 7) \]
参数设置:
- 初始点:\(x^{(0)} = (0, 0)^T\)
- 初始记忆长度 \(m_0 = 1\),最大 \(M = 5\)
- 梯度阈值 \(\epsilon = 10^{-6}\)
- Armijo线搜索参数 \(c_1 = 10^{-4}\),初始步长 \(\alpha=1\),回溯因子 \(\rho = 0.5\)
- 自适应参数:\(\theta_k\) 的阈值设为 0.1(增)和 0.01(减)
迭代过程示例(前几步):
-
\(k=0\):计算 \(g^{(0)} = (-14, -22)^T\),\(\|g^{(0)}\| \approx 26.08 > \epsilon\)。取 \(d^{(0)} = -g^{(0)} = (14, 22)^T\)。执行Armijo线搜索得步长 \(\alpha_0\)(例如通过回溯得到 \(\alpha_0=1\) 可能满足,因为方向为负梯度方向)。更新 \(x^{(1)} = x^{(0)} + \alpha_0 d^{(0)} = (14, 22)^T\)。计算新梯度 \(g^{(1)}\),进而计算 \(\theta_0\)。由于初始梯度变化大,可能增加记忆长度至 \(m_1=2\)。
-
\(k=1\):计算 \(g^{(1)}\)(具体值略)。构建搜索方向 \(d^{(1)} = -g^{(1)} + \beta_1 \cdot \frac{g^{(1)T} y^{(0)}}{g^{(0)T} g^{(0)}} d^{(0)}\),其中 \(y^{(0)} = g^{(1)} - g^{(0)}\),\(\beta_1\) 可设为1(或根据 \(\theta_0\) 调整)。执行线搜索得 \(\alpha_1\),更新 \(x^{(2)}\)。根据 \(\theta_1\) 调整记忆长度 \(m_2\)。
-
持续迭代,直至梯度范数小于 \(\epsilon\)。
由于Himmelblau函数在初始点(0,0)附近梯度指向其中一个极小点(3.584, -1.848)的大致方向,自适应记忆梯度法通过利用历史梯度信息,可能会比纯梯度下降更快地逼近该极小点,尤其在迭代初期梯度变化较大时,增加记忆长度有助于调整方向,避免振荡。
步骤4:收敛性与特点
- 收敛性:在适当条件下(如目标函数 Lipschitz 连续可微且下界),该法可保证 \(\liminf_{k\to\infty} \| \nabla f(x^{(k)}) \| = 0\)。自适应记忆长度机制不会破坏收敛性,因为它本质上只是修改了搜索方向,只要方向是下降方向且线搜索满足 Wolfe 条件,全局收敛性仍可保持。
- 优势:相比于标准梯度下降,该方法通过历史信息隐含地利用了曲率信息,可能在非凸函数中更快逃离平坦区域或鞍点;自适应记忆长度避免了固定长度可能导致的效率低下。
- 注意事项:需存储最近 \(M\) 步的梯度和方向,增加内存开销;参数(如阈值)需要合理选择以确保自适应调整有效。
通过上述过程,我们使用自适应记忆梯度法求解了Himmelblau函数的优化问题,该方法通过动态利用历史梯度信息,有望在非凸优化中实现更高效的收敛。