← 返回《人工智能数学基础》
📑 查看全课大纲(第 83 / 93 节)
  1. 1.概论和集合的定义
  2. 2.逼疯康托的实数集理论
  3. 3.常用不等式与映射
  4. 4.函数及特殊函数
  5. 5.序列极限的定义
  6. 6.序列极限的性质与夹逼定理
  7. 7.重要极限
  8. 8.无穷小量,无穷大量和一组重要的阶的比较关系
  9. 9.聚点原理
  10. 10.函数极限及其性质
  11. 11.重要极限与等价无穷小
  12. 12.连续函数
  13. 13.导数的概念(那些年,扛起牛顿的胡克)
  14. 14.定义法求导
  15. 15.函数四则运算的导数与反函数求导法则
  16. 16.复合函数,隐函数,参数式求导
  17. 17.不定式求导之“洛必达与伯努利的师生情”
  18. 18.一阶微分
  19. 19.高阶导数
  20. 20.高阶微分
  21. 21.罗尔中值定理与拉格朗日中值定理
  22. 22.柯西空降科学院遭排挤
  23. 23.泰勒公式与泰勒的克妻属性
  24. 24.利用泰勒展开唯一性定理计算泰勒展开
  25. 25.泰勒公式的余项估计
  26. 26.极值问题与导数
  27. 27.函数凹凸性
  28. 28.无卵用的渐近线与函数作图
  29. 29.不定积分的定义
  30. 30.第一换元法
  31. 31.第二换元法
  32. 32.分部积分法
  33. 33.有理式积分
  34. 34.三角替换
  35. 35.定积分的概念
  36. 36.定积分的性质与积分中值定理
  37. 37.变上限定积分
  38. 38.微积分基本定理之“高斯教你如何优雅地装逼”
  39. 39.定积分的换元法
  40. 40.奇偶函数与周期函数的定积分
  41. 41.曲线求长与不可求长曲线(海岸线居然算不出长度?)
  42. 42.旋转体体积
  43. 43.旋转体侧面积
  44. 44.极坐标下图形的面积(数学系常用表白曲线)
  45. 45.欧式空间
  46. 46.点列极限,开集与闭集
  47. 47.多元函数的定义
  48. 48.多元函数的极限
  49. 49.多元连续函数
  50. 50.一阶偏导数
  51. 51.高阶偏导数
  52. 52.全微分
  53. 53.方向导数与梯度
  54. 54.链式法则
  55. 55.一阶全微分形式的不变性与高阶微分
  56. 56.多元函数的泰勒公式
  57. 57.隐函数存在定理与逆映射存在定理
  58. 58.多元函数的极值
  59. 59.矩阵基础知识
  60. 60.行列式的定义与特殊矩阵的行列式
  61. 61.行列式的性质
  62. 62.行列式按k行展开
  63. 63.线性方程组初步与高斯消元法
  64. 64.齐次线性方程组与Cramer法则
  65. 65.线性空间
  66. 66.线性相关与线性无关
  67. 67.向量组的秩
  68. 68.矩阵的秩与线性方程组有解的充要条件
  69. 69.齐次线性方程组的解集结构
  70. 70.非齐次线性方程组解集结构
  71. 71.基与维数
  72. 72.矩阵的乘法
  73. 73.特殊矩阵
  74. 74.矩阵乘积的秩与行列式
  75. 75.矩阵的逆
  76. 76.正交矩阵
  77. 77.矩阵对角化与特征值特征向量
  78. 78.实对称矩阵对角化
  79. 79.二次型与正定矩阵
  80. 80.LU分解
  81. 81.Cholesky分解
  82. 82.SVD分解
  83. 83.线搜索
  84. 84.步长
  85. 85.最速下降法和牛顿法
  86. 86.共轭梯度法
  87. 87.拟牛顿法
  88. 88.无约束优化
  89. 89.若干知识点补充(一)
  90. 90.若干知识点补充(二)
  91. 91.凸优化问题
  92. 92.对偶问题(一)
  93. 93.对偶问题(二)

线搜索

约 21 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

无约束优化与线搜索方法

小象实战讲义 · 人工智能数学基础

