跳至内容
数据科学

Hessian 矩阵:优化及其以外的二阶导数指南

理解 Hessian 矩阵在多元微积分与优化中的作用。了解它如何用于分析曲率、定位临界点,并为机器学习中的算法提供指引。
Vidhi Chugh's photo
Vidhi Chugh
已更新 · 8分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。

当我们谈到优化、模型训练或理解损失曲面的曲率时,通常会想到代价函数和梯度。代价函数解释了模型的表现如何,而梯度作为其一阶导数,指向损失减少最快的方向。不过,梯度只告诉我们斜率,而不是斜率本身如何变化。

这正是常被忽视的 Hessian 矩阵变得重要的地方。它是一个关于标量函数的二阶偏导数组成的方阵,能够刻画梯度如何演化,从而揭示损失曲面的曲率。在数据科学中,它在涉及高级优化算法、模型诊断,以及评估机器学习模型的稳定性和收敛性等任务中尤为关键。

Hessian 矩阵将单变量函数的二阶导数概念推广到多变量情境。它编码了函数的局部曲率信息,用于量化函数在给定点附近如何弯曲。它有助于分析极小值、极大值和鞍点等临界点,并为高级数值优化技术提供指引。

本文重点在于理解 Hessian 矩阵如何帮助把握优化算法的行为以及它们的收敛速度。面对包含许多变量的复杂模型时,它尤为有用。对于熟悉梯度向量和 Jacobian 矩阵的读者,Hessian 是下一步。它告诉您函数在高维空间中的表现。

什么是 Hessian 矩阵?

来看这样一个方程,s a 可二次可微的标量函数:

这意味着该函数可以求二阶导,并返回一个单个数。f 的 Hessian 矩阵,记为 Hf(x),是一个 n × n 的方阵,包含了 f 的所有二阶偏导数。

形式化地,Hessian 矩阵的每个元素定义为:

这意味着 Hessian 告诉我们函数的梯度(一阶导数)相对于每个输入变量如何变化。

如果 f 的所有二阶偏导数在某点的邻域内连续,根据克莱罗定理(也称施瓦茨定理),混合偏导相等,即求导次序不影响结果:

这种对称性意味着在此类情形下 Hessian 矩阵是对称的。

需要强调的是,Hessian 矩阵仅对标量函数定义,也就是返回单个数值的函数。处理向量值函数时,如下:

则二阶导数的概念将扩展为三阶张量而非矩阵。该张量刻画了 F 的每个输出分量如何随每一对输入而变化。

设 Rn -> R 为一个二次可微的标量函数。Hessian 矩阵(f 的)是一个 n × n 矩阵,定义为:

每个元素 Hij 是相应的二阶偏导:

Hessian 矩阵示例

考虑函数:

一阶偏导:

 

二阶偏导:

Hessian 矩阵

在 (x,y) = (1,1) 处求值

判别式

负的判别式意味着该临界点是鞍点。欢迎在我们的课程 Introduction to Optimization in Python 中查看鞍点技术的讲解,了解 Hessian 的实际应用。

下面是在 Python 中实现的相同示例:

import sympy as sp

x, y = sp.symbols('x y')
f = x**3 - 2*x*y - y**6

# Compute gradient
grad_f = [sp.diff(f, var) for var in (x, y)]

# Compute Hessian
hessian_f = sp.hessian(f, (x, y))

# Evaluate at point (1,1)
eval_hessian = hessian_f.subs({x: 1, y: 1})
determinant = eval_hessian.det()

print("Gradient:")
sp.pprint(grad_f)
print("")
print("Hessian matrix:")
sp.pprint(hessian_f)
print("")
print("Hessian at (1,1):")
sp.pprint(eval_hessian)
print("")
print("Discriminant:", determinant)

此代码使用符号求导来计算 Hessian 矩阵,并在特定点进行求值。像 SymPy 这样的工具可作为实用的“Hessian 矩阵计算器”,既适用于教学,也适用于应用研究。

判别式与二阶导数检验

多元情形的二阶导数检验使用 Hessian 矩阵来对临界点进行分类:

设 X0 为满足以下条件的临界点,his is true.

设 Hessian 为

解释取决于 Hessian 的正定性:

  • 正定(所有特征值 > 0):X0 为局部极小值。
  • 负定(所有特征值 < 0):X0 为局部极大值。
  • 不定(特征值有正有负):X0 为鞍点。
  • 奇异(行列式为零):检验无定论。

我们用这四种情形的示例来理解:

import numpy as np
import matplotlib.pyplot as plt
from sympy import symbols, diff, hessian, lambdify

# Define symbols
x, y = symbols('x y')

# List of 4 functions for different discriminant cases
functions = [
    ("x**2 + y**2", "Positive definite (local minimum)"),
    ("-x**2 - y**2", "Negative definite (local maximum)"),
    ("x**2 - y**2", "Indefinite (saddle point)"),
    ("x**4 + y**4", "Zero determinant (inconclusive)")
]

# Prepare plots
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes = axes.ravel()

