📑 查看全课大纲(第 83 / 93 节)
- 1.概论和集合的定义
- 2.逼疯康托的实数集理论
- 3.常用不等式与映射
- 4.函数及特殊函数
- 5.序列极限的定义
- 6.序列极限的性质与夹逼定理
- 7.重要极限
- 8.无穷小量,无穷大量和一组重要的阶的比较关系
- 9.聚点原理
- 10.函数极限及其性质
- 11.重要极限与等价无穷小
- 12.连续函数
- 13.导数的概念(那些年,扛起牛顿的胡克)
- 14.定义法求导
- 15.函数四则运算的导数与反函数求导法则
- 16.复合函数,隐函数,参数式求导
- 17.不定式求导之“洛必达与伯努利的师生情”
- 18.一阶微分
- 19.高阶导数
- 20.高阶微分
- 21.罗尔中值定理与拉格朗日中值定理
- 22.柯西空降科学院遭排挤
- 23.泰勒公式与泰勒的克妻属性
- 24.利用泰勒展开唯一性定理计算泰勒展开
- 25.泰勒公式的余项估计
- 26.极值问题与导数
- 27.函数凹凸性
- 28.无卵用的渐近线与函数作图
- 29.不定积分的定义
- 30.第一换元法
- 31.第二换元法
- 32.分部积分法
- 33.有理式积分
- 34.三角替换
- 35.定积分的概念
- 36.定积分的性质与积分中值定理
- 37.变上限定积分
- 38.微积分基本定理之“高斯教你如何优雅地装逼”
- 39.定积分的换元法
- 40.奇偶函数与周期函数的定积分
- 41.曲线求长与不可求长曲线(海岸线居然算不出长度?)
- 42.旋转体体积
- 43.旋转体侧面积
- 44.极坐标下图形的面积(数学系常用表白曲线)
- 45.欧式空间
- 46.点列极限,开集与闭集
- 47.多元函数的定义
- 48.多元函数的极限
- 49.多元连续函数
- 50.一阶偏导数
- 51.高阶偏导数
- 52.全微分
- 53.方向导数与梯度
- 54.链式法则
- 55.一阶全微分形式的不变性与高阶微分
- 56.多元函数的泰勒公式
- 57.隐函数存在定理与逆映射存在定理
- 58.多元函数的极值
- 59.矩阵基础知识
- 60.行列式的定义与特殊矩阵的行列式
- 61.行列式的性质
- 62.行列式按k行展开
- 63.线性方程组初步与高斯消元法
- 64.齐次线性方程组与Cramer法则
- 65.线性空间
- 66.线性相关与线性无关
- 67.向量组的秩
- 68.矩阵的秩与线性方程组有解的充要条件
- 69.齐次线性方程组的解集结构
- 70.非齐次线性方程组解集结构
- 71.基与维数
- 72.矩阵的乘法
- 73.特殊矩阵
- 74.矩阵乘积的秩与行列式
- 75.矩阵的逆
- 76.正交矩阵
- 77.矩阵对角化与特征值特征向量
- 78.实对称矩阵对角化
- 79.二次型与正定矩阵
- 80.LU分解
- 81.Cholesky分解
- 82.SVD分解
- 83.线搜索
- 84.步长
- 85.最速下降法和牛顿法
- 86.共轭梯度法
- 87.拟牛顿法
- 88.无约束优化
- 89.若干知识点补充(一)
- 90.若干知识点补充(二)
- 91.凸优化问题
- 92.对偶问题(一)
- 93.对偶问题(二)
线搜索
约 21 分钟
无约束优化与线搜索方法
小象实战讲义 · 人工智能数学基础
在人工智能与机器学习的核心算法中,无论是训练神经网络还是拟合模型参数,最终都归结为一个寻找函数最优解的问题。本节我们将正式进入最优化领域,从无约束优化问题的定义出发,理解局部最优与全局最优的区别与联系,并掌握求解这类问题的基本思路—线搜索方法。学完本节,你将能够清晰地描述一个优化问题的构成,并理解梯度下降、牛顿法等经典算法的底层逻辑。
💡 核心导读
本节将围绕以下要点展开,为你构建清晰的知识地图:
- 问题定义:明确什么是无约束优化问题,理解光滑函数假设的必要性及其局限性。
- 最优解辨析:区分全局最优点与局部极小值点,认识非凸优化问题的普遍性与挑战。
- 最优性条件:回顾并运用一阶、二阶必要条件与充分条件来判断候选点是否为极值点。
- 凸函数的特权:理解凸函数下局部极小即全局最小的优良性质,认识其在优化中的特殊地位。
- 线搜索框架:掌握线搜索方法的核心迭代公式 ,理解下降方向判据 的几何意义,并了解最速下降法、牛顿法与拟牛顿法在选择搜索方向上的本质区别。
无约束优化问题
在数学上,一个无约束优化问题通常表述为:给定一个目标函数 ,其中 (或其定义域的子集),我们希望找到一点 ,使得函数值 ) 最小。即:
我们的任务是同时找到这个最优解 和对应的最优函数值 )。
为了便于理论分析和算法设计,我们通常对目标函数 做出一个较强的假设: 是一个光滑函数。这意味着至少 的一阶导数(梯度)是存在的。在机器学习的大多数场景中,这个假设是合理的,因为许多损失函数(如均方误差、交叉熵)都是可微的。没有一阶导数,像梯度下降、牛顿法等基于导数的经典算法就无法应用。当然,现实世界也存在大量不连续或不可微的函数,针对它们有专门的优化理论(如次梯度法、进化算法),这超出了本节的基础范畴。
全局最优与局部最优
对于一个最优解 ,我们根据其最优性的范围进行区分:
- 全局最优点:如果对于定义域内所有可行的 ,都有 ) \le f(x),则称 为全局最优点(全局最小值点)。
- 局部极小值点:如果存在 的一个邻域,使得在该邻域内所有点 都满足 ) \le f(x),则称 为局部极小值点。
这与数学分析中“最小值点”和“极小值点”的概念完全对应,前者是整体性质,后者是局部性质。
理想情况下,我们总希望找到全局最优解。然而,对于复杂的非凸函数,其函数曲面可能非常曲折,存在大量“局部极小值点”和“鞍点”,而全局最优点可能深藏其中。在机器学习中,即使是简单的手写数字识别任务,其神经网络的损失函数曲面也常呈现这种复杂形态,使得寻找全局最优变得极其困难。
因此,在实践中,我们往往退而求其次,转而寻找局部极小值点。那么,在什么情况下局部极小就是全局最小呢?答案是:当函数是凸函数时。凸函数具有“局部极小即全局最小”的优良性质,这使得凸优化问题在理论上和计算上都更为友好。遗憾的是,现实中的多数问题都是非凸的。
最优性条件
如何判断一个点 是否是局部极小值点呢?我们回顾数学分析中的经典条件。以下假设 在 处具有所需的可微性。
一阶必要条件:若 是局部极小值点,且 在 处一阶可导,则梯度必须为零向量。 满足此条件的点称为驻点或临界点。
二阶必要条件:若 是局部极小值点,且 在 处二阶连续可导(即 Hessian 矩阵存在且连续),则在一阶条件 ) = 0 满足的前提下,Hessian 矩阵 ) 必须是半正定的。
二阶充分条件:若 在 处二阶连续可导,且满足 ) = 0,同时 Hessian 矩阵 ) 正定,则 是一个严格的局部极小值点。
凸函数的特权:
- 若 是凸函数,则它的任何一个局部极小值点都是全局最小值点。
- 若 是可导的凸函数,则满足 ) = 0 的驻点 就是全局最小值点。
对于非凸问题,我们通常从寻找驻点(一阶条件)入手,并利用二阶条件判断其是否为局部极小。
线搜索方法框架
由于直接求解 的解析解通常不可行,我们采用迭代算法。线搜索方法是最主流的迭代框架之一,其核心思想是:构造一个序列 ,使其收敛到最优解 。每次迭代的更新公式为:
其中:
- 是第 步的搜索方向。
- 是第 步的步长(或学习率)。
算法的有效性完全取决于如何选择 和 。
下降方向
首先,搜索方向 必须是一个下降方向,以确保函数值有下降的可能。下降方向的数学判据为:
这个不等式的几何意义非常深刻。回忆梯度 的方向是函数在该点上升最快的方向。两个向量的点积 ,其中 是两者的夹角。点积小于零等价于 ,即夹角 大于 。这意味着搜索方向 与梯度方向的夹角超过 ,大致指向函数值下降的半球区域。
通用形式与经典算法
许多线搜索方法中,搜索方向 可以表示为如下通用形式:
其中 是一个对称正定矩阵。不同的算法体现在 的不同选择上:
最速下降法:取 (单位矩阵)。此时 ,即负梯度方向。这是函数值下降最快的局部方向,故得名。
牛顿法:取 ,即当前点的 Hessian 矩阵。此时 。牛顿法利用了函数的二阶曲率信息,在驻点附近通常具有更快的收敛速度。
拟牛顿法:牛顿法需要计算并求逆 Hessian 矩阵,计算成本高。拟牛顿法(如 DFP、BFGS 算法)通过迭代方式构造一个矩阵 来近似 ,从而避免直接求逆。
算法框架
一个典型的线搜索算法框架如下:
- 初始化起点 ,设置精度要求 ,令 。
- while do
- 确定下降方向 (例如,采用上述某种方法)。
- 验证下降条件:确保 。
- 确定步长 (可通过精确线搜索或 Armijo、Wolfe 等非精确线搜索准则)。
- 更新迭代点:。
- 。
- end while
步长 的选择同样关键,好的步长能在保证下降的前提下加速收敛。
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()📝 动手练一练
下降方向判断:设函数 在点 处。 a) 计算该点的梯度 。 b) 判断向量 和 是否为该点处的下降方向?请用下降方向判据说明。
驻点与极值点分析:考虑单变量函数 。 a) 求其所有驻点(即满足 的点)。 b) 利用二阶导数判断这些驻点是局部极小点、局部极大点还是鞍点。 c) 这个函数是凸函数吗?它的局部极小点是全局最小点吗?
参考答案:
a) 梯度 ,故 。 b) 对于 :,是下降方向。 对于 :,是下降方向。
a) ,令 得 ,故驻点为 和 。 b) 。在 处,,故 是局部极小点。在 处,,故 是局部极大点。 c) 二阶导数 在定义域 上不恒大于等于零(例如当 时),因此 不是凸函数。其局部极小点 对应的函数值 ,但当 时,,存在更小的函数值,所以该局部极小点不是全局最小点。
本章小结
本节我们建立了最优化问题的基本认知框架:
- 问题核心:无约束优化旨在最小化一个光滑函数 。
- 现实困境:非凸问题的全局最优解难以获取,实践中多寻求局部极小解。
- 判断依据:利用一阶必要条件(梯度为零)找驻点,结合二阶条件(Hessian 正定)判断是否为局部极小。
- 理想情形:对于凸函数,局部极小即全局最小,优化问题大大简化。
- 求解框架:线搜索方法通过迭代公式 逼近解,其核心是选择下降方向 () 与合适步长。最速下降法、牛顿法等经典算法的区别本质在于搜索方向 的构造方式不同。
行动清单 学完本节,你可以立即:
- 辨析概念:面对一个优化问题,能清晰区分其目标是寻找全局最优还是局部最优,并判断目标函数的凸性是否能为求解带来便利。
- 应用条件:给定一个候选点,能够运用一阶和二阶最优性条件,判断其是否为局部极值点。
- 理解算法:阅读梯度下降等优化算法的代码时,能识别出其对应的线搜索框架,并理解其中方向与步长更新的数学原理。
— 小象教研组
- 第11章讲义(含板书):最优化(PDF · 4.3MB)下载
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加课程顾问,免费获取网盘下载链接
微信扫码添加顾问