在人工智能与机器学习的核心算法中,无论是训练神经网络还是拟合模型参数,最终都归结为一个寻找函数最优解的问题。本节我们将正式进入最优化领域,从无约束优化问题的定义出发,理解局部最优与全局最优的区别与联系,并掌握求解这类问题的基本思路—线搜索方法。学完本节,你将能够清晰地描述一个优化问题的构成,并理解梯度下降、牛顿法等经典算法的底层逻辑。

💡 核心导读

本节将围绕以下要点展开,为你构建清晰的知识地图:

  1. 问题定义:明确什么是无约束优化问题,理解光滑函数假设的必要性及其局限性。
  2. 最优解辨析:区分全局最优点与局部极小值点,认识非凸优化问题的普遍性与挑战。
  3. 最优性条件:回顾并运用一阶、二阶必要条件与充分条件来判断候选点是否为极值点。
  4. 凸函数的特权:理解凸函数下局部极小即全局最小的优良性质,认识其在优化中的特殊地位。
  5. 线搜索框架:掌握线搜索方法的核心迭代公式 xk+1=xk+αkpkx_{k+1} = x_k + \alpha_k p_k,理解下降方向判据 f(xk)Tpk<0\nabla f(x_k)^T p_k < 0 的几何意义,并了解最速下降法、牛顿法与拟牛顿法在选择搜索方向上的本质区别。

无约束优化问题

在数学上,一个无约束优化问题通常表述为:给定一个目标函数 f(x)f(x),其中 xRnx \in \mathbb{R}^n(或其定义域的子集),我们希望找到一点 xx^,使得函数值 f(x)f(x^) 最小。即:

minxRnf(x)\min_{x \in \mathbb{R}^n} f(x)

我们的任务是同时找到这个最优解 xx^ 和对应的最优函数值 f(x)f(x^)

为了便于理论分析和算法设计,我们通常对目标函数 ff 做出一个较强的假设:ff 是一个光滑函数。这意味着至少 ff 的一阶导数(梯度)是存在的。在机器学习的大多数场景中,这个假设是合理的,因为许多损失函数(如均方误差、交叉熵)都是可微的。没有一阶导数,像梯度下降、牛顿法等基于导数的经典算法就无法应用。当然,现实世界也存在大量不连续或不可微的函数,针对它们有专门的优化理论(如次梯度法、进化算法),这超出了本节的基础范畴。

全局最优与局部最优

对于一个最优解 xx^*,我们根据其最优性的范围进行区分:

  • 全局最优点:如果对于定义域内所有可行的 xx,都有 f(x)f(x)f(x^) \le f(x),则称 xx^ 为全局最优点(全局最小值点)。
  • 局部极小值点:如果存在 xx^ 的一个邻域,使得在该邻域内所有点 xx 都满足 f(x)f(x)f(x^) \le f(x),则称 xx^* 为局部极小值点。

这与数学分析中“最小值点”和“极小值点”的概念完全对应,前者是整体性质,后者是局部性质。

理想情况下,我们总希望找到全局最优解。然而,对于复杂的非凸函数,其函数曲面可能非常曲折,存在大量“局部极小值点”和“鞍点”,而全局最优点可能深藏其中。在机器学习中,即使是简单的手写数字识别任务,其神经网络的损失函数曲面也常呈现这种复杂形态,使得寻找全局最优变得极其困难。

因此,在实践中,我们往往退而求其次,转而寻找局部极小值点。那么,在什么情况下局部极小就是全局最小呢?答案是:当函数是凸函数时。凸函数具有“局部极小即全局最小”的优良性质,这使得凸优化问题在理论上和计算上都更为友好。遗憾的是,现实中的多数问题都是非凸的。

最优性条件

如何判断一个点 xx^ 是否是局部极小值点呢?我们回顾数学分析中的经典条件。以下假设 ffxx^ 处具有所需的可微性。

  1. 一阶必要条件:若 xx^ 是局部极小值点,且 ffxx^ 处一阶可导,则梯度必须为零向量。 f(x)=0\nabla f(x^*) = 0 满足此条件的点称为驻点临界点

  2. 二阶必要条件:若 xx^ 是局部极小值点,且 ffxx^ 处二阶连续可导(即 Hessian 矩阵存在且连续),则在一阶条件 f(x)=0\nabla f(x^) = 0 满足的前提下,Hessian 矩阵 2f(x)\nabla^2 f(x^) 必须是半正定的。 2f(x)0\nabla^2 f(x^*) \succeq 0

  3. 二阶充分条件:若 ffxx^ 处二阶连续可导,且满足 f(x)=0\nabla f(x^) = 0,同时 Hessian 矩阵 2f(x)\nabla^2 f(x^) 正定,则 xx^ 是一个严格的局部极小值点。 2f(x)0\nabla^2 f(x^*) \succ 0

  4. 凸函数的特权

  • ff 是凸函数,则它的任何一个局部极小值点都是全局最小值点。
  • ff 是可导的凸函数,则满足 f(x)=0\nabla f(x^) = 0 的驻点 xx^ 就是全局最小值点。

