量化交易中文教材

第 09 章 性能优化

对应原书第 9 章。上一章(本册第 08 章)用泰勒级数刻画了性能曲面(performance surface)和极小点的条件;本章反过来利用泰勒展开构造寻找极小点的算法:最速下降法、牛顿法、共轭梯度法。它们是第 10–12 章及第 13a、13b 章所有训练算法的底层引擎——LMS 是"近似最速下降",反向传播是"多层网络上的近似最速下降",Levenberg–Marquardt 是"牛顿法的变体",CGBP 是"共轭梯度用在网络上"。

这部分内容与第 04 册《数值最优化》高度重叠:线搜索见第 04 册第 03 章,共轭梯度见第 04 册第 05 章,牛顿法的各种修正见第 04 册第 06 章,拟牛顿法见第 04 册第 08 章。本章不重复那里的严格理论,只从训练神经网络的角度把三类算法讲清楚:学习率为什么有上限、为什么特征要标准化、为什么网络训练不直接用牛顿法。

学习目标

读完本章,你应当能够:

  1. 写出迭代极小化的统一框架 \(\mathbf{x}_{k+1}=\mathbf{x}_k+\alpha_k\mathbf{p}_k\),判断一个方向是否为下降方向,推导最速下降方向。
  2. 对二次函数推导固定学习率最速下降的稳定条件 \(\alpha<2/\lambda_{\max}\),并用"最大曲率"和"条件数"解释收敛快慢。
  3. 计算二次函数上沿直线极小化的步长,证明精确线搜索后新梯度与搜索方向正交,从而解释最速下降的锯齿形轨迹。
  4. 写出牛顿法,说明它在二次函数上一步收敛、在一般函数上可能收敛到鞍点或发散的原因。
  5. 理解共轭方向与二次终止性,能手算两步共轭梯度,并说明它为什么适合参数很多的问题。
  6. 把这些结论用到量化问题:协方差矩阵的条件数、特征标准化、大规模二次规划。

读前导读

这一章在解决什么问题

结论先说:上一章告诉你"碗底长什么样",这一章告诉你"怎么走到碗底"。三种走法:最速下降(每步沿最陡的下坡方向走一小步)、牛顿法(用二次函数近似地形,直接跳到近似的碗底)、共轭梯度(介于两者之间,只用坡度信息,但能避免来回绕路)。

