Hessian 矩阵点评

Hessian 矩阵(海森矩阵)系统讲解

本文说明
本文由一份原始学习笔记整理、勘误、重组与扩写而成:

  • 保留:原文的全部知识点、例题、推导、表格与结论,未删减任何知识性内容;
  • 修正:原文中的概念性错误、计算笔误、表述不严谨之处,均在正文中就地更正,并在 附录 A 勘误表 汇总;
  • 补充:二阶泰勒展开、二阶最优/必要条件、任意方向曲率、Sylvester 判据、凸性、Hessian-向量积、常见函数速查表、练习题等;
  • 点评:凡标有 【点评】 的段落,是对该处要点的强调、辨析或延伸。

目录

第一部分 概念奠基

  1. 从一元函数说起:一阶导与二阶导
  2. 多变量带来的新问题
  3. 梯度回顾
  4. 为什么 Hessian 是"对梯度再求导"

第二部分 动手计算
5. 例题一:二元函数(逐步推导 + 逐元素解读)
6. 例题二:三元函数(含"\(f_{yy}=0\) 之谜"专题)
7. 例题三:神经网络中的一个神经元
8. 常见函数的 Hessian 速查表

第三部分 几何意义与判定
9. Hessian 每个元素到底代表什么
10. 任意方向上的曲率与主曲率
11. 正定性、特征值与二阶最优性条件
12. Hessian 与凸性

第四部分 应用
13. 二阶泰勒展开与牛顿法
14. 深度学习中的 Hessian

第五部分 总结
15. 层次总览表与一句话总结
16. 常见误区清单

附录

  • 附录 A 勘误表
  • 附录 B 练习题与解答
  • 附录 C 符号与约定

第一部分 概念奠基

1. 从一元函数说起:一阶导与二阶导

Hessian 的本质,是把"二阶导数"这个概念从一元函数推广到多元函数。所以我们先把一元的情形彻底想清楚。

1.1 第一次求导:变化速度

\[y=f(x) \]

例如

\[f(x)=x^2 \]

第一次求导:

\[f'(x)=2x \]

它表示:

\(x\) 改变一点点时,\(y\) 怎么变化。

例如在 \(x=3\) 处:

\[f'(3)=6 \]

这句话的正确理解方式是:

\(x=3\) 附近,\(x\) 每增加无穷小\(\mathrm{d}x\)\(y\) 增加约 \(6\,\mathrm{d}x\)

也就是一阶泰勒近似:

\[f(3+\Delta)\approx f(3)+6\Delta=9+6\Delta \]

【点评】 原始笔记在这里写的是"\(x\) 增加 1 个单位,\(y\) 大约增加 6 个单位"——这个说法不严谨。导数是一个局部(无穷小)概念,不能拿 \(\Delta=1\) 这种有限增量去"验证":

\[f(4)-f(3)=16-9=7\neq 6 \]

误差高达 \(1\)(约 \(14\%\))。只有当 \(\Delta\) 很小时近似才成立:

\[\frac{f(3.01)-f(3)}{0.01}=\frac{9.0601-9}{0.01}=6.01\approx 6 \]

记住这句话,后面理解 Hessian 时同样重要:导数是局部的

所以:

\[\boxed{f'(x)\ \text{描述的是}\ \textbf{变化速度}} \]

1.2 第二次求导:变化速度本身怎么变化

继续对 \(f(x)=x^2\) 求导:

\[f''(x)=2 \]

它表示:

\[\boxed{\text{变化速度本身怎么变化}} \]

也就是:斜率 \(f'(x)\) 有没有在变化?变化得多快?

对比两个例子:

函数 一阶导 \(f'\) 二阶导 \(f''\) 几何
\(f(x)=3x\) \(3\)(常数) \(0\) 直线,没有弯曲
\(f(x)=x^2\) \(2x\)(随 \(x\) 增大而增大) \(2\) 曲线,向上弯曲
  • 直线 \(f(x)=3x\):斜率永远是 \(3\),恒定不变,所以 \(f''(x)=0\)——没有弯曲
  • 抛物线 \(f(x)=x^2\):斜率 \(2x\) 随着 \(x\) 增大而越来越大,所以 \(f''(x)=2>0\)——向上弯曲(凸)。

【点评】 一元函数的二阶导数为我们提供了两条关键信息:

  1. 大小\(|f''|\)):弯曲得有多厉害;
  2. 符号\(f''\) 的正负):向上弯还是向下弯。

符号比大小更重要:\(f''>0\) 表示"碗口朝上"(凸),\(f''<0\) 表示"碗口朝下"(凹)。当 \(f'(x_0)=0\) 时,\(f''(x_0)>0\) 就是极小值的判别依据——这正是后面 Hessian 正定判据的一元原型。

1.3 一个关键问题

一元情形下,描述"弯曲"只需要一个数\(f''\))。

那么对多元函数 \(f(x,y)\),需要几个数才能描述弯曲?

答案是:不止一个,而且它们必须打包成一个矩阵——这就是 Hessian 出现的根本原因。下面看它为什么必然是一个矩阵。


2. 多变量带来的新问题

现在考虑二元函数:

\[f(x,y) \]

例如

\[f(x,y)=x^2+y^2 \]

它不再是平面上的一条曲线,而是三维空间中的一张曲面(一个旋转抛物面,碗形)。

(原始笔记在此处附有 4 张曲面示意图,链接指向一个会失效的临时图床。这里用文字与示意代替:)

        z
        |        ___---___
        |     /             \
        |   /                 \
        |  |                   |      <- 碗形曲面 z = x^2 + y^2
        |   \                 /
        |     \___         __/
        |         ---___---
        +------------------------ y
       /
      x

面对这样一张曲面,我们必须回答 三个 问题:

问题 1:沿 \(x\) 方向变化怎么样?

\(\dfrac{\partial f}{\partial x}\)\(\dfrac{\partial^2 f}{\partial x^2}\)

问题 2:沿 \(y\) 方向变化怎么样?

\(\dfrac{\partial f}{\partial y}\)\(\dfrac{\partial^2 f}{\partial y^2}\)

问题 3:\(x\) 的变化会不会影响 \(y\) 方向的坡度?(方向之间的耦合)

\(\dfrac{\partial^2 f}{\partial x\partial y}\)

【点评】 问题 3 是多元函数独有的、也是最重要的问题。一元函数不存在"两个方向互相影响"这回事,所以一元没有 Hessian。三元函数则要回答 \(3\) 个"自身"问题和 \(3\times 2=6\) 个"交叉"问题——正好是 \(3\times3=9\) 个元素。一般地,\(n\) 元函数需要 \(n^2\) 个数——这就需要一个矩阵来保存所有信息

于是我们需要一个能同时装下"每个方向自身的弯曲"和"方向之间的耦合"的容器,那就是矩阵。


3. 梯度回顾

3.1 偏导数:只动一个变量

对于 \(f(x,y)\),先求一阶偏导:

\[\frac{\partial f}{\partial x} \]

表示:

\(y\) 固定住,只改变 \(x\) 时,函数的变化速度。

同理:

\[\frac{\partial f}{\partial y} \]

表示:

\(x\) 固定住,只改变 \(y\) 时,函数的变化速度。

\(f(x,y)=x^2+y^2\) 为例:

\[\frac{\partial f}{\partial x}=2x,\qquad \frac{\partial f}{\partial y}=2y \]

【点评】 "偏"字的含义就是偏心:求 \(\partial/\partial x\) 时,眼里只有 \(x\),其余一切都当成常数。这个"把别的变量一律当常数"的操作,是后面计算所有 Hessian 元素的基本功。原始笔记后半段专门用一个专题讨论了它(见 第 6 章)。

3.2 梯度:把偏导打包成向量

把各方向的一阶信息放在一起:

\[\boxed{ \nabla f= \begin{bmatrix} f_x\\[2pt] f_y \end{bmatrix} = \begin{bmatrix} \dfrac{\partial f}{\partial x}\\[8pt] \dfrac{\partial f}{\partial y} \end{bmatrix} } \]

这就是梯度(gradient)

\(f=x^2+y^2\)

\[\nabla f= \begin{bmatrix} 2x\\ 2y \end{bmatrix} \]

它告诉我们:在当前位置 \((x,y)\)函数上升最快的方向就是这个向量所指的方向,其长度就是最大变化率。

\(f=x^2+y^2\) 验证一下这个说法。在 \((1,1)\) 处:

\[\nabla f(1,1)= \begin{bmatrix}2\\2\end{bmatrix} \]

即"右上 \(45^\circ\)"方向。这与直觉一致:碗形曲面从 \((1,1)\) 出发,朝远离原点方向走升得最快。

【点评】 梯度有两个容易混淆的说法,务必分清:

  • 梯度 \(\nabla f\)一个方向、一个向量(不是数);
  • 梯度的 \(\|\nabla f\|\) 才是"最大变化率"这个数。

原文说"梯度告诉当前位置坡度最大的方向",这是对的;但下面这些都是错的:「梯度是坡度的大小」「梯度是斜率」——它们是 \(\|\nabla f\|\),不是 \(\nabla f\)

3.3 一个技术细节:行向量还是列向量?

梯度写成列向量 \(\nabla f\in\mathbb{R}^{n\times 1}\) 是最常见的约定(本文采用)。但在某些教材(尤其是矩阵微分、深度学习反向传播的推导)中,梯度被写成行向量 \(\nabla f\in\mathbb{R}^{1\times n}\)

【点评】 这个约定差异会直接导致 Hessian 的转置与链式法则的写法不同,看文献时务必先确认约定。本文全程采用列向量约定:梯度是 \(n\times1\)


4. 为什么 Hessian 是"对梯度再求导"

这是全文最关键的概念一步。

4.1 梯度本身已经是一个函数(而且是向量函数)

看这个梯度:

\[\nabla f= \begin{bmatrix} 2x+3y\\ 3x+4y \end{bmatrix} \]

注意:它不是一个数。它是一个向量函数——输入一个点 \((x,y)\),输出一个向量。

\[\nabla f:\ \mathbb{R}^2\to\mathbb{R}^2,\qquad (x,y)\mapsto \begin{bmatrix}2x+3y\\3x+4y\end{bmatrix} \]

现在我们问:

梯度随着位置变化,变化得怎么样?

也就是:

梯度的变化率。

写成公式就是:

\[\boxed{H=\nabla(\nabla f)} \]

也就是:

\[\boxed{H=\nabla^2 f} \]

【点评】 严格地说,\(-H=\nabla(\nabla f)\) 这个写法是记号上的简写。更准确的说法是:

Hessian 是"梯度映射" \(\nabla f:\mathbb{R}^n\to\mathbb{R}^n\) 的 Jacobian 矩阵。

因为"对一个向量值函数求导",得到的正是 Jacobian 矩阵(每一个输出分量对每一个输入分量求偏导)。这一点在 4.3 会具体展开。另外要提醒:记号 \(\nabla^2 f\)偏微分方程语境里常被用来表示拉普拉斯算子 \(\Delta f=\sum_i f_{ii}\)(它是 Hessian 的,是一个数,不是矩阵)。看文献时要靠上下文区分。

4.2 直觉:从"坡度"到"坡度的地图"

对象 回答的问题
\(f\) 这里有多高
\(\nabla f\) 这里往哪走升得最快?(当前位置的一份"坡度快照")
\(H\) 这里的坡度本身如何随位置变化?(一张"坡度变化的地图")

4.3 为什么结果是矩阵?

因为梯度有多个分量,而每个分量又可以对多个变量求导。

二维情形,梯度是

\[\nabla f= \begin{bmatrix} f_x\\ f_y \end{bmatrix} \]

现在对它求导,逐行处理

第一行:对 \(f_x\)\(x,y\) 的导,得到

\[\begin{bmatrix} \dfrac{\partial f_x}{\partial x} & \dfrac{\partial f_x}{\partial y} \end{bmatrix} \]

第二行:对 \(f_y\)\(x,y\) 的导,得到

\[\begin{bmatrix} \dfrac{\partial f_y}{\partial x} & \dfrac{\partial f_y}{\partial y} \end{bmatrix} \]

组合:

\[H= \begin{bmatrix} \dfrac{\partial f_x}{\partial x} & \dfrac{\partial f_x}{\partial y}\\[8pt] \dfrac{\partial f_y}{\partial x} & \dfrac{\partial f_y}{\partial y} \end{bmatrix} \]

因为 \(f_x=\dfrac{\partial f}{\partial x}\),所以

\[\frac{\partial f_x}{\partial x}=\frac{\partial^2 f}{\partial x^2}, \qquad \frac{\partial f_x}{\partial y}=\frac{\partial^2 f}{\partial x\partial y}, \qquad\dots \]

得到 Hessian 的定义式

\[\boxed{ H= \begin{bmatrix} \dfrac{\partial^2 f}{\partial x^2} & \dfrac{\partial^2 f}{\partial x\partial y}\\[8pt] \dfrac{\partial^2 f}{\partial y\partial x} & \dfrac{\partial^2 f}{\partial y^2} \end{bmatrix} } \]

推广到 \(n\) 元函数 \(f(x_1,x_2,\dots,x_n)\)

\[\boxed{ H_{ij}=\frac{\partial^2 f}{\partial x_i\,\partial x_j}, \qquad H= \begin{bmatrix} \dfrac{\partial^2 f}{\partial x_1^2} & \dfrac{\partial^2 f}{\partial x_1\partial x_2} & \cdots & \dfrac{\partial^2 f}{\partial x_1\partial x_n}\\[8pt] \dfrac{\partial^2 f}{\partial x_2\partial x_1} & \dfrac{\partial^2 f}{\partial x_2^2} & \cdots & \dfrac{\partial^2 f}{\partial x_2\partial x_n}\\[8pt] \vdots & \vdots & \ddots & \vdots\\[8pt] \dfrac{\partial^2 f}{\partial x_n\partial x_1} & \dfrac{\partial^2 f}{\partial x_n\partial x_2} & \cdots & \dfrac{\partial^2 f}{\partial x_n^2} \end{bmatrix} } \]

一句话记住: Hessian 的第 \(i\) 行,就是"梯度第 \(i\) 个分量 \(f_{x_i}\)"再对全部变量求一遍导。

4.4 对称性:为什么 \(H_{12}=H_{21}\)

上面矩阵中,\(H_{12}=\dfrac{\partial^2 f}{\partial x\partial y}\)\(H_{21}=\dfrac{\partial^2 f}{\partial y\partial x}\) 看起来是两个不同的东西,但在绝大多数情况下它们相等

定理(Schwarz / Clairaut,混合偏导相等)
\(f\) 在点 \(P\) 的某邻域内二阶偏导数连续(记作 \(f\in C^2\)),则在该点

\[\frac{\partial^2 f}{\partial x\partial y}=\frac{\partial^2 f}{\partial y\partial x} \]

因此:

\[\boxed{H=H^{\mathsf T}\quad(\text{Hessian 是对称矩阵})} \]

【点评】 这条性质极其重要,它带来三个直接后果:

  1. 计算量减半\(n\times n\) 矩阵只需算 \(\dfrac{n(n+1)}{2}\) 个独立元素,而不是 \(n^2\) 个;
  2. 理论基石:对称矩阵必定可以正交对角化\(H=Q\Lambda Q^{\mathsf T}\)\(Q\) 正交、\(\Lambda\) 实对角),所以我们才能谈论"实特征值""主轴""主曲率"——否则这一切都不成立;
  3. 实用的自检手段:手算 Hessian 时,只要发现算出来的矩阵不对称,一定是算错了。(唯一的例外是数值计算中浮点误差导致的微小不对称,或函数不满足 \(C^2\) 的病态情形。)

后面例题二的手算结果,就是靠这条性质自我验证的。


第二部分 动手计算

5. 例题一:二元函数(逐步推导 + 逐元素解读)

5.1 题目

\[f(x,y)=x^2+3xy+2y^2 \]

5.2 第一步:求梯度

分别求偏导(求 \(\partial/\partial x\) 时把 \(y\) 当常数,反之亦然):

\[\frac{\partial f}{\partial x}=2x+3y \]

\[\frac{\partial f}{\partial y}=3x+4y \]

(第二式:\(\dfrac{\partial}{\partial y}(3xy)=3x\)\(\dfrac{\partial}{\partial y}(2y^2)=4y\)。)

所以

\[\nabla f= \begin{bmatrix} 2x+3y\\ 3x+4y \end{bmatrix} \]

5.3 第二步:求 Hessian

Hessian 就是"对梯度再求一次导"。四个元素逐个算:

左上\(f_x\) 再对 \(x\) 求导):

\[\frac{\partial}{\partial x}(2x+3y)=2 \]

右上\(f_x\) 再对 \(y\) 求导):

\[\frac{\partial}{\partial y}(2x+3y)=3 \]

左下\(f_y\) 再对 \(x\) 求导):