对于非凸问题,我们通常从寻找驻点(一阶条件)入手,并利用二阶条件判断其是否为局部极小。

线搜索方法框架

由于直接求解 f(x)=0\nabla f(x) = 0 的解析解通常不可行,我们采用迭代算法。线搜索方法是最主流的迭代框架之一,其核心思想是:构造一个序列 {xk}{x_k},使其收敛到最优解 xx^*。每次迭代的更新公式为:

xk+1=xk+αkpkx_{k+1} = x_k + \alpha_k p_k

其中:

  • pkp_k 是第 kk 步的搜索方向
  • αk>0\alpha_k > 0 是第 kk 步的步长(或学习率)。

算法的有效性完全取决于如何选择 pkp_kαk\alpha_k

下降方向

首先,搜索方向 pkp_k 必须是一个下降方向,以确保函数值有下降的可能。下降方向的数学判据为:

f(xk)Tpk<0\nabla f(x_k)^T p_k < 0

这个不等式的几何意义非常深刻。回忆梯度 f(xk)\nabla f(x_k) 的方向是函数在该点上升最快的方向。两个向量的点积 f(xk)Tpk=f(xk)pkcosθ\nabla f(x_k)^T p_k = |\nabla f(x_k)| |p_k| \cos \theta,其中 θ\theta 是两者的夹角。点积小于零等价于 cosθ<0\cos \theta < 0,即夹角 θ\theta 大于 9090^\circ。这意味着搜索方向 pkp_k 与梯度方向的夹角超过 9090^\circ,大致指向函数值下降的半球区域。

通用形式与经典算法

许多线搜索方法中,搜索方向 pkp_k 可以表示为如下通用形式:

pk=Bk1f(xk)p_k = -B_k^{-1} \nabla f(x_k)

其中 BkB_k 是一个对称正定矩阵。不同的算法体现在 BkB_k 的不同选择上:

  1. 最速下降法:取 Bk=IB_k = I(单位矩阵)。此时 pk=f(xk)p_k = -\nabla f(x_k),即负梯度方向。这是函数值下降最快的局部方向,故得名。 pkSD=f(xk)p_k^{\text{SD}} = -\nabla f(x_k)

  2. 牛顿法:取 Bk=2f(xk)B_k = \nabla^2 f(x_k),即当前点的 Hessian 矩阵。此时 pk=[2f(xk)]1f(xk)p_k = -[\nabla^2 f(x_k)]^{-1} \nabla f(x_k)。牛顿法利用了函数的二阶曲率信息,在驻点附近通常具有更快的收敛速度。 pkNewton=[2f(xk)]1f(xk)p_k^{\text{Newton}} = -[\nabla^2 f(x_k)]^{-1} \nabla f(x_k)

  3. 拟牛顿法:牛顿法需要计算并求逆 Hessian 矩阵,计算成本高。拟牛顿法(如 DFP、BFGS 算法)通过迭代方式构造一个矩阵 HkH_k 来近似 [2f(xk)]1[\nabla^2 f(x_k)]^{-1},从而避免直接求逆。 pkQN=Hkf(xk),Hk[2f(xk)]1p_k^{\text{QN}} = -H_k \nabla f(x_k), \quad H_k \approx [\nabla^2 f(x_k)]^{-1}

算法框架

一个典型的线搜索算法框架如下:

  1. 初始化起点 x0x_0,设置精度要求 ϵ\epsilon,令 k=0k=0
  2. while f(xk)>ϵ|\nabla f(x_k)| > \epsilon do
  3.     确定下降方向 pkp_k(例如,采用上述某种方法)。
  4.     验证下降条件:确保 f(xk)Tpk<0\nabla f(x_k)^T p_k < 0
  5.     确定步长 αk\alpha_k(可通过精确线搜索或 Armijo、Wolfe 等非精确线搜索准则)。
  6.     更新迭代点:xk+1=xk+αkpkx_{k+1} = x_k + \alpha_k p_k
  7.      kk+1k \leftarrow k + 1
  8. end while

