理解 “Hessian 为什么是梯度再求导”,实际上就是理解:
一阶导数描述变化率,二阶导数描述变化率的变化。
Hessian 本质上就是把这个思想推广到多变量函数。
我们从最底层一步一步建立概念。
1. 从一元函数开始:为什么二阶导数存在?
假设:
\[y=f(x)
\]
例如:
\[f(x)=x^2
\]
第一次求导
\[f'(x)=2x
\]
它表示:
当 x 改变一点点时,y 怎么变化。
例如:
x=3:
\[f'(3)=6
\]
意思:
在 x=3 附近:
x 增加 1 个单位,
y 大约增加 6 个单位。
所以:
\[f'(x)
\]
描述的是:
\[\boxed{\text{变化速度}}
\]
第二次求导
继续:
\[f''(x)=2
\]
它表示:
\[\boxed{\text{变化速度本身怎么变化}}
\]
也就是:
斜率:
\[f'(x)
\]
有没有变化。
比如:
直线:
\[f(x)=3x
\]
斜率永远:
\[f'(x)=3
\]
所以:
\[f''(x)=0
\]
没有弯曲。
而:
\[f(x)=x^2
\]
斜率:
\[2x
\]
随着 x 增大:
斜率越来越大。
所以:
\[f''(x)=2
\]
表示:
曲线向上弯曲。
2. 多变量函数出现问题
现在:
\[f(x,y)
\]
例如:
\[f(x,y)=x^2+y^2
\]
它不是一条线,而是一张曲面。
![1L]()
![2]()
![3]()
![4]()
我们需要回答:
问题1:
沿 x 方向变化怎么样?
问题2:
沿 y 方向变化怎么样?
问题3:
x 的变化会不会影响 y 方向?
这就需要一个矩阵保存所有信息。
3. 梯度是什么?
对于:
\[f(x,y)
\]
先求一阶偏导:
\[\frac{\partial f}{\partial x}
\]
表示:
固定 y:
只改变 x 时,
函数变化速度。
同理:
\[\frac{\partial f}{\partial y}
\]
表示:
固定 x:
只改变 y 时,
函数变化速度。
把它们放一起:
\[\boxed{
\nabla f=
\begin{bmatrix}
f_x\\
f_y
\end{bmatrix}
}
\]
这就是梯度。
例如:
\[f=x^2+y^2
\]
梯度:
\[\nabla f
=
\begin{bmatrix}
2x\\
2y
\end{bmatrix}
\]
它告诉:
当前位置:
\[(x,y)
\]
坡度最大的方向。
4. 为什么 Hessian 要对梯度求导?
关键来了。
梯度:
\[\nabla f
\]
本身已经是一个函数。
例如:
\[\nabla f
=
\begin{bmatrix}
2x+3y\\
3x+4y
\end{bmatrix}
\]
注意:
它不是一个数。
它是:
\[\text{向量函数}
\]
现在我们问:
梯度随着位置变化,变化得怎么样?
也就是:
梯度的变化率。
这就是:
\[\boxed{
H=\nabla(\nabla f)
}
\]
也就是:
\[\boxed{
H=\nabla^2f
}
\]
5. 为什么得到矩阵?
因为梯度有多个分量。
例如二维:
\[\nabla f=
\begin{bmatrix}
f_x\\
f_y
\end{bmatrix}
\]
现在对它求导。
第一行:
对:
\[f_x
\]
求:
\[x,y
\]
得到:
\[\begin{bmatrix}
\frac{\partial f_x}{\partial x}
&
\frac{\partial f_x}{\partial y}
\end{bmatrix}
\]
第二行:
对:
\[f_y
\]
求:
\[x,y
\]
得到:
\[\begin{bmatrix}
\frac{\partial f_y}{\partial x}
&
\frac{\partial f_y}{\partial y}
\end{bmatrix}
\]
组合:
\[H=
\begin{bmatrix}
\frac{\partial f_x}{\partial x}
&
\frac{\partial f_x}{\partial y}
\\
\frac{\partial f_y}{\partial x}
&
\frac{\partial f_y}{\partial y}
\end{bmatrix}
\]
因为:
\[f_x=\frac{\partial f}{\partial x}
\]
所以:
\[\frac{\partial f_x}{\partial x}
=
\frac{\partial^2f}{\partial x^2}
\]
得到:
\[\boxed{
H=
\begin{bmatrix}
\frac{\partial^2f}{\partial x^2}
&
\frac{\partial^2f}{\partial x\partial y}
\\
\frac{\partial^2f}{\partial y\partial x}
&
\frac{\partial^2f}{\partial y^2}
\end{bmatrix}
}
\]
这就是 Hessian 定义。
6. 每个元素代表什么?
这是理解 Hessian 的核心。
假设:
\[H_{11}
\]
表示:
\[\frac{\partial^2f}{\partial x^2}
\]
意思:
x方向的坡度,随着x变化有多快。
也就是:
x方向弯曲程度。
\[H_{22}
\]
表示:
\[\frac{\partial^2f}{\partial y^2}
\]
意思:
y方向曲率。
重点:
\[H_{12}
\]
表示:
\[\frac{\partial^2f}{\partial x\partial y}
\]
什么意思?
先:
\[\frac{\partial f}{\partial x}
\]
得到:
x方向坡度。
再:
\[\frac{\partial}{\partial y}
\]
问:
当 y 改变时,x方向坡度变化多少?
这就是:
两个方向之间的耦合。
7. 一个直观例子
情况1:
\[f=x^2+y^2
\]
梯度:
\[\nabla f=
\begin{bmatrix}
2x\\
2y
\end{bmatrix}
\]
Hessian:
\[H=
\begin{bmatrix}
2&0\\
0&2
\end{bmatrix}
\]
为什么没有交叉项?
因为:
x变化不会影响y方向。
所以:
\[H_{12}=0
\]
情况2:
\[f=x^2+xy+y^2
\]
梯度:
\[\nabla f=
\begin{bmatrix}
2x+y\\
x+2y
\end{bmatrix}
\]
Hessian:
\[H=
\begin{bmatrix}
2&1\\
1&2
\end{bmatrix}
\]
出现:
\[H_{12}=1
\]
表示:
x和y有关联。
8. 从机器学习角度理解
神经网络:
\[Loss=L(w_1,w_2,...,w_n)
\]
梯度:
\[\nabla L
\]
告诉:
每个参数应该往哪里调整。
但是梯度不知道:
参数之间是否互相影响。
Hessian:
\[H=
\nabla^2L
\]
告诉:
\[\frac{\partial^2L}
{\partial w_i\partial w_j}
\]
也就是:
修改参数 (w_i),会不会改变参数 (w_j) 的梯度。
所以:
梯度:
当前位置坡度
Hessian:
坡度地图
9. 最终建立一个数学层次
从低到高:
\[f(x)
\]
函数:
地形高度
↓
\[\nabla f
\]
梯度:
地形坡度方向
↓
\[\nabla^2f
\]
Hessian:
坡度如何变化,即曲率
↓
\[H的特征值
\]
每个主方向上的弯曲程度
所以一句话总结:
\[\boxed{
\text{Hessian 是梯度的导数,因为梯度本身是一个向量函数;求梯度的变化率,就必须对梯度再次求导。}
}
\]
从几何上:
\[\boxed{
\text{梯度描述“一阶方向”,Hessian描述“方向变化”。}
}
\]
这也是为什么牛顿法:
\[\Delta x=-H^{-1}\nabla f
\]
比普通梯度下降更聪明:它不仅知道“往哪里走”,还知道“地面有多弯”。
几个例子
前面我们从梯度(gradient)→ 方向导数 → 梯度下降讨论过一阶信息。Hessian 矩阵就是进一步研究:
梯度变化的速度和方向。
如果说梯度告诉我们:
“现在往哪里走下降最快?”
那么 Hessian 告诉我们:
“这个下降方向附近,地形弯曲程度如何?”
在机器学习、深度学习优化中,Hessian 是理解二阶优化、牛顿法、损失函数曲率、正定矩阵的核心。
1. 二元函数最简单的 Hessian
先从:
\[f(x,y)=x^2+3xy+2y^2
\]
开始。
第一步:求梯度
梯度:
\[\nabla f=
\begin{bmatrix}
\frac{\partial f}{\partial x}\\
\frac{\partial f}{\partial y}
\end{bmatrix}
\]
分别求:
\[\frac{\partial f}{\partial x}=2x+3y
\]
\[\frac{\partial f}{\partial y}=3x+4y
\]
所以:
\[\nabla f=
\begin{bmatrix}
2x+3y\\
3x+4y
\end{bmatrix}
\]
第二步:求 Hessian
Hessian 是梯度再求导:
\[H=
\nabla^2 f
\]
也就是:
\[H=
\begin{bmatrix}
\frac{\partial^2 f}{\partial x^2}
&
\frac{\partial^2 f}{\partial x\partial y}
\\
\frac{\partial^2 f}{\partial y\partial x}
&
\frac{\partial^2 f}{\partial y^2}
\end{bmatrix}
\]
计算:
左上:
\[\frac{\partial}{\partial x}(2x+3y)=2
\]
左下:
\[\frac{\partial}{\partial y}(2x+3y)=3
\]
右上:
\[\frac{\partial}{\partial x}(3x+4y)=3
\]
右下:
\[\frac{\partial}{\partial y}(3x+4y)=4
\]
因此:
\[\boxed{
H=
\begin{bmatrix}
2&3\\
3&4
\end{bmatrix}
}
\]
这个 Hessian 表示什么?
注意:
\[H=
\begin{bmatrix}
2&3\\
3&4
\end{bmatrix}
\]
其中:
对角元素
\[H_{11}=2
\]
表示:
沿 x 方向:
\[\frac{\partial^2 f}{\partial x^2}=2
\]
曲率。
\[H_{22}=4
\]
表示:
沿 y 方向曲率更大。
所以 y 方向比 x 方向更陡。
非对角元素
\[H_{12}=H_{21}=3
\]
表示:
x 和 y 之间存在耦合。
也就是说:
改变 x 会影响 y 方向梯度。
这就是为什么:
\[xy
\]
这种交叉项会出现在 Hessian 非对角位置。
2. 三维函数 Hessian
考虑:
\[f(x,y,z)
=
x^2y+yz^2+\sin(xz)
\]
这是更接近机器学习中的复杂形式。
第一步:梯度
对 x:
\[f_x
=
2xy+z\cos(xz)
\]
因为:
\[\frac{\partial}{\partial x}\sin(xz)
=
z\cos(xz)
\]
对 y:
\[f_y=x^2+z^2
\]
对 z:
\[f_z
=
y2z+x\cos(xz)
\]
所以:
\[\nabla f=
\begin{bmatrix}
2xy+z\cos(xz)
\\
x^2+z^2
\\
2yz+x\cos(xz)
\end{bmatrix}
\]
第二步: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}
\]
计算:
第一行
\[f_{xx}
=
2y-z^2\sin(xz)
\]
\[f_{xy}=2x
\]
\[f_{xz}
=
\cos(xz)-xz\sin(xz)
\]
第二行
\[f_{yx}=2x
\]
\[f_{yy}=0
\]
\[f_{yz}=2z
\]
第三行
\[f_{zx}
=
\cos(xz)-xz\sin(xz)
\]
\[f_{zy}=2z
\]
\[f_{zz}
=
2y-x^2\sin(xz)
\]
所以:
\[\boxed{
H=
\begin{bmatrix}
2y-z^2\sin(xz)
&
2x
&
\cos(xz)-xz\sin(xz)
\\
2x
&
0
&
2z
\\
\cos(xz)-xz\sin(xz)
&
2z
&
2y-x^2\sin(xz)
\end{bmatrix}
}
\]
这个 Hessian 告诉我们:
1. x方向曲率
\[H_{11}
=
2y-z^2\sin(xz)
\]
不是固定值。
说明:
不同位置,地形不同。
2. y方向
\[H_{22}=0
\]
说明:
函数关于 y 是线性的。
3. x-z 耦合
\[H_{13}
=
\cos(xz)-xz\sin(xz)
\]
说明:
x 和 z 的变化强烈相关。
3. 神经网络中的 Hessian(更重要)
假设一个最简单神经元:
\[y=w_1x_1+w_2x_2
\]
损失:
\[L=
(y-t)^2
\]
令:
\[e=w_1x_1+w_2x_2-t
\]
则:
\[L=e^2
\]
梯度:
\[\nabla L
=
\begin{bmatrix}
2ex_1\\
2ex_2
\end{bmatrix}
\]
Hessian:
\[H=
\begin{bmatrix}
\frac{\partial^2L}{\partial w_1^2}
&
\frac{\partial^2L}{\partial w_1\partial w_2}
\\
\frac{\partial^2L}{\partial w_2\partial w_1}
&
\frac{\partial^2L}{\partial w_2^2}
\end{bmatrix}
\]
计算:
\[\frac{\partial^2L}{\partial w_1^2}
=
2x_1^2
\]
\[\frac{\partial^2L}{\partial w_2^2}
=
2x_2^2
\]
交叉:
\[\frac{\partial^2L}{\partial w_1\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}
}
\]
这就是机器学习里面常见的 Hessian 结构。
注意:
\[H=X^TX
\]
类似最小二乘中的矩阵。
4. Hessian 与正定矩阵关系
判断一个点是不是极小值:
看 Hessian。
例如:
\[H=
\begin{bmatrix}
4&0\\
0&2
\end{bmatrix}
\]
两个特征值:
\[\lambda_1=4
\]
\[\lambda_2=2
\]
全部:
\[>0
\]
所以:
\[H\succ0
\]
正定。
意味着:
/
/
____/____
/
/
碗形最低点。
如果:
\[H=
\begin{bmatrix}
4&0\\
0&-2
\end{bmatrix}
\]
一个正,一个负:
\[\lambda_1>0,\lambda_2<0
\]
说明:
一个方向向上,一个方向向下。
这是:
\[\text{鞍点}
\]
5. 在深度学习中的现实意义
神经网络参数:
\[\theta=
(w_1,w_2,...,w_n)
\]
损失:
\[L(\theta)
\]
那么:
梯度:
\[\nabla L
\]
大小:
\[n\times1
\]
告诉:
参数调整方向。
Hessian:
\[H=
\nabla^2L
\]
大小:
\[n\times n
\]
告诉:
每个参数之间如何相互影响。
例如:
\[H_{ij}
=
\frac{\partial^2L}
{\partial w_i\partial w_j}
\]
表示:
改变:
\[w_i
\]
是否影响:
\[w_j
\]
一个重要总结
可以建立这样的层次:
| 数学对象 |
回答的问题 |
几何意义 |
| 函数 (f(x)) |
高度是多少? |
地形 |
| 一阶导数 (f') |
变化多快? |
坡度 |
| 梯度 (\nabla f) |
往哪里升最快? |
方向箭头 |
| Hessian (\nabla^2f) |
坡度如何变化? |
曲率 |
| 特征值 |
曲率大小 |
地形弯曲程度 |
| 正定 Hessian |
所有方向向上 |
极小值 |
| 负定 Hessian |
所有方向向下 |
极大值 |
从深度学习角度看:
梯度下降是一阶优化,只看“方向”;牛顿法是二阶优化,通过 Hessian 感知“地形弯曲”,因此能更聪明地决定步长。
下一步如果继续深入,最值得学习的是:
\[\boxed{\Delta x=-H^{-1}\nabla f}
\]
这个公式就是牛顿法,它把你前面学习的:
梯度 + Hessian + 正定矩阵 + 特征值
全部连接起来。