\[\frac{\partial}{\partial x}(3x+4y)=3 \]

右下\(f_y\) 再对 \(y\) 求导):

\[\frac{\partial}{\partial y}(3x+4y)=4 \]

因此:

\[\boxed{ H= \begin{bmatrix} 2&3\\ 3&4 \end{bmatrix} } \]

自检\(H_{12}=H_{21}=3\),矩阵对称 ✔(符合 4.4 节的定理)。

5.4 逐元素解读

\[H= \begin{bmatrix} 2&3\\ 3&4 \end{bmatrix} \]

对角元素

\[H_{11}=\frac{\partial^2 f}{\partial x^2}=2 \]

表示沿 \(x\) 坐标轴方向的二阶导,即该方向上的曲率。

\[H_{22}=\frac{\partial^2 f}{\partial y^2}=4 \]

表示沿 \(y\) 坐标轴方向的曲率,比 \(H_{11}\) 更大。

【点评·重要更正】 原始笔记在此写道"所以 \(y\) 方向比 \(x\) 方向更陡"——这句话有两个问题

  1. 术语错误:"陡"指的是坡度,那是一阶信息(由 \(\nabla f\) 决定);\(4\)曲率,是二阶信息。正确说法是"沿 \(y\) 轴的弯曲程度比沿 \(x\) 轴更大"。
  2. 更严重的误导:说"两个方向曲率都为正"会让人以为这是一个向上的碗形(极小值)。错! 这个 Hessian 的行列式是

\[\det H=2\times4-3\times3=-1<0 \]

说明它是不定的(indefinite),这个点是鞍点,不是极小值点。详见下面的点评。

非对角元素

\[H_{12}=H_{21}=3 \]

表示:\(x\)\(y\) 之间存在耦合

也就是说:

改变 \(x\),会影响 \(y\) 方向上的坡度(反过来也一样)。

这正是 \(xy\) 这种交叉项出现在 Hessian 非对角位置的原因:非对角元是"交叉项"的二阶印记

【点评·本例真正的结论】 这个例子其实是一个绝佳的"反面教材",值得完整算一遍:

(1) 函数可以因式分解:

\[f(x,y)=x^2+3xy+2y^2=(x+y)(x+2y) \]

(2) 求特征值:

\[\det(H-\lambda I)=(2-\lambda)(4-\lambda)-9=\lambda^2-6\lambda-1=0 \]

\[\lambda_{1,2}=3\pm\sqrt{10}\approx 6.1623,\quad -0.1623 \]

一个正、一个负\(H\) 不定 → 该点是鞍点

(3) 数值验证:\(\lambda_2\approx-0.1623\) 对应的单位特征向量

\[d\approx(0.8112,\,-0.5847) \]

沿此方向

\[d^{\mathsf T}Hd=\lambda_2\approx-0.1623<0 \]

即函数沿这个方向是向下弯的。实际上

\[f(0.8112,\,-0.5847)\approx-0.0811<0=f(0,0) \]

(4) 几何图像: 因为 \(f=(x+y)(x+2y)\),在两条直线 \(x+y=0\)\(x+2y=0\) 上函数值为 \(0\);在这两条直线夹成的楔形区域里函数值为负,在其外为正。这是典型的鞍形(双曲抛物面),而不是碗形。

      \   |   /
       \  |  /          <- 沿两条直线的"零谷线"
   -----\-+-/-----
         \|/
   负区域 | 正区域
         /|\
   -----/ | \-----

教训:

对角线元素为正,绝不意味着矩阵正定。
判断"是不是碗",必须看整个矩阵的行列式/特征值,不能只看对角线。

这个教训在后面第 11 章会被提炼成正式的判别法。


6. 例题二:三元函数(含"\(f_{yy}=0\) 之谜"专题)

6.1 题目

\[f(x,y,z)=x^2y+yz^2+\sin(xz) \]

这是更接近机器学习中复杂损失函数的形式:既有乘积项(耦合),又有非线性项(\(\sin\))。

6.2 第一步:求梯度

\(x\)

\[\frac{\partial f}{\partial x} =\frac{\partial}{\partial x}(x^2y)+\frac{\partial}{\partial x}(yz^2)+\frac{\partial}{\partial x}\sin(xz) =2xy+0+z\cos(xz) \]

其中用到链式法则:

\[\frac{\partial}{\partial x}\sin(xz)=\cos(xz)\cdot\frac{\partial(xz)}{\partial x}=z\cos(xz) \]

所以

\[f_x=2xy+z\cos(xz) \]

\(y\)

\[f_y=x^2+z^2 \]

(三项中只有 \(x^2y\)\(yz^2\)\(y\)\(\sin(xz)\)\(y\) 无关,导数为 \(0\)。)

\(z\)

\[f_z=2yz+x\cos(xz) \]

\(\dfrac{\partial}{\partial z}(yz^2)=2yz\)\(\dfrac{\partial}{\partial z}\sin(xz)=\cos(xz)\cdot x\)。)

【勘误】 原始笔记在此处写成 "\(f_z=y2z+x\cos(xz)\)",其中 y2z2yz 的笔误(\(y\cdot 2z\))。该笔误在原文稍后已被自动更正,但此处仍标注一笔。

所以:

\[\nabla f= \begin{bmatrix} 2xy+z\cos(xz)\\ x^2+z^2\\ 2yz+x\cos(xz) \end{bmatrix} \]

6.3 第二步:求 Hessian

Hessian 的大小是 \(3\times3\)

\[H= \begin{bmatrix} f_{xx}&f_{xy}&f_{xz}\\ f_{yx}&f_{yy}&f_{yz}\\ f_{zx}&f_{zy}&f_{zz} \end{bmatrix} \]

核心操作:把梯度里的每一个分量,再分别对 \(x,y,z\) 求导。

第一行(对 \(f_x=2xy+z\cos(xz)\) 求导):

\[f_{xx}=\frac{\partial}{\partial x}\big[2xy+z\cos(xz)\big]=2y+z\cdot\big[-\sin(xz)\cdot z\big]=2y-z^2\sin(xz) \]

\[f_{xy}=\frac{\partial}{\partial y}\big[2xy+z\cos(xz)\big]=2x \]

\[f_{xz}=\frac{\partial}{\partial z}\big[2xy+z\cos(xz)\big]=0+\big[\cos(xz)+z\cdot(-\sin(xz)\cdot x)\big]=\cos(xz)-xz\sin(xz) \]

第二行(对 \(f_y=x^2+z^2\) 求导):

\[f_{yx}=\frac{\partial}{\partial x}(x^2+z^2)=2x \]

\[f_{yy}=\frac{\partial}{\partial y}(x^2+z^2)=0 \]

\[f_{yz}=\frac{\partial}{\partial z}(x^2+z^2)=2z \]

第三行(对 \(f_z=2yz+x\cos(xz)\) 求导):

\[f_{zx}=\frac{\partial}{\partial x}\big[2yz+x\cos(xz)\big]=\cos(xz)-xz\sin(xz) \]

\[f_{zy}=\frac{\partial}{\partial z}\big[2yz+x\cos(xz)\big]=2z \]

\[f_{zz}=\frac{\partial}{\partial z}\big[2yz+x\cos(xz)\big]=2y+x\cdot\big[-\sin(xz)\cdot x\big]=2y-x^2\sin(xz) \]

所以:

\[\boxed{ H= \begin{bmatrix} 2y-z^2\sin(xz) & 2x & \cos(xz)-xz\sin(xz)\\[4pt] 2x & 0 & 2z\\[4pt] \cos(xz)-xz\sin(xz) & 2z & 2y-x^2\sin(xz) \end{bmatrix} } \]