for i, (func_str, title) in enumerate(functions):
    f = eval(func_str)
    
    # Compute gradients and Hessian
    fx = diff(f, x)
    fy = diff(f, y)
    H = hessian(f, (x, y))
    
    # Evaluate Hessian at (0,0) (critical point for all these functions)
    H0 = H.subs({x: 0, y: 0})
    det_H0 = H0.det()
    fxx0 = H0[0, 0]
    
    # Classification
    if det_H0 > 0 and fxx0 > 0:
        classification = "Local Minimum"
    elif det_H0 > 0 and fxx0 < 0:
        classification = "Local Maximum"
    elif det_H0 < 0:
        classification = "Saddle Point"
    else:
        classification = "Inconclusive"

    # Prepare function for plotting
    f_lamb = lambdify((x, y), f, 'numpy')
    X, Y = np.meshgrid(np.linspace(-2, 2, 100), np.linspace(-2, 2, 100))
    Z = f_lamb(X, Y)

    # Plot
    ax = axes[i]
    cp = ax.contourf(X, Y, Z, levels=50, cmap='coolwarm')
    ax.set_title(f"{title}\n{func_str}\nDet(H)={det_H0}, fxx={fxx0} → {classification}")
    ax.plot(0, 0, 'ko')  # critical point
    fig.colorbar(cp, ax=ax)

plt.tight_layout()
plt.show()

Hessian matrix in Python

在上面的等高线图中,从“蓝色”为最低到“红色”为最高,数值逐渐升高。

该检验是单变量函数二阶导数检验的推广,并常与泰勒级数和凸优化等主题一同讨论。

优化中的 Hessian 矩阵

Hessian 矩阵自然地出现在标量函数的二阶 Taylor 展开中:

这种二次近似使牛顿类方法能够高效地寻找临界点。牛顿法按如下方式更新变量:

在高维情形下,计算和存储完整的 Hessian 代价可能很高。为此,诸如 BFGS 和 L-BFGS 的拟牛顿方法通过梯度差分迭代地近似 Hessian。

此外,Hessian-向量积 Hv 可在不显式计算完整矩阵的情况下,用差分近似得到:

这种近似在利用自动微分的深度学习框架中尤为实用。

在机器学习与数据科学中的应用

在机器学习中,Hessian 矩阵为损失景观的曲率提供洞察:

  • 在神经网络中,分析 Hessian 可以揭示鞍点与平坦区域的存在。
  • 在凸优化问题中,Hessian 有助于验证凸性并为二阶求解器提供指导。
  • 在微调模型时,了解 Hessian 有助于根据局部曲率调整学习率。

除优化外,Hessian 还用于:

  • 统计诊断(例如最大似然估计中的 Fisher 信息矩阵)。
  • 计算机视觉中,如 Hessian 行列式(DoH)斑点检测器用于特征检测。
  • 分子动力学,尤其是在振动谱的正常模分析中。

理解 Hessian 能让从业者超越梯度下降,应用更复杂的算法,如 BFGS,这在诸如 Machine Learning Fundamentals in Python 等课程中使用。这些技术依赖于诸如泰勒级数和矩阵代数等高级微积分主题。

结论

Hessian 矩阵封装了关于标量函数的二阶信息,提供了分析曲率、识别临界点与求解优化问题的有力框架。梯度提供方向,而 Hessian 则细化了对形状与尖锐程度的理解,尤其是在机器学习常见的高维问题中。

对于已熟悉 Jacobian 与梯度的从业者,掌握 Hessian 将更全面地理解算法行为与问题结构。


Vidhi Chugh's photo
Author
Vidhi Chugh
LinkedIn

我是一名 AI 策略与伦理专家,致力于在数据科学、产品与工程的交汇处构建可扩展的机器学习系统。曾入选全球“200 位顶尖商业与技术创新者”之一,我的使命是让机器学习走向大众,打破术语壁垒,让每个人都能参与这场变革。

常见问题

什么是 Hessian 矩阵?它为何在优化中重要?

Hessian 矩阵是一个关于标量函数的二阶偏导数组成的方阵。它刻画函数的曲率,帮助确定临界点的性质,并为优化算法提供指导以实现更好的收敛性。

Hessian 与梯度、Jacobian 有何不同?

梯度提供一阶导数(最陡上升方向),Jacobian 将这一概念扩展到向量值函数;而 Hessian 更进一步,描述梯度本身如何变化,提供关于函数在多维空间中的曲率信息。

Hessian 矩阵在何种情况下是对称的?

当某点邻域内所有二阶偏导连续时,根据克莱罗(或施瓦茨)定理,Hessian 矩阵是对称的。这一对称性有助于简化理论分析与计算。

如何用 Hessian 对临界点进行分类?

使用二阶导数检验:

  • Hessian 正定 → 局部极小值
  • Hessian 负定 → 局部极大值
  • Hessian 不定 → 鞍点
  • 行列式为零 → 检验无定论

能否使用 Python 计算并可视化 Hessian?

可以。像 SymPy 这样的符号数学库可以在特定点计算并评估 Hessian 矩阵。这些工具既适合学习,也适用于数据科学与机器学习中的实际优化任务。

主题
数据科学

与 DataCamp 一起学习

课程

R 数据科学的线性代数

4 小时
21.9K
本课程介绍线性代数,这是支撑数据科学的最重要数学主题之一。
查看详情开始课程

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。
查看更多