步长 αk\alpha_k 的选择同样关键,好的步长能在保证下降的前提下加速收敛。

import numpy as np
import matplotlib.pyplot as plt

# 定义目标函数:Rosenbrock函数,一个经典的非凸优化测试函数
def rosenbrock(x):
    """Rosenbrock函数,f(x,y) = (a-x)^2 + b*(y-x^2)^2, 通常取a=1, b=100"""
    a, b = 1, 100
    return (a - x[0])**2 + b * (x[1] - x[0]**2)**2

# 定义梯度
def rosenbrock_grad(x):
    a, b = 1, 100
    df_dx = -2*(a - x[0]) - 4*b * x[0] * (x[1] - x[0]**2)
    df_dy = 2*b * (x[1] - x[0]**2)
    return np.array([df_dx, df_dy])

# 定义Hessian矩阵
def rosenbrock_hessian(x):
    a, b = 1, 100
    df_dx2 = 2 - 4*b*(x[1] - x[0]**2) + 8*b*x[0]**2
    df_dxdy = -4*b*x[0]
    df_dy2 = 2*b
    return np.array([[df_dx2, df_dxdy], [df_dxdy, df_dy2]])

# 实现最速下降法
def steepest_descent(x0, grad_func, max_iter=10000, lr=0.001, tol=1e-6):
    x = x0.copy()
    path = [x0.copy()]
    for i in range(max_iter):
        g = grad_func(x)
        if np.linalg.norm(g) < tol:
            break
        # 搜索方向:负梯度
        p = -g
        # 固定步长更新
        x = x + lr * p
        path.append(x.copy())
    return np.array(path), i

# 实现牛顿法
def newton_method(x0, grad_func, hess_func, max_iter=100, tol=1e-6):
    x = x0.copy()
    path = [x0.copy()]
    for i in range(max_iter):
        g = grad_func(x)
        if np.linalg.norm(g) < tol:
            break
        H = hess_func(x)
        # 搜索方向:-H^{-1} * g
        p = -np.linalg.solve(H, g) # 解线性方程组,避免直接求逆
        # 固定步长为1(经典牛顿法)
        x = x + p
        path.append(x.copy())
    return np.array(path), i

# 运行两种方法
x0 = np.array([-1.5, 2.0]) # 非平凡的初始点
path_sd, iter_sd = steepest_descent(x0, rosenbrock_grad, lr=0.001, max_iter=20000)
path_nt, iter_nt = newton_method(x0, rosenbrock_grad, rosenbrock_hessian, max_iter=50)

print(f"最速下降法:从 {x0} 出发,经过 {iter_sd} 次迭代,终点 {path_sd[-1].round(4)}")
print(f"牛顿法:从 {x0} 出发,经过 {iter_nt} 次迭代,终点 {path_nt[-1].round(4)}")
print(f"理论全局最优点: [1, 1]")

# 可视化优化路径 (在等高线图上)
x = np.linspace(-2, 2, 400)
y = np.linspace(-1, 3, 400)
X, Y = np.meshgrid(x, y)
Z = rosenbrock([X, Y])

plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.contour(X, Y, Z, levels=np.logspace(-0.5, 3.5, 20), cmap='viridis')
plt.plot(path_sd[:, 0], path_sd[:, 1], 'ro-', markersize=3, linewidth=0.8, label=f'最速下降 ({iter_sd} iter)')
plt.plot(x0[0], x0[1], 'bs', label='起点')
plt.plot(1, 1, 'g*', markersize=15, label='最优点 (1,1)')
plt.xlabel('x')
plt.ylabel('y')
plt.title('最速下降法优化路径')
plt.legend()
plt.axis('equal')

plt.subplot(1, 2, 2)
plt.contour(X, Y, Z, levels=np.logspace(-0.5, 3.5, 20), cmap='viridis')
plt.plot(path_nt[:, 0], path_nt[:, 1], 'mo-', markersize=5, linewidth=1, label=f'牛顿法 ({iter_nt} iter)')
plt.plot(x0[0], x0[1], 'bs', label='起点')
plt.plot(1, 1, 'g*', markersize=15, label='最优点 (1,1)')
plt.xlabel('x')
plt.ylabel('y')
plt.title('牛顿法优化路径')
plt.legend()
plt.axis('equal')
plt.tight_layout()
plt.show()