自检(对称性)

\[f_{xy}=f_{yx}=2x\ ✔\qquad f_{xz}=f_{zx}=\cos(xz)-xz\sin(xz)\ ✔\qquad f_{yz}=f_{zy}=2z\ ✔ \]

【点评】 手算多元 Hessian 时,"逐行求导 + 对称性自检"是必须养成的习惯。\(3\times3\) 要算 \(9\) 个偏导,其中只有 \(6\) 个是独立的;如果算完发现 \(f_{xy}\neq f_{yx}\),不用怀疑数学,一定是自己算错了。这个例子里的 \(\cos(xz)-xz\sin(xz)\) 要算两遍(\(f_{xz}\)\(f_{zx}\)),正好互为验算。

6.4 逐项解读

(1)\(x\) 方向曲率

\[H_{11}=2y-z^2\sin(xz) \]

不是固定值,随位置变化。说明:不同位置,地形不同。

(2)\(y\) 方向

\[H_{22}=0 \]

说明:函数关于 \(y\) 是"线性"的(准确地说是仿射的,见 6.5)。沿 \(y\) 方向没有任何弯曲。

(3)\(x\)\(z\) 耦合

\[H_{13}=\cos(xz)-xz\sin(xz) \]

非零 → \(x\)\(z\) 之间存在耦合

【点评·措辞更正】 原文说"说明 \(x\)\(z\) 的变化强烈相关",这个说法有两个不准确之处:

  • 数学上这里叫耦合(coupling)/ 交互作用(interaction),与统计学的"相关(correlation)"不是一回事;
  • "强烈"缺乏依据:二阶偏导非零只说明存在耦合,不说明耦合的强弱。诚实的说法是"\(x\) 方向的坡度会随 \(z\) 变化,二者不独立"。

6.5 专题:\(f_{yy}=0\) 到底意味着什么?

这是原始笔记后半段花了一整节讨论的问题,也是初学者最容易卡住的地方,我们把它完整讲清楚。

困惑的来源是这样的:

我们已经算出

\[f_y=x^2+z^2 \]

然后马上写 Hessian:

\[H= \begin{bmatrix} f_{xx}&f_{xy}&f_{xz}\\ f_{yx}&f_{yy}&f_{yz}\\ f_{zx}&f_{zy}&f_{zz} \end{bmatrix} \]

于是产生一种错觉:

"第二行是 \(f_y\),那第二行是不是就该放 \(x^2+z^2\)?"

不是。 这里混淆了两个不同的"对 \(y\) 求导"动作

  • 第一次对 \(y\) 求导:从 \(f\) 得到 \(f_y\)(这是梯度的分量);
  • 第二次对 \(y\) 求导:从 \(f_y\) 再求导(这才是 Hessian 的元素)。

关键在于:

\[\boxed{\frac{\partial}{\partial y}(x^2+z^2)=0} \]

为什么是 \(0\)

因为在 \(x^2+z^2\) 这个表达式里根本没有 \(y\)。求 \(\partial/\partial y\) 时,\(x\)\(z\) 都被视为常数,于是 \(x^2+z^2\) 整体就是一个"相对于 \(y\) 的常数"。

举个数字例子:\(x=3,\ z=4\),则

\[x^2+z^2=9+16=25 \]

无论 \(y=1\)\(y=2\)\(y=100\) 还是 \(y=-50\),这个 \(25\) 都不会变。所以它对 \(y\) 的变化率当然是 \(0\)。这和一元函数里的

\[\frac{\mathrm d}{\mathrm dx}(5)=0 \]

完全一样,只是这里的"常数"特殊一点:

\[\boxed{\text{偏导时,只关心当前正在变化的那个变量。}} \]

\(f_y\) 这一整行完整算出来:

\[\boxed{ \begin{aligned} \frac{\partial f_y}{\partial x}&=\frac{\partial}{\partial x}(x^2+z^2)=2x\\[4pt] \frac{\partial f_y}{\partial y}&=\frac{\partial}{\partial y}(x^2+z^2)=0\\[4pt] \frac{\partial f_y}{\partial z}&=\frac{\partial}{\partial z}(x^2+z^2)=2z \end{aligned} } \]

所以 Hessian 的第二行是

\[\boxed{[\,2x,\quad 0,\quad 2z\,]} \]

而不是 \([\,x^2+z^2,\ x^2+z^2,\ x^2+z^2\,]\)

正确的思维链条是:

\[\underbrace{\nabla f= \begin{bmatrix} \text{x 方向坡度}\\ \text{y 方向坡度}\\ \text{z 方向坡度} \end{bmatrix}}_{\text{先得到三个"坡度"}} \quad\Longrightarrow\quad \underbrace{\text{再问:这三个坡度随 }x,y,z\text{ 变化时怎么变?}}_{\text{对每一个再求三个偏导}} \]

用自然语言复述这个结论:

\(f_y=x^2+z^2\) 表示"\(y\) 方向的坡度"。
这个坡度根本不随 \(y\) 改变,所以 \(y\) 方向坡度沿 \(y\) 方向的变化率为 \(0\),即 \(f_{yy}=0\)
但是——

\[f_{yx}=2x\neq 0 \]

虽然 \(y\) 方向的坡度不随 \(y\) 改变,但它会随着 \(x\) 改变。

这正好说明:

\[\boxed{\text{对角线描述"一个方向自身的曲率",非对角线描述"不同方向之间的耦合"。}} \]

【点评·更精确的说法】 严格来讲,\(f_{yy}=0\) 说明的是:

\(f\) 关于 \(y\)仿射的(affine):固定 \(x,z\) 后,\(f\)\(y\) 的一次函数

\[f=x^2y+yz^2+\sin(xz)=y\,(x^2+z^2)+\sin(xz) \]

即"斜率 \(x^2+z^2\) 与截距 \(\sin(xz)\) 都只依赖 \(x,z\)"。

"线性"与"仿射"的区别在于是否有常数项:线性要求 \(f(0)=0\)。这里当 \(y=0\)\(f=\sin(xz)\neq0\),所以是仿射而非严格线性。日常口语中说"线性"通常可以接受,但严格表述应当是仿射

6.6 一个重要推论:这个函数不可能有(严格)局部极小值

这一点原始笔记没有提到,但由 \(f_{yy}=0\) 可以直接推出:

(1)\(H_{22}=0\) 意味着 \(H\) 永远不可能是正定的。

因为正定矩阵 \(H\succ0\) 蕴含 \(e_i^{\mathsf T}He_i=H_{ii}>0\) 对所有 \(i\) 成立——正定矩阵的对角元必须全部为正

这里 \(H_{22}\equiv0\),所以 \(H\) 处处不是正定

(2)几何含义: 沿 \(y\) 方向,函数是一条直线(没有弯曲)。一条直线不可能有"谷底"——它要么一直上升、要么一直下降、要么水平。所以这个函数沿 \(y\) 方向不可能存在严格局部极小值

(3)数值验证: 取点 \((1,1,\pi/2)\),代入得

\[H= \begin{bmatrix} -0.4674 & 2 & -1.5708\\ 2 & 0 & 3.1416\\ -1.5708 & 3.1416 & 1 \end{bmatrix} \]

其中左上角 \(2\times2\) 子式的行列式

\[H_{11}H_{22}-H_{12}^2=(-0.4674)(0)-2^2=-4<0 \]

一个二阶主子式小于零,直接说明矩阵不定(因为它限制了特征值必有正有负)。

【点评】 "先看对角元符号,就能排除掉一整类可能性"是一个极其高效的检查习惯:对角元有非正的,就一定不是正定


7. 例题三:神经网络中的一个神经元

7.1 题目

这是最贴近机器学习的一个例子。考虑最简单的一个神经元(线性模型):

\[y=w_1x_1+w_2x_2 \]

平方损失:

\[L=(y-t)^2 \]

其中 \(t\) 是目标值。令

\[e=w_1x_1+w_2x_2-t \]

(即残差/误差),则

\[L=e^2 \]

我们要求 \(L\) 关于参数 \(w_1,w_2\) 的 Hessian(注意:求导对象是参数,\(x_1,x_2,t\) 都是常数)。

7.2 梯度

\[\frac{\partial L}{\partial w_1}=\frac{\partial L}{\partial e}\cdot\frac{\partial e}{\partial w_1}=2e\cdot x_1 \]

\[\frac{\partial L}{\partial w_2}=\frac{\partial L}{\partial e}\cdot\frac{\partial e}{\partial w_2}=2e\cdot x_2 \]

所以

\[\nabla L= \begin{bmatrix} 2ex_1\\ 2ex_2 \end{bmatrix} \]

【点评】 这里用到了链式法则,而且是两段:外层是平方(\(2e\)),内层是线性的(\(x_1\))。在神经网络里,这就是"反向传播"的最简原型。

7.3 Hessian

\[H= \begin{bmatrix} \dfrac{\partial^2 L}{\partial w_1^2} & \dfrac{\partial^2 L}{\partial w_1\partial w_2}\\[8pt] \dfrac{\partial^2 L}{\partial w_2\partial w_1} & \dfrac{\partial^2 L}{\partial w_2^2} \end{bmatrix} \]

逐个计算(注意 \(e\) 依赖 \(w_1,w_2\),而 \(x_1,x_2\) 是常数):

\[\frac{\partial^2 L}{\partial w_1^2} =\frac{\partial}{\partial w_1}(2ex_1) =2x_1\cdot\frac{\partial e}{\partial w_1} =2x_1\cdot x_1=2x_1^2 \]

同理

\[\frac{\partial^2 L}{\partial w_2^2}=2x_2^2 \]

交叉项:

\[\frac{\partial^2 L}{\partial w_1\partial w_2} =\frac{\partial}{\partial w_2}(2ex_1) =2x_1\cdot\frac{\partial e}{\partial w_2} =2x_1x_2 \]

因此:

\[\boxed{ H= 2 \begin{bmatrix} x_1^2 & x_1x_2\\ x_1x_2 & x_2^2 \end{bmatrix} } \]

7.4 修正:这个矩阵到底是什么?

【勘误·重要】 原始笔记在此写道:

"注意:\(H=X^{\mathsf T}X\),类似最小二乘中的矩阵。"

这句话不准确,有两处问题:

问题 1:它是外积(outer product),不是 \(X^{\mathsf T}X\)\(\mathbf{x}=\begin{bmatrix}x_1\\x_2\end{bmatrix}\in\mathbb{R}^2\),则

\[\boxed{H=2\,\mathbf{x}\mathbf{x}^{\mathsf T}} \]

展开验证:

\[2\begin{bmatrix}x_1\\x_2\end{bmatrix}\begin{bmatrix}x_1&x_2\end{bmatrix} =2\begin{bmatrix}x_1^2&x_1x_2\\x_1x_2&x_2^2\end{bmatrix}\ ✔ \]

这是一个 \(2\times2\) 矩阵,由"列向量 × 行向量"得到——外积

问题 2:丢了系数 2。 原式即使改成正确形式,也应当是 \(2\mathbf{x}\mathbf{x}^{\mathsf T}\),系数 \(2\) 来自平方求导。

那么 \(X^{\mathsf T}X\) 是从哪里来的? 它属于批量(batch)版本。如果有 \(N\) 个样本,损失是

\[L=\sum_{i=1}^{N}\big(w_1x_{i1}+w_2x_{i2}-t_i\big)^2 \]

则 Hessian 是各样本贡献之和:

\[H=\sum_{i=1}^{N}2\,\mathbf{x}_i\mathbf{x}_i^{\mathsf T}=2X^{\mathsf T}X \]

其中 \(X\in\mathbb{R}^{N\times2}\) 的第 \(i\) 行是 \(\mathbf{x}_i^{\mathsf T}\)

\[\boxed{ \begin{aligned} \text{单样本:}\quad & H=2\,\mathbf{x}\mathbf{x}^{\mathsf T}\ (\text{外积,秩 }1)\\[4pt] \text{批量:}\quad & H=2X^{\mathsf T}X\ (\text{最小二乘的标准形式}) \end{aligned} } \]

