# Hessian 与牛顿方程的求解

[[MCS/day6/00 学习指南|day6 学习指南]] · [[MCS/00 MCS学习总览|十一天总览]] · [[MCS/day6/阅读核验与疑问|阅读核验与疑问]] · 上一篇：[[MCS/day6/12 牛顿法到 XGBoost 的课堂推导|牛顿法到 XGBoost 的课堂推导]] · 下一篇：[[MCS/day6/14 牛顿求根、初值与失效案例|牛顿求根、初值与失效案例]]

> 来源：[[MCS/day6补充9|day6补充9]]。用途：补充。原有推导、追问与解答保留；阅读时请结合本日核验说明。

## 牛顿法中的 Hessian 矩阵与线性方程组求解

### 一、 背景与核心结论

在优化模型（如深度学习）时，我们经常需要利用二阶信息来加速收敛。图片中给出了一个极其关键的运算场景：

*   **模型规模**：1 亿个参数。
*   **Hessian 矩阵 $H$ **：大小为 $1亿 \times 1亿$。
*   **核心结论（Answer）**：**不会去求逆矩阵**，而是转化为**解一个线性方程组**。

公式如下：
$$
H \Delta x = -g \quad \longrightarrow \quad \text{线性方程组}
$$

---

### 二、 符号定义 ($H, \Delta x, g$ 分别是什么？)

结合优化理论，这三个符号的含义如下：

#### 1. $H$：Hessian 矩阵（海森矩阵）
*   **定义**：目标函数（通常是损失函数）对所有参数的**二阶偏导数**组成的方阵。
*   **维度**：由于模型有 1 亿个参数，$H$ 是一个 $1亿 \times 1亿$ 的矩阵。
*   **作用**：描述损失函数的**曲率**（梯度变化的快慢），用于修正梯度下降的方向和步长。

#### 2. $g$：梯度向量（Gradient）
*   **定义**：目标函数对所有参数的**一阶偏导数**组成的向量。
*   **维度**：与参数数量相同，即 $1亿 \times 1$ 的向量。
*   **作用**：指向函数值上升最快的方向。公式中的 $-g$ 表示沿着梯度的反方向（下降最快的方向）更新参数。

#### 3. $\Delta x$：参数的更新量（牛顿步长）
*   **定义**：代表参数需要改变的数值，通常写作 $\Delta x = x_{new} - x_{old}$。
*   **维度**：与参数数量相同，$1亿 \times 1$ 的向量。
*   **作用**：这是要求解的未知数。得到 $\Delta x$ 后，参数更新为 $x_{new} = x_{old} + \Delta x$。

---

### 三、 为什么不直接求逆？

标准的牛顿法更新公式是：
$$
\Delta x = -H^{-1}g
$$

但是，当模型有 1 亿个参数时：
1.  **存储限制**：$H$ 矩阵的大小是 $1亿 \times 1亿$（约 $10^{16}$ 个元素），内存根本无法存储。
2.  **计算限制**：求逆矩阵 $H^{-1}$ 的计算复杂度是 $O(n^3)$，即 $(10^8)^3 = 10^{24}$ 次运算，超级计算机也无法在合理时间内完成。

因此，**Answer** 指出：**不去求逆矩阵**，而是将问题转化为求解线性方程组 ** $H\Delta x = -g$ **。
这样做的好处是，可以使用**共轭梯度法（Conjugate Gradient）**等迭代算法，在不显式构建 $H$ 矩阵、也不求逆的情况下，直接解出 $\Delta x$。

---

### 四、 极简示例（2 个参数的例子）

为了直观理解，我们将 1 亿个参数缩小到 2 个参数。

**假设目标函数**：
$$
f(x_1, x_2) = x_1^2 + 3x_2^2
$$
我们想找到让 $f$ 最小的 $x_1$ 和 $x_2$。

#### 1. 计算梯度 $g$（一阶导数）
*   对 $x_1$ 求导：$\frac{\partial f}{\partial x_1} = 2x_1$
*   对 $x_2$ 求导：$\frac{\partial f}{\partial x_2} = 6x_2$

所以梯度向量 $g$ 为：
$$
g = \begin{bmatrix} 2x_1 \\ 6x_2 \end{bmatrix}
$$

#### 2. 计算 Hessian 矩阵 $H$（二阶导数）
*   $\frac{\partial^2 f}{\partial x_1^2} = 2$
*   $\frac{\partial^2 f}{\partial x_1 \partial x_2} = 0$
*   $\frac{\partial^2 f}{\partial x_2 \partial x_1} = 0$
*   $\frac{\partial^2 f}{\partial x_2^2} = 6$

所以 Hessian 矩阵 $H$ 为：
$$
H = \begin{bmatrix} 2 & 0 \\ 0 & 6 \end{bmatrix}
$$
*(这是一个 $2 \times 2$ 的矩阵，对应图片中 $1亿 \times 1亿$ 的缩小版)*

#### 3. 假设当前参数位置
假设我们当前在点 $(x_1, x_2) = (4, 2)$。
代入计算：
*   梯度 $g = \begin{bmatrix} 2 \times 4 \\ 6 \times 2 \end{bmatrix} = \begin{bmatrix} 8 \\ 12 \end{bmatrix}$
*   Hessian $H = \begin{bmatrix} 2 & 0 \\ 0 & 6 \end{bmatrix}$

#### 4. 求解线性方程组 $H \Delta x = -g$
我们要解：
$$
\begin{bmatrix} 2 & 0 \\ 0 & 6 \end{bmatrix} \begin{bmatrix} \Delta x_1 \\ \Delta x_2 \end{bmatrix} = -\begin{bmatrix} 8 \\ 12 \end{bmatrix} = \begin{bmatrix} -8 \\ -12 \end{bmatrix}
$$

展开就是两个简单的方程：
*   $2 \Delta x_1 = -8 \implies \Delta x_1 = -4$
*   $6 \Delta x_2 = -12 \implies \Delta x_2 = -2$

所以，$\Delta x = \begin{bmatrix} -4 \\ -2 \end{bmatrix}$。

#### 5. 更新参数
新的参数 = 旧参数 + $\Delta x$：
*   $x_1^{new} = 4 + (-4) = 0$
*   $x_2^{new} = 2 + (-2) = 0$

**结果**：一步就直接跳到了最小值点 $(0, 0)$。这就是牛顿法（利用 Hessian）比普通梯度下降更快的原因。

#### 6. 对比图片中的“1 亿参数”情况
在这个小例子里，矩阵很小，我们当然可以直接算逆矩阵：
$$
H^{-1} = \begin{bmatrix} 0.5 & 0 \\ 0 & 1/6 \end{bmatrix}
$$
然后算 $\Delta x = -H^{-1}g$，结果一样。

**但在 1 亿参数时：**
*   矩阵 $H$ 是 $1亿 \times 1亿$，内存根本存不下。
*   求逆矩阵 $H^{-1}$ 的计算量是 $O(n^3)$，即 $(10^8)^3 = 10^{24}$ 次运算，超级计算机也算不完。

所以图片里的 **Answer** 说：**不去求逆，而是解线性方程组 $H\Delta x = -g$ **。
在这个 2 参数例子里，解方程组就是简单的除法；在 1 亿参数时，就用**共轭梯度法**等迭代算法，每次只算 $H$ 乘以一个向量（不需要显式构造 $H$），逐步逼近 $\Delta x$ 的解。