你其实用过牛顿法:Excel 或计算器求债券到期收益率(YTM)时,就是在反复做"\(y_{new}=y_{old}-\dfrac{P(y_{old})-P_{\text{市场}}}{P'(y_{old})}\)",其中 \(P'\) 与修正久期相关。这就是一元牛顿法,用一阶导数做"求根";本章把它用于"求极小"(对梯度求根,所以要用到二阶导数),并推广到多元。

对于"单个神经元 = 线性回归"的情形,最优解有公式(正规方程),不需要迭代;但多层网络没有公式,只能迭代。本章最重要的结论是:最速下降的学习率上限和收敛速度,完全由 Hessian 的特征值决定。对线性回归来说 Hessian 正比于 \(\mathbf{X}^T\mathbf{X}\),所以因子量纲差异大、因子高度相关,都会让训练极慢。这就是训练前必须标准化输入的数学原因。

需要先想起来的数学

  • 一元牛顿法求根。解 \(f(y)=0\):在当前点用切线近似,切线与横轴的交点作为新点,\(y_{new}=y_{old}-f(y_{old})/f'(y_{old})\)。例:解 \(y^2-2=0\),从 \(y=1\) 出发,\(1-(-1)/2=1.5\),再一步 \(1.5-0.25/3\approx1.4167\),迅速逼近 \(\sqrt2\approx1.4142\)。见 第 00 册第 02 章 导数与泰勒展开。
  • 链式法则(多元版)。\(\frac{d}{d\alpha}F(\mathbf{x}+\alpha\mathbf{p})=\nabla F(\mathbf{x}+\alpha\mathbf{p})^T\mathbf{p}\):函数沿直线的变化率 = 该点梯度与直线方向的内积。见 第 00 册第 05 章 多元微积分与优化。
  • 二次函数的梯度与 Hessian(第 08 章)。\(F=\frac12\mathbf{x}^T\mathbf{A}\mathbf{x}+\mathbf{d}^T\mathbf{x}+c\) 的梯度是 \(\mathbf{A}\mathbf{x}+\mathbf{d}\),Hessian 是 \(\mathbf{A}\),极小点 \(\mathbf{x}^*=-\mathbf{A}^{-1}\mathbf{d}\)。
  • 线性迭代的稳定性(第 05 章)。\(\mathbf{e}_{k+1}=\mathbf{M}\mathbf{e}_k\) 收敛到 0 ⇔ \(\mathbf{M}\) 的所有特征值模小于 1。一元情形 \(e_{k+1}=me_k\) 就是 \(|m|<1\)。
  • 大 O 记号。\(O(n)\)、\(O(n^2)\) 表示"与 \(n\)、\(n^2\) 同数量级",用来比较存储和计算量。\(n=10{,}000\) 个参数时,\(O(n^2)\) 意味着一亿个数。见 第 00 册第 07 章 概率中的分析工具。

怎么读这一章

核心必读是 9.1 节(下降方向)和 9.2 节(最速下降与稳定学习率),尤其是式 (9.25) \(\alpha<2/\lambda_{\max}\) 和后面"三条结论"。9.3 节牛顿法读懂公式和"二次函数一步到位、但分不清极小与鞍点"即可,非二次函数的四个初值例子可以快速浏览。9.4 节共轭梯度第一次读可以只看 9.4.1 动机、9.4.3 的核心式 (9.58) 和 9.4.4 两步收敛的例子,三种 \(\beta_k\) 公式不必记。9.6 节量化实战的两个实验(条件数与特征标准化)请务必读。


9.1 迭代极小化的框架

训练神经网络的目标是找一组权值和偏置 \(\mathbf{x}\),使性能指标(performance index)\(F(\mathbf{x})\) 最小。除了极少数情形(如线性网络的均方误差),我们写不出极小点的解析式,只能迭代:从初值 \(\mathbf{x}_0\) 出发,

\[\mathbf{x}_{k+1}=\mathbf{x}_k+\alpha_k\mathbf{p}_k \qquad\text{或}\qquad \Delta\mathbf{x}_k=\mathbf{x}_{k+1}-\mathbf{x}_k=\alpha_k\mathbf{p}_k \tag{9.1–9.2}\]

\(\mathbf{p}_k\) 是搜索方向(search direction),正标量 \(\alpha_k\) 是学习率(learning rate),决定步长。本章三种算法的差别都在 \(\mathbf{p}_k\) 怎么选;\(\alpha_k\) 的选法也有好几种。

下降方向。 我们希望每一步都让函数值下降:\(F(\mathbf{x}_{k+1})<F(\mathbf{x}_k)\)。在 \(\mathbf{x}_k\) 处做一阶泰勒展开:

\[F(\mathbf{x}_{k+1})=F(\mathbf{x}_k+\Delta\mathbf{x}_k)\approx F(\mathbf{x}_k)+\mathbf{g}_k^T\Delta\mathbf{x}_k,\qquad \mathbf{g}_k\equiv\nabla F(\mathbf{x})\big|_{\mathbf{x}=\mathbf{x}_k} \tag{9.4–9.5}\]

要下降,需要 \(\mathbf{g}_k^T\Delta\mathbf{x}_k=\alpha_k\mathbf{g}_k^T\mathbf{p}_k<0\)。因为 \(\alpha_k>0\),这等价于

\[\mathbf{g}_k^T\mathbf{p}_k<0 \tag{9.7}\]

满足这个条件的 \(\mathbf{p}_k\) 叫下降方向(descent direction):只要步子足够小,沿它走函数值一定下降。

金融直觉:梯度的每个分量是"这个参数增加一单位,损失增加多少",相当于风险管理里的"边际贡献"或债券组合的关键利率久期。\(\mathbf{g}_k^T\Delta\mathbf{x}_k\) 就是"各参数的变动 × 各自的边际影响"之和,即一阶近似下的总损失变化——和用 DV01 估算利率变动带来的损益是同一个算法。下降方向的条件 \(\mathbf{g}_k^T\mathbf{p}_k<0\) 就是"按一阶估算,这次调整的总效果是减少损失"。式 (9.4) 中的 \(\equiv\) 读作"定义为",\(\big|_{\mathbf{x}=\mathbf{x}_k}\) 表示"在 \(\mathbf{x}_k\) 处取值"。


9.2 最速下降法

9.2.1 算法

在 \(\mathbf{p}_k\) 长度固定的前提下,什么方向下降得最快?就是让内积 \(\mathbf{g}_k^T\mathbf{p}_k\) 最负的方向——与梯度正好相反:\(\mathbf{p}_k=-\mathbf{g}_k\)。代入得最速下降法(steepest descent):

\[\boxed{\mathbf{x}_{k+1}=\mathbf{x}_k-\alpha_k\mathbf{g}_k} \tag{9.10}\]

学习率有两种常见选法:(1) 每步沿直线 \(\mathbf{x}_k-\alpha_k\mathbf{g}_k\) 对 \(\alpha_k\) 极小化 \(F\);(2) 取固定值(如 0.02),或预先设定的递减序列(如 \(\alpha_k=1/k\))。神经网络训练中第 (2) 种最常见。

例(原书 9.12)。 \(F(\mathbf{x})=x_1^2+25x_2^2\),初值 \(\mathbf{x}_0=[0.5,0.5]^T\)。梯度 \(\nabla F=[2x_1,\,50x_2]^T\),\(\mathbf{g}_0=[1,25]^T\)。取 \(\alpha=0.01\):

\[\mathbf{x}_1=\begin{bmatrix}0.5\\0.5\end{bmatrix}-0.01\begin{bmatrix}1\\25\end{bmatrix}=\begin{bmatrix}0.49\\0.25\end{bmatrix},\qquad \mathbf{x}_2=\begin{bmatrix}0.49\\0.25\end{bmatrix}-0.01\begin{bmatrix}0.98\\12.5\end{bmatrix}=\begin{bmatrix}0.4802\\0.125\end{bmatrix}\]

注意两个坐标的进度差别:\(x_2\) 一步就减半,\(x_1\) 只动了 2%。学习率小时轨迹始终与等高线正交(梯度与等高线正交);把 \(\alpha\) 增到 0.035,轨迹开始来回振荡;再大就发散。我们想让学习率尽量大以加快收敛,但它受稳定性限制。对一般函数无法事先知道上限,对二次函数可以精确算出来。

9.2.2 稳定学习率

设性能指标是二次函数

\[F(\mathbf{x})=\tfrac12\mathbf{x}^T\mathbf{A}\mathbf{x}+\mathbf{d}^T\mathbf{x}+c,\qquad \nabla F(\mathbf{x})=\mathbf{A}\mathbf{x}+\mathbf{d} \tag{9.18–9.19}\]

代入固定学习率的最速下降:

\[\mathbf{x}_{k+1}=\mathbf{x}_k-\alpha(\mathbf{A}\mathbf{x}_k+\mathbf{d})\quad\Longleftrightarrow\quad \mathbf{x}_{k+1}=[\mathbf{I}-\alpha\mathbf{A}]\mathbf{x}_k-\alpha\mathbf{d} \tag{9.20–9.21}\]

这是一个线性动态系统。它稳定的充要条件是矩阵 \([\mathbf{I}-\alpha\mathbf{A}]\) 的所有特征值模小于 1。设 Hessian \(\mathbf{A}\) 的特征值、特征向量为 \(\lambda_i,\mathbf{z}_i\),则

\[[\mathbf{I}-\alpha\mathbf{A}]\mathbf{z}_i=\mathbf{z}_i-\alpha\lambda_i\mathbf{z}_i=(1-\alpha\lambda_i)\mathbf{z}_i \tag{9.22}\]

即 \([\mathbf{I}-\alpha\mathbf{A}]\) 与 \(\mathbf{A}\) 特征向量相同、特征值为 \(1-\alpha\lambda_i\)。稳定条件 \(|1-\alpha\lambda_i|<1\)。有强极小点时 \(\lambda_i>0\),条件化为 \(\alpha<2/\lambda_i\) 对所有 \(i\) 成立:

推导拆解:式 (9.21) 多了一个常数项 \(-\alpha\mathbf{d}\),为什么只看矩阵 \([\mathbf{I}-\alpha\mathbf{A}]\)?改看"离极小点的误差" \(\mathbf{e}_k=\mathbf{x}_k-\mathbf{x}^*\)。极小点满足 \(\mathbf{A}\mathbf{x}^*+\mathbf{d}=\mathbf{0}\),所以梯度 \(\mathbf{A}\mathbf{x}_k+\mathbf{d}=\mathbf{A}(\mathbf{x}_k-\mathbf{x}^*)=\mathbf{A}\mathbf{e}_k\)。代入更新式两边减去 \(\mathbf{x}^*\):\(\mathbf{e}_{k+1}=\mathbf{e}_k-\alpha\mathbf{A}\mathbf{e}_k=[\mathbf{I}-\alpha\mathbf{A}]\mathbf{e}_k\),常数项消失了。于是 \(\mathbf{e}_k=[\mathbf{I}-\alpha\mathbf{A}]^k\mathbf{e}_0\),由第 05 章,沿第 \(i\) 个特征方向的误差每步乘以 \((1-\alpha\lambda_i)\)。

再把条件 \(|1-\alpha\lambda_i|<1\) 拆开:\(-1<1-\alpha\lambda_i<1\)。右边不等式给出 \(\alpha\lambda_i>0\)(\(\lambda_i>0\) 时自动成立);左边给出 \(\alpha\lambda_i<2\)。一元例子最直观:\(F=\frac{\lambda}{2}x^2\),\(x_{k+1}=(1-\alpha\lambda)x_k\)。\(\lambda=50\)、\(\alpha=0.01\) 时因子 0.5,每步减半;\(\alpha=0.03\) 时因子 \(-0.5\),正负交替地减半;\(\alpha=0.05\) 时因子 \(-1.5\),每步越过极小点且越跳越远。

\[\boxed{\alpha<\frac{2}{\lambda_{\max}}} \tag{9.25}\]

直观解释。 最大稳定学习率与二次函数的最大曲率成反比。曲率描述梯度变化有多快:梯度变化太快时,一步就会越过极小点很远,落点的梯度幅值比出发点还大(方向相反),下一步更远,最终发散。

例(续):\(\mathbf{A}=\mathrm{diag}(2,50)\),\(\lambda_1=2\)(\(\mathbf{z}_1=[1,0]^T\)),\(\lambda_2=50\)(\(\mathbf{z}_2=[0,1]^T\)),所以 \(\alpha<2/50=0.04\)。原书图 9.3 验证:\(\alpha=0.039\) 振荡衰减而收敛,\(\alpha=0.041\) 发散。

由此得到三条对网络训练极其重要的结论:

  1. 学习率被 Hessian 的最大特征值卡住;

  2. 算法沿最大特征值方向收敛最快(例中第一步几乎平行于 \(x_2\) 轴),沿最小特征值方向收敛最慢;

  3. 最终收敛速度由最小特征值和学习率共同决定。沿 \(\mathbf{z}_i\) 方向的误差每步乘以 \((1-\alpha\lambda_i)\)。学习率小,慢方向 \(1-\alpha\lambda_{\min}\) 接近 1;学习率逼近 \(2/\lambda_{\max}\),快方向 \(|1-\alpha\lambda_{\max}|\) 又接近 1(来回振荡)。两头兼顾的最佳固定学习率是 \(\alpha=2/(\lambda_{\max}+\lambda_{\min})\),此时最坏的收缩因子为 \((\kappa-1)/(\kappa+1)\),\(\kappa=\lambda_{\max}/\lambda_{\min}\) 为条件数。所以条件数越大,最速下降越慢。

    推导拆解:最坏收缩因子是 \(\max\big(|1-\alpha\lambda_{\min}|,\,|1-\alpha\lambda_{\max}|\big)\)(中间的特征值都夹在两者之间,不会更差)。\(\alpha\) 增大时前者变小、后者(越过 \(1/\lambda_{\max}\) 之后)变大,最佳点是两者相等:\(1-\alpha\lambda_{\min}=\alpha\lambda_{\max}-1\),解得 \(\alpha=2/(\lambda_{\max}+\lambda_{\min})\)。代回得因子 \(1-\frac{2\lambda_{\min}}{\lambda_{\max}+\lambda_{\min}}=\frac{\lambda_{\max}-\lambda_{\min}}{\lambda_{\max}+\lambda_{\min}}\),分子分母同除 \(\lambda_{\min}\) 即 \((\kappa-1)/(\kappa+1)\)。数值感受:\(\kappa=25\)(本节例子)时因子 \(24/26\approx0.92\),误差缩小到百万分之一约需 \(\ln10^{-6}/\ln0.92\approx170\) 步;\(\kappa=1000\) 时因子 0.998,约需 6,900 步。

例(P9.1)。 \(F(\mathbf{x})=5x_1^2-6x_1x_2+5x_2^2+4x_1+4x_2\),写成标准形 \(\mathbf{A}=\begin{bmatrix}10&-6\\-6&10\end{bmatrix}\),\(\mathbf{d}=[4,4]^T\)。特征值 \(\lambda_1=4\)(\(\mathbf{z}_1=[1,1]^T\),椭圆长轴方向)、\(\lambda_2=16\)(\(\mathbf{z}_2=[1,-1]^T\))。驻点 \(\mathbf{x}^*=-\mathbf{A}^{-1}\mathbf{d}=[-1,-1]^T\)。最大稳定学习率 \(2/16=0.125\);\(\alpha=0.12\) 收敛、\(0.13\) 发散。

例(P9.2)——一步收敛的特例。 同一函数从 \(\mathbf{x}_0=[0,-2]^T\) 出发、用沿直线极小化:\(\mathbf{g}_0=[16,-16]^T\),\(\alpha_0=0.0625\),\(\mathbf{x}_1=[-1,-1]^T\),一步到达极小。原因是 \(\mathbf{x}_0-\mathbf{x}^*=[1,-1]^T\) 恰好平行于特征向量 \(\mathbf{z}_2\):沿特征向量方向,负梯度直指极小点。如果所有特征值相等(等高线是圆),任何方向都是特征向量,最速下降总能一步到位。原书习题 E9.1 由此追问:超过 \(2/\lambda_{\max}\) 一定发散吗?答案是不一定——若初值误差恰好只在小特征值方向上有分量,只需 \(\alpha<2/\lambda_{\text{该方向}}\)。当然这在实际中可遇不可求。

9.2.3 沿直线极小化

另一种选法是每步取 \(\alpha_k\) 使 \(F(\mathbf{x}_k+\alpha_k\mathbf{p}_k)\) 最小。对一般函数需要数值线搜索(第 12 章会用区间定位 + 黄金分割实现;更系统的 Wolfe 条件见第 04 册第 03 章);对二次函数可以解析求解。对 \(\alpha_k\) 求导:

\[\frac{d}{d\alpha_k}F(\mathbf{x}_k+\alpha_k\mathbf{p}_k)=\mathbf{g}_k^T\mathbf{p}_k+\alpha_k\mathbf{p}_k^T\mathbf{A}_k\mathbf{p}_k=0\quad\Rightarrow\quad \alpha_k=-\frac{\mathbf{g}_k^T\mathbf{p}_k}{\mathbf{p}_k^T\mathbf{A}_k\mathbf{p}_k} \tag{9.30–9.31}\]

其中 \(\mathbf{A}_k=\nabla^2F(\mathbf{x}_k)\)(二次函数的 Hessian 与 \(k\) 无关)。

推导拆解:式 (9.30) 的求导,先把 \(F(\mathbf{x}_k+\alpha\mathbf{p}_k)\) 在 \(\mathbf{x}_k\) 处做二阶展开(对二次函数是精确的):\(F(\mathbf{x}_k)+\alpha\,\mathbf{g}_k^T\mathbf{p}_k+\frac12\alpha^2\,\mathbf{p}_k^T\mathbf{A}_k\mathbf{p}_k\)。这是 \(\alpha\) 的一元二次函数,形如 \(c+b\alpha+\frac12a\alpha^2\),对 \(\alpha\) 求导得 \(b+a\alpha\),令其为 0 得 \(\alpha=-b/a\)。这里 \(b=\mathbf{g}_k^T\mathbf{p}_k<0\)(下降方向),\(a=\mathbf{p}_k^T\mathbf{A}_k\mathbf{p}_k>0\)(沿该方向的曲率),所以 \(\alpha_k>0\)。直观上:坡越陡(\(|b|\) 大)步子越大,弯得越厉害(\(a\) 大)步子越小。

例(原书 9.33)。 \(F(\mathbf{x})=\tfrac12\mathbf{x}^T\begin{bmatrix}2&1\\1&2\end{bmatrix}\mathbf{x}\),\(\mathbf{x}_0=[0.8,-0.25]^T\)。梯度 \([2x_1+x_2,\,x_1+2x_2]^T\),\(\mathbf{p}_0=-\mathbf{g}_0=[-1.35,-0.3]^T\),

\[\alpha_0=-\frac{[1.35\ \ 0.3][-1.35\ \ -0.3]^T}{[-1.35\ \ -0.3]\,\mathbf{A}\,[-1.35\ \ -0.3]^T}=0.413,\qquad \mathbf{x}_1=\mathbf{x}_0-0.413\,\mathbf{g}_0=[0.24,\,-0.37]^T\]

继续迭代,轨迹呈锯齿形(zig-zag),相邻两步方向正交。

为什么正交? 沿直线极小化时,总是停在直线与某条等高线相切的点;梯度垂直于等高线,所以下一步(负梯度)与这一步垂直。用链式法则可严格证明:

\[\frac{d}{d\alpha_k}F(\mathbf{x}_{k+1})=\nabla F(\mathbf{x})^T\big|_{\mathbf{x}_{k+1}}\frac{d}{d\alpha_k}(\mathbf{x}_k+\alpha_k\mathbf{p}_k)=\mathbf{g}_{k+1}^T\mathbf{p}_k=0 \tag{9.39}\]

这个结论与是否用最速下降无关:沿任何方向做精确线搜索后,新梯度都与该方向正交。共轭梯度法会用到它。


9.3 牛顿法

最速下降只用一阶展开;牛顿法用二阶展开

\[F(\mathbf{x}_{k+1})\approx F(\mathbf{x}_k)+\mathbf{g}_k^T\Delta\mathbf{x}_k+\tfrac12\Delta\mathbf{x}_k^T\mathbf{A}_k\Delta\mathbf{x}_k \tag{9.40}\]

并直接跳到这个二次近似的驻点(stationary point)。对 \(\Delta\mathbf{x}_k\) 求梯度令为零:\(\mathbf{g}_k+\mathbf{A}_k\Delta\mathbf{x}_k=\mathbf{0}\),于是

\[\boxed{\mathbf{x}_{k+1}=\mathbf{x}_k-\mathbf{A}_k^{-1}\mathbf{g}_k} \tag{9.43}\]

例。 对 \(F=x_1^2+25x_2^2\),\(\mathbf{x}_0=[0.5,0.5]^T\):

\[\mathbf{x}_1=\begin{bmatrix}0.5\\0.5\end{bmatrix}-\begin{bmatrix}2&0\\0&50\end{bmatrix}^{-1}\begin{bmatrix}1\\25\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}\]

对有强极小点的二次函数,牛顿法一步到位——它用 \(\mathbf{A}^{-1}\) 把椭圆等高线"拉成圆",条件数问题消失了。

推导拆解:为什么二次函数一步到位?对二次函数,\(\mathbf{A}_k=\mathbf{A}\),\(\mathbf{g}_k=\mathbf{A}\mathbf{x}_k+\mathbf{d}\)。代入式 (9.43):\(\mathbf{x}_{k+1}=\mathbf{x}_k-\mathbf{A}^{-1}(\mathbf{A}\mathbf{x}_k+\mathbf{d})=\mathbf{x}_k-\mathbf{x}_k-\mathbf{A}^{-1}\mathbf{d}=-\mathbf{A}^{-1}\mathbf{d}=\mathbf{x}^*\),与起点无关。对照最速下降:两者都是"减去某个矩阵乘以梯度",最速下降用 \(\alpha\mathbf{I}\),对所有方向一视同仁;牛顿法用 \(\mathbf{A}^{-1}\),在曲率 \(\lambda_i\) 大的方向步子缩小为 \(1/\lambda_i\)、曲率小的方向放大——每个特征方向都恰好走到底。

金融直觉:一元时牛顿步 \(-F'/F''\) 和求 YTM 的迭代同一个思路:用"斜率 / 曲率"估算还差多远。也可以把 \(\mathbf{A}^{-1}\) 看成"按风险缩放":均值–方差最优解 \(\mathbf{w}^*=\Sigma^{-1}\boldsymbol\mu/\gamma\) 正是在 \(\mathbf{w}=\mathbf{0}\) 处走一步牛顿法的结果,\(\Sigma^{-1}\) 把每个方向的期望收益除以该方向的方差。

非二次函数上的行为。 原书用本册第 08 章的函数 \(F(\mathbf{x})=(x_2-x_1)^4+8x_1x_2-x_1+x_2+3\) 演示。它有三个驻点:\([-0.41878,0.41878]^T\)(强局部极小)、\([-0.134797,0.134797]^T\)(鞍点)、\([0.55358,-0.55358]^T\)(强全局极小)。

  • 初值 \([1.5,0]^T\):一步不到位,但朝全局极小前进,再两步就到 0.01 精度内。解析函数在强极小点附近很像二次函数,越接近极小点,牛顿法的预测越准,这是它快的原因。
  • 初值 \([-1.5,0]^T\):收敛到局部极小。牛顿法只用局部的一、二阶导数,分不清局部与全局极小。
  • 初值 \([0.75,0.75]^T\):此处二次近似的 Hessian 不定(indefinite),驻点是鞍点,算法收敛到原函数的鞍点。牛顿法求的是二次近似的驻点,不区分极小、极大和鞍点。
  • 初值 \([1.15,0.75]^T\):二次近似预测出一个鞍点,但它恰好靠近局部极小,最终收敛到局部极小——尽管这个初值比上一个离局部极小更远。牛顿法的结果可能很难预测。

例题 P9.6 给出判别方法:\(F=x_1^3+x_1x_2-x_1^2x_2^2\) 在 \(\mathbf{x}_0=[1,1]^T\) 处 \(\mathbf{g}_0=[2,-1]^T\),\(\mathbf{A}_0=\begin{bmatrix}4&-3\\-3&-2\end{bmatrix}\),牛顿一步到 \([0.5882,1.1176]^T\);而 \(\mathbf{A}_0\) 的特征值为 \(5.24\) 与 \(-3.24\),异号,所以这一步落在二次近似的鞍点上。P9.4 则说明:在 \(F=\exp(x_1^2-x_1+2x_2^2+4)\) 上从 \([1,-2]^T\) 出发,牛顿一步只走到 \([0.971,-1.886]^T\),离真极小 \([0.5,0]^T\) 还很远——函数在初值附近根本不像二次函数。P9.5 中 Hessian 奇异(驻谷),牛顿法无法执行,而最速下降(\(\alpha=0.1\))照样收敛到弱极小。

牛顿法小结。 通常远快于最速下降,但:可能收敛到鞍点(最速下降几乎不会)、可能振荡或发散;需要计算、存储 Hessian 并求逆。最速下降只要学习率不过大(或每步做线极小化)就保证收敛。第 12 章的 Levenberg–Marquardt 算法在出现发散时自动退化为小步长最速下降,兼得两者之长。

拟牛顿法。 注意当 \(\mathbf{A}_k=\mathbf{I}\) 时牛顿方向就是最速下降方向。拟牛顿(quasi-Newton)或单步割线(one-step-secant)法用一个逐步更新的正定矩阵 \(\mathbf{H}_k\) 代替 \(\mathbf{A}_k^{-1}\),不必求逆,并设计成对二次函数 \(\mathbf{H}_k\to\mathbf{A}^{-1}\)。BFGS 等方法的推导见第 04 册第 08 章。


9.4 共轭梯度法

9.4.1 动机:二次终止性

在有限步内精确极小化二次函数的性质叫二次终止性(quadratic termination)。牛顿法有这个性质,但要二阶导数:\(n\) 个参数的梯度有 \(n\) 个元素,Hessian 有 \(n^2\) 个。神经网络常有成百上千个权值,存储和求逆 Hessian 不现实。我们想要只用一阶导数、又具二次终止性的方法。

最速下降 + 线搜索在椭圆等高线上走短步锯齿,正交方向显然不是最好的。改用共轭方向。

9.4.2 共轭方向

定义。 对正定 Hessian \(\mathbf{A}\),向量组 \(\{\mathbf{p}_k\}\) 互相共轭(mutually conjugate),当且仅当

\[\mathbf{p}_k^T\mathbf{A}\mathbf{p}_j=0,\quad k\neq j \tag{9.52}\]

\(\mathbf{A}\) 的特征向量就是一组共轭向量:\(\mathbf{z}_k^T\mathbf{A}\mathbf{z}_j=\lambda_j\mathbf{z}_k^T\mathbf{z}_j=0\)(对称矩阵的特征向量互相正交),所以它们既正交又共轭。沿特征向量(等高线主轴)依次精确搜索就能到极小点,但这需要先求出 Hessian,没有实用价值。

白话解释:"共轭"就是"用 \(\mathbf{A}\) 度量的正交"。普通正交是 \(\mathbf{p}_k^T\mathbf{p}_j=0\),共轭是在中间夹一个 \(\mathbf{A}\)。几何上,如果做一次坐标变换把椭圆等高线拉成圆,那么共轭的方向在新坐标里就变成了真正垂直的方向。在圆形等高线上,沿两条垂直的方向各做一次精确线搜索就到了圆心;共轭方向就是在原坐标里还原出来的"那两条方向"。为什么沿共轭方向搜索不会"前功尽弃"?在一个方向上精确搜索后,梯度与该方向正交(式 9.39);下一个方向与它共轭,意味着沿新方向移动时梯度的变化 \(\alpha\mathbf{A}\mathbf{p}_{k+1}\) 与旧方向正交,所以旧方向上已经达到的"最优"不会被破坏。最速下降的相邻方向只是普通正交,后一步会破坏前一步的成果,于是来回锯齿。

金融直觉:组合语言里,\(\mathbf{p}_k^T\Sigma\mathbf{p}_j\) 是两个组合 \(\mathbf{p}_k\)、\(\mathbf{p}_j\) 收益的协方差,所以"关于 \(\Sigma\) 共轭"就是"两个组合收益不相关"。在不相关的组合上分别调仓,调整一个不会改变另一个的风险贡献,可以逐个优化。

定理([Scal85]/[Gill81]):沿任意一组共轭方向 \(\{\mathbf{p}_1,\dots,\mathbf{p}_n\}\) 依次做精确线搜索,任何 \(n\) 参数二次函数至多 \(n\) 步到达精确极小。

P9.8 证明了这一定理的前提:共轭向量必线性无关。若 \(\sum_j a_j\mathbf{p}_j=\mathbf{0}\),左乘 \(\mathbf{p}_k^T\mathbf{A}\) 得 \(a_k\mathbf{p}_k^T\mathbf{A}\mathbf{p}_k=0\),而 \(\mathbf{A}\) 正定使 \(\mathbf{p}_k^T\mathbf{A}\mathbf{p}_k>0\),故所有 \(a_k=0\)。\(n\) 个线性无关的方向张成整个空间,所以 \(n\) 步足够。

9.4.3 不用 Hessian 的共轭条件

关键一步:把共轭条件改写成只含梯度的形式。二次函数梯度 \(\nabla F=\mathbf{A}\mathbf{x}+\mathbf{d}\),第 \(k\) 步的梯度变化

\[\Delta\mathbf{g}_k=\mathbf{g}_{k+1}-\mathbf{g}_k=\mathbf{A}\Delta\mathbf{x}_k=\alpha_k\mathbf{A}\mathbf{p}_k \tag{9.56}\]

所以共轭条件 \(\alpha_k\mathbf{p}_k^T\mathbf{A}\mathbf{p}_j=0\) 等价于

\[\Delta\mathbf{g}_k^T\mathbf{p}_j=0,\quad k\neq j \tag{9.58}\]

搜索方向与过去的梯度变化正交,就是共轭。 Hessian 不见了。

推导拆解:式 (9.56) 用了两点。一是二次函数梯度对 \(\mathbf{x}\) 是线性的:\(\mathbf{g}_{k+1}-\mathbf{g}_k=(\mathbf{A}\mathbf{x}_{k+1}+\mathbf{d})-(\mathbf{A}\mathbf{x}_k+\mathbf{d})=\mathbf{A}(\mathbf{x}_{k+1}-\mathbf{x}_k)\),\(\mathbf{d}\) 抵消。二是 \(\mathbf{x}_{k+1}-\mathbf{x}_k=\alpha_k\mathbf{p}_k\)(式 9.2)。于是 \(\mathbf{A}\mathbf{p}_k=\Delta\mathbf{g}_k/\alpha_k\):Hessian 乘以方向,可以用"走一步前后梯度之差"来代替。这和用有限差分估算凸性同一个思路——不需要知道二阶导数公式,只要在两个点上测量一阶导数,相减即可。因为 \(\mathbf{A}\) 对称,\(\mathbf{p}_k^T\mathbf{A}\mathbf{p}_j=(\mathbf{A}\mathbf{p}_k)^T\mathbf{p}_j=\Delta\mathbf{g}_k^T\mathbf{p}_j/\alpha_k\),所以共轭条件只需检查梯度变化。

第一个方向任取,通常取 \(\mathbf{p}_0=-\mathbf{g}_0\)。之后每步构造与 \(\{\Delta\mathbf{g}_0,\dots,\Delta\mathbf{g}_{k-1}\}\) 正交的新方向(类似 Gram–Schmidt),可化简为只用上一个方向:

\[\mathbf{p}_k=-\mathbf{g}_k+\beta_k\mathbf{p}_{k-1} \tag{9.60}\]

\(\beta_k\) 有三种常用取法(对二次函数完全等价):

\[\beta_k=\frac{\Delta\mathbf{g}_{k-1}^T\mathbf{g}_k}{\Delta\mathbf{g}_{k-1}^T\mathbf{p}_{k-1}}\ \text{(Hestenes–Stiefel)},\qquad \beta_k=\frac{\mathbf{g}_k^T\mathbf{g}_k}{\mathbf{g}_{k-1}^T\mathbf{g}_{k-1}}\ \text{(Fletcher–Reeves)},\qquad \beta_k=\frac{\Delta\mathbf{g}_{k-1}^T\mathbf{g}_k}{\mathbf{g}_{k-1}^T\mathbf{g}_{k-1}}\ \text{(Polak–Ribière)} \tag{9.61–9.63}\]

算法: (1) \(\mathbf{p}_0=-\mathbf{g}_0\);(2) \(\mathbf{x}_{k+1}=\mathbf{x}_k+\alpha_k\mathbf{p}_k\),\(\alpha_k\) 沿方向极小化(二次函数用式 9.31,一般函数用线搜索);(3) 按式 9.60 和三种 \(\beta_k\) 之一算下一方向;(4) 未收敛回到 (2)。

9.4.4 例:两步精确收敛

仍用 \(F=\tfrac12\mathbf{x}^T\begin{bmatrix}2&1\\1&2\end{bmatrix}\mathbf{x}\),\(\mathbf{x}_0=[0.8,-0.25]^T\)。第一步与最速下降相同:\(\alpha_0=0.413\),\(\mathbf{x}_1=[0.24,-0.37]^T\)。此时 \(\mathbf{g}_1=\mathbf{A}\mathbf{x}_1=[0.11,-0.5]^T\),用 Fletcher–Reeves:

\[\beta_1=\frac{\mathbf{g}_1^T\mathbf{g}_1}{\mathbf{g}_0^T\mathbf{g}_0}=\frac{0.2621}{1.9125}=0.137,\qquad \mathbf{p}_1=-\mathbf{g}_1+\beta_1\mathbf{p}_0=\begin{bmatrix}-0.11\\0.5\end{bmatrix}+0.137\begin{bmatrix}-1.35\\-0.3\end{bmatrix}=\begin{bmatrix}-0.295\\0.459\end{bmatrix}\]
\[\alpha_1=-\frac{[0.11\ \ -0.5]\,[-0.295\ \ 0.459]^T}{\mathbf{p}_1^T\mathbf{A}\mathbf{p}_1}=\frac{0.262}{0.325}=0.807,\qquad \mathbf{x}_2=\mathbf{x}_1+\alpha_1\mathbf{p}_1=\begin{bmatrix}0\\0\end{bmatrix}\]

二维二次函数两步精确收敛。对比最速下降:共轭梯度把第二个方向"拧"到穿过椭圆中心,而不是与上一步正交。(原书数值是用四舍五入后的 \(\mathbf{x}_1\) 算的;用未舍入值算,\(\beta_1=0.140\),结论不变,见 9.6 节代码。)

P9.7 用共轭梯度重做 P9.3 的线性神经元训练问题(\(\mathbf{A}=\begin{bmatrix}10&2\\2&4\end{bmatrix}\),\(\mathbf{d}=[-2,-1]^T\),\(\mathbf{x}_0=[1,1]^T\)):\(\alpha_0=0.0962\),\(\mathbf{x}_1=[0.038,0.519]^T\),Polak–Ribière \(\beta_1=0.0133\),\(\alpha_1=0.2889\),\(\mathbf{x}_2=[0.1667,0.1667]^T\),同样两步到达极小;而 P9.3 用最速下降(\(\alpha=0.05\))要迭代很多步。

非二次函数上共轭梯度一般不会在 \(n\) 步内收敛,需要线搜索和周期性重置(restart),这些在第 12 章讨论。


9.5 三种算法的比较

最速下降 牛顿法 共轭梯度
用到的信息 梯度 梯度 + Hessian 及其逆 梯度(+ 线搜索)
二次函数上 线性收敛,速度由条件数决定 一步到位 至多 \(n\) 步
收敛保证 学习率足够小即保证 可能趋向鞍点、振荡、发散 二次函数上保证;一般函数需重置
每步存储 \(O(n)\) \(O(n^2)\) \(O(n)\)
在本书中的后代 LMS(第 10 章)、SDBP(第 11 章)、动量(第 12 章) Gauss–Newton、LM(第 12 章) CGBP(第 12 章)

三者都以泰勒展开为基础:最速下降用一阶展开;牛顿法与共轭梯度都是针对二次函数设计的。


9.6 量化实战:条件数决定一切

9.6.1 本章在量化中的位置

量化里几乎所有的数值估计都落在本章的框架里:

  • 均值–方差组合优化 \(\min_{\mathbf{w}}\tfrac12\mathbf{w}^T\Sigma\mathbf{w}-\lambda\boldsymbol\mu^T\mathbf{w}\) 本身就是二次函数,Hessian 就是协方差矩阵 \(\Sigma\)。资产高度相关时 \(\Sigma\) 病态,最速下降会非常慢;同样的病态也让解对 \(\boldsymbol\mu\) 的估计误差极其敏感——这是第 13a 章"正则化/收缩"的动机之一。
  • 最小二乘回归、岭回归是二次函数极小化;正规方程 \(\mathbf{x}^*=-\mathbf{A}^{-1}\mathbf{d}\) 就是牛顿法的一步。
  • GARCH、状态空间模型的极大似然常用拟牛顿法(BFGS);收益率曲线、波动率曲面校准常用 Levenberg–Marquardt(第 12 章)。
  • 训练预测网络时为什么要标准化特征:学习率上限 \(2/\lambda_{\max}\) 由输入相关矩阵的最大特征值决定(下一章会看到 Hessian \(=2\mathbf{R}\))。把成交量(\(10^6\) 量级)和收益率(\(10^{-2}\) 量级)放在一起,特征值相差十几个数量级,只能用极小的学习率,收益率那一维几乎学不动。
  • 牛顿法分不清极小与鞍点的提醒适用于非凸校准问题:初值选择和多起点搜索必不可少。

9.6.2 代码

第一段复现本章例题;第二段做两个量化实验:(a) 50 只股票、3 因子结构协方差的均值–方差问题上比较最速下降与共轭梯度;(b) 看标准化前后输入相关矩阵的条件数。

import numpy as np

# 例 9.12:F(x)=x1^2+25x2^2,固定学习率最速下降
A = np.diag([2.0, 50.0])
grad = lambda x: A @ x
for lr in [0.01, 0.039, 0.041]:
    x = np.array([0.5, 0.5])
    for k in range(200):
        x = x - lr * grad(x)
    print(f"alpha={lr:.3f}  200 步后 x = {np.round(x, 6)}  |x|={np.linalg.norm(x):.2e}")
print("最大稳定学习率 2/lambda_max =", 2 / np.linalg.eigvalsh(A).max())

# 牛顿法一步到位
x0 = np.array([0.5, 0.5])
print("牛顿一步:", x0 - np.linalg.solve(A, grad(x0)))

# 共轭梯度(Fletcher-Reeves,精确线搜索)于 F=0.5 x'[[2,1],[1,2]]x
A2 = np.array([[2.0, 1.0], [1.0, 2.0]])
x = np.array([0.8, -0.25]); g = A2 @ x; p = -g
for k in range(2):
    a = -(g @ p) / (p @ A2 @ p)
    x = x + a * p
    g_new = A2 @ x
    beta = (g_new @ g_new) / (g @ g)
    print(f"CG 第{k+1}步: alpha={a:.3f}, x={np.round(x, 4)}, beta={beta:.3f}")
    p = -g_new + beta * p; g = g_new

输出:

alpha=0.010  200 步后 x = [0.008794 0.      ]  |x|=8.79e-03
alpha=0.039  200 步后 x = [0.0e+00 1.8e-05]  |x|=1.75e-05
alpha=0.041  200 步后 x = [   0.       8646.290408]  |x|=8.65e+03
最大稳定学习率 2/lambda_max = 0.04
牛顿一步: [0. 0.]
CG 第1步: alpha=0.413, x=[ 0.243  -0.3738], beta=0.140
CG 第2步: alpha=0.808, x=[ 0. -0.], beta=0.000

看第一行:\(\alpha=0.01\) 时 200 步后 \(x_2\) 早已归零,\(x_1\) 还剩 0.0088——慢的方向(\(\lambda=2\))每步只收缩 \(1-0.02=0.98\)。\(\alpha=0.041\) 只比上限多 2.5%,\(x_2\) 却爆到 8646,而 \(x_1\) 照样收敛:发散只发生在大特征值方向。

import numpy as np
rng = np.random.default_rng(0)

# 1) 均值-方差:min 0.5 w'Σw - λ μ'w,Hessian 就是协方差矩阵 Σ
n = 50
B = rng.normal(0, 1, (n, 3))                       # 3 个共同因子的载荷
fvar = np.diag([0.04, 0.01, 0.005])                 # 因子方差(年化)
Sigma = B @ fvar @ B.T + np.diag(rng.uniform(0.01, 0.04, n))
mu = rng.normal(0.05, 0.03, n); lam = 1.0
A, d = Sigma, -lam * mu
w_star = np.linalg.solve(A, -d)                     # 牛顿一步 = 解线性方程组
ev = np.linalg.eigvalsh(A)
print(f"Σ 特征值范围 [{ev.min():.4f}, {ev.max():.2f}], 条件数 {ev.max()/ev.min():.0f}")

def sd(A, d, tol=1e-8, maxit=200000):
    x = np.zeros(len(d)); lr = 1.9 / np.linalg.eigvalsh(A).max()
    for k in range(maxit):
        g = A @ x + d
        if np.linalg.norm(g) < tol: return x, k
        x -= lr * g
    return x, maxit

def cg(A, d, tol=1e-8):
    x = np.zeros(len(d)); g = A @ x + d; p = -g
    for k in range(10 * len(d)):
        if np.linalg.norm(g) < tol: return x, k
        a = -(g @ p) / (p @ A @ p); x = x + a * p
        g_new = A @ x + d
        beta = (g_new @ (g_new - g)) / (g @ g)       # Polak-Ribière
        p = -g_new + beta * p; g = g_new
    return x, k

x1, k1 = sd(A, d); x2, k2 = cg(A, d)
print(f"最速下降: {k1} 次迭代, 误差 {np.abs(x1-w_star).max():.1e}")
print(f"共轭梯度: {k2} 次迭代, 误差 {np.abs(x2-w_star).max():.1e}")

# 2) 特征量纲:回归中把成交量(1e6 量级)与收益率(1e-2 量级)放一起
T = 1000
X = np.column_stack([rng.normal(0, 0.02, T), rng.lognormal(13, 0.5, T)])
for name, Z in [("原始特征", X), ("标准化后", (X - X.mean(0)) / X.std(0))]:
    Z1 = np.column_stack([Z, np.ones(T)])
    lamR = np.linalg.eigvalsh(Z1.T @ Z1 / T)
    print(f"{name}: R 的特征值 {np.array2string(lamR, precision=3)}, "
          f"条件数 {lamR.max()/lamR.min():.1e}")

输出:

Σ 特征值范围 [0.0106, 2.56], 条件数 240
最速下降: 1934 次迭代, 误差 8.5e-07
共轭梯度: 23 次迭代, 误差 5.6e-08
原始特征: R 的特征值 [3.765e-04 2.226e-01 3.237e+11], 条件数 8.6e+14
标准化后: R 的特征值 [0.946 1.    1.054], 条件数 1.1e+00

解读。

  1. 因子结构协方差的条件数是 240:3 个因子方向的特征值很大(市场因子尤其大),其余 47 个特质方向的特征值都很小。最速下降(学习率已取到上限的 95%)要近 2000 步,共轭梯度只要 23 步——甚至少于 \(n=50\)。原因是 \(\Sigma\) 的特征值"成簇":3 个大特征值加上 47 个落在 \([0.01,0.04]\) 窄区间内的小特征值,共轭梯度对特征值成簇的矩阵收敛特别快(严格结论是"只有 \(r\) 个不同特征值时至多 \(r\) 步",见第 04 册第 05 章)。实践中几千只股票的风险模型求解就是这样做的,而且共轭梯度只需要矩阵–向量乘积 \(\Sigma\mathbf{p}=\mathbf{B}(\mathbf{F}(\mathbf{B}^T\mathbf{p}))+\mathbf{D}\mathbf{p}\),根本不用把 \(\Sigma\) 存成稠密矩阵。
  2. 原始特征的条件数 \(8.6\times10^{14}\),标准化后约为 1。在条件数 \(10^{14}\) 的曲面上用最速下降,学习率被成交量那一维卡死在 \(10^{-11}\) 量级,收益率那一维每步收缩因子是 \(1-10^{-14}\) 量级,实际上完全不动。这就是下一章 LMS、第 11 章反向传播训练前必须标准化输入的数学原因。

本章小结

所有训练算法都是迭代 \(\mathbf{x}_{k+1}=\mathbf{x}_k+\alpha_k\mathbf{p}_k\)。最速下降取负梯度方向,简单、只需梯度,但在二次函数上等价于线性系统 \(\mathbf{x}_{k+1}=(\mathbf{I}-\alpha\mathbf{A})\mathbf{x}_k-\alpha\mathbf{d}\):学习率被最大特征值限制在 \(2/\lambda_{\max}\) 以内,收敛速度被最小特征值拖住,条件数大就慢;精确线搜索又使相邻步正交,走成锯齿。牛顿法用 Hessian 把等高线"变圆",二次函数一步到位,但只认二次近似的驻点,可能走向鞍点或发散,且要 \(O(n^2)\) 存储。共轭梯度用"方向与梯度变化正交"代替 Hessian,二次函数至多 \(n\) 步收敛、只需 \(O(n)\) 存储,是两者的折中。对网络训练最重要的一句话:学习率上限与收敛速度都由 Hessian 的特征值决定,而 Hessian 的特征值又取决于输入的尺度。

概念 公式 / 要点
下降方向 \(\mathbf{g}_k^T\mathbf{p}_k<0\)
最速下降 \(\mathbf{x}_{k+1}=\mathbf{x}_k-\alpha_k\mathbf{g}_k\)
稳定学习率(二次函数) \(\alpha<2/\lambda_{\max}(\mathbf{A})\)
沿直线极小化步长 \(\alpha_k=-\mathbf{g}_k^T\mathbf{p}_k/(\mathbf{p}_k^T\mathbf{A}\mathbf{p}_k)\),此后 \(\mathbf{g}_{k+1}^T\mathbf{p}_k=0\)
牛顿法 \(\mathbf{x}_{k+1}=\mathbf{x}_k-\mathbf{A}_k^{-1}\mathbf{g}_k\)
共轭 \(\mathbf{p}_k^T\mathbf{A}\mathbf{p}_j=0\iff\Delta\mathbf{g}_k^T\mathbf{p}_j=0\)
共轭梯度方向 \(\mathbf{p}_k=-\mathbf{g}_k+\beta_k\mathbf{p}_{k-1}\),\(\beta_k\) 取 HS / FR / PR
二次终止 \(n\) 维二次函数至多 \(n\) 步
判别驻点 Hessian 特征值全正:极小;全负:极大;异号:鞍点

练习

基础

  1. 对 \(F=\tfrac12\mathbf{x}^T\begin{bmatrix}6&-2\\-2&6\end{bmatrix}\mathbf{x}+[-1,-1]\mathbf{x}\)(原书 E9.2),从 \(\mathbf{x}_0=\mathbf{0}\) 用 \(\alpha=0.1\) 做两步最速下降,并求最大稳定学习率。 提示: 特征值为 4 和 8,\(\alpha<0.25\)。\(\mathbf{g}_0=[-1,-1]^T\),\(\mathbf{x}_1=[0.1,0.1]^T\);\(\mathbf{g}_1=[-0.6,-0.6]^T\),\(\mathbf{x}_2=[0.16,0.16]^T\)。
  2. 对 \(F=x_1^2+2x_2^2\) 沿直线 \(\mathbf{x}=[1,1]^T+\alpha[-1,-2]^T\) 求极小,并验证该点的梯度与直线方向正交(原书 E9.3)。 提示: \(F(\alpha)=(1-\alpha)^2+2(1-2\alpha)^2\),\(\alpha^*=5/9\);该点梯度 \([8/9,-4/9]^T\) 与 \([-1,-2]^T\) 内积为 0。
  3. 说明 P9.2 中为什么最速下降一步就到达极小,并构造另一个能一步收敛的初值。 提示: 初值误差平行于任一特征向量即可,例如 \(\mathbf{x}_0=\mathbf{x}^*+c[1,1]^T\)。
  4. 对 \(F=\tfrac12\mathbf{x}^T\begin{bmatrix}3&2\\2&0\end{bmatrix}\mathbf{x}+[4,4]\mathbf{x}\)(原书 E9.6)从原点做一步牛顿法,判断到达的是不是极小点。 提示: Hessian 行列式 \(-4<0\),特征值异号;牛顿步解 \(\mathbf{A}\mathbf{x}=-\mathbf{d}\) 得 \([-2,1]^T\),这是函数唯一的驻点,但它是鞍点而非极小点(该函数无极小)。

进阶

  1. 证明或否定:"\(\mathbf{p}_1\) 与 \(\mathbf{p}_2\) 共轭、\(\mathbf{p}_2\) 与 \(\mathbf{p}_3\) 共轭,则 \(\mathbf{p}_1\) 与 \(\mathbf{p}_3\) 共轭"(原书 E9.12)。 提示: 不成立。取 \(\mathbf{A}=\mathbf{I}\)(共轭即正交),\(\mathbf{p}_1=\mathbf{p}_3=[1,0]^T\),\(\mathbf{p}_2=[0,1]^T\)。
  2. 以 P9.3 的 \(\mathbf{A}=\begin{bmatrix}10&2\\2&4\end{bmatrix}\) 为例,分别取固定学习率 \(\alpha=0.95\times2/\lambda_{\max}\) 和 \(\alpha=2/(\lambda_{\max}+\lambda_{\min})\),估计要多少步才能使误差缩小到初始的 \(10^{-6}\)。 提示: \(\lambda=7\pm\sqrt{13}\approx3.39,\ 10.61\)。第一种 \(\alpha=0.179\),两方向因子为 \(0.39\) 和 \(|1-1.9|=0.9\),最坏 0.9,约 131 步;第二种 \(\alpha=1/7\),两方向因子都是 \((\kappa-1)/(\kappa+1)=0.515\),约 21 步。学习率"越接近上限越快"是错觉。
  3. 用代码验证:对 9.6 节的均值–方差问题,若把共轭梯度中的 \(\beta_k\) 换成 Fletcher–Reeves 或 Hestenes–Stiefel,迭代次数是否改变?为什么? 提示: 二次函数 + 精确线搜索下三者在精确算术中等价,迭代次数应基本相同,差别只来自舍入误差。
  4. 把 9.6 节的 \(\Sigma\) 换成 \(\Sigma+\delta\mathbf{I}\)(岭化),观察 \(\delta\) 从 0 增大到 0.05 时最速下降的迭代次数如何变化,并解释与第 13a 章正则化的联系。 提示: 所有特征值加 \(\delta\),条件数从 240 迅速下降,迭代次数大减;正则化同时改善了优化的条件数和估计的稳定性。

原书推荐习题: P9.1、E9.2(Hessian 特征分解、等高线与最大稳定学习率);P9.2、E9.1(初值在特征向量方向);P9.5、P9.6、E9.6(牛顿法遇奇异或不定 Hessian);P9.7、E9.11(手算共轭梯度,比较 HS/FR/PR);P9.8、E9.12(共轭向量的线性无关性与非传递性)。

原书对照

本章小节 原书章节 PDF 页码
9.1 迭代框架 9 Objectives / Theory and Examples 开头 p.267–268
9.2 最速下降、稳定学习率、沿直线极小化 9 Steepest Descent p.268–276
9.3 牛顿法 9 Newton's Method p.276–281
9.4 共轭梯度 9 Conjugate Gradient p.281–286
小结 9 Summary of Results p.287–288
例题 P9.1–P9.8 9 Solved Problems p.289–302
结语与延伸阅读 9 Epilogue / Further Reading p.303–304
习题 E9.1–E9.12 9 Exercises p.305–308