【点评】 这个更正很有价值,因为它把两个知识点正确地接上了:

  • \(\mathbf{x}\mathbf{x}^{\mathsf T}\) 是"一个样本的信息",秩为 1;
  • \(X^{\mathsf T}X\) 是"\(N\) 个样本信息的叠加",秩最多为 \(\min(N,2)\)

\(X^{\mathsf T}X\) 正是最小二乘/线性回归里那个著名的矩阵(正规方程 \(X^{\mathsf T}X\mathbf{w}=X^{\mathsf T}\mathbf{t}\) 的系数矩阵)。所以原文"类似最小二乘中的矩阵"这个直觉方向是对的,只是形式写错了。

7.5 这个 Hessian 的性质

(1)它是常数矩阵。

\(H=2\mathbf{x}\mathbf{x}^{\mathsf T}\)\(w_1,w_2\) 无关。这符合一般规律:

线性模型的平方损失是参数的二次函数,而二次函数的 Hessian 是常数

(2)它是半正定的,但(通常)不是正定的。

对任意向量 \(\mathbf{v}\)

\[\mathbf{v}^{\mathsf T}H\mathbf{v}=2\mathbf{v}^{\mathsf T}\mathbf{x}\mathbf{x}^{\mathsf T}\mathbf{v}=2(\mathbf{x}^{\mathsf T}\mathbf{v})^2\ge0 \]

所以 \(H\succeq0\)(半正定)。它的两个特征值是

\[\lambda_1=2\|\mathbf{x}\|^2>0,\qquad \lambda_2=0 \]

(沿 \(\mathbf{x}\) 方向特征值为 \(2\|\mathbf{x}\|^2\),垂直方向为 \(0\)。)

(3)零特征值的含义:存在"平坦方向"。

取与 \(\mathbf{x}\) 垂直的方向 \(\mathbf{v}\perp\mathbf{x}\):沿这个方向移动参数,预测值 \(w_1x_1+w_2x_2\) 完全不变,因此损失也完全不变。

\[L(\mathbf{w}+t\mathbf{v})=L(\mathbf{w})\quad\text{对任意 }t \]

具体数字例子:\(x_1=1,\ x_2=2,\ t=5\),则

\[H=2\begin{bmatrix}1&2\\2&4\end{bmatrix} =\begin{bmatrix}2&4\\4&8\end{bmatrix}, \qquad \det H=16-16=0 \]

最小值出现在直线 \(w_1+2w_2=5\) 上(一整条直线都是最优解,而不是孤立的一个点)。

【点评】 这不是"数学游戏的瑕疵",而是机器学习中的真实问题

  • 它意味着解不唯一(无穷多组权重给出同样的预测);
  • 它对应特征共线性:当 \(x_1,x_2\) 成比例(这里 \(x_2=2x_1\))时,模型无法分辨两个特征各自的贡献;
  • 它解释了为什么要加 L2 正则化:加上 \(\lambda\|\mathbf{w}\|^2\) 后,Hessian 变成 \(2\mathbf{x}\mathbf{x}^{\mathsf T}+2\lambda I\),特征值变成 \(2\|\mathbf{x}\|^2+2\lambda\)\(2\lambda\)全部为正——问题被"治好了"(这也是岭回归存在唯一解的几何原因)。

8. 常见函数的 Hessian 速查表

熟记几个基本型的 Hessian,能大幅加快推导速度(\(x\in\mathbb{R}^n\)\(A\in\mathbb{R}^{n\times n}\)):

函数 \(f(x)\) 梯度 \(\nabla f\) Hessian \(H\) 备注
\(a^{\mathsf T}x+b\) \(a\) \(\mathbf{0}\) 线性函数没有弯曲
\(\tfrac12 x^{\mathsf T}Ax\)\(A\) 对称) \(Ax\) \(A\) Hessian 就是二次型的系数矩阵
\(x^{\mathsf T}Ax\)\(A\) 对称) \(2Ax\) \(2A\) 注意差一个因子
\(x^{\mathsf T}Ax\)\(A\) 不对称) \((A+A^{\mathsf T})x\) \(A+A^{\mathsf T}\) 只有对称部分起作用
\(\tfrac12|Ax-b|^2\) \(A^{\mathsf T}(Ax-b)\) \(A^{\mathsf T}A\) 列满秩时正定
\(|x|^2=x^{\mathsf T}x\) \(2x\) \(2I\) 各向同性,正定
\(e^{a^{\mathsf T}x}\) \(e^{a^{\mathsf T}x}a\) \(e^{a^{\mathsf T}x}aa^{\mathsf T}\) 半正定,秩 1
\(\log(1+e^{a^{\mathsf T}x})\) \(\sigma\,a\) \(\sigma(1-\sigma)\,aa^{\mathsf T}\) \(\sigma=\sigma(a^{\mathsf T}x)\),半正定
\(\log\sum_j e^{x_j}\)(LSE) \(\mathrm{softmax}(x)=p\) \(\mathrm{diag}(p)-pp^{\mathsf T}\) 半正定,常用作凸替代
\((w^{\mathsf T}x-t)^2\) \(2(w^{\mathsf T}x-t)x\) \(2xx^{\mathsf T}\) 7.4 的结论

【点评】 这张表里藏着一条重要规律:

但凡是凸函数,它的 Hessian 就(处处)半正定;反之,\(C^2\) 函数的 Hessian 处处半正定,它就是凸函数。

看表中的例子:\(\|x\|^2\)\(\tfrac12\|Ax-b\|^2\)、LSE、logistic 损失——全是半正定的,因此它们全是凸函数,优化起来"没有局部极小值陷阱"。这就是为什么机器学习里到处是这几个函数。而例题一的 \(x^2+3xy+2y^2\)、例题二的 \(x^2y+yz^2+\sin(xz)\) 的 Hessian 不定,所以它们有鞍点。


第三部分 几何意义与判定

9. Hessian 每个元素到底代表什么

这是理解 Hessian 的核心

9.1 对角线元素:沿坐标轴方向的曲率

\[H_{11}=\frac{\partial^2 f}{\partial x^2} \]

意思:

\(x\) 方向的坡度,随着 \(x\) 自身变化有多快。

也就是:

沿 \(x\) 轴的弯曲程度。

\[H_{22}=\frac{\partial^2 f}{\partial y^2} \]

意思:

沿 \(y\) 轴的弯曲程度。

【点评·必须澄清的一点】 原始笔记用"沿 \(x\) 方向的曲率"来描述 \(H_{11}\),方向是对的,但必须补上两个字——沿坐标轴方向

因为曲面在 \((x_0,y_0)\) 处的"曲率"是依赖方向的:朝东南走和朝正东走,感受到的弯曲不一样。\(H_{11}\) 只告诉你沿 \(e_1=(1,0)\) 这一条特定方向的弯曲。想知道任意方向 \(d\) 的弯曲,需要 第 10 章 的公式 \(d^{\mathsf T}Hd\)

这正是例题一"翻车"的根源:\(H_{11}=2>0\)\(H_{22}=4>0\) 看起来两个坐标方向都是向上弯的,但存在某个斜方向 \(d\approx(0.81,-0.58)\) 使得 \(d^{\mathsf T}Hd<0\)——曲面在那个方向是向下弯的。

9.2 非对角线元素:耦合

\[H_{12}=\frac{\partial^2 f}{\partial x\partial y} \]

它的含义要分两步解读:

  1. 先算 \(\dfrac{\partial f}{\partial x}\),得到 \(x\) 方向的坡度
  2. 再对它求 \(\dfrac{\partial}{\partial y}\),问:

\(y\) 改变时,\(x\) 方向的坡度变化多少?

这就是:

两个方向之间的耦合。

换句话说:

\[H_{12}\neq0 \quad\Longleftrightarrow\quad \text{"往 }y\text{ 方向挪一步,}x\text{ 方向的坡度会跟着变"} \]

【点评】 更贴近优化直觉的说法是:

\[H_{ij}=\frac{\partial}{\partial x_j}\left(\frac{\partial f}{\partial x_i}\right) =\frac{\partial}{\partial x_j}\big(\text{梯度第 }i\text{ 个分量}\big) \]

即:沿 \(j\) 方向移动时,梯度的第 \(i\) 个分量变化多快。 这正是"参数之间如何相互影响"的精确数学表述。

9.3 两个直观例子

情况 1(无耦合):

\[f=x^2+y^2 \]

\[\nabla f= \begin{bmatrix}2x\\2y\end{bmatrix}, \qquad H= \begin{bmatrix}2&0\\0&2\end{bmatrix} \]

为什么没有交叉项?因为 \(x\) 的变化不会影响 \(y\) 方向的坡度:\(\dfrac{\partial f}{\partial y}=2y\),其中根本没有 \(x\)。所以

\[H_{12}=0 \]

几何:这是一个完美的旋转抛物面(碗),两个主轴正好是 \(x\) 轴与 \(y\) 轴。

情况 2(有耦合):

\[f=x^2+xy+y^2 \]

\[\nabla f= \begin{bmatrix}2x+y\\x+2y\end{bmatrix}, \qquad H= \begin{bmatrix}2&1\\1&2\end{bmatrix} \]

\[H_{12}=1\neq0 \]

表示 \(x\)\(y\) 有关联\(y\) 增大时,\(x\) 方向的坡度 \(2x+y\) 也会增大。

【点评】 注意这个函数的特征值:

\[\det(H-\lambda I)=(2-\lambda)^2-1=0 \ \Longrightarrow\ \lambda=1,3 \]

全为正 → 正定 → 是碗形(有极小值)。但它的"碗"是斜着的:主轴沿 \((1,1)\)\((1,-1)\) 方向,而不是坐标轴方向。曲率沿 \((1,-1)\) 方向是 \(1\),沿 \((1,1)\) 方向是 \(3\)

这就是"非对角元"的几何意义:它让碗倾斜(旋转)。 只要 \(H_{12}\neq0\),主轴就不再与坐标轴对齐——这直接导致梯度下降走"之"字形(见 13.5)。


10. 任意方向上的曲率与主曲率

10.1 方向曲率公式

沿单位向量 \(d\)\(\|d\|=1\))方向走,函数在该方向的二阶变化率是:

\[\boxed{f''(x;d)=d^{\mathsf T}H(x)\,d} \]

写成二次型就是:

\[d^{\mathsf T}Hd=\sum_{i,j}H_{ij}d_id_j \]

推导(用二阶泰勒展开,见 13.1):

\[f(x+td)=f(x)+t\,\nabla f^{\mathsf T}d+\frac{t^2}{2}\,d^{\mathsf T}Hd+o(t^2) \]

\(t\) 求二阶导,即得 \(d^{\mathsf T}Hd\)

验证:取 \(d=e_1=(1,0)\)

\[e_1^{\mathsf T}He_1=H_{11} \]

\(d=e_2=(0,1)\)\(e_2^{\mathsf T}He_2=H_{22}\)

\[\boxed{\text{对角线元素正是"坐标轴方向"的方向曲率。}} \]

10.2 Rayleigh 商与主曲率

对单位向量 \(d\)\(d^{\mathsf T}Hd\) 就是 Rayleigh 商。它有一个非常好的性质:

\[\boxed{\lambda_{\min}\ \le\ d^{\mathsf T}Hd\ \le\ \lambda_{\max} \qquad(\|d\|=1)} \]

其中 \(\lambda_{\min},\lambda_{\max}\)\(H\) 的最小、最大特征值,且等号分别在对应的特征向量方向上取到

所以:

\[\boxed{ \begin{aligned} \lambda_{\max}&=\text{最陡的向上弯曲(最大曲率)}\\ \lambda_{\min}&=\text{最陡的向下弯曲(若为负,则是最快下降方向)} \end{aligned} } \]

【点评】 这条性质把"Hessian 的特征值"与"曲面的弯曲"彻底打通了,是本篇最值得记住的结论之一:

概念 数学表达
沿方向 \(d\) 的曲率 \(d^{\mathsf T}Hd\)\(|d|=1\)
最大曲率(主曲率之一) \(\lambda_{\max}\),方向为对应特征向量
最小曲率(主曲率之一) \(\lambda_{\min}\),方向为对应特征向量
曲率在所有方向都 \(>0\) \(\lambda_{\min}>0\),即 \(H\) 正定(碗)
曲率在所有方向都 \(<0\) \(\lambda_{\max}<0\),即 \(H\) 负定(倒扣的碗)
有的方向向上、有的向下 \(\lambda_{\min}<0<\lambda_{\max}\),即 \(H\) 不定(鞍点

10.3 等高线与椭圆

在极小值点附近,把 \(f\) 用二阶泰勒近似:

\[f(x)\approx f(x^*)+\frac12(x-x^*)^{\mathsf T}H(x-x^*) \]

(因为在极小值点 \(\nabla f(x^*)=0\)。)

等高线 \(f=\text{const}\) 就是

\[(x-x^*)^{\mathsf T}H(x-x^*)=c \]

\(H\) 正定时,这是一个椭圆

  • 椭圆的两条半轴方向 = \(H\)特征向量
  • 半轴长度 \(\propto 1/\sqrt{\lambda_i}\)——特征值越大,那个方向越"陡",等高线越密,半轴越短
      λ 小(平缓,等高线稀疏)
   <---------->
     ___-----___
    /           \      ^
   |      *      |     |  λ 大(陡峭,等高线密集)
    \           /      v
     ---_____---

条件数定义为

\[\kappa=\frac{\lambda_{\max}}{\lambda_{\min}}\ (\ge1) \]

【点评】 \(\kappa\) 是衡量"病态程度"的黄金指标:

  • \(\kappa=1\):等高线是正圆,梯度下降直奔最低点,一步到位;
  • \(\kappa\gg1\):等高线是又扁又长的椭圆("峡谷"),梯度下降会来回震荡、走出"之"字形,收敛极慢;
  • 收敛所需的迭代次数大致正比于 \(\kappa\log(1/\varepsilon)\)

这就是为什么特征值分布悬殊是优化中最头疼的问题之一,也是为什么需要预处理(preconditioning)、归一化、Adam 等方法——它们本质上都在改善 Hessian 的条件数


11. 正定性、特征值与二阶最优性条件

11.1 二次型的符号分类

对一个对称矩阵 \(H\)

名称 记号 定义 特征值 几何
正定 \(H\succ0\) 对一切 \(x\neq0\)\(x^{\mathsf T}Hx>0\) 全部 \(>0\) 碗,向上弯
半正定 \(H\succeq0\) 对一切 \(x\)\(x^{\mathsf T}Hx\ge0\) 全部 \(\ge0\) 碗或槽(有平坦方向)
负定 \(H\prec0\) 对一切 \(x\neq0\)\(x^{\mathsf T}Hx<0\) 全部 \(<0\) 倒扣的碗
半负定 \(H\preceq0\) 对一切 \(x\)\(x^{\mathsf T}Hx\le0\) 全部 \(\le0\) 倒扣的碗或槽
不定 既有 \(x\) 使 \(>0\),又有使 \(<0\) 有正有负 鞍点

11.2 判别方法一:特征值

这是最根本的判据:

\[\boxed{ \begin{aligned} H\succ0 &\iff \lambda_i>0\ \ \forall i\\ H\succeq0 &\iff \lambda_i\ge0\ \ \forall i\\ H\prec0 &\iff \lambda_i<0\ \ \forall i\\ H\ \text{不定} &\iff \exists\,\lambda_i>0\ \text{且}\ \exists\,\lambda_j<0 \end{aligned} } \]

例题(原始笔记的例子):

\[H_1= \begin{bmatrix}4&0\\0&2\end{bmatrix} \]

(对角矩阵的特征值就是对角元)

\[\lambda_1=4>0,\qquad \lambda_2=2>0 \]

全部为正,所以

\[H_1\succ0\quad\text{(正定)} \]

几何上对应:

      \         /
       \       /
    ----\-----/----
         \   /
          \ /
           V          <- 碗形,最低点

再看:

\[H_2= \begin{bmatrix}4&0\\0&-2\end{bmatrix} \]

\[\lambda_1=4>0,\qquad \lambda_2=-2<0 \]

一正一负 → 不定鞍点

沿 \(x\) 方向向上弯,沿 \(y\) 方向向下弯。

       \       /
        \     /
   ------+---+------     <- 鞍点:一个方向向上,一个方向向下
        /     \
       /       \

【点评】 注意原始笔记举的这两个例子都是对角矩阵——对角矩阵的特征值就是对角元,所以判断很容易。但一般矩阵不能这么看!例题一就是活生生的反例:

\[\begin{bmatrix}2&3\\3&4\end{bmatrix} \]

对角元 \(2,4\) 全为正,但特征值是 \(6.16\)\(-0.16\)——它是不定的

铁律:判断正定性必须考虑整个矩阵(特征值或全体主子式),绝不能只看对角线。

11.3 判别方法二:Sylvester 判据(不用算特征值)

对于 \(2\times2\) 及以上的矩阵,手算特征值往往很麻烦。Sylvester 判据给出了一个只需算行列式的等价条件:

定理(Sylvester)
对称矩阵 \(H\) 正定 \(\iff\) 它的所有顺序主子式(从左上角开始的 \(1\times1,2\times2,\dots,n\times n\) 子式)全部大于零

\[H\succ0 \iff D_1=H_{11}>0,\quad D_2=\begin{vmatrix}H_{11}&H_{12}\\H_{21}&H_{22}\end{vmatrix}>0,\quad \dots,\quad D_n=\det H>0 \]

用例题一检验:

\[D_1=2>0,\qquad D_2=\det H=2\cdot4-3\cdot3=-1<0 \]

\(D_2<0\)不正定 ✔(与特征值结论一致)。

【点评】 Sylvester 判据在手算时非常高效(只需算 \(n\) 个行列式,不必解特征方程)。但要注意两点:

  1. 它只适用于正定判别。判负定要用 \(-H\)(即 \(H\) 负定 \(\iff\) \(-H\) 正定 \(\iff\) \((-1)^kD_k>0\) 对所有 \(k\));
  2. "顺序主子式"不能换成"任意主子式"。(对半正定的判别,则需要全体主子式 \(\ge0\),而不只是顺序的——这是常见的考试陷阱。)

11.4 判别方法三:二元函数的判别式法(考试最常用)

对二元函数,把上面的结论具体化。记

\[D=\det H= \begin{vmatrix}f_{xx}&f_{xy}\\f_{yx}&f_{yy}\end{vmatrix} =f_{xx}f_{yy}-f_{xy}^{2} \]

驻点(即 \(\nabla f=0\) 的点)处:

条件 结论
\(D>0\)\(f_{xx}>0\) 局部极小值
\(D>0\)\(f_{xx}<0\) 局部极大值
\(D<0\) 鞍点(不是极值)
\(D=0\) 判别失效,需要更高阶信息

为什么? 因为当 \(D>0\) 时,\(\lambda_1\lambda_2=D>0\)\(\lambda_1+\lambda_2=f_{xx}+f_{yy}\),说明两特征值同号;再看 \(f_{xx}>0\) 就知道同为正(正定 → 极小)或同为负(负定 → 极大)。当 \(D<0\) 时两特征值异号 → 不定 → 鞍点。

【点评】 这张表是微积分考试的核心考点,务必背熟。两个提醒:

  • 第一列必须用 \(f_{xx}\) 判断,用 \(f_{yy}\) 也可以(因为同号时二者符号一致,\(D>0\)\(f_{xx}f_{yy}=D+f_{xy}^2>0\),所以 \(f_{xx},f_{yy}\) 同号);
  • \(D=0\) 的情形不能下结论,见 11.6。

11.5 二阶最优性条件

现在可以给出完整的"找极值"理论:

一阶必要条件
\(x^*\)\(f\) 的局部极小值点且 \(f\) 在该点可微,则

\[\nabla f(x^*)=0 \]

(这样的点称为驻点 / 临界点。)

二阶必要条件
\(x^*\) 是局部极小值点且 \(f\in C^2\),则

\[\nabla f(x^*)=0\quad\text{且}\quad H(x^*)\succeq0\ (\text{半正定}) \]

注意:只能是正定,不能要求正定。反例:\(f(x)=x^4\)\(x=0\)\(f''(0)=0\),但 \(x=0\) 确是全局极小值点。

二阶充分条件

\[\nabla f(x^*)=0\quad\text{且}\quad H(x^*)\succ0\ (\text{正定}) \]

\(x^*\)严格局部极小值点

\[\boxed{ \begin{aligned} &\text{驻点}+\ H\succ0 &&\Longrightarrow\ \text{严格局部极小}\\ &\text{驻点}+\ H\prec0 &&\Longrightarrow\ \text{严格局部极大}\\ &\text{驻点}+\ H\ \text{不定} &&\Longrightarrow\ \text{鞍点}\\ &\text{驻点}+\ H\ \text{半正定/半负定} &&\Longrightarrow\ \text{信息不足,无法判定} \end{aligned} } \]

【点评·极其重要】 请注意条件的方向

  • 正定是充分条件,不是必要条件!
  • 必要条件只要求正定。

所以"\(H\) 正定 \(\iff\) 极小值"这个说法是错的(原文的表格里"正定 Hessian → 极小值"作为记忆口诀没问题,但作为定理必须补上"驻点"这个前提)。

两个必须记住的反例:

函数 在原点 说明
\(f=x^4\) \(\nabla f=0,\ H=0\)(半正定),极小值 说明必要条件不能加强为正定
\(f=x^3\) \(\nabla f=0,\ H=0\)(半正定),不是极小值 说明必要条件不充分,二阶条件失效

这两个函数在原点的 Hessian 完全相同(都是 \(0\)),但一个是极小值、一个不是——仅凭二阶信息无法区分,必须用到更高阶导数(或直接观察函数值)。

11.6 判别失效的三种情形(\(D=0\)

\(D=0\) 时一定要回到函数本身去分析。经典例子:

(1)\(f=x^4+y^4\),在原点

\[H(0,0)=\begin{bmatrix}0&0\\0&0\end{bmatrix}=0,\qquad D=0 \]

判别失效。但显然 \(f\ge0\)\(f(0,0)=0\),所以原点是严格全局极小值点

(2)\(f=x^3-3xy^2\)(猴鞍),在原点

\[H(0,0)=\begin{bmatrix}0&0\\0&0\end{bmatrix} \]

判别失效。但沿 \(y=0\)\(f=x^3\),在 \(x=0\) 处既不取极大也不取极小;沿 \(x=0\)\(f=0\)。所以原点是鞍点

(3)\(f=x^2y^2\),在原点

\(H(0,0)=0\),判别失效。而 \(f\ge0\)\(f(0,0)=0\) → 原点是极小值点,但不是严格的(沿 \(x\) 轴、\(y\) 轴函数恒为 \(0\))。

【点评】 这三例告诉我们:

Hessian 在驻点处"退化"(有零特征值)时,二阶信息不足以定论,必须借助更高阶导数或直接分析。

这也解释了为什么"鞍点"在深度学习中如此棘手:高维非凸函数中大量临界点是退化的,Hessian 有接近零的特征值,梯度下降在那里几乎停滞(见 14.4)。


12. Hessian 与凸性

定义: 若对任意 \(x,y\)\(t\in[0,1]\)

\[f(tx+(1-t)y)\le tf(x)+(1-t)f(y) \]

则称 \(f\)凸函数(几何上:函数图像位于任意弦的下方)。

二阶判据:\(f\in C^2\)

\[\boxed{f\ \text{是凸函数}\iff H(x)\succeq0\ \text{对一切 }x} \]

(严格凸的充分条件是 \(H(x)\succ0\) 对一切 \(x\);但严格凸不蕴含处处正定,如 \(f=x^4\)。)

【点评】 凸性为什么如此重要?

  1. 局部极小 = 全局极小:凸函数没有"假的谷底",梯度下降不会被困住;
  2. 驻点即最优解:只要 \(\nabla f(x^*)=0\)\(x^*\) 就是全局最优;
  3. 机器学习里的凸问题(线性回归、逻辑回归、SVM)都有唯一/良好的全局解——这也是为什么人们喜欢用凸损失。

判断一个损失函数是否凸,实践中最快的方法就是看它的 Hessian 是否处处半正定。比如:

  • 最小二乘:\(H=2X^{\mathsf T}X\succeq0\) ✔ 凸
  • 逻辑回归:\(H=\sum_i p_i(1-p_i)\mathbf{x}_i\mathbf{x}_i^{\mathsf T}\succeq0\) ✔ 凸
  • 神经网络的损失:\(H\) 一般不定 ✘ 非凸

第四部分 应用

13. 二阶泰勒展开与牛顿法

13.1 二阶泰勒展开

一元函数的二阶泰勒展开是

\[f(x+\Delta)\approx f(x)+f'(x)\Delta+\frac12 f''(x)\Delta^2 \]

多元函数的对应版本是

\[\boxed{ f(x+p)\approx f(x)+\nabla f(x)^{\mathsf T}p+\frac12 p^{\mathsf T}H(x)\,p } \]

逐项对照\(p\) 是位移向量):

一元 多元 含义
\(f(x)\) \(f(x)\) 当前位置的高度
\(f'(x)\Delta\) \(\nabla f^{\mathsf T}p\) 线性项(坡度 × 位移)
\(\frac12 f''(x)\Delta^2\) \(\frac12 p^{\mathsf T}Hp\) 二次项(曲率 × 位移²)

【点评】 这个公式是 Hessian 在优化中全部作用的源头。它告诉你:Hessian 就是"局部把函数近似成二次曲面"时那个二次型的系数矩阵。所有基于 Hessian 的算法(牛顿法、信赖域、拟牛顿、自然梯度)本质上都是在利用这个二次近似。

13.2 牛顿法:推导

思路:既然我有了局部的二次近似,不如直接跳到这个二次函数的极小点

对二次近似关于 \(p\) 求梯度:

\[\nabla_p\left[f(x)+\nabla f^{\mathsf T}p+\frac12p^{\mathsf T}Hp\right]=\nabla f+Hp \]

令它为零:

\[\nabla f+Hp=0 \ \Longrightarrow\ \boxed{p=-H^{-1}\nabla f} \]

于是得到牛顿法的迭代格式:

\[\boxed{x_{k+1}=x_k-H(x_k)^{-1}\nabla f(x_k)} \]

即原始笔记中那个把"梯度 + Hessian + 正定矩阵 + 特征值"全部串起来的公式:

\[\boxed{\Delta x=-H^{-1}\nabla f} \]

13.3 例题:二次函数一步收敛(但落在鞍点上!)

仍用例题一:

\[f(x,y)=x^2+3xy+2y^2,\qquad \nabla f= \begin{bmatrix}2x+3y\\3x+4y\end{bmatrix}, \qquad H= \begin{bmatrix}2&3\\3&4\end{bmatrix} \]

先求 \(H^{-1}\)\(2\times2\) 求逆公式:交换对角元、取负非对角元、除以行列式):

\[H^{-1}=\frac{1}{\det H}\begin{bmatrix}4&-3\\-3&2\end{bmatrix} =\frac{1}{-1}\begin{bmatrix}4&-3\\-3&2\end{bmatrix} =\begin{bmatrix}-4&3\\3&-2\end{bmatrix} \]

\(x_0=(1,1)\) 出发:

\[\nabla f(1,1)=\begin{bmatrix}5\\7\end{bmatrix} \]

\[\Delta x=-H^{-1}\nabla f= -\begin{bmatrix}-4&3\\3&-2\end{bmatrix}\begin{bmatrix}5\\7\end{bmatrix} =-\begin{bmatrix}-20+21\\15-14\end{bmatrix} =-\begin{bmatrix}1\\1\end{bmatrix} =\begin{bmatrix}-1\\-1\end{bmatrix} \]

\[x_1=(1,1)+(-1,-1)=(0,0) \]

验证:

\[\nabla f(0,0)=\begin{bmatrix}0\\0\end{bmatrix}\ ✔ \]

一次迭代就收敛了。 这不是巧合:

对于二次函数,牛顿法一步到达驻点(因为二次函数的二阶泰勒展开就是它本身,没有近似误差)。

\[\boxed{\text{二次函数 + 牛顿法} = \text{一步收敛}} \]

【点评·这个例子最精彩的地方】 牛顿法收敛到的 \((0,0)\) 是一个鞍点,不是极小值点

\[f(0.8112,-0.5847)\approx-0.0811<0=f(0,0) \]

这揭示了一个非常重要的事实:

牛顿法(以及任何只求解 \(\nabla f=0\) 的方法)找出的是"驻点",而不是"极小值点"。
它可能收敛到极小值、极大值,或鞍点——必须用 Hessian 的正定性来事后判定

在实践中,纯牛顿法因此常配合"若 \(H\) 不正定则修正"的策略(如加 \(\mu I\) 使其正定,即阻尼/信赖域方法)。

13.4 例题:\(f=x^2+y^4\)——牛顿法退化为线性收敛

再来看一个"牛顿法不灵"的例子。

\[f(x,y)=x^2+y^4,\qquad \nabla f=\begin{bmatrix}2x\\4y^3\end{bmatrix}, \qquad H=\begin{bmatrix}2&0\\0&12y^2\end{bmatrix} \]

最小值在原点 \((0,0)\)\(f_{\min}=0\)

\((1,1)\) 出发迭代:

  • \(x\) 分量\(x_{k+1}=x_k-\dfrac{2x_k}{2}=0\)——一步到位(二次函数)。
  • \(y\) 分量

\[y_{k+1}=y_k-\frac{4y_k^3}{12y_k^2}=y_k-\frac{y_k}{3}=\frac{2}{3}y_k \]

于是得到几何数列

\[y_k=\left(\frac{2}{3}\right)^{k} \]

数值验证:

迭代 \(k\) \(x_k\) \(y_k\) 误差压缩比
0 1 1
1 0 0.66666667 0.667
2 0 0.44444444 0.667
3 0 0.29629630 0.667
4 0 0.19753086 0.667
5 0 0.13168724 0.667
6 0 0.08779150 0.667

【点评】 这个例子说明:

牛顿法"二次收敛"是有前提的——它要求在最优解处 \(H\) 正定且非奇异

这里在最优解处

\[H(0,0)=\begin{bmatrix}2&0\\0&0\end{bmatrix} \]

奇异\(y\) 方向曲率为 \(0\)),所以 \(y\) 分量只能线性收敛(收敛比 \(2/3\)),而不是二次收敛。这叫退化极小值

实践中到处都是这种"接近平坦"的方向,这就是为什么纯牛顿法在深度学习里不实用,而需要正则化/阻尼(把 \(H\) 换成 \(H+\mu I\))。

13.5 牛顿法 vs 梯度下降

维度 梯度下降(一阶) 牛顿法(二阶)
迭代式 \(x_{k+1}=x_k-\eta\nabla f\) \(x_{k+1}=x_k-H^{-1}\nabla f\)
用到的信息 坡度(方向) 坡度 + 曲率
步长 需调超参 \(\eta\) 自动确定(\(H^{-1}\) 本身含步长)
二次函数 需多步,且受 \(\kappa\) 影响 一步
收敛速度 线性,\(\propto\kappa\log\frac1\varepsilon\) 接近解时二次收敛
每步代价 \(O(n)\) \(H\)\(O(n^2)\) 存储、\(O(n^3)\) 求逆
非凸时 稳定下降 可能奔向鞍点/极大值

(1)牛顿法为什么"聪明":它自动处理尺度

\(f(x,y)=x^2+100y^2\)

\[H=\begin{bmatrix}2&0\\0&200\end{bmatrix},\qquad \kappa=\frac{200}{2}=100 \]

  • 梯度下降\(y\) 方向太陡,\(x\) 方向太平。为了在 \(y\) 方向不发散,步长必须满足

\[\eta<\frac{2}{\lambda_{\max}}=\frac{2}{200}=0.01 \]

但这个步长在 \(x\) 方向(\(\lambda=2\))又太小,于是\(x\) 方向爬得极慢——"之"字形震荡

  • 牛顿法

\[H^{-1}=\begin{bmatrix}1/2&0\\0&1/200\end{bmatrix} \]

\[\Delta x=-H^{-1}\nabla f= -\begin{bmatrix}1/2&0\\0&1/200\end{bmatrix}\begin{bmatrix}2x\\200y\end{bmatrix} =\begin{bmatrix}-x\\-y\end{bmatrix} \]

一步到原点,完全不受 \(\kappa=100\) 的影响。

【点评】 这就是"牛顿法用 Hessian 感知地形弯曲"的实际含义:\(H^{-1}\) 相当于对每个方向做了一次"尺度归一化"——陡的方向步子小、平的方向步子大。它把椭圆的等高线"矫正"成了圆形。深度学习中各种自适应优化器(Adam 等)本质上都在用便宜的方式近似这个 \(H^{-1}\)(对角近似)。

(2)梯度下降的步长上界(Hessian 的直接用途)

对二次函数 \(f=\frac12x^{\mathsf T}Hx\),梯度下降

\[x_{k+1}=x_k-\eta Hx_k=(I-\eta H)x_k \]

要收敛,需所有 \(|1-\eta\lambda_i|<1\),即

\[\boxed{0<\eta<\frac{2}{\lambda_{\max}}} \]

【点评】 这是一个非常实用的结论:学习率的上限由 Hessian 的最大特征值决定。而 \(\lambda_{\max}\) 正是梯度 \(\nabla f\) 的 Lipschitz 常数 \(L\),所以机器学习理论中常见的收敛条件 \(\eta<2/L\),说的就是这件事。

13.6 局限与替代方案

牛顿法在深度学习里几乎从不直接使用,原因是:

问题 具体
存储 \(H\)\(n\times n\)\(n=10^6\) 参数时,\(H\)\(10^{12}\) 个元素,单精度需 \(4\) TB
计算 \(H\)\(O(n^2)\) 次二阶导;求逆(解线性方程组)需 \(O(n^3)\)
非凸 \(H\) 可能不定,牛顿方向甚至可能是上升方向

现实中使用的替代方案:

方法 核心思想 复杂度
拟牛顿法(BFGS) 不直接算 \(H\),用梯度差逐步估计 \(H^{-1}\) \(O(n^2)\)
L-BFGS 只存最近 \(m\) 步的向量,隐式表示 \(H^{-1}\) \(O(mn)\)
Gauss-Newton 对最小二乘,用 \(H\approx 2J^{\mathsf T}J\)\(J\) 为残差 Jacobian)丢弃二阶残差项 \(O(n^2)\)
Levenberg–Marquardt \(H+\mu I\) 兼顾牛顿与梯度下降
Hessian-free / 牛顿-CG 不构造 \(H\),只用Hessian-向量积 + 共轭梯度解方程 \(O(n)\) 每步
对角近似 / Adam 只保留 \(H\) 的对角元(或其二阶矩估计) \(O(n)\)

14. 深度学习中的 Hessian

14.1 层次结构

神经网络参数:

\[\theta=(w_1,w_2,\dots,w_n) \]

损失:

\[L(\theta) \]

梯度:

\[\nabla L\in\mathbb{R}^{n\times1} \]

大小 \(n\times1\),告诉:

参数调整方向。

Hessian:

\[H=\nabla^2L\in\mathbb{R}^{n\times n} \]

大小 \(n\times n\),元素为

\[H_{ij}=\frac{\partial^2L}{\partial w_i\partial w_j} \]

告诉:

每个参数之间如何相互影响。

具体地:

\[H_{ij}=\frac{\partial}{\partial w_j}\left(\frac{\partial L}{\partial w_i}\right) \]

表示:沿 \(w_j\) 方向移动时,\(w_i\) 的梯度变化多快。

【点评·措辞纠正】 原始笔记此处写"表示:改变 \(w_i\) 是否影响 \(w_j\)",以及后文的"修改参数 \(w_i\),会不会改变参数 \(w_j\) 的梯度"。后者是正确的说法,前者则容易误解(参数 \(w_i\)\(w_j\) 之间并没有直接的函数依赖关系,它们都是自变量)。准确表述:\(H_{ij}\) 衡量的是"沿 \(j\) 方向移动时,\(i\) 方向梯度的变化率",即两个方向在曲率意义下的耦合。(由对称性,交换 \(i,j\) 结论相同。)

直观类比:

对象 类比
梯度 \(\nabla L\) 当前位置的坡度
Hessian \(H\) 一张坡度如何变化的地图(地形弯曲图)

14.2 规模问题:为什么不能真的算 Hessian

\(n=10^6\) 参数的模型为例:

\[H\in\mathbb{R}^{10^6\times10^6} \ \Longrightarrow\ 10^{12}\ \text{个元素} \ \Longrightarrow\ \text{float32 下约 }4\ \text{TB} \]

求逆需要 \(O(n^3)=10^{18}\) 次运算。完全不可行。

所以深度学习中与 Hessian 相关的一切,都是间接的、近似的、只取部分信息的

14.3 Hessian-向量积(HVP):不构造 \(H\) 也能用 \(H\)

这是深度学习里最实用的技巧。我们往往不需要整个 \(H\),只需要它对某个向量 \(v\) 的作用 \(Hv\)

注意:

\[Hv=\nabla^2L\cdot v=\nabla\big(\nabla L^{\mathsf T}v\big) \]

右边是"先求方向导数,再求梯度",而方向导数 \(\nabla L^{\mathsf T}v\) 是一个标量

\[\boxed{Hv=\nabla\left(\nabla L^{\mathsf T}v\right)} \]

(这个恒等式对任意 \(v\) 成立,与 \(v\) 是否依赖 \(\theta\) 无关——这正是它好用的原因。)

在深度学习框架里,这只需两次反向传播:

  1. 第一次反向传播得到 \(\nabla L\)
  2. 计算标量 \(s=\nabla L^{\mathsf T}v\)
  3. \(s\) 再求一次梯度(torch.autograd.grad 对梯度再求导,即 create_graph=True),得到 \(Hv\)

\[\text{代价:约 }2\sim4\text{ 倍前向传播} \]

【点评】 HVP 是 Hessian 相关技术在现代深度学习里"活下来"的关键,它支撑了:

  • 共轭梯度法解牛顿方程 \(Hp=-\nabla L\)(Hessian-free 优化);
  • 共轭梯度法求最大/最小特征值(Lanczos / 幂法);
  • 影响函数(influence functions):估计"删除某个训练样本对模型的影响",用于数据调试;
  • OBD/OBS 剪枝:用 Hessian 对角元衡量每个权重的重要性。

14.4 鞍点主导与逃逸

在低维(\(n=2\))中,我们习惯把"极值"和"鞍点"看成两类不同的事。但在高维中:

一个临界点是局部极小值的概率极低,绝大多数临界点是鞍点

直觉:在临界点处,\(H\)\(n\) 个特征值。要成为局部极小值,所有 \(n\) 个特征值必须同为正。如果每个特征值的符号"随机"(等概率正负),那么概率是 \(2^{-n}\)——\(n=10^6\) 时几乎为零。只要存在一个负特征值方向,这个点就是鞍点。

\[\boxed{\text{高维空间中,鞍点远比局部极小值常见。}} \]

这其实是好消息

  • 梯度下降在鞍点附近会被"负曲率方向"推开(沿 \(\lambda<0\) 的方向梯度会自动把你推离);
  • 真正的问题不是"困在鞍点",而是在鞍点附近的平坦区域(\(\lambda\approx0\))中爬行太慢

【点评】 这也解释了为什么深度学习里"局部极小值不是主要障碍"这一现代观点(Choromanska 等,2015)。真正影响优化的是:

  1. 病态条件数(峡谷地形)→ 用动量/自适应步长缓解;
  2. 平坦/退化区域 → 用噪声(SGD 的随机性)帮助逃离。

SGD 的噪声在这里扮演了重要角色:它相当于给参数加了随机扰动,能帮助逃离鞍点附近的平坦区(相关理论工作如 Ge 等 2015 证明"扰动梯度下降"可以高效逃离严格鞍点)。

14.5 Hessian 在深度学习中的其他角色

用途 用到的 Hessian 信息
二阶优化 完整的 \(H\)(K-FAC、Hessian-free)
自适应学习率 \(H\) 的对角元(Adam 的二阶矩是其廉价替代)
剪枝 对角元 \(H_{ii}\) 衡量权重重要性(OBD/OBS)
不确定性估计 拉普拉斯近似:后验协方差 \(\approx H^{-1}\)(在 MAP 点处)
自然梯度 用 Fisher 信息矩阵 \(F=\mathbb{E}[\nabla\log p\,\nabla\log p^{\mathsf T}]\) 代替 \(H\)(对对数似然,\(F=-H\) 的期望)
泛化分析 特征值谱的"平坦度"与泛化能力的关系(flat minima)
影响函数 \(H^{-1}\) 用于估计单样本影响

14.6 回到那个神经元例子

现在回头看 第 7 章 的结论:

\[H=2\,\mathbf{x}\mathbf{x}^{\mathsf T}\quad(\text{单样本}),\qquad H=2X^{\mathsf T}X\quad(\text{批量}) \]

它说明:

  1. 线性模型的平方损失是凸的\(H\succeq0\))→ 没有伪局部极小值;
  2. Hessian 与参数无关(常数矩阵)→ 各处的曲率都一样;
  3. 特征值谱决定了优化难度:如果 \(X^{\mathsf T}X\) 的特征值跨度很大(特征尺度差异大、或特征间高度相关),条件数就大,梯度下降就会震荡。

【点评】 这三点正是线性回归可以用正规方程一步求解\(\mathbf{w}^*=-(2X^{\mathsf T}X)^{-1}\cdot(-2X^{\mathsf T}\mathbf{t})=(X^{\mathsf T}X)^{-1}X^{\mathsf T}\mathbf{t}\))而深度学习不能的原因:只有极少数问题,Hessian 才便宜到可以直接求逆。


第五部分 总结

15. 层次总览表与一句话总结

15.1 数学对象层次表