📝 动手练一练

  1. 下降方向判断:设函数 f(x,y)=x2+3y2f(x, y) = x^2 + 3y^2 在点 (1,1)(1, 1) 处。 a) 计算该点的梯度 f(1,1)\nabla f(1, 1)。 b) 判断向量 p1=(1,1)\mathbf{p}_1 = (-1, -1)p2=(1,2)\mathbf{p}_2 = (1, -2) 是否为该点处的下降方向?请用下降方向判据说明。

  2. 驻点与极值点分析:考虑单变量函数 f(x)=x33xf(x) = x^3 - 3x。 a) 求其所有驻点(即满足 f(x)=0f’(x)=0 的点)。 b) 利用二阶导数判断这些驻点是局部极小点、局部极大点还是鞍点。 c) 这个函数是凸函数吗?它的局部极小点是全局最小点吗?

参考答案:

  1. a) 梯度 f=(2x,6y)\nabla f = (2x, 6y),故 f(1,1)=(2,6)\nabla f(1,1) = (2, 6)。 b) 对于 p1=(1,1)\mathbf{p}_1 = (-1, -1)fp1=(2,6)(1,1)=26=8<0\nabla f \cdot \mathbf{p}_1 = (2,6)\cdot(-1,-1) = -2-6 = -8 < 0是下降方向。 对于 p2=(1,2)\mathbf{p}_2 = (1, -2)fp2=(2,6)(1,2)=212=10<0\nabla f \cdot \mathbf{p}_2 = (2,6)\cdot(1,-2) = 2-12 = -10 < 0是下降方向

  2. a) f(x)=3x23f’(x) = 3x^2 - 3,令 f(x)=0f’(x)=0x2=1x^2=1,故驻点为 x=1x = 1x=1x = -1。 b) f(x)=6xf”(x) = 6x。在 x=1x=1 处,f(1)=6>0f”(1)=6>0,故 x=1x=1局部极小点。在 x=1x=-1 处,f(1)=6<0f”(-1)=-6<0,故 x=1x=-1局部极大点。 c) 二阶导数 f(x)=6xf”(x)=6x 在定义域 R\mathbb{R} 上不恒大于等于零(例如当 x<0x<0 时),因此 f(x)f(x) 不是凸函数。其局部极小点 x=1x=1 对应的函数值 f(1)=2f(1)=-2,但当 xx \to -\infty 时,f(x)f(x) \to -\infty,存在更小的函数值,所以该局部极小点不是全局最小点

本章小结

本节我们建立了最优化问题的基本认知框架:

  • 问题核心:无约束优化旨在最小化一个光滑函数 f(x)f(x)
  • 现实困境:非凸问题的全局最优解难以获取,实践中多寻求局部极小解。
  • 判断依据:利用一阶必要条件(梯度为零)找驻点,结合二阶条件(Hessian 正定)判断是否为局部极小。
  • 理想情形:对于凸函数,局部极小即全局最小,优化问题大大简化。
  • 求解框架:线搜索方法通过迭代公式 xk+1=xk+αkpkx_{k+1} = x_k + \alpha_k p_k 逼近解,其核心是选择下降方向 (fTpk<0\nabla f^T p_k < 0) 与合适步长。最速下降法、牛顿法等经典算法的区别本质在于搜索方向 pkp_k 的构造方式不同。

行动清单 学完本节,你可以立即:

  1. 辨析概念:面对一个优化问题,能清晰区分其目标是寻找全局最优还是局部最优,并判断目标函数的凸性是否能为求解带来便利。
  2. 应用条件:给定一个候选点,能够运用一阶和二阶最优性条件,判断其是否为局部极值点。
  3. 理解算法:阅读梯度下降等优化算法的代码时,能识别出其对应的线搜索框架,并理解其中方向与步长更新的数学原理。

— 小象教研组

配套学习资源与课件
  • 第11章讲义(含板书):最优化(PDF · 4.3MB)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加课程顾问,免费获取网盘下载链接
微信二维码:扫码添加课程顾问微信扫码添加顾问