数学对象 回答的问题 几何意义 输入→输出
函数 \(f(x)\) 高度是多少? 地形 \(\mathbb{R}^n\to\mathbb{R}\)
一阶导数 \(f'\) 变化多快? 坡度 \(\mathbb{R}\to\mathbb{R}\)
梯度 \(\nabla f\) 往哪里升最快? 方向箭头 \(\mathbb{R}^n\to\mathbb{R}^n\)
Hessian \(\nabla^2 f\) 坡度如何变化? 曲率 \(\mathbb{R}^n\to\mathbb{R}^{n\times n}\)
\(H\) 的特征值 曲率有多大? 主方向上的弯曲程度
\(H\) 的特征向量 弯曲沿哪些方向? 主轴(碗的对称轴)
正定 \(H\)\(\lambda_i>0\) 所有方向都向上弯 局部极小值
负定 \(H\)\(\lambda_i<0\) 所有方向都向下弯 局部极大值
不定 \(H\)(符号混合) 有的向上、有的向下 鞍点
半正定且有零特征值 某些方向完全平坦 退化,需更高阶信息

从低到高的概念链:

\[\text{函数 }f \ \longrightarrow\ \text{一阶导数} \ \longrightarrow\ \text{梯度 }\nabla f \ \longrightarrow\ \text{梯度的导数} \ \longrightarrow\ \text{Hessian }H \ \longrightarrow\ \text{特征值/特征向量} \ \longrightarrow\ \text{正定性判定} \ \longrightarrow\ \text{牛顿法 } \Delta x=-H^{-1}\nabla f \]

\(f(x,y,z)\) 用一句话说明每一层:

  • 函数 \(f\):告诉你"高度";
  • 梯度 \(\nabla f\):告诉你"当前位置各方向的坡度";
  • Hessian \(H\):告诉你"这些坡度本身如何随位置变化"。

15.2 三句话总结

\[\boxed{\text{Hessian 是梯度的导数:因为梯度本身是一个向量函数;求"梯度的变化率",就必须对梯度再求导。}} \]

\[\boxed{\text{梯度描述"一阶方向",Hessian 描述"方向的改变"。}} \]

\[\boxed{\text{梯度下降是一阶优化,只看"往哪走";牛顿法是二阶优化,用 Hessian 感知"地面有多弯",因而能自动定步长。}} \]

15.3 为什么牛顿法更"聪明"

\[\boxed{\Delta x=-H^{-1}\nabla f} \]

这个公式把前面所学的梯度 + Hessian + 正定矩阵 + 特征值全部连接起来:

  • \(\nabla f\) 说"往哪走";
  • \(H^{-1}\) 说"每个方向该走多远"(陡的方向少走、平的方向多走);
  • \(H\) 正定则保证这个方向确实是下降方向

它的局限同样来自这三者:\(H\) 太大、太贵、还可能不正定。


16. 常见误区清单

把这些错误一次列清,考试和实战中都极容易踩:

# 错误说法 正确说法
1 "\(H_{11}\) 就是函数在 \(x\) 方向的曲率" 沿坐标轴方向的曲率;任意方向的曲率是 \(d^{\mathsf T}Hd\)
2 "对角元全为正 → 正定 → 极小值" 。反例:\(\begin{bmatrix}2&3\\3&4\end{bmatrix}\),对角元 \(2,4>0\) 但不定
3 "\(H\) 正定 \(\iff\) 极小值" 必须加前提:在驻点处。且正定是充分非必要(\(f=x^4\)
4 "Hessian 一定对称" \(f\in C^2\)(Schwarz 定理)。手算时不对称就是算错了
5 "Hessian 是数/是向量" 它是 \(n\times n\) 矩阵;梯度是 \(n\times1\) 向量
6 "\(\nabla^2f\) 中的 \(\nabla^2\) 是拉普拉斯算子" 在优化语境下 \(\nabla^2f\) 是 Hessian;在 PDE 语境下才是拉普拉斯(\(=\mathrm{tr}\,H\)
7 "梯度下降的步长与 Hessian 无关" 稳定性要求 \(0<\eta<2/\lambda_{\max}\),上限由 Hessian 决定
8 "牛顿法一定收敛到极小值" 只保证到驻点,可能是鞍点或极大值(见 13.3 的例题)
9 "牛顿法总是二次收敛" 需最优解处 \(H\) 正定非奇异;退化时退化为线性收敛(见 13.4)
10 "深度学习里 Hessian 没用" 直接用不行,但 HVP、对角近似、Fisher/K-FAC、影响函数都是它的衍生
11 "局部极小值是深度学习的主要障碍" 高维中鞍点远多于局部极小值;真正的困难是病态条件数与平坦区
12 "\(f_{yy}=0\) 说明该行元素都是 \(x^2+z^2\)" 那是 \(f_y\)(一阶);Hessian 要对 \(f_y\) 再求一次导(见 6.5)

附录 A 勘误表

以下是原始笔记中的全部问题(按出现顺序),以及本文的处理方式。

# 位置 原文 问题性质 更正
1 例1 解读 "所以 \(y\) 方向比 \(x\) 方向更陡" 术语错误\(4\) 是曲率(二阶),"陡"指坡度(一阶) 改为"沿 \(y\) 轴的弯曲程度更大"
2 例1 解读 \(H_{11}=2,H_{22}=4>0\) 暗示碗形/极小 概念错误:该矩阵 \(\det=-1\)、特征值 \(6.16\)\(-0.16\)不定,是鞍点 已在 5.4 完整更正并给出特征值与下降方向
3 例1 解读 未察觉 \(f=(x+y)(x+2y)\) 可因式分解 遗漏:因式分解一眼看出鞍点结构 已补充
4 例2 梯度 \(f_z=\texttt{y2z}+x\cos(xz)\) 笔误(原文后处已自纠) 改为 \(2yz+x\cos(xz)\)
5 例2 解读 "\(x\)\(z\) 的变化强烈相关" 措辞不当:应为"耦合/交互","强烈"无依据 改为"存在耦合,二者不独立"
6 例2 解读 "\(H_{22}=0\) 说明函数关于 \(y\)线性的" 不精确:含常数项 \(\sin(xz)\),应为仿射 已在 6.5 澄清
7 例2 未指出 \(H_{22}=0\Rightarrow H\) 永不正定 ⇒ 无极小值 遗漏的重要推论 已补充(6.6)
8 例3 结论 "\(H=X^{\mathsf T}X\),类似最小二乘中的矩阵" 错误:单样本应为 \(H=2\mathbf{x}\mathbf{x}^{\mathsf T}\)(外积);\(X^{\mathsf T}X\) 是批量形式 \(H=2X^{\mathsf T}X\);且原式丢了系数 2 已在 7.4 更正并解释两个形式的来源
9 例3 未讨论 \(H\) 的奇异性和"平坦方向" 遗漏 已补充(7.5),并联系 L2 正则化
10 一阶导数示例 "\(f'(3)=6\) 意思:\(x\) 增加 1 个单位,\(y\) 大约增加 6" 不严谨:导数是无穷小意义下的变化率;\(\Delta=1\) 时实际增加 \(7\) 已在 1.1 更正
11 概念 \(H=\nabla(\nabla f)\) 记号简写:严格说 Hessian 是梯度映射的 Jacobian 已在 4.1 注明
12 概念 未辨析 \(\nabla^2f\) 与拉普拉斯算子 遗漏:记号冲突 已补充(4.1、误区 6)
13 概念 未给出 Hessian 的对称性定理(Schwarz) 遗漏关键理论 已补充(4.4)
14 深度学习 "改变 \(w_i\) 是否影响 \(w_j\)" 表述含糊\(w_i,w_j\) 都是自变量,无直接依赖 已改为"沿 \(j\) 方向移动时 \(i\) 方向梯度的变化率"(14.1)
15 总结表 "正定 Hessian → 极小值" 缺前提:须在驻点处;且正定是充分非必要 已在 11.5 补全四个条件分支
16 结构 "为什么 Hessian 要对梯度求导"(基础内容)排在牛顿法之后 逻辑顺序问题:基础概念后置 已前移重组为第 4 章
17 结构 三元函数的 \(f_{yy}\) 讨论被拆成独立尾段,与前文脱节 结构问题 已整合为 6.5 专题
18 配图 4 张图片指向 images.openai.com/static-rsc-4/... 临时链接 链接会失效 已替换为文字/ASCII 示意图,并说明原委
19 整体 缺少:二阶泰勒展开、二阶最优性条件、判别式法 \(D\)、Sylvester 判据、凸性、方向曲率、条件数、HVP、练习题 内容缺口 已全部补充(第 10–14 章、附录 B)

附录 B 练习题与解答

练习 1 三元函数的 Hessian

\(f(x,y,z)=x^3+y^2z+e^{xy}\) 的梯度与 Hessian。

解答

梯度:

\[f_x=3x^2+ye^{xy},\qquad f_y=2yz+xe^{xy},\qquad f_z=y^2 \]

二阶偏导:

\[f_{xx}=6x+y^2e^{xy} \]

\[f_{xy}=e^{xy}+xye^{xy}=(1+xy)e^{xy} \]

\[f_{xz}=\frac{\partial}{\partial z}(3x^2+ye^{xy})=0 \]

\[f_{yy}=2z+x^2e^{xy} \]

\[f_{yz}=\frac{\partial}{\partial z}(2yz+xe^{xy})=2y \]

\[f_{zz}=\frac{\partial}{\partial z}(y^2)=0 \]

Hessian:

\[H= \begin{bmatrix} 6x+y^2e^{xy} & (1+xy)e^{xy} & 0\\ (1+xy)e^{xy} & 2z+x^2e^{xy} & 2y\\ 0 & 2y & 0 \end{bmatrix} \]

自检\(f_{xy}=f_{yx}=(1+xy)e^{xy}\) ✔,\(f_{xz}=f_{zx}=0\) ✔,\(f_{yz}=f_{zy}=2y\) ✔。

观察\(H_{33}=0\),所以 \(H\) 处处不正定——该函数关于 \(z\) 是仿射的(固定 \(x,y\)\(f\)\(z\) 的一次函数),不可能有严格局部极小值。

(数值验算:与有限差分结果完全一致。)

练习 2 求极值(经典考题)

\(f(x,y)=x^3-3xy+y^3\) 的极值。

解答

第一步:求驻点。

\[f_x=3x^2-3y=0\ \Longrightarrow\ y=x^2 \]

\[f_y=-3x+3y^2=0\ \Longrightarrow\ x=y^2 \]

代入:\(x=(x^2)^2=x^4\),即 \(x(x^3-1)=0\),得 \(x=0\)\(x=1\)

  • \(x=0\Rightarrow y=0\):驻点 \((0,0)\)
  • \(x=1\Rightarrow y=1\):驻点 \((1,1)\)

第二步:求二阶偏导。

\[f_{xx}=6x,\qquad f_{yy}=6y,\qquad f_{xy}=-3 \]

\[D=f_{xx}f_{yy}-f_{xy}^2=36xy-9 \]

第三步:判别。

  • \((0,0)\)\(D=0-9=-9<0\)鞍点(不是极值)。
  • \((1,1)\)\(D=36-9=27>0\),且 \(f_{xx}(1,1)=6>0\)局部极小值

\[f(1,1)=1-3+1=-1 \]

(数值验算:\(\det H\) 与有限差分一致。)

练习 3 二次型的 Hessian 与牛顿法

\(A\) 对称可逆,\(f(x)=\tfrac12x^{\mathsf T}Ax+b^{\mathsf T}x+c\)。求 \(H\),并证明牛顿法从任意点出发一步到达 \(x^*=-A^{-1}b\)

解答

梯度:

\[\nabla f=Ax+b \]

Hessian:\(Ax+b\) 再求导(\(A\) 是常数矩阵):

\[H=A \]

牛顿法:

\[x_1=x_0-H^{-1}\nabla f(x_0) =x_0-A^{-1}(Ax_0+b) =x_0-x_0-A^{-1}b =-A^{-1}b=x^* \]

一步到位 ✔。这也说明:二次函数的牛顿法 = 直接解线性方程组\(Ax=-b\)),本质上不是"迭代优化"而是"解方程"。这正是"二次函数一步收敛"的一般性证明。

练习 4 批量平方损失的 Hessian

设有 \(N\) 个样本 \((\mathbf{x}_i,t_i)\),损失 \(L(\mathbf{w})=\sum_{i=1}^N(\mathbf{w}^{\mathsf T}\mathbf{x}_i-t_i)^2\)。求 \(H\),并说明它何时正定。

解答

单个样本的 Hessian 是 \(2\mathbf{x}_i\mathbf{x}_i^{\mathsf T}\)(见第 7 章),求和:

\[H=\sum_{i=1}^{N}2\,\mathbf{x}_i\mathbf{x}_i^{\mathsf T}=2X^{\mathsf T}X \]

其中 \(X\in\mathbb{R}^{N\times d}\) 的第 \(i\) 行为 \(\mathbf{x}_i^{\mathsf T}\)

正定性:

\[\mathbf{v}^{\mathsf T}X^{\mathsf T}X\mathbf{v}=\|X\mathbf{v}\|^2\ge0 \]

(半正定,恒成立)。

\[H\succ0 \iff X\mathbf{v}\neq0\ \text{对一切}\ \mathbf{v}\neq0 \iff X\ \text{列满秩}\ (N\ge d\ \text{且特征不共线}) \]

结论:只要特征之间存在线性相关(共线性),\(H\) 就奇异,最优解不唯一——这正是需要岭回归(加 \(\lambda I\) 使 \(H=2X^{\mathsf T}X+2\lambda I\succ0\))的原因。

练习 5 判别失效怎么办

\(f(x,y)=x^4+y^4\),用二阶判别法判断原点是否为极值点。

解答

二阶偏导:

\[f_x=4x^3,\ f_y=4y^3 \ \Longrightarrow\ \nabla f(0,0)=\mathbf{0}\quad(\text{是驻点}) \]

\[f_{xx}=12x^2,\quad f_{yy}=12y^2,\quad f_{xy}=0 \]

\[H(0,0)=\begin{bmatrix}0&0\\0&0\end{bmatrix}, \qquad D=f_{xx}f_{yy}-f_{xy}^2=0 \]

\(D=0\):判别法失效(不能下任何结论)。

必须回到定义:

\[f(x,y)=x^4+y^4\ge0=f(0,0)\quad\text{对一切 }(x,y) \]

且等号仅在 \((0,0)\) 成立,所以原点是严格全局极小值点

【点评】 这个例子说明:Hessian 在驻点退化(有零特征值)时,二阶信息完全失效,必须借助更高阶导数或直接分析函数取值。一般地,若最低阶非零导数出现在第 \(2k\) 阶,则 \(2k\) 为偶数时是极值、奇数时不是。

练习 6 凸性与 Hessian

\(f(x)=\log\sum_{j=1}^{n}e^{x_j}\)(log-sum-exp)的 Hessian,并说明 \(f\) 是否为凸函数。

解答

\[p_j=\frac{e^{x_j}}{\sum_k e^{x_k}}\quad(\text{softmax}), \qquad \sum_j p_j=1 \]

一阶偏导:

\[\frac{\partial f}{\partial x_i}=\frac{e^{x_i}}{\sum_k e^{x_k}}=p_i \]

二阶偏导:

\[\frac{\partial^2 f}{\partial x_i\partial x_j} =\frac{\partial p_i}{\partial x_j} =p_i\delta_{ij}-p_ip_j \]

(当 \(i=j\)\(\partial p_i/\partial x_i=p_i-p_i^2=p_i(1-p_i)\);当 \(i\neq j\)\(\partial p_i/\partial x_j=-p_ip_j\)。)

Hessian:

\[H=\mathrm{diag}(p)-pp^{\mathsf T} \]

半正定性: 对任意 \(v\)

\[v^{\mathsf T}Hv=\sum_i p_iv_i^2-\Big(\sum_i p_iv_i\Big)^2 =\mathrm{Var}_{p}(v)\ \ge0 \]

(方差非负。)

所以 \(H\succeq0\)\(f\)凸函数 ✔。

【点评】 \(\mathrm{diag}(p)-pp^{\mathsf T}\) 正是"以 \(p\) 为分布的随机变量的协方差矩阵",这个形式在机器学习中反复出现(softmax 的 Jacobian、多项分布的 Fisher 信息矩阵、交叉熵损失的 Hessian 结构)。认出这个结构,就能立刻判断凸性


附录 C 符号与约定

符号 含义
\(f:\mathbb{R}^n\to\mathbb{R}\) \(n\) 元实值函数
\(\partial f/\partial x_i\) 偏导数(固定其余变量)
\(f_{x_i}\)\(f_{ij}\) \(\partial f/\partial x_i\)\(\partial^2f/\partial x_i\partial x_j\) 的简写
\(\nabla f\) 梯度,列向量 \(\in\mathbb{R}^{n\times1}\)(本文约定)
\(\nabla^2f\) Hessian(本文语境);注意 PDE 中常指拉普拉斯算子
\(H\) Hessian 矩阵 \(\in\mathbb{R}^{n\times n}\),对称
\(H\succ0\) / \(H\succeq0\) 正定 / 半正定
\(\lambda_i\) 特征值
\(\kappa\) 条件数 \(\lambda_{\max}/\lambda_{\min}\)
\(\mathbf{x}\mathbf{x}^{\mathsf T}\) 外积(outer product),得到一个矩阵
\(X^{\mathsf T}X\) Gram 矩阵(最小二乘里的标准形式)
\(\mathrm{diag}(p)\) \(p\) 为对角元的对角矩阵
\(\sigma(z)\) sigmoid 函数 \(1/(1+e^{-z})\)
\(\mathrm{tr}\,H\) 矩阵的迹 \(=\sum_i H_{ii}\)(即拉普拉斯算子)

约定:

  1. 梯度记为列向量
  2. Hessian 定义为 \(H_{ij}=\partial^2f/\partial x_i\partial x_j\)(第 \(i\) 行第 \(j\) 列);
  3. 求和约定:不加说明时,\(\sum_i\) 表示 \(i\)\(1\)\(n\)
  4. 假设 \(f\in C^2\)(二阶偏导连续),以保证 Hessian 对称;
  5. 本文所有 Hessian 的解析结果均已用中心差分法数值验算,误差 \(<10^{-4}\)

最后总结一句话:

\[\boxed{\text{梯度告诉你"往哪走",Hessian 告诉你"地面有多弯"——前者决定方向,后者决定步长。}} \]

posted @ 2026-09-14 14:38  立体风  阅读(5)  评论(0)    收藏  举报