滑铁卢优化技术笔记-全-
滑铁卢优化技术笔记(全)
001:课程介绍与预备知识

概述
在本节课中,我们将学习优化技术课程的整体介绍以及一些必要的数学预备知识。课程将涵盖从基础概念到高级算法的广泛内容,旨在帮助初学者理解优化的核心思想及其在理论与实践中的应用。
课程介绍
本课程将介绍优化的主要方法。我们不仅会学习理论,还会探讨实践应用。课程内容涵盖核心优化算法,这些算法在工业界和学术研究中都非常有用。
我们将从预备知识和背景开始,包括集合、范数、函数、局部与全局最小化器、导数等概念。如果对这些概念不熟悉,请不要担心,课程会逐一讲解。
我们将学习梯度、雅可比矩阵、海森矩阵、集合的凸性以及函数的凸性。这些概念和方法既有趣又实用。
课程将介绍标准问题,如凸问题、线性规划、二次规划和半定规划。我们将详细讲解线性规划中的单纯形算法,特别是其实现方法之一——表格法。
我们还将学习整数线性规划,并使用分支定界法来求解。该方法通过树状结构简化整数线性规划问题,使其能利用线性规划的方法求解。
课程将介绍KKT条件(Karush-Kuhn-Tucker条件),这是优化中非常著名的条件。它们看似复杂,但实际上非常简单易懂,并且非常有用。
我们将学习拉格朗日函数和拉格朗日乘数法。之后,课程将涵盖无约束和一阶约束优化。我们将解释无约束和约束的含义,并学习基于梯度的一阶优化方法,如梯度下降法。我们也会涉及二阶优化方法,如牛顿法,以及在约束情况下的内点法或障碍法。
课程还将介绍重要的元启发式方法。当目标函数非常复杂或约束过多时,例如优化飞机的空气动力学结构,经典方法可能难以应用,此时可以使用元启发式优化方法。
元启发式优化是软计算的一个领域,包括模糊逻辑、神经网络和进化算法等。我们将学习一些重要的元启发式算法,如遗传算法、粒子群优化和模拟退火算法。
如果时间允许,我们还将介绍分布式优化,其中最著名的算法是交替方向乘子法(ADMM)。分布式优化的思想与联邦学习类似,适用于大数据和隐私保护场景。
此外,我们可能涵盖其他主题,如L1范数优化、次梯度和非光滑优化等。
课程大纲与时间安排
课程大纲是暂定的,我们将根据进度灵活调整。主要内容安排如下:
- 初步知识与背景
- 线性规划与单纯形法(表格法)
- 整数线性规划
- KKT条件
- 期中考试(大约在第6周)
- 无约束与约束一阶方法
- 无约束与约束二阶方法
- 元启发式优化
- 分布式优化

课程材料与评估
课程材料包括讲义和笔记。我们还将提供一份教程论文作为可选阅读材料,其中涵盖了除线性规划外的许多主题。
课程评估包括:
- 作业(20%):预计有三次作业,可能包含编程部分(建议使用Python)。
- 期中考试(30%):内容将基于课堂讲授和作业,旨在检验理解程度。
- 课程项目(40%):学生将分组进行,包括报告和口头展示。
- 课堂参与(10%):积极参与课堂讨论、提问和回答问题将获得加分。
课程的主要目标是理解优化方法,而非追求高分。我们希望学习过程充满乐趣。


什么是优化? 🔍
优化问题是寻找一个函数的最小值或最大值。
函数 是一种映射关系,对于每一个输入,都有唯一的输出。输入可以是标量(单个数字)、向量或多维数据。输出通常是标量。
我们想要最小化或最大化的函数称为目标函数或成本函数。最小化通常与减少成本或误差相关;最大化通常与增加利润或收益相关。
从哲学角度看,整个生命就是一场优化。同样,所有机器学习(如回归、分类、聚类、强化学习)本质上都是优化问题。
优化问题的输入变量称为决策变量、优化变量或目标变量。
优化问题的类型
优化问题可以是单变量的(只有一个标量输入),也可以是多变量的(有多个输入,可表示为向量或矩阵)。
例如,函数 f(x) = xᵀx = x₁² + x₂² + ... + xₙ² 是一个二次函数。在二维情况下,其图像像一个碗,最小值在原点 (0,0)。
优化问题可以是无约束的,即对变量没有限制。例如,最小化 f(x) = x²。
优化问题也可以是有约束的,即对变量的取值有限制。例如:
最小化 f(x) = x₁² + x₂²
约束条件:
x₁ + x₂ ≤ 8
2x₁ + x₂² ≤ 16
约束条件定义了变量的可行域。优化就是在可行域内寻找使目标函数值最优的点。需要注意的是,约束条件不能相互矛盾,否则可行域为空,问题无解。
优化与搜索
对于简单问题,可以使用经典的优化方法(基于微积分等)。对于非常复杂的问题(如存在许多局部最优解),则可以使用搜索方法。
网格搜索(或称暴力搜索)将定义域划分为网格,并计算每个网格点的函数值。这是一种简单但计算量可能很大的方法。
元启发式搜索(如粒子群优化)则更智能。它模拟群体协作,个体根据自身经验和群体经验在搜索空间中移动,逐步逼*最优解。目标函数的图像通常被称为搜索地形或景观。
集合与范数 📐
理解优化需要一些关于集合的基本概念。
内点、闭包与边界:
- 给定一个集合 D,其内点是那些可以被一个完全位于 D 内的小邻域包围的点。
- 集合的闭包是集合与其边界点的并集。
- 边界是闭包与内点的差集。
凸集与凸包:
- 一个集合是凸集,如果连接该集合中任意两点的线段上的所有点都仍然在该集合内。直观地说,凸集没有“凹陷”的部分。
- 凸包是包含给定集合的最小凸集。它相当于把非凸集的“凹陷”处“填*”。
最小值、最大值、下确界、上确界:
- 最小值是函数能达到的最小的函数值。
- 最大值是函数能达到的最大的函数值。
- 下确界是函数值最大的下界(可能达不到)。
- 上确界是函数值最小的上界(可能达不到)。
最小值和最大值分别是下确界和上确界的特殊情况。
内积
向量的内积(点积):
对于两个向量 x 和 y,其内积定义为:
<**x**, **y**> = **x**ᵀ**y** = Σᵢ xᵢ yᵢ
结果是一个标量。几何上,它表示一个向量在另一个向量方向上的投影长度。
矩阵的内积:
对于两个矩阵 X 和 Y,其内积通常通过迹运算符定义:
<**X**, **Y**> = tr(**X**ᵀ**Y**) = Σᵢ Σⱼ Xᵢⱼ Yᵢⱼ
结果也是一个标量。迹运算符 tr() 计算的是矩阵主对角线元素之和。




总结
本节课我们一起学习了优化技术课程的总体框架、基本概念以及必要的数学预备知识。我们了解了什么是优化问题,以及无约束与约束优化的区别。我们还介绍了集合的基本概念(如内点、边界、凸集)和向量/矩阵的内积运算。这些概念是理解后续更复杂优化算法的基础。下节课我们将继续学习其他预备知识,并开始进入线性规划的具体内容。
002:预备知识

在本节课中,我们将要学习优化技术所需的一些核心数学预备知识,包括集合、函数和优化问题的基础概念。这些知识是理解后续优化算法的基础。
集合的预备知识


上一节我们介绍了课程的基本信息,本节中我们来看看与集合相关的重要概念。
凸集
一个集合是凸集,如果对于集合中的任意两点,连接这两点的线段上的所有点也都在该集合内。用公式表示,对于集合 D 中的任意两点 x 和 y,以及任意 α ∈ [0, 1],都有:
αx + (1-α)y ∈ D
凸包
对于一个集合(不一定是凸集),其凸包是包含该集合的最小凸集。如果集合本身已经是凸集,那么它的凸包就是它自己。
内点
点 x 是集合 D 的内点,如果存在一个正数 ε > 0,使得以 x 为中心、ε 为半径的邻域完全包含在 D 内。用公式表示:
∃ ε > 0, {y | ||y - x||₂ ≤ ε} ⊆ D
其中,||·||₂ 表示 L2 范数(欧几里得距离)。
范数与距离
以下是几种重要的范数定义。
Lp 范数
对于一个 D 维向量 x = [x₁, x₂, ..., xₙ]ᵀ,其 Lp 范数定义为:
||x||p = (∑^{D} |x_i|p)
其中 p ≥ 1。
常用范数
- L1 范数(曼哈顿范数):
||x||₁ = ∑ |x_i| - L2 范数(欧几里得范数):
||x||₂ = √(∑ x_i²) - L∞ 范数(切比雪夫范数):
||x||_∞ = max(|x_i|)
弗罗贝尼乌斯范数
对于矩阵 X ∈ ℝ^{D₁×D₂},其弗罗贝尼乌斯范数类似于向量的 L2 范数:
||X||F = √(∑^{D₁} ∑_{j=1}^{D₂} X_{ij}²)
范数的性质
范数满足以下四个条件:
- 非负性:
||x|| ≥ 0 - 齐次性:
||αx|| = |α| · ||x|| - 零向量的范数为零:
||x|| = 0 ⇔ x = 0 - 三角不等式:
||x + y|| ≤ ||x|| + ||y||
三角不等式可以直观理解为:两点之间的直线距离最短。
对偶范数
范数 ||·|| 的对偶范数 ||·||* 定义为:
**||z||* = sup{ zᵀx | ||x|| ≤ 1 }**
其中,L2 范数的对偶是自身,L1 范数的对偶是 L∞ 范数,反之亦然。
霍尔德不等式
对于向量 x 和 y,以及满足 1/p + 1/q = 1 的 p, q ≥ 1,有:
|xᵀy| ≤ ||x||_p · ||y||_q
当 p = q = 2 时,即为著名的柯西-施瓦茨不等式。
锥与广义不等式
锥
一个集合 K 是锥,如果它满足:
- 包含原点。
- 是凸集。
- 对于任意 x ∈ K 和标量 λ ≥ 0,都有 λx ∈ K。直观上,锥是从原点向外无限延伸的区域。
广义不等式
利用锥可以定义向量或矩阵之间的广义不等式。对于锥 K,我们定义:
x ≼_K y ⇔ y - x ∈ K
当 K 是非负象限(即所有分量非负)时,x ≼ y 意味着 x 的每个分量都小于等于 y 的对应分量。对于矩阵,通常使用半正定锥。
函数的预备知识
上一节我们介绍了集合和范数,本节中我们来看看函数,特别是凸函数的相关性质。
凸函数
一个函数 f: D → ℝ 是凸函数,如果其定义域 D 是凸集,且对于任意 x, y ∈ D 和 α ∈ [0, 1],满足:
f(αx + (1-α)y) ≤ αf(x) + (1-α)f(y)
几何意义是:函数图像上任意两点之间的线段位于函数图像的上方(或重合)。如果不等式反向,则函数是凹函数。
凸函数的一阶条件
如果凸函数 f 可微,那么对于定义域内所有 x, y,有:
f(y) ≥ f(x) + ∇f(x)ᵀ (y - x)
这意味着函数图像始终在其任意一点的切线的上方。
凸函数的二阶条件
如果凸函数 f 二阶可微,那么其海森矩阵(二阶导数矩阵)处处是半正定的:
∇²f(x) ≽ 0, ∀ x ∈ D
对于标量函数,这意味着二阶导数非负,函数图像“开口向上”。
强凸函数
一个可微函数 f 是 μ-强凸 的(μ > 0),如果对于所有 x, y ∈ D,满足:
f(y) ≥ f(x) + ∇f(x)ᵀ (y - x) + (μ/2) ||y - x||₂²
强凸函数有且仅有一个全局最小值点,而普通凸函数的最小值点可能是一个区域。
L-光滑(利普希茨连续)
一个函数 f 是 L-光滑 的,如果存在常数 L,使得对于所有 x, y ∈ D,满足:
|f(x) - f(y)| ≤ L ||x - y||₂
这意味着函数的变化率(斜率)有一个上界 L,不会出现过于陡峭的变化。
优化问题基础
极小值与极大值
- 局部极小点 x:存在一个邻域,在该邻域内 f(x) 是最小值。
- 全局极小点 x:在整个定义域内,f(x) 是最小值。
- 凸函数的性质:凸函数的任何局部极小点都是全局极小点。强凸函数有唯一的全局极小点。
驻点、鞍点与极值点
对于可微函数 f:
- 驻点:梯度为零的点,即 ∇f(x) = 0。
- 极值点:局部极小点或局部极大点。在极值点处,梯度为零。
- 鞍点:梯度为零,但既不是局部极小点也不是局部极大点。在鞍点处,函数在不同方向上的曲率符号相反(海森矩阵有正有负的特征值)。
需要注意的是,对于凸函数,“梯度为零”是“成为极小点”的充要条件。但对于非凸函数,梯度为零的点可能是极小点、极大点或鞍点。
优化问题的解
对于一个最小化问题 min f(x):
- 最优值:函数能达到的最小值,记为 min f(x)。
- 最优点(解):使得函数取得最优值的变量值,记为 argmin f(x)。
最小化与最大化的转换
可以利用以下关系在最小化和最大化问题之间转换:
max f(x) = -min [-f(x)]argmax f(x) = argmin [-f(x)]
导数(梯度)的维度
导数的维度由函数输入和输出的维度决定:
- 标量对标量的导数:标量。
- 标量对向量的导数(梯度):向量,维度与输入向量相同。
∇f(x) ∈ ℝᴰ。 - 向量对向量的导数(雅可比矩阵):矩阵,行数等于输入维度,列数等于输出维度。
J ∈ ℝ^{D₁×D₂}。 - 标量对矩阵的导数:矩阵,维度与原矩阵相同。
- 梯度向量的导数(海森矩阵):二阶导数矩阵,是方阵。对于凸函数,海森矩阵是半正定的。
链式法则
对于复合函数 h(x) = f(g(x)),其导数遵循链式法则:
∇h(x) = ∇f(g(x)) · ∇g(x)
总结


本节课中我们一起学习了优化技术所需的数学预备知识。我们回顾了凸集、凸包、内点等集合概念,介绍了Lp范数、弗罗贝尼乌斯范数及其性质。我们深入探讨了凸函数、强凸函数和L-光滑函数的定义与判别条件,并理解了它们在优化中的重要性。最后,我们学习了优化问题的基础,包括极值点、驻点、鞍点的区别,以及导数在不同情况下的维度。这些概念是理解和分析后续优化算法(如线性规划、梯度下降法等)的基石。下一讲,我们将开始学习具体的优化算法——线性规划。
003:线性规划 📊

在本节课中,我们将要学习线性规划。线性规划是凸优化问题的一种特殊形式,其目标函数和所有约束条件都是线性的(或仿射的)。我们将从基本概念入手,学习如何将实际问题建模为线性规划问题,并通过可视化和单纯形法来求解。
概述
线性规划是优化问题中最基础且应用最广泛的一类。其特点是目标函数和约束条件都是线性的。由于问题的结构特性,其最优解总是出现在可行域的顶点(也称为极值点)上。本节课我们将学习线性规划的标准形式、建模方法、图解法以及求解线性规划的经典算法——单纯形法及其表格实现。
范数与利普希茨常数回顾
在深入线性规划之前,我们先简要回顾上节课的两个核心概念。
上一节我们介绍了各种范数及其单位球。随着参数 p 的增加,L_p 范数的单位球形状会从菱形(p=1)逐渐向正方形(p=∞)变化。当 p 小于1时,单位球会向内收缩。
关于利普希茨常数 L 的计算,我们有一个重要的结论。利普希茨条件不等式:
|f(x) - f(y)| ≤ L ||x - y||
可以重新整理,得到斜率的上界:
|(f(x) - f(y)) / ||x - y||| ≤ L
当 x 趋*于 y 时,这个比值趋*于函数在 y 点导数的范数 ||∇f(y)||。因此,利普希茨常数 L 是函数在其定义域内导数范数的一个上界。为了获得最小的 L(这对优化有利),我们通常将其取为导数的最大范数:
L = max_{x ∈ D} ||∇f(x)||
优化问题的一般形式
现在,我们正式进入优化问题的讨论。一个一般的约束优化问题可以写成如下形式:
最小化 f(x)
满足于 g_i(x) ≤ 0, i = 1, ..., m1
h_j(x) = 0, j = 1, ..., m2
其中 x ∈ D,D 是函数 f 的定义域。
- 约束转换:任何
≥约束可以通过乘以-1转换为≤约束。等式或不等式右侧的常数项可以移到左侧,构成新的函数。 - 可行点与可行集:一个点
x是可行的,当且仅当它同时属于函数定义域D并满足所有约束条件。所有可行点的集合称为可行集S,优化问题也可以简洁地写为min_{x ∈ S} f(x)。
凸优化问题
在所有优化问题中,凸优化问题是最容易求解的,因为其局部最优解就是全局最优解。
一个优化问题是凸的,当满足以下条件:
- 目标函数
f(x)是凸函数。 - 不等式约束函数
g_i(x)是凸函数。 - 等式约束函数
h_j(x)是仿射函数(即形如Ax + b的线性函数)。
凸优化有许多标准形式,以下是其中几种:
- 线性规划:目标函数和所有约束都是仿射函数。这是凸优化的特例。
- 二次规划:目标函数是二次的(例如
(1/2)x^T P x + q^T x,其中P正定),约束是仿射的。 - 二次约束二次规划:目标函数和不等式约束都是二次的,等式约束是仿射的。
- 半定规划:优化变量是一个半正定矩阵,目标函数和约束都是关于该矩阵的线性(仿射)函数。许多其他凸优化问题都可以转化为半定规划,因此它非常重要。内点法(或障碍法)是求解此类问题的强大工具。
线性规划详解
本节中我们重点学习线性规划,它是所有优化技术的重要基础。
标准形式
线性规划的标准形式通常写作:
最小化 c^T x
满足于 Gx ≤ h
x ≥ 0
或者对于最大化问题,将“最小化”改为“最大化”。这里 x ≥ 0 表示向量的每个分量都非负,Gx ≤ h 也是按分量理解。变量非负的要求在许多实际问题(如生产数量、资源分配)中是很自然的。
实际应用举例
以下是两个将实际问题建模为线性规划的例子:
-
生产利润最大化:
- 变量:
x1,x2表示两种产品的产量。 - 目标:最大化总利润
60*x1 + 30*x2。 - 约束:资源限制,例如
8*x1 + 3*x2 ≤ 48(原材料限制),4*x1 + 2*x2 ≥ 24(最低生产要求),以及x1, x2 ≥ 0。
- 变量:
-
储水系统容量最大化:
- 变量:
x1,x2表示两个连通水箱的水位高度。 - 目标:最大化总储水量
60*x1 + 30*x2(假设宽度固定)。 - 约束:进水流量限制或物理空间限制,可表示为线性不等式,如
x1 + 2*x2 ≤ 40,以及x1, x2 ≥ 0。
- 变量:
图解法
当优化变量只有1个或2个时,我们可以用图解法直观地求解线性规划。
求解步骤:
- 在坐标系中画出所有约束条件对应的直线(或*面),并确定满足不等式的半*面。
- 所有约束半*面以及
x ≥ 0的交集构成了可行域。它是一个多边形(或多面体),称为多胞形。 - 画出目标函数的等值线(即
c^T x = k的一系列*行线)。 - 观察目标函数值
k的变化方向。对于最大化问题,沿着目标函数增加的方向移动;对于最小化问题,则沿着减少的方向移动。 - 关键结论:线性规划的最优解一定出现在可行域的某个顶点(极值点)上。只需比较目标函数在所有顶点处的值,即可找到最优解。
示例:对于问题 min x1 + 2*x2, s.t. x1 + 2*x2 ≥ 40, x1 + x2 ≥ 30, x1, x2 ≥ 0,其可行域是一个无界区域。图解法显示,在顶点 (20, 10) 处目标函数取得最小值 40。
单纯形法
对于变量更多的情况,我们需要系统性的算法。单纯形法是求解线性规划最著名的算法之一,其核心思想与图解法一致:在可行域(一个多胞形,或称单纯形)的顶点之间移动,每次移动都让目标函数值得到改善,直到找到最优顶点。
表格法
表格法是实现单纯形法的一种具体方法,通过一系列表格操作来模拟顶点间的移动。
处理 ≤ 约束:
- 引入松弛变量:将每个
≤不等式约束a^T x ≤ b转化为等式a^T x + s = b,其中s ≥ 0称为松弛变量。原问题变量和所有松弛变量都要求非负。 - 构造初始表格:将目标函数和所有等式约束写成表格形式。目标函数改写为
c^T x - z = 0,其中z是目标函数值。 - 迭代过程:
- 选择主元列:在目标函数行(
z行除外)中,选取最负的系数对应的变量作为进基变量(对于最大化问题)。这代表增加该变量对提升目标函数最有效。 - 比值检验:对于主元列中每个正系数,计算其对应行的右端项与该系数的比值。忽略负系数和零系数。取最小比值对应的行作为主元行。该行对应的变量将成为离基变量。
- 行变换:通过初等行变换,使主元位置变为1,且主元列其他所有位置变为0。这相当于让进基变量取代离基变量成为基变量。
- 更新:将主元行的标签(变量名)替换为主元列的变量名。
- 选择主元列:在目标函数行(
- 终止条件:重复步骤3,直到目标函数行的所有系数(
z列除外)都非负。此时表格给出了最优解:基变量取对应行的右端项值,非基变量取0,z值即为最优目标函数值。
处理混合约束(≥, =)
对于更一般的约束,需要引入额外变量:
≥约束:引入剩余变量e (≥ 0)和人工变量a (≥ 0),将a^T x ≥ b写为a^T x - e + a = b。为了迫使人工变量a在最优解中为0,需要在目标函数中加上-M * a(最大化问题),其中M是一个极大的正数。这称为大M法。=约束:直接引入人工变量a (≥ 0),将等式写为a^T x + a = b,同样在目标函数中加上-M * a以驱使a为0。
在表格法中,需要先通过行变换将人工变量对应的列化为单位向量形式(即成为基变量),然后再开始正常的单纯形迭代。
算法原理
单纯形法的每一步选择(主元列和主元行)都有直观解释:
- 选择主元列(最负系数):这对应于选择那个单位增长能带来最大目标函数提升的变量进入基。
- 比值检验(选择主元行):对于选定的进基变量,比值
(右端项)/(主元列系数)代表了在其他变量为0的“最坏情况”下,该变量能增长的最大值。我们选择最小的比值,是为了确保移动到一个新的顶点时,所有约束仍然得到满足,即不离开可行域。
总结

本节课我们一起学习了线性规划的核心内容。我们首先回顾了范数和利普希茨常数的概念,然后介绍了优化问题的一般形式和凸优化的重要性。接着,我们深入探讨了线性规划的标准形式、建模方法以及两种求解技术:适用于低维问题的图解法和适用于任意维度的单纯形法(通过表格法实现)。我们了解到线性规划的最优解总在可行域的顶点达到,而单纯形法则通过沿着边在顶点间智能移动来寻找这个最优解。最后,我们还学习了如何处理 ≥ 和 = 约束的大M法。掌握线性规划是理解更复杂优化技术的重要基石。
004:整数线性规划与灵敏度分析


在本节课中,我们将学习整数线性规划的基本概念及其求解方法——分支定界法。随后,我们将探讨线性规划中的灵敏度分析,了解当优化问题的参数发生变化时,如何分析其对最优解的影响。
线性规划回顾与对偶单纯形法
上一节我们介绍了线性规划的单纯形法。本节中,我们来看看对偶单纯形法,它特别适用于处理某些特定形式的约束。
在对偶单纯形法中,我们首先选择主元行,然后选择主元列,这与标准单纯形法的顺序相反。以下是其步骤概要:
- 选择主元行:在约束的右侧值(RHS)列中,选择最负的值所在的行作为主元行。
- 选择主元列:对于主元行中每一个负的系数,计算目标函数行(第0行)对应系数除以该负系数绝对值的比值。选择比值最小的列作为主元列。
- 执行行变换:进行初等行变换,使主元变为1,主元列其他元素变为0。
- 终止条件:重复上述步骤,直到RHS列中的所有值都变为非负。
当我们在最大化问题中遇到“大于等于”约束,或在最小化问题中遇到“小于等于”约束时,可以通过乘以-1来转换,但这可能导致RHS出现负值,此时就需要使用对偶单纯形法。
整数线性规划
整数线性规划是线性规划的一个扩展,要求部分或全部决策变量取整数值。当所有变量都必须为整数时,称为纯整数规划;当部分变量为整数,部分为连续变量时,称为混合整数规划。
为什么整数规划更困难?
与连续优化相比,离散(整数)优化通常更困难。因为在连续空间中,我们可以沿着任何方向*滑地移动以寻找最优解;而在整数空间中,我们只能“跳跃”到离散的格点上,这限制了搜索的灵活性。
整数规划与线性规划最优解的关系
对于一个最大化问题,将其整数约束松弛为连续约束后得到线性规划问题。线性规划的最优目标函数值 总是大于或等于 对应的整数规划的最优值。这是因为整数规划的可行域是线性规划可行域的一个子集。
求解方法:分支定界法
分支定界法是求解整数线性规划的经典方法。其核心思想是:先求解松弛后的线性规划问题,如果解不满足整数要求,则通过添加新的约束将原问题分解为两个子问题,并逐步缩小搜索范围。
以下是分支定界法的基本步骤:
- 松弛:忽略整数约束,求解对应的线性规划问题(称为松弛问题)。
- 分支:如果松弛问题的最优解中,某个应为整数的变量
x_k取值为非整数a,则创建两个新的子问题:- 子问题 A:在原问题基础上增加约束
x_k ≤ floor(a)。 - 子问题 B:在原问题基础上增加约束
x_k ≥ ceil(a)。
- 子问题 A:在原问题基础上增加约束
- 定界与剪枝:
- 整数解:如果某个子问题的最优解全是整数,则记录该解及其目标值,作为当前最优整数解的一个候选。不再对该分支继续分解。
- 优于当前界:如果子问题的最优值(对于最大化问题是上界)比当前记录的最佳整数解的目标值还差,则剪掉该分支(不再分解)。
- 无可行解:如果子问题无可行解,则剪掉该分支。
- 非整数解:如果子问题有非整数解且其上界优于当前最佳整数解,则返回步骤2,继续对该子问题进行分支。
- 选择最优:遍历所有分支后,从所有记录的整数可行解中,选择目标值最优的一个作为原整数规划的最优解。
分支变量选择:通常选择当前解中分数部分最大的变量进行分支,这有助于更快地找到整数解。
灵敏度分析
灵敏度分析研究线性规划问题的最优解如何随问题参数的变化而变化。这对于实际应用(如生产计划、资源分配)中的决策支持至关重要。
分析框架


假设我们已通过单纯形法求解出标准形式的线性规划问题,并得到最终单纯形表。我们可以将表整理为以下形式,其中 B 和 N 分别代表基变量和非基变量的系数矩阵:


[ I | B^{-1}N ] | B^{-1}b
[ 0 | c_N^T - c_B^T B^{-1}N ] | -c_B^T B^{-1}b
I:单位矩阵。B^{-1}b:基变量的最优值。c_N^T - c_B^T B^{-1}N:判别数(第0行中非基变量的系数)。最优时,这些值应全部 ≥ 0(对于最大化问题)。-c_B^T B^{-1}b:最优目标函数值的相反数。
灵敏度分析通过考察参数变化如何影响判别数 c_N^T - c_B^T B^{-1}N 和基变量值 B^{-1}b 来进行。
常见的参数变化类型及分析思路
-
目标函数系数
c_j的变化- 非基变量系数变化:只影响该变量对应的判别数。计算新判别数,若仍 ≥ 0,则最优解不变;否则,需继续迭代。
- 基变量系数变化:影响所有非基变量的判别数。需重新计算所有判别数,检查是否全部 ≥ 0,以确定最优基是否改变。
-
约束条件系数
a_{ij}的变化- 非基变量系数变化:影响
B^{-1}N中对应的列,从而影响相关判别数。重新计算并判断。 - 基变量系数变化:改变了基矩阵
B,因此需要重新计算B^{-1},进而影响整个表格。分析较为复杂。
- 非基变量系数变化:影响
-
右端项
b_i的变化- 影响基变量的值
B^{-1}b。计算新的基变量值,若全部 ≥ 0,则最优基不变,但解值改变;否则,需使用对偶单纯形法恢复可行性。
- 影响基变量的值
-
增加新变量
- 相当于在最终表中增加一列。计算该新变量对应的判别数,若 ≥ 0,则不应引入;否则,将其作为入基变量继续迭代。
-
增加新约束
- 将新约束加入最终表。若原最优解满足新约束,则仍为最优;否则,引入松弛变量或人工变量,并使用对偶单纯形法或大M法求解。
核心原则:参数变化后,检查原最终单纯形表中的两个关键部分:
- 最优性条件:判别数是否仍全部非负(最大化问题)。
- 可行性条件:基变量的值是否仍全部非负。
只要这两个条件同时满足,则当前基仍是最优基,尽管目标函数值和变量值可能已变。若任一条件被破坏,则需从当前表出发继续迭代,寻找新的最优解。

本节课中我们一起学习了整数线性规划的分支定界法,以及线性规划灵敏度分析的基本原理。理解这些内容有助于我们处理现实世界中带有离散决策或参数不确定性的优化问题。
005:灵敏度分析与拉格朗日函数


概述
在本节课中,我们将学习线性规划中的灵敏度分析,并引入优化理论的核心概念——拉格朗日函数与对偶性。我们将了解如何分析优化问题对参数变化的敏感度,并学习如何将带约束的优化问题转化为无约束问题。
灵敏度分析回顾
上一节我们介绍了线性规划的基本解法。本节中,我们来看看当优化问题的参数发生变化时,如何分析其对最优解的影响,即灵敏度分析。
灵敏度分析的核心思想是:在已求得最优解的基础上,分析当目标函数系数、约束系数等参数发生改变时,最优解是否会变化,以及如何变化。管理者可能基于市场变化提出此类问题,工程师需要据此给出建议。
参数变化的几种情况
以下是灵敏度分析中常见的几种变化类型:
- 改变非基变量在目标函数中的系数:例如,改变某个当前不生产产品的单位利润。如果变化在一定范围内,最优解可能不变;若超出范围,则需重新计算,该变量可能进入基变量,开始被生产。
- 改变基变量在目标函数中的系数:这会影响单纯形表中的多个部分,需要重新计算检验数。变化超出特定区间时,最优基可能改变。
- 改变约束条件中的系数:分为改变非基变量和基变量的系数。这需要重新计算单纯形表中受影响的列,并判断是否需要继续迭代。
- 增加新的决策变量:例如,公司考虑引入新产品。这相当于在单纯形表中增加一列。若该列检验数为非负,则不应生产该产品;若为负,则需继续迭代,新产品可能取代原有产品进入生产计划。
- 增加新的约束条件:这可能导致三种情况:
- 当前最优解满足新约束,则最优解不变。
- 当前最优解不满足新约束,但问题仍有可行解,此时需用对偶单纯形法继续求解。
- 新约束与原有约束矛盾,导致可行域为空,问题变得不可行。
核心概念:在单纯形表中,参数变化的影响可通过公式 c_N^T - c_B^T B^{-1} N 重新计算检验数来判断。其中 B 是基变量系数矩阵,N 是非基变量系数矩阵。
整数规划的舍入问题
在讨论灵敏度分析后,我们回顾一个关于整数线性规划的重要观点。有人提出,可以先求解连续的线性规划问题,再将解舍入到最*的整数。但这是一个常见的误解。
反例:假设连续线性规划的最优解是 (1.8, 4.8),舍入到最*整数得到 (2, 5)。然而,(2, 5) 这个点可能根本不在整数规划的可行域内。因此,简单的舍入通常无法得到可行或最优的整数解。这正是我们需要使用分支定界法等专门算法来解决整数规划的原因。
拉格朗日函数与对偶性
从线性规划过渡到更一般的非线性优化,我们引入一个核心工具——拉格朗日函数。它是处理约束优化问题的关键。

一般优化问题的形式
任何优化问题都可以写成以下标准形式:
最小化 f(x)
满足 g_i(x) ≤ 0, i = 1, ..., m
以及 h_j(x) = 0, j = 1, ..., p

其中,x 是优化变量,f(x) 是目标函数,g_i(x) 是不等式约束,h_j(x) 是等式约束。最大化问题可以通过对目标函数取负号转化为最小化问题。
拉格朗日函数的定义
对于上述优化问题,其拉格朗日函数 L(x, λ, ν) 定义为:
L(x, λ, ν) = f(x) + Σ_{i=1}^{m} λ_i g_i(x) + Σ_{j=1}^{p} ν_j h_j(x)
其中:
λ_i称为对应于不等式约束g_i(x) ≤ 0的拉格朗日乘子或对偶变量,且要求λ_i ≥ 0。ν_j称为对应于等式约束h_j(x) = 0的拉格朗日乘子,符号不限。
拉格朗日函数的直观理解
拉格朗日函数可以理解为原约束问题的“松弛”。它将难以处理的约束条件以惩罚项的形式加入目标函数:
f(x)是原始目标。Σ λ_i g_i(x)是对违反不等式约束的惩罚。由于g_i(x) ≤ 0且λ_i ≥ 0,此项为非正,违反越严重(g_i(x)越大),惩罚越大(使L值增大)。Σ ν_j h_j(x)是对违反等式约束的惩罚。
通过最小化拉格朗日函数,我们试图在最小化原始目标的同时,尽可能满足约束条件。它将一个带约束的问题转化为了一个关于 x 的无约束问题(但引入了新的变量 λ 和 ν)。
对偶函数
在拉格朗日函数的基础上,我们定义对偶函数 g(λ, ν):
g(λ, ν) = inf_{x} L(x, λ, ν)
对偶函数是拉格朗日函数关于原始变量 x 取极小值后得到的函数,因此它只是对偶变量 λ 和 ν 的函数。
弱对偶与强对偶
一个重要引理指出:对于任意满足 λ ≥ 0 的 λ 和 ν,对偶函数 g(λ, ν) 总是原问题最优值 p* 的一个下界,即 g(λ, ν) ≤ p*。
由此,我们可以构造对偶问题:
最大化 g(λ, ν)
满足 λ ≥ 0
设对偶问题的最优值为 d*。根据上述引理,恒有 d* ≤ p*。这个性质称为弱对偶性。差值 p* - d* 称为对偶间隙。
如果对偶间隙为零,即 d* = p*,则称为强对偶性成立。对于凸优化问题,在满足一定条件(如Slater条件:存在一个严格可行点,使得所有不等式约束都严格小于0)时,强对偶性通常成立。
对偶性的意义
- 弱对偶:给出了原问题最优值的一个下界,可用于评估求解算法的效果。
- 强对偶:意味着我们可以通过求解对偶问题来获得原问题的最优值。有时对偶问题更容易求解。

总结
本节课我们一起学习了两个重要部分:
- 灵敏度分析:我们掌握了如何分析线性规划问题参数变化对最优解的影响,并能够针对不同变化情况(如改变系数、增加变量或约束)给出是否需重新求解的判断。
- 拉格朗日函数与对偶性基础:我们引入了处理约束优化问题的核心工具——拉格朗日函数,理解了它如何通过添加惩罚项将约束问题松弛。在此基础上,我们定义了对偶函数,并学习了弱对偶与强对偶的关键概念,这为后续学习KKT条件奠定了理论基础。

在接下来的课程中,我们将基于拉格朗日函数,深入探讨最优解必须满足的KKT条件。
006:KKT条件与梯度下降

在本节课中,我们将学习优化理论中的两个核心概念:KKT条件和梯度下降法。KKT条件是判断优化问题最优解的必要条件,而梯度下降法是一种用于寻找函数最小值的迭代式一阶优化算法。我们将从理论推导到实际应用,逐步解析这些内容。
课程与项目安排概述

在深入技术内容之前,我们先简要说明课程项目分组和期中考试的相关安排。
- 课程项目需要组建小组,每组建议4人(允许一组为3人)。请尽快在课程链接中提交小组成员名单和简短的项目提案。
- 期中考试将于两周后的课程时间(2月28日)在线进行。考试形式为开卷,内容涵盖截至KKT条件结束的所有课程材料。请确保按时参加,并准备好必要的设备。
现在,让我们进入今天的核心学习内容。
KKT条件详解
上一讲我们介绍了对偶问题、对偶函数以及强对偶性的Slater条件。本节中,我们将基于这些概念,推导出在优化理论中至关重要的KKT条件。
*稳性条件
首先回顾拉格朗日函数,对于标准形式的优化问题:
L(x, λ, ν) = f(x) + Σ λ_i g_i(x) + Σ ν_j h_j(x)
我们可以将其视为原始目标函数 f(x) 的一个正则化形式。为了最小化这个正则化问题,我们对 x 求导并令其为零:
∇_x L(x, λ, ν) = 0
这个方程称为*稳性条件。它意味着在最优解处,拉格朗日函数关于原始变量的梯度必须为零。这个条件对于所有对偶变量 λ 和 ν 都成立,而不仅仅是最优对偶变量。
互补松弛条件
在强对偶性成立的前提下,我们可以推导出另一个关键条件。假设 x* 是原始最优解,λ*, ν* 是对偶最优解。根据强对偶性定义和对偶函数,经过一系列推导,我们可以得到:
λ_i* · g_i(x*) = 0, 对于所有不等式约束 i
这被称为互补松弛条件。它意味着对于每个不等式约束,其对应的最优拉格朗日乘子 λ_i* 和约束函数值 g_i(x*) 至少有一个为零。
以下是互补松弛条件的两种具体情况:
- 若
λ_i* > 0,则必有g_i(x*) = 0(约束是紧的或活跃的)。 - 若
g_i(x*) < 0,则必有λ_i* = 0(约束是非活跃的,其对偶变量为零)。
KKT条件总结
将*稳性条件、互补松弛条件与我们之前讨论的原始可行性和对偶可行性结合起来,就得到了完整的KKT条件(Karush-Kuhn-Tucker条件)。对于最优解 (x*, λ*, ν*),它们必须满足以下四点:
- *稳性:
∇_x L(x*, λ*, ν*) = 0 - 原始可行性:
g_i(x*) ≤ 0,h_j(x*) = 0(对所有约束) - 对偶可行性:
λ_i* ≥ 0(对所有不等式约束) - 互补松弛:
λ_i* · g_i(x*) = 0(对所有不等式约束)
KKT条件是最优解的必要条件。对于凸优化问题且满足Slater条件(即强对偶成立)时,KKT条件同时也是最优解的充分条件。
拉格朗日乘子法
KKT条件不仅可以用来验证解的最优性,还可以直接用于求解优化问题,这种方法称为拉格朗日乘子法。其步骤如下:
以下是使用拉格朗日乘子法求解优化问题的具体步骤:
- 构造拉格朗日函数
L(x, λ, ν)。 - 对
L关于x求导并令为零,解出x为λ, ν的函数,即x = φ(λ, ν)。 - 将
x = φ(λ, ν)代回L,得到对偶函数g(λ, ν)。 - 求解对偶问题
max_{λ≥0, ν} g(λ, ν),得到最优对偶变量λ*,ν*。 - 将
λ*,ν*代入x = φ(λ, ν),得到最优原始变量x*。 - 计算
f(x*)得到最优目标值。
我们通过一个简单的数值例子演示了该方法的应用,并验证了在满足Slater条件的问题中,强对偶性(f(x*) = g(λ*, ν*))确实成立。
梯度下降法
在学习了处理约束问题的KKT条件后,我们转向无约束优化问题,并介绍一种基础而强大的迭代算法——梯度下降法。
梯度下降的推导
梯度下降的核心思想是沿着当前点梯度方向的反方向(即函数下降最快的方向)前进一小步,逐步逼*函数的最小值点。
我们从微积分基本定理的一个推论出发:对于一个梯度是L-利普希茨连续的函数,有以下不等式成立:
f(y) ≤ f(x) + ∇f(x)^T (y - x) + (L/2) ||y - x||^2
我们的目标是在每一步迭代中减少函数值,即希望 f(x_{k+1}) < f(x_k)。将 y = x_{k+1}, x = x_k 代入上式,并令 x_{k+1} = x_k + Δx,我们得到:
f(x_k + Δx) - f(x_k) ≤ ∇f(x_k)^T Δx + (L/2) ||Δx||^2
为了使左端(函数值的实际变化)尽可能为负,我们最小化其右端上界。通过求解这个关于 Δx 的二次函数最小值,我们得到最优的更新步长为:
Δx = - (1/L) ∇f(x_k)
因此,梯度下降的迭代公式为:
x_{k+1} = x_k - (1/L) ∇f(x_k)
步长与线搜索
在实际应用中,利普希茨常数 L 通常难以获取。因此,我们引入一个可调的步长(或学习率) η,将迭代公式写为更通用的形式:
x_{k+1} = x_k - η ∇f(x_k)
为了保证算法收敛(函数值下降),步长 η 需要满足条件 0 < η < 2/L。最优的理论步长是 η = 1/L。
由于 L 未知,我们需要动态确定合适的步长,这个过程称为线搜索。最简单的线搜索(回溯法)从 η=1 开始,如果新点的函数值没有充分下降(例如,不满足 f(x_k - η∇f(x_k)) < f(x_k)),则将 η 减半,重复此过程直到满足条件。更复杂的线搜索如Armijo准则要求更严格的下降条件,通常能带来更稳定的收敛。
收敛准则与算法框架
梯度下降是一个迭代过程,我们需要一个停止条件。常用的收敛准则包括:
- 梯度范数足够小:
||∇f(x_k)|| < ε - 函数值变化足够小:
|f(x_{k+1}) - f(x_k)| < ε - 自变量变化足够小:
||x_{k+1} - x_k|| < ε - 达到最大迭代次数。
结合线搜索和收敛准则,梯度下降算法的框架如下:
初始化 x_0
for k = 0, 1, 2, ...:
初始化步长 η = 1
while 不满足线搜索条件(如Armijo条件):
η = β * η (例如 β=0.5)
x_{k+1} = x_k - η ∇f(x_k)
if 满足收敛准则:
break
返回 x_{k+1}
对于凸函数,梯度下降能收敛到全局最小值;对于非凸函数,它可能收敛到局部最小值或鞍点。步长的选择会影响收敛速度和稳定性,过大的步长可能导致振荡,过小的步长则收敛缓慢。
总结
本节课中我们一起学习了优化理论中的两大支柱。首先,我们深入探讨了KKT条件,它是一组用于判断约束优化问题最优解的必要条件,包含了*稳性、原始可行性、对偶可行性和互补松弛性。我们还介绍了利用KKT条件求解问题的拉格朗日乘子法。
随后,我们转向无约束优化,推导了梯度下降法这一基础的一阶迭代算法。我们讨论了其理论步长、实际应用中步长的选择策略(线搜索),以及判断算法何时停止的收敛准则。


从下一讲开始,我们将继续探索更高级的一阶和二阶优化方法,并将这些技术应用于带约束的问题。
007:反向传播、AGM、SGD、SAG、Adam与神经网络

概述
在本节课中,我们将学习几种重要的优化算法,包括反向传播、加速梯度法、随机梯度下降及其变体,并了解它们如何应用于神经网络训练。课程最后将通过一个简单的代码示例,展示如何构建和训练一个神经网络。
项目与课程反馈
上一讲我们介绍了梯度下降与动量方法。在开始新内容前,先对课程项目和中途测验进行一些说明。
以下是关于课程项目的一些通用建议:
- 请首先清晰地解释你要解决的问题。
- 将问题表述为一个或多个优化问题,即最小化或最大化某个目标函数,并包含约束条件。
- 请说明你计划使用的优化算法,并简要解释其工作原理、优缺点,以及为何选择该算法。
- 在报告中展示实验结果并进行深入分析,而不仅仅是呈现数据。

关于课程成绩,请尽力完成项目、作业和测验,无需过度担忧。我会根据每个项目的完成情况独立评分。如果在项目过程中遇到任何困难,欢迎随时联系我寻求帮助。
关于中途测验,我收到了关于测验时长的反馈。在未来的课程中,我会尝试缩短测验时间。感谢大家的反馈。
根据课程进度,我们可能还会有一次作业。如果之前作业完成得不够理想,请尽力完成后续的作业和项目。
反向传播算法
现在,我们进入本节课的核心内容。首先,我们来探讨在神经网络中至关重要的反向传播算法。
神经网络基础
人工神经网络试图模仿人脑的结构。一个简单的前馈神经网络包含多个层,每层有多个神经元。每一层的神经元都与下一层的所有神经元相连,但同层神经元之间没有连接。网络的输入层神经元数量应与输入数据的维度匹配,输出层神经元数量应与输出维度匹配。这些连接上的权重是可学习的参数,我们的目标就是优化这些权重,使网络能准确地将输入映射到期望的输出。
每个神经元的计算分为两步:
- 加权求和:将上一层所有神经元的输出乘以对应的权重并求和,得到
a_i。
a_i = Σ_l (x_il * z_l) - 激活函数:将
a_i输入一个非线性激活函数(如ReLU、Sigmoid),得到该神经元的输出z_i。
z_i = σ_i(a_i)
激活函数的非线性至关重要。如果所有激活函数都是线性的,那么整个多层网络将退化为一个单层线性变换,无法捕捉数据中的复杂非线性模式。
反向传播原理
反向传播的本质是梯度下降加上链式法则。我们的目标是最小化网络的预测误差 E。由于优化变量是所有权重 x_il,我们需要计算误差 E 对每个权重 x_il 的梯度。
根据梯度下降,权重的更新规则为:
x_il^(新) = x_il^(旧) - η * (∂E/∂x_il)
关键是如何计算 ∂E/∂x_il。这里就需要链式法则。我们可以将其分解:
∂E/∂x_il = (∂E/∂a_i) * (∂a_i/∂x_il)
∂a_i/∂x_il很容易计算,根据a_i的定义,其结果为z_l。∂E/∂a_i定义为δ_i。计算δ_i需要区分神经元i所在的层:- 如果神经元
i在输出层,δ_i可以直接根据误差函数E和激活函数σ_i计算。 - 如果神经元
i在中间层(隐藏层),则需要再次使用链式法则,通过下一层神经元的δ_j来计算:
δ_i = σ_i‘(a_i) * Σ_j (x_ji * δ_j)
- 如果神经元
通过这种从输出层向输入层反向递推的方式,我们可以高效地计算出所有权重的梯度,从而利用梯度下降更新权重。反向传播算法于1986年提出,极大地推动了人工智能的发展。
加速梯度法
我们之前学习的梯度下降法,在收敛速度上并非最优。为此,Nesterov在1983年提出了加速梯度法,也称为快速梯度法。
AGM在每次迭代中更新两个变量 x 和 y,其更新规则如下:
x_{k+1} = y_k - η_k * ∇f(y_k)y_{k+1} = x_{k+1} + γ_k * (x_{k+1} - x_k)
其中,序列 γ_k 需要满足特定条件(例如 γ_k = 2/k 对于 k>=4)。
收敛速率比较
假设目标函数 f 是凸函数且其梯度是L-*滑的。设 f* 为最优函数值,x* 为最优解,x_0 为初始点。
-
梯度下降的收敛速率上界为:
f(x_k) - f* ≤ (2L ||x_0 - x*||^2) / (k+1)
其收敛阶为O(1/k)。 -
加速梯度法的收敛速率上界为:
f(x_k) - f* ≤ (4L ||x_0 - x*||^2) / ((k+1)^2)
其收敛阶为O(1/k^2)。
比较可知,AGM的收敛速度显著快于标准梯度下降法。值得注意的是,AGM是一种梯度方法,而非“下降”法,因为其迭代过程并不保证函数值每一步都下降。
随机梯度下降及其变体
当目标函数是大量子函数之和时(常见于机器学习),计算完整梯度非常耗时。随机梯度下降 应运而生。
随机梯度下降
考虑目标函数:f(x) = (1/n) Σ_{i=1}^n f_i(x)
完整梯度为:∇f(x) = (1/n) Σ_{i=1}^n ∇f_i(x)
SGD在每次迭代中,随机采样一个索引 i_t,然后仅使用该子函数的梯度进行更新:
x_{k+1} = x_k - η_k * ∇f_{i_t}(x_k)
- 优点:每次迭代计算快,内存需求低。
- 缺点:由于使用噪声梯度,收敛路径震荡,且最终可能只在最优解附*徘徊。若使用固定学习率,最终会与最优解保持一个与
η相关的差距。
其收敛速率取决于学习率的选择。对于凸函数,若使用递减学习率(如 η_k = 1/√k),收敛阶约为 O(log k / √k)。
小批量随机梯度下降
为了在速度和稳定性之间取得*衡,小批量SGD 被广泛使用。它每次迭代随机采样一个小批量(Mini-batch)数据 B,并使用该批数据的*均梯度进行更新:
x_{k+1} = x_k - η_k * (1/|B|) Σ_{i∈B} ∇f_i(x_k)
小批量SGD是深度学习中最重要的优化算法之一。遍历整个数据集一次称为一个周期。
随机*均梯度
SAG算法(2012年提出)试图结合SGD的速度和GD的精度。其思想是维护一个梯度表,每次迭代随机更新一个子函数的梯度,并用更新后的梯度表均值来*似完整梯度。理论上,它具有与GD相同的 O(1/k) 收敛速率,但实践中需要仔细调参。
随机方差缩减梯度
SVRG(2013年提出)是另一种改进SGD的方法。它在每次外循环中计算一次完整梯度作为锚点,然后在接下来的内循环中,使用该锚点来修正随机梯度的方差,从而获得更稳定的收敛。
自适应学习率算法
学习率的设置对优化至关重要。以下是一些自适应调整学习率的著名算法。
AdaGrad
AdaGrad(2011年)为每个参数维护一个累积*方梯度,并据此缩放学习率:
G_{jj} = Σ_{t=1}^k (∇f_{i_t}(x_t)_j)^2
x_{k+1} = x_k - η * (G + εI)^{-1/2} * ∇f_{i_k}(x_k)
其思想是:对于历史上更新频繁(梯度大)的参数,降低其学习率;对于更新少的参数,则给予较大的学习率。这有助于处理稀疏数据。
RMSProp
RMSProp(2012年)改进了AdaGrad,引入衰减因子 γ 来计算梯度的指数移动*均,避免了学习率过早衰减至零:
v_k = γ * v_{k-1} + (1-γ) * (∇f(x_k))^2
x_{k+1} = x_k - η * (∇f(x_k) / (√v_k + ε))
Adam
Adam(自适应矩估计)是当前最流行的优化器之一。它结合了RMSProp和动量的思想,同时计算梯度的一阶矩(均值)和二阶矩(未中心化的方差)的指数移动*均,并进行偏差校正:
m_k = β1 * m_{k-1} + (1-β1) * ∇f(x_k)
v_k = β2 * v_{k-1} + (1-β2) * (∇f(x_k))^2
m̂_k = m_k / (1 - β1^k)
v̂_k = v_k / (1 - β2^k)
x_{k+1} = x_k - η * m̂_k / (√v̂_k + ε)
Adam通常能快速收敛且对超参数选择相对鲁棒。
神经网络编程实践
理论需要实践来巩固。本节我们将通过代码,实际构建并训练一个简单的神经网络。
环境设置与库导入
我们将使用PyTorch库。首先安装并导入必要的包:
import torch
from torch import nn
import matplotlib.pyplot as plt
import numpy as np
from tqdm import tqdm
定义神经网络结构
我们定义一个继承自 nn.Module 的四层全连接网络:
class NeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.layer1 = nn.Linear(1, 10)
self.layer2 = nn.Linear(10, 20)
self.layer3 = nn.Linear(20, 10)
self.layer4 = nn.Linear(10, 1)
self.relu = nn.ReLU()
def forward(self, x):
x = self.relu(self.layer1(x))
x = self.relu(self.layer2(x))
x = self.relu(self.layer3(x))
x = self.layer4(x) # 输出层通常不使用激活函数(回归任务)
return x
准备数据
创建一个数据集类来加载和处理数据,并使用 DataLoader 生成小批量数据:
class MyDataset(torch.utils.data.Dataset):
def __init__(self, x, y):
self.x = torch.from_numpy(x).float().view(-1, 1)
self.y = torch.from_numpy(y).float().view(-1, 1)
def __len__(self):
return len(self.x)
def __getitem__(self, idx):
return self.x[idx], self.y[idx]
def load_data(xtrain, ytrain, xtest, ytest, batch_size=16):
train_dataset = MyDataset(xtrain, ytrain)
test_dataset = MyDataset(xtest, ytest)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
return train_loader, test_loader
训练与评估
实例化模型、优化器(如Adam)和损失函数(如均方误差)。然后进行多轮训练:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
net = NeuralNetwork().to(device)
optimizer = torch.optim.Adam(net.parameters(), lr=0.001)
criterion = nn.MSELoss()
num_epochs = 1000
for epoch in tqdm(range(num_epochs), desc='Epochs'):
epoch_losses = []
for data_batch, label_batch in train_loader:
data_batch, label_batch = data_batch.to(device), label_batch.to(device)
prediction = net(data_batch)
loss = criterion(prediction, label_batch)
optimizer.zero_grad()
loss.backward()
optimizer.step()
epoch_losses.append(loss.item())
在测试阶段,需要设置 torch.no_grad() 来禁用梯度计算,以提高效率并防止误更新。
通过绘制训练损失下降曲线和测试集上的预测结果,可以直观地评估模型的学习效果。代码演示了网络如何学习线性或非线性数据的模式。
总结
本节课我们一起学习了多种核心优化技术。
- 反向传播是神经网络训练的基石,本质是梯度下降与链式法则的结合。
- 加速梯度法通过引入额外的变量和更新步骤,获得了比标准梯度下降更快的理论收敛速度。
- 随机梯度下降及其变体(小批量SGD、SAG、SVRG)通过随机采样来*似梯度,解决了大数据集上的计算瓶颈,是机器学习的主流优化器。
- 自适应学习率算法(AdaGrad, RMSProp, Adam)能够自动调整每个参数的学习步长,通常能带来更稳定、更快速的收敛,其中Adam尤为流行。
- 最后,我们通过一个PyTorch代码示例,将理论应用于实践,完成了从构建、训练到评估一个简单神经网络的完整流程。

理解这些优化算法的原理和适用场景,对于有效训练机器学习模型至关重要。
008:*端方法、牛顿法与内点法

在本节课中,我们将要学习第一类优化方法中的*端方法,以及第二类优化方法中的牛顿法和内点法。我们将从*端算子的定义开始,逐步深入到其在优化算法中的应用,然后过渡到利用二阶导数的牛顿法,最后探讨如何处理带约束的优化问题,特别是使用内点法。
*端算子与相关概念
上一节我们介绍了梯度下降等一阶方法。本节中,我们来看看另一类重要的一阶方法:*端方法。
*端算子的定义
对于一个凸函数 G,其*端算子(或*端映射)定义为:
prox_{λG}(x) = argmin_u [ G(u) + (1/(2λ)) * ||u - x||_2^2 ]
其中,λ > 0 是一个参数。当 λ = 1 时,我们得到标准形式。
这个定义可以理解为三个步骤的转换:
- 原始问题:最小化 G(x)。
- 变量替换:引入新变量 u,并添加约束 x = u。
- 约束松弛:将硬约束 x = u 作为正则化项(软惩罚)加入目标函数,从而转化为无约束问题。
因此,*端算子在最小化函数 G 的同时,要求解 u 尽可能接*给定的点 x。
莫罗包络与莫罗分解
与*端算子紧密相关的概念是莫罗包络(Moreau Envelope):
M_{λG}(x) = inf_u [ G(u) + (1/(2λ)) * ||u - x||_2^2 ]
注意,莫罗包络是函数值,而*端算子是达到该最小值的参数 u。函数 G 的最小化点也是其莫罗包络的最小化点。
另一个重要概念是莫罗分解(Moreau Decomposition):
x = prox_{λG}(x) + λ * prox_{G*/λ}(x/λ)
其中 G* 是函数 G 的共轭函数(对偶空间中的对应函数)。这个分解表明,任何点 x 都可以分解为两个*端映射结果的和。
指示函数与投影
在优化中,集合 S 的指示函数定义为:
I_S(x) = 0, if x ∈ S; ∞, if x ∉ S
这与机器学习中常见的0/1指示函数不同。这里的定义使得指示函数可以作为“硬惩罚”:如果点不在集合内,则目标函数值为无穷大,迫使优化必须满足约束。
*端算子与指示函数结合,会产生一个非常重要的操作:投影。
prox_{I_S}(x) = argmin_{u ∈ S} (1/2) * ||u - x||_2^2 = Π_S(x)
这个等式的证明利用了指示函数的定义:为了使目标函数有限,u 必须属于集合 S,此时问题简化为在 S 中寻找离 x 最*的点,这正是投影的定义。
以下是常见函数的*端算子:
- 零函数:
prox_{λ*0}(x) = x(恒等映射)。 - L2范数:
prox_{λ||·||_2}(x) = (1 - λ / max(||x||_2, λ)) * x。 - L1范数(逐元素):
[prox_{λ||·||_1}(x)]_j = sign(x_j) * max(|x_j| - λ, 0)。这个函数被称为软阈值函数,是处理L1正则化(如LASSO回归)的关键。
L1正则化常被用来诱导解的稀疏性,其原理是L1范数的单位球有“尖角”,优化解更容易落在这些尖角上,使得某些变量恰好为零。
基于*端算子的优化算法
理解了核心概念后,我们来看看如何利用*端算子构建优化算法。
*端点算法
对于无约束问题 min f(x),*端点算法(Proximal Point Algorithm)的迭代步骤为:
x_{k+1} = prox_{λf}(x_k) = argmin_u [ f(u) + (1/(2λ)) * ||u - x_k||_2^2 ]
可以将其理解为:在每一步,我们不仅最小化 f,还要求新解 u 不能离上一步的解 x_k 太远,从而稳定优化过程。这类似于在函数 f 的莫罗包络上执行梯度下降。
*端梯度法
在实际问题中,我们经常遇到复合函数优化:min f(x) + g(x),其中 f 光滑可微,g 凸但不一定光滑(例如L1范数正则化项)。*端梯度法(Proximal Gradient Method)专门解决此类问题。
其迭代更新公式为:
x_{k+1} = prox_{ηg}( x_k - η * ∇f(x_k) )
这个公式可以解释为两步:
- 对光滑部分 f 执行一步梯度下降:
y = x_k - η * ∇f(x_k)。 - 对非光滑部分 g 执行*端映射(投影或软阈值等):
x_{k+1} = prox_{ηg}(y)。
当 g 是某个集合 S 的指示函数时,*端梯度法退化为投影梯度法:
x_{k+1} = Π_S( x_k - η * ∇f(x_k) )
算法先沿梯度方向走一步,如果点落在了可行集 S 之外,就将其投影回 S 中最*的点。
正交约束的投影
在许多科学工程问题(如主成分分析PCA)中,会遇到正交约束 X^T X = I。如何将点投影到正交矩阵集合上呢?答案是使用奇异值分解(SVD)。
给定矩阵 X,计算其SVD:X = U Σ V^T。则其到正交矩阵集的投影为:
Π(X) = U I V^T
即将奇异值矩阵 Σ 中的所有奇异值替换为1(或更一般地,满足约束所需的值),然后重构矩阵。
牛顿法:利用二阶信息
上一节我们介绍了一阶的*端方法。本节中,我们转向利用二阶导数(海森矩阵)的优化方法——牛顿法。
从牛顿-拉弗森法到牛顿法
牛顿法源于求根算法牛顿-拉弗森法。对于优化问题 min f(x),其最优解需满足一阶最优性条件 ∇f(x) = 0。将 ∇f(x) 视为待求根的函数,应用牛顿-拉弗森法,得到牛顿法的迭代公式:
x_{k+1} = x_k - η * [∇²f(x_k)]^{-1} ∇f(x_k)
其中 ∇²f(x_k) 是海森矩阵。当 η=1 时,即为标准形式。
牛顿法的直观解释是:在当前位置 x_k,用二阶泰勒展开*似原函数,并直接跳到该二次函数的最小值点。对于凸函数,在最优解附*,函数*似为二次型,因此牛顿法收敛速度极快(二次收敛)。
带等式约束的牛顿法
对于带等式约束的问题:min f(x), s.t. Ax = b,我们可以利用拉格朗日函数和KKT条件推导出牛顿步。
令拉格朗日函数 L(x, ν) = f(x) + ν^T (Ax - b)。在迭代点附*对 L 进行二阶*似,并令其对 x 和 ν 的导数为零,得到一个线性方程组:
[ ∇²f(x_k) A^T; A 0 ] * [ p; ν ] = [ -∇f(x_k); -(Ax_k - b) ]
其中 p = x_{k+1} - x_k 是待求的更新步长,ν 是对偶变量。通过求解这个方程组,我们可以同时得到 primal 和 dual 的更新。即使初始点不可行(Ax_0 ≠ b),该方法也能处理。
内点法:处理不等式约束
最后,我们探讨如何用内点法(Interior Point Method)或障碍函数法(Barrier Method)处理同时包含等式和不等式约束的通用问题。
问题转化与障碍函数
考虑一般问题:min f(x), s.t. h_i(x) ≤ 0, i=1...m, Ax = b。
核心思想是将不等式约束通过指示函数转化为目标函数中的惩罚项:
min f(x) + Σ_i I_{(-∞, 0]}(h_i(x)), s.t. Ax = b
由于指示函数不可微,我们用光滑的可微函数来*似它,即障碍函数。最常用的是对数障碍函数:
I_{(-∞, 0]}(h_i(x)) ≈ -(1/t) * log(-h_i(x)), 其中 t > 0
当 t 很大时,这个*似很好:在约束内部 (h_i(x) < 0),函数值接*0;在边界上 (h_i(x) → 0⁻),函数值趋向无穷大。
内点法流程
使用对数障碍函数*似后,原问题转化为:
min f(x) - (1/t) * Σ_i log(-h_i(x)), s.t. Ax = b
这变成了一个只含等式约束的优化问题。我们可以用前面介绍的带等式约束的牛顿法来求解它。
算法从初始点(必须在不等式约束内部,即 h_i(x) < 0)开始,固定一个较大的 t,用牛顿法求解上述问题。然后增大 t 的值(例如乘以一个因子),用前一步的解作为初始点,再次求解。随着 t 不断增大,对数障碍函数越来越接*真实的指示函数,最终得到的解会收敛到原问题的最优解。
内点法的精度与参数 t 有关。可以证明,障碍问题的最优值 f*_barrier 与原问题最优值 f* 满足:f* - m/t ≤ f*_barrier ≤ f*。当 t → ∞ 时,f*_barrier → f*。

本节课中我们一起学习了优化技术中的重要方法。我们从*端算子出发,掌握了其定义、几何意义及在L1/L2正则化中的应用,并学习了基于它的*端点算法和*端梯度法。接着,我们过渡到二阶方法,学习了牛顿法及其处理等式约束的扩展。最后,我们探讨了处理不等式约束的强大工具——内点法,了解了通过障碍函数将复杂约束问题转化为序列等式约束问题的核心思想。这些方法构成了现代连续优化算法的基础。
009:共轭梯度法、拟牛顿法与分布式优化



概述
在本节课中,我们将学习几种高级优化技术。首先,我们将回顾牛顿法中的快速求解技巧,包括共轭梯度法。接着,我们将探讨如何避免计算复杂的海森矩阵,即拟牛顿法。最后,我们将进入分布式优化领域,学习如何将复杂问题分解为多个子问题并行求解,重点介绍交替方向乘子法。
牛顿法的快速求解技巧
上一节我们介绍了牛顿法及其在约束优化中的应用。本节中我们来看看如何加速牛顿法中线性方程组的求解过程。
在牛顿法中,无论是无约束问题(更新公式为 p = -H⁻¹∇f),还是处理等式或不等式约束后形成的系统(如 Mz = q),最终都需要求解一个形如 Mz = q 的线性方程组。当变量维度 d 或约束数量 q 很大时,矩阵 M 的规模会变得非常庞大,直接求解非常耗时。
以下是几种加速求解的技巧:
矩阵分解法
通过将系数矩阵 M 分解为特殊结构矩阵的乘积,可以显著加速求解。
- LU分解:将
M分解为置换矩阵P、下三角矩阵L和上三角矩阵U的乘积,即 M = PLU。求解Mz = q转化为依次求解三个更简单的方程组。 - Cholesky分解:仅适用于正定矩阵。将
M分解为 M = LLᵀ,其中L是下三角矩阵。然后通过前向和后向替代快速求解。
舒尔补法
当矩阵 M 能写成块矩阵形式时,可以使用舒尔补进行降维求解,尤其适用于某些块矩阵易于求逆的情况。
共轭梯度法
除了分解,另一种思路是使用迭代法*似求解线性方程组。共轭梯度法就是其中一种高效的方法。
共轭梯度法最初用于求解线性方程组 Mz = q。有趣的是,该方程的解 z = M⁻¹q* 恰好是下面这个二次函数的最小值点:
f(z) = (1/2) zᵀ M z - zᵀ q
因此,求解线性方程组可以转化为一个优化问题。共轭梯度法通过迭代方式求解该优化问题,其更新公式与梯度下降法非常相似:z_{k+1} = z_k - η_k ∇f(z_k)。其中步长 η_k 通过精确线搜索确定。与梯度下降不同的是,共轭梯度法在确定搜索方向 p_k 时,不仅考虑当前梯度,还考虑前一步的方向,以确保新的方向与旧方向关于矩阵 M 是“共轭”的。这使其收敛速度远快于普通梯度下降。
非线性共轭梯度法
将共轭梯度法的思想推广到最小化一般非线性函数 f(z),就得到了非线性共轭梯度法。它不再要求目标函数是二次型,但其核心思想——利用历史信息构建共轭方向——得以保留。有多种公式用于计算方向组合时的参数 β,如 Fletcher-Reeves 公式和 Polak-Ribière 公式。
拟牛顿法
我们了解了牛顿法收敛快但需要计算海森矩阵 H 或其逆矩阵 H⁻¹,这在变量维度高时计算代价巨大。拟牛顿法旨在用*似矩阵 B ≈ H 或 H ≈ H⁻¹ 来替代,从而在保持较快收敛速度的同时降低计算成本。
拟牛顿法的核心思想是利用当前迭代点 x_k 和下一步迭代点 x_{k+1} 的信息来更新*似矩阵。定义:
- s_k = x_{k+1} - x_k (自变量的变化)
- y_k = ∇f(x_{k+1}) - ∇f(x_k) (梯度的变化)
对于凸函数,海森矩阵满足割线方程 H s ≈ y。拟牛顿法要求其*似矩阵 B 或 H 也满足类似条件。

以下是几种著名的拟牛顿法更新公式:

BFGS 方法
这是最流行的拟牛顿法之一。它直接更新对海森矩阵逆 H 的*似:
H_{k+1} = (I - ρ_k s_k y_kᵀ) H_k (I - ρ_k y_k s_kᵀ) + ρ_k s_k s_kᵀ
其中 ρ_k = 1/(y_kᵀ s_k)。
L-BFGS 方法(有限内存BFGS)
当维度 d 极大时,存储 d×d 的矩阵 H 可能内存不足。L-BFGS 不再显式存储整个 H 矩阵,而是只保存最* m 步(例如 m=10)的 {s_i, y_i} 向量对,并在需要计算搜索方向 p = -H ∇f 时,利用这些历史信息通过一个递归算法高效地计算出 H ∇f 的结果。这种方法极大地节省了内存,成为许多现代优化工具箱的首选。
分布式优化
当优化问题涉及多个可分离的变量块时,我们可以采用分布式优化方法,将原问题分解为多个子问题并行求解,最后协调得到全局解。
交替优化
这是最直观的分布式优化思想。对于一个关于多变量 x1, x2, ..., xm 的最小化问题,交替优化依次固定其他变量,只优化一个变量:
x1_{k+1} = argmin_{x1} f(x1, x2_k, ..., xm_k)
x2_{k+1} = argmin_{x2} f(x1_{k+1}, x2, x3_k, ..., xm_k)
...
理论上,每个子问题需要求解到收敛,但实践中对每个子问题只进行一步梯度下降等迭代也常常有效。
对偶上升与分解
考虑带等式约束 Ax = b 的问题。其拉格朗日函数为 L(x, ν) = f(x) + νᵀ(Ax - b)。对偶上升法交替优化原始变量和对偶变量:
- x_{k+1} = argmin_x L(x, ν_k) (最小化拉格朗日函数)
- ν_{k+1} = ν_k + η_k (Ax_{k+1} - b) (梯度上升更新对偶变量,以促使约束满足)
如果目标函数 f(x) 对于变量块是可分解的,即 f(x) = Σ f_i(x_i),那么第一步的 x 更新可以分解为多个独立的子问题并行求解,这就得到了对偶分解法。
交替方向乘子法
ADMM 结合了对偶上升法的思想和增广拉格朗日法(在拉格朗日函数中加入约束违反的二次惩罚项)的优点,用于求解如下形式的问题:
minimize f1(x1) + f2(x2) subject to A x1 + B x2 = c
其增广拉格朗日函数为:
L_ρ(x1, x2, ν) = f1(x1) + f2(x2) + νᵀ(A x1 + B x2 - c) + (ρ/2) ||A x1 + B x2 - c||²
ADMM 的迭代步骤非常简洁:
- x1_{k+1} = argmin_{x1} L_ρ(x1, x2_k, ν_k)
- x2_{k+1} = argmin_{x2} L_ρ(x1_{k+1}, x2, ν_k)
- ν_{k+1} = ν_k + ρ (A x1_{k+1} + B x2_{k+1} - c)
ADMM 的强大之处在于,x1 和 x2 的更新可以完全分离并行,并且算法对于许多凸问题具有良好的收敛性。它还可以推广到处理多个变量块以及不等式约束(通过引入松弛变量将不等式转化为等式),是当前分布式和大规模优化中非常重要的工具。


总结
本节课中我们一起学习了三类重要的优化技术。我们首先探讨了加速牛顿法的数值线性代数技巧,如共轭梯度法。然后,我们介绍了拟牛顿法家族,特别是BFGS和L-BFGS,它们用*似矩阵巧妙地避免了海森矩阵的直接计算。最后,我们进入了分布式优化的领域,从交替优化出发,讲解了对偶上升、对偶分解,并重点介绍了目前广泛应用的交替方向乘子法,这些方法为求解大规模、多变量的复杂优化问题提供了强有力的框架。
010:分布式优化与非光滑优化



概述
在本节课中,我们将要学习分布式优化与非光滑优化的核心概念与方法。我们将首先回顾交替方向乘子法(ADMM)及其在分布式优化中的应用,然后探讨如何处理目标函数不可导(非光滑)的优化问题,例如包含L1正则项的问题。
ADMM与分布式优化
上一节我们介绍了ADMM算法。本节中我们来看看如何利用ADMM进行分布式优化。
ADMM是分布式优化中最著名的算法之一。如果优化问题可以分解为多个互不相交的块或原始变量,我们就能将每个变量的优化分配到不同的核心或服务器上并行计算,从而实现并行化。
以下是ADMM更新步骤的回顾:
- 原始变量更新(可并行):
x_i^{k+1} = \arg\min_{x_i} \left( f_i(x_i) + \frac{\rho}{2} \|x_i - z^k + u_i^k\|^2 \right) - 辅助变量更新(需聚合):
z^{k+1} = \arg\min_{z} \left( \sum_{i} \frac{\rho}{2} \|x_i^{k+1} - z + u_i^k\|^2 + g(z) \right) - 对偶变量更新:
u_i^{k+1} = u_i^k + x_i^{k+1} - z^{k+1}
在每次迭代中,原始变量的更新可以在分布式服务器上并行执行。迭代结束时,更新后的原始变量被聚合到中央服务器,以便更新对偶变量。这种模式让人联想到联邦学习,其两大用途是:处理大数据(通过并行加速)和保护隐私(各服务器数据不互通)。
即使原问题不是分布式的,我们也可以通过引入辅助变量和等式约束,将其转化为分布式问题,从而利用ADMM求解。一个常见的技巧是:对于单变量问题 min f(x),我们引入M个变量 x_1, ..., x_M 和一个辅助变量 z,并添加约束 x_i = z。这等价于要求所有 x_i 相等,从而将原问题转化为ADMM可解的形式。
对于多变量问题,我们可以将约束嵌入目标函数,并使用指示函数。例如,对于约束 x_i ∈ S_i,定义指示函数 Φ_i(x_i),当 x_i ∈ S_i 时为0,否则为无穷大。然后引入辅助变量 z_i 和约束 x_i = z_i,将问题转化为:
\min_{x, z} \sum_i [f_i(x_i) + Φ_i(z_i)] \quad \text{s.t.} \quad x_i = z_i
这同样可以通过ADMM求解。有趣的是,此时的ADMM更新步骤与*端算子密切相关。例如,z 的更新步骤 z_i^{k+1} = \arg\min_{z_i} (Φ_i(z_i) + (ρ/2)\|x_i^{k+1} - z_i + u_i^k\|^2) 就是函数 Φ_i 的*端映射。如果 Φ_i 是集合 S_i 的指示函数,那么这个*端映射就是向集合 S_i 的投影。
ADMM应用实例:图像结构成分分析
为了理解ADMM的实际应用,我们来看一个图像处理领域的例子:图像结构成分分析(ISCA)。该方法受主成分分析(PCA)启发,但用结构相似性距离(SSIM)替代了PCA中的均方误差,以更好地符合人类视觉感知。
其优化问题如下:
\min_{\{U_b\}} \sum_{b=1}^{B} D_{SSIM}(X_b, U_b U_b^T X_b) \quad \text{s.t.} \quad U_b^T U_b = I, \forall b
其中 X_b 是图像块,U_b 是投影矩阵,约束要求 U_b 为正交矩阵。这个问题天然是分布式的(针对每个图像块 b)。我们可以使用ADMM来求解:引入辅助变量 V_b 和约束 U_b = V_b,将正交约束以指示函数形式嵌入关于 V_b 的目标函数中。构建增广拉格朗日函数后,交替更新 U_b, V_b 和对偶变量。其中,V_b 的更新步骤正是向正交矩阵集合的投影(通过将矩阵的奇异值设置为1来实现)。实验结果表明,该方法能有效提取图像的结构信息。
非光滑优化导论
到目前为止,我们假设成本函数是可微且光滑的。然而,许多实际问题涉及非光滑函数,例如在点处不可导的函数。本节将探讨处理非光滑优化问题的方法,特别是包含L1正则项的问题。
L1正则化(又称Lasso)在机器学习和信号处理中广泛应用,因为它能产生稀疏解,并且对异常值比L2正则化更鲁棒。然而,L1范数在零点不可导,这给优化带来了挑战。
我们处理非光滑L1范数优化的一些主要方法包括:
- 使用Huber函数进行光滑*似。
- 使用*端算法(如软阈值法)。
- 使用坐标下降法。
- 使用次梯度法。
方法一:Huber函数光滑*似
处理非光滑函数的一种思路是将其“光滑化”。对于L1范数,我们可以利用凸共轭来定义它的一个光滑*似——Huber函数。
首先,回顾凸共轭的定义。函数 f 的凸共轭 f^*(y) 定义为:
f^*(y) = \sup_{x} (y^T x - f(x))
对于凸函数,取两次凸共轭可以恢复原函数:f(x) = f^{**}(x)。L1范数的凸共轭是单位 L∞ 范数球的指示函数。基于此,并为了在零点获得唯一解,我们添加一个强凸的邻*项,最终可以推导出Huber函数:
H_\mu(x) =
\begin{cases}
\frac{x^2}{2\mu} & \text{if } |x| \le \mu \\
|x| - \frac{\mu}{2} & \text{if } |x| > \mu
\end{cases}
其中 μ > 0 是一个参数。Huber函数处处可导,其导数如下:
H'_\mu(x) =
\begin{cases}
\frac{x}{\mu} & \text{if } |x| \le \mu \\
\operatorname{sign}(x) & \text{if } |x| > \mu
\end{cases}
参数 μ 控制*似的精度:μ 越小,*似越精确,但函数在零点附*的“弯曲”区域越窄,计算可能越不稳定;μ 越大,*似越*滑,但偏离L1范数越远。
方法二:*端算法与软阈值法
*端算法是处理非光滑复合函数优化的强大工具。我们之前已经学过,函数 g 的*端算子定义为:
\operatorname{prox}_{\lambda g}(v) = \arg\min_x \left( g(x) + \frac{1}{2\lambda} \|x - v\|^2 \right)
对于L1范数,其*端算子有一个闭合形式的解,称为软阈值函数:
\operatorname{prox}_{\lambda \|\cdot\|_1}(v)_j = \operatorname{sign}(v_j) \max(|v_j| - \lambda, 0)
这个公式可以按元素应用。它的含义是:如果元素 v_j 的绝对值小于阈值 λ,则将其置为零;否则,将其向零方向收缩 λ 个单位。λ 越小,*似越精确。
对于形如 min f(x) + λ\|x\|_1 的Lasso问题,我们可以使用*端梯度法:在每一步,先对光滑部分 f(x) 做梯度下降,然后对结果应用L1范数的*端算子(即软阈值函数)。
方法三:坐标下降法
坐标下降法的思想类似于交替优化,但交替的是变量的各个坐标。它每次只优化一个坐标(或一个坐标块),而固定其他所有坐标。对于最小化 f(x) 的问题,其基本更新格式为:
x_j^{k+1} = \arg\min_{x_j} f(x_1^{k+1}, ..., x_{j-1}^{k+1}, x_j, x_{j+1}^k, ..., x_d^k)
我们按顺序或随机选择坐标进行更新,并循环往复直至收敛。
将坐标下降法应用于Lasso回归问题 min (1/2)\|y - Xβ\|^2 + λ\|β\|_1 时,针对每个坐标 β_j 的子问题可以导出闭合解。令人惊讶的是,这个解正是软阈值函数:
\beta_j^{new} = \frac{1}{\|X_j\|^2} S_{\lambda} \left( X_j^T (y - X_{-j} \beta_{-j}) \right)
其中 S_λ 是软阈值函数。这意味着,即使使用坐标下降法求解Lasso,最终每个坐标的更新也归结为软阈值操作。
方法四:次梯度法
当函数在某些点不可导时,梯度不存在。为此,我们引入次梯度的概念作为梯度的推广。对于凸函数 f,向量 g 是 f 在点 x 的一个次梯度,如果满足:
f(y) \ge f(x) + g^T (y - x), \quad \forall y
所有在点 x 的次梯度构成的集合称为次微分,记作 ∂f(x)。在函数光滑的点,次微分只包含一个元素,即梯度;在不可导的点(如L1范数的零点),次微分是一个集合(例如,对于绝对值函数,在0点的次微分是区间 [-1, 1])。
基于次梯度,我们可以推广一阶最优性条件:点 x* 是凸函数 f 的最小点,当且仅当 0 ∈ ∂f(x*)。这意味着,在最优解处,零向量是函数的一个次梯度。
次梯度法是梯度下降法在非光滑函数上的推广。其更新公式为:
x^{k+1} = x^k - \alpha_k g^k, \quad \text{其中 } g^k \in \partial f(x^k)
这里 g^k 是当前点 x^k 的任意一个次梯度。在光滑点,它就是梯度;在非光滑点,则从次微分中任选一个。需要注意的是,由于在非光滑点选取的次梯度可能不是下降方向,所以该方法不保证每一步函数值都下降,因此通常不称为“次梯度下降法”。
类似地,我们可以定义随机次梯度法、投影次梯度法等变体,以处理大规模或带约束的非光滑优化问题。
总结
本节课中我们一起学习了分布式优化与非光滑优化的核心内容。
我们首先深入探讨了ADMM算法如何用于分布式优化,通过引入辅助变量和约束,可以将许多问题转化为分布式形式并行求解,并看到了其在图像处理中的一个应用实例。
接着,我们转向非光滑优化,重点讨论了包含L1正则项的问题。我们学习了四种主要处理方法:
- Huber函数光滑*似:通过凸共轭推导出一个处处可导的*似函数。
- *端算法与软阈值法:利用L1范数的*端算子(软阈值函数)来设计迭代算法。
- 坐标下降法:通过轮流优化单个坐标来求解,对于Lasso问题,每个坐标的更新恰好是软阈值操作。
- 次梯度法:将梯度下降推广到非光滑函数,使用次梯度进行迭代更新。


这些方法为解决机器学习、信号处理等领域中常见的非光滑优化问题提供了有力的工具。
011:非凸优化与序列凸规划

在本节课中,我们将学习非凸优化问题及其解决方法。我们将首先了解什么是非凸优化,然后重点介绍两种主要的求解方法:序列凸规划(一种局部优化方法)和分支定界法(一种全局优化方法)。课程内容将尽可能简单直白,以便初学者理解。
概述
非凸优化问题是指目标函数或约束条件不满足凸性要求的优化问题。这类问题在现实中非常普遍,例如神经网络的训练。与凸优化不同,非凸优化通常存在多个局部最优解,找到全局最优解更具挑战性。本节课将介绍处理这类问题的核心思路和具体算法。
非凸优化简介
在预备知识中,我们介绍了凸函数和凸集。如果一个优化问题的目标函数是凸函数,并且可行域是凸集,那么它就是一个凸优化问题。反之,如果目标函数非凸或可行域非凸,那么这就是一个非凸优化问题。
考虑以下一般形式的优化问题:
最小化 f(x)
满足 y_i(x) ≤ 0, i = 1, ..., m1
h_j(x) = 0, j = 1, ..., m2
其中,函数 f, y_i, h_j 不一定都是凸的。
之前介绍的一阶和二阶优化方法(如梯度下降、牛顿法)虽然是为凸问题设计的,但在许多非凸问题上(如机器学习和信号处理)也能取得不错的效果。这是因为在这些领域,局部最优解通常已经足够好。然而,这些方法不能保证找到全局最优解,其结果依赖于初始点的选择。
一个典型的例子是神经网络的训练。神经网络的损失函数(如均方误差)关于网络输出是凸的,但关于网络权重参数则是高度非凸和非线性的。然而,反向传播算法(本质上是梯度下降加链式法则)通常能很好地工作,这是因为在高维特征空间中,局部最优解往往彼此接*,质量都差不多。
非凸优化方法分类
非凸优化方法大致可分为两类:
- 局部优化方法:速度较快,但不保证找到全局最优解。
- 全局优化方法:能保证找到全局最优解,但通常计算较慢。
此外,还有元启发式或基于搜索的优化方法,它们通常属于局部方法,不保证全局最优,我们将在下一部分讨论。
上一节我们介绍了非凸优化的基本概念和分类,本节中我们来看看第一种具体的局部优化方法:序列凸规划。
序列凸规划
序列凸规划是一种局部优化方法。其核心思想是:通过一系列凸优化问题来迭代地逼*原始的非凸优化问题。
在每次迭代 k 中,SCP 解决以下凸*似问题:
最小化 f̂(x)
满足 ŷ_i(x) ≤ 0, i = 1, ..., m1
ĥ_j(x) = 0, j = 1, ..., m2
x ∈ T_k
其中:
f̂,ŷ_i,ĥ_j是原非凸函数在当前迭代点x_k附*的凸*似。T_k称为信赖域,它确保变量x停留在一个局部凸区域内,使得凸*似是可信的。
这个凸*似问题本身可以用之前学过的任何凸优化方法(如内点法)来求解。因此,SCP 包含一个嵌套循环:外层是 SCP 迭代,内层是求解凸*似问题。
凸*似的构建方法
以下是构建凸*似 f̂, ŷ_i, ĥ_j 的几种常见方法:
1. 泰勒级数展开
使用一阶或二阶泰勒展开来获得线性(仿射)或二次凸*似。
- 一阶*似(仿射函数,总是凸的):
f̂(x) = f(x_k) + ∇f(x_k)^T (x - x_k) - 二阶*似(二次函数,需保证凸性):
f̂(x) = f(x_k) + ∇f(x_k)^T (x - x_k) + 1/2 (x - x_k)^T P (x - x_k)
其中,P是原函数海森矩阵在正半定锥上的投影,以确保f̂是凸函数。投影可以通过特征值分解实现:将负特征值置零,然后重构矩阵。
2. 粒子法
在信赖域 T_k 内选取若干点,通过求解一个最小二乘二次回归问题来拟合凸函数。
最小化 Σ_{i=1}^m [ (1/2 x_i^T P x_i + b^T x_i + a) - f(x_i) ]^2
满足 P ≽ 0 (半正定)
求解得到 P, b, a 后,凸*似函数即为 f̂(x) = 1/2 x^T P x + b^T x + a。
3. 拟线性化
将函数重新参数化,使其形式上类似于线性函数。例如,对于二次*似 f̂(x) = 1/2 x^T P x + b^T x + a,可以将其重写为:
f̂(x) = a(x)^T x + c(x)
其中 a(x) = 1/2 P x + b,c(x) = a。虽然 a(x) 依赖于 x,但形式上是线性的,故称“拟线性”。
信赖域及其更新
信赖域 T_k 通常定义为当前迭代点 x_k 附*的一个简单区域,例如:
- 超立方体(框):
|x_j - x_{k,j}| ≤ ρ_j,对每个维度j。 - 椭圆(或球):
(x - x_k)^T P (x - x_k) ≤ ρ,其中P对称正定。
信赖域需要在迭代中更新。更新策略基于*似解的质量。我们定义两个量:
- 预测下降量:
Δ̂ = φ(x_k) - φ̂(x̂_k),其中φ是原问题的正则化成本函数,φ̂是*似问题的正则化成本函数。 - 实际下降量:
Δ = φ(x_k) - φ(x̂_k)。
更新规则如下:
- 如果
Δ̂ ≥ α Δ(例如α=0.1),说明*似解质量好。接受x̂_k作为新迭代点,并扩大信赖域(例如ρ := ρ * β, β>1)。 - 否则,说明*似解质量差。拒绝
x̂_k,将当前点保持不变(x_{k+1} = x_k),并缩小信赖域(例如ρ := ρ * γ, 0<γ<1)。
通过这种机制,SCP 在解质量好时探索更大区域,质量差时收缩到更可信的局部区域。
上一节我们介绍了作为局部方法的序列凸规划,本节中我们来看看能保证全局最优的分支定界法。
分支定界法
分支定界法是一种全局优化方法,其思想与用于整数线性规划的分支定界法类似。它能保证找到全局最优解,但计算成本通常较高。
核心思想
算法的核心思想是:
- 分支:将整个可行域递归地分割成更小的子区域(通常是超矩形)。
- 定界:在每个子区域上,计算目标函数最优值
f*的上界和下界。 - 剪枝:通过比较不同子区域的边界,排除那些不可能包含全局最优解的子区域。
随着分割的进行,上下界会越来越紧,直到足够接*,从而确定全局最优解。
上下界的计算
- 下界 (L):在子区域上,求解原问题的一个凸松弛问题。对于最小化问题,凸松弛的解
f_relax*一定不大于原子区域上的全局最优解f*,即L = f_relax* ≤ f*。 - 上界 (U):在子区域内任意选取一个可行点
x_feas,计算其目标函数值f(x_feas)。根据定义,全局最优值f*一定不大于该值,即U = f(x_feas) ≥ f*。
因此,在子区域上有 L ≤ f* ≤ U。
算法步骤
以下是分支定界法用于最小化问题的简化步骤:
- 初始化:将整个可行域作为初始区域
R。计算其下界L(R)和上界U(R)。设置全局下界L_global = L(R),全局上界U_global = U(R)。 - 循环:当
U_global - L_global > ε(ε 为预设容差)时:
a. 选择区域:从当前活跃区域中选择一个区域(例如,下界最小的区域,因为它可能包含更优解)。
b. 分支:将所选区域分割成两个子区域R_left和R_right。
c. 定界:计算每个子区域的下界L_left,L_right和上界U_left,U_right。
d. 更新全局边界:
*L_global = max(L_global, L_left, L_right)(我们希望下界更大)
*U_global = min(U_global, U_left, U_right)(我们希望上界更小)
e. 剪枝:如果某个子区域的下界L_sub已经大于当前全局上界U_global,则该子区域不可能包含全局最优解,将其丢弃。 - 终止与返回:当循环结束时,全局最优解
f*被夹在L_global和U_global之间,且两者非常接*。通常返回使得下界最小的那个区域对应的解作为全局最优解的*似。
对于最大化问题,逻辑类似,但需要注意比较方向(例如,我们关注上界更大的区域)。
总结
本节课中我们一起学习了非凸优化及其两种核心求解策略:
- 序列凸规划:一种高效的局部方法,通过迭代求解凸*似问题来逼*非凸问题的局部最优解。其关键在于构建凸*似和动态管理信赖域。
- 分支定界法:一种能保证全局最优性的方法,但计算量较大。它通过系统地分割可行域并计算上下界来搜索全局最优解。

这两种方法代表了在求解难度和求解质量之间进行权衡的经典思路。对于许多实际应用(如深度学习),找到高质量的局部解通常已经足够,因此SCP等局部方法及其变种被广泛使用。而当问题要求找到全局最优时,则需考虑分支定界法等全局方法。在下一部分,我们将探讨另一类强大的工具——元启发式优化算法。
013:黎曼矩阵流形上的优化

概述
在本节课中,我们将学习黎曼优化的基本概念。我们将从向量空间和流形的基础知识开始,逐步深入到黎曼流形、黎曼优化问题,以及如何将欧几里得优化问题转化为黎曼优化问题。我们还将介绍黎曼流形上的核心概念,如切空间、度量、测地线、梯度、Hessian矩阵、指数映射和对数映射等。最后,我们会简要介绍一些重要的黎曼矩阵流形和相关的工具箱与文献。
向量空间与流形
上一节我们介绍了课程概述,本节中我们来看看优化问题所涉及的基础数学空间。
向量空间,也称为线性空间,是一个集合,其元素(通常称为向量)可以相加,并可以与称为标量的数字相乘或缩放。简单来说,我们可以用标量缩放向量,然后将它们相加。我们可以在这个空间中进行向量的加法和线性组合。向量空间包含原点,因为一个向量减去它自身等于零向量(即原点),而原点必须在这个空间中。
欧几里得空间是一个定义了欧几里得距离度量的向量空间。这意味着当你在该向量空间中有两个点时,每个点都可以表示为一个从原点到该点的向量。两点之间的欧几里得距离,即连接这两点的线段的长度,可以通过连接两点的向量的 L2 范数来计算。
光滑流形,简单来说,是一个可微的弯曲超曲面。在一维中,它是一条线;在二维中,它是一个*面(线性)或非线性曲面;在三维中,它可以是一个*面或非线性曲面。在更高维度中,我们无法可视化,只能想象。超曲面不一定是线性的,超*面是超曲面的一个特例。一般来说,弯曲的超曲面可以看作光滑流形,它是可微的,意味着你可以在流形上的所有点求导。在数学定义上,它需要拓扑空间、图卡和同胚的概念。
黎曼流形
上一节我们介绍了光滑流形,本节中我们来看看黎曼流形,它为流形赋予了距离概念。
黎曼流形,记为 M(M 代表流形)。简单来说,它是一个实光滑流形(流形也可以是复的),并且其上定义了一个黎曼距离度量。这个度量是定义在弯曲超曲面上的距离。当你在流形上有两个点时,连接它们的最短曲线(测地线)的长度就是这两点之间的黎曼距离。在数学定义上,黎曼流形是一个实光滑流形,并且在每一点的切空间上都配备了一个正定内积,这个内积称为流形的度量。有了度量,你几乎可以计算流形上的一切:内积、距离、测地线和曲率。
欧几里得优化 vs 黎曼优化
上一节我们定义了黎曼流形,本节中我们来看看在这两种不同空间中的优化问题有何异同。
在之前的优化技术课程中,所讨论的通常是欧几里得优化。常规优化通常是欧几里得优化,我们在欧几里得空间中优化。例如,成本函数是从欧几里得空间到标量的映射:f: R^D -> R。优化问题可以看作 minimize f(x) with respect to x subject to x ∈ R^D。当只有这个约束时,可以将其视为无约束优化问题。如果优化问题有约束,我们实际上有不等式和等式约束,这些约束的交集定义了可行集。
欧几里得空间是*坦的黎曼流形的一个特例。因此,我们可以将欧几里得优化算法推广到黎曼优化算法。在黎曼优化中,我们优化一个成本函数,而变量位于一个黎曼流形 M 上。优化变量通常是一个矩阵,因此黎曼优化也称为矩阵流形上的优化。函数是从流形到实数的映射:f: M -> R。优化问题写作 minimize f(X) with respect to X subject to X ∈ M。比较这两个公式,可以看出欧几里得优化是黎曼优化的特例,其中流形 M 就是欧几里得空间。
将欧氏优化转化为黎曼优化
上一节我们对比了两种优化,本节中我们来看一个有用的技巧:将某些欧氏约束优化问题转化为黎曼优化问题。
有时,我们可以将欧几里得优化问题转化为黎曼优化问题。一些约束实际上是某些众所周知的流形。例如,考虑优化问题:minimize f(X) = trace(X^T A X) subject to X^T X = I。这个约束 X^T X = I 意味着矩阵 X 是正交矩阵,其列是标准正交的。这实际上是一个著名的流形,称为Stiefel流形。因此,我们可以将问题重写为 minimize trace(X^T A X) subject to X ∈ Stiefel manifold。通过这种技术,我们将欧几里得优化问题转化为了黎曼优化问题。
如果约束要求 X 是正定矩阵,那么这对应对称正定(SPD)流形。如果想找到子空间上的投影(例如在PCA中),则对应Grassmann流形。许多机器学习算法可以表述为Grassmann流形上的优化问题。
拓扑与光滑流形概念
上一节我们介绍了问题转化的技巧,本节中我们需要深入一些微分几何和代数拓扑的基础概念,以更好地理解流形。
设 X 为一个集合。X 上的一个拓扑 T 是 X 的子集(称为开集)的一个集合,满足以下三个条件:
- 空集和整个集合 X 属于 T。
- T 中任意有限个开集的交集也属于 T。
- T 中任意多个开集的并集也属于 T。
拓扑空间 就是配备了拓扑 T 的集合 X 所构成的对 (X, T)。


一个拓扑空间 (X, T) 是 Hausdorff空间 当且仅当对于 X 中任意两个不同的点 x1 和 x2,存在开集 U 和 V,使得 x1 ∈ U,x2 ∈ V,且 U ∩ V = ∅。简单来说,这意味着点是可分离和可区分的。
同胚 是代数拓扑中的一个重要概念。它是从一个拓扑到另一个拓扑的变换,且不撕裂拓扑。你可以变形它,但不能撕裂。两个拓扑在同胚变换前后被称为是同胚的,记为 ≅。例如,一个咖啡杯和一个甜甜圈(环面)是同胚的。
微分同胚 是一个光滑且可微的同胚变换。例如,一个有尖角的形状和一个光滑形状可能是同胚的,但不是微分同胚的。


一个拓扑空间 (X, T) 是一个 d维拓扑流形(或称拓扑d-流形),如果它是Hausdorff空间,具有可数基,并且局部同胚于d维欧几里得空间 R^d。“局部”意味着如果你像蚂蚁一样站在流形上,你看到的局部区域类似于 R^d。例如,一条嵌入在二维空间中的曲线局部是一维的(一个线段),所以它是一个一维流形。一个球的表面(二维球面 S^2)嵌入在三维空间中,但局部是二维的(像一个*面),所以它是一个二维流形。而一个实心球(三维球体 B^3)嵌入在三维空间中,局部是三维的,所以它是一个三维流形。
图卡与光滑图册
上一节我们定义了拓扑流形,本节中我们来看看如何用“地图”(图卡)来覆盖和描述流形。
考虑一个d维拓扑流形 M。对于所有 x ∈ M,存在一个包含 x 的开集 U 和一个同胚映射 φ: U -> φ(U),其中 φ(U) 是 R^d 的一个开子集。这个二元组 (U, φ) 称为流形 M 的一个坐标图卡或简称图卡。
一个光滑图册 A 是覆盖流形 M 的图卡集合 {(U_α, φ_α)},并且其中任意两个图卡是光滑相容的。两个图卡 (U, φ) 和 (V, ψ) 是光滑相容的,如果转换映射 ψ ∘ φ^{-1}: φ(U ∩ V) -> ψ(U ∩ V) 及其逆是光滑的(C^∞)。一个极大光滑图册是一个不被任何其他光滑图册所包含的光滑图册。
一个光滑d维流形 就是一个配备了极大光滑图册 A 的d维拓扑流形。
黎曼流形概念
上一节我们完成了对光滑流形的定义,本节中我们最终正式定义黎曼流形及其相关核心概念。
黎曼流形 M 是一个光滑流形,并且配备了一个度量或内积 g。注意,这个度量不是距离度量,而是定义在流形每一点切空间上的内积。有了这个度量 g,我们可以计算切向量的内积、流形上曲线的长度、两点之间的(黎曼)距离(即连接它们的测地线长度)、测地线本身以及流形的曲率。
以下是黎曼流形的一些核心概念:
- 切空间 T_x M:在流形 M 上点 x 处的切向量的空间。可以将其视为在该点与流形相切的超*面。如果流形是d维的,则切空间也是d维的。
- 黎曼度量 g:一个函数,它取切空间中的两个切向量 ζ 和 η,并输出一个标量,即它们的内积:
g_x(ζ, η)。 - 范数:利用度量,可以定义切向量的范数:
||ζ||_x = sqrt(g_x(ζ, ζ))。 - 曲线长度:流形上一条参数曲线 x(t)(t 从 a 到 b)的长度由积分给出:
Length = ∫_a^b ||dx/dt|| dt。 - 测地线:流形上连接两点、局部长度最短的曲线。
- 黎曼梯度 grad f(x):成本函数 f 在流形上点 x 处最速上升的方向。它是欧几里得梯度在黎曼几何中的推广。
- 黎曼Hessian Hess f(x):黎曼梯度的导数,是欧几里得Hessian矩阵在黎曼几何中的推广。它可以表示为
Hess f(x)[ζ] = ∇_ζ grad f(x),其中 ∇ 是仿射联络。 - 对数映射 log_x(y):黎曼几何中减法的推广。它取流形上两点 x 和 y,返回切空间 T_x M 中的一个切向量,该向量代表了从 x 到 y 的方向。
- 指数映射 exp_x(ζ):黎曼几何中加法的推广。它取流形上一点 x 和切空间 T_x M 中的一个切向量 ζ,返回流形上沿着 ζ 方向“走”一段距离后到达的点 y。
- 收缩 Retraction R_x(ζ):指数映射的*似。它提供了一种更简单的方式从 x 沿着方向 ζ 移动到流形上的新点,通常是通过在切空间中沿直线移动,然后投影回流形来实现。
- *行移动:沿着流形上一条曲线移动一个切向量,使其相对于联络保持“*行”。如果流形有曲率,沿着闭合曲线*行移动一个向量后,返回的向量可能与原始向量方向不同,这个差异角反映了流形的曲率。
- 向量传输 T_{x->y}(ζ):*行移动的*似。它将切空间 T_x M 中的一个向量 ζ 映射到另一个切空间 T_y M 中的一个对应向量。
黎曼优化算法
上一节我们介绍了黎曼流形的数学工具,本节中我们来看看如何利用这些工具构建优化算法。
欧几里得优化算法可以推广到黎曼优化算法。以下是两个例子:
1. 黎曼梯度下降
欧几里得梯度下降的更新公式为:x_{k+1} = x_k - λ ∇f(x_k)。
在黎曼几何中,加法被指数映射推广。因此,黎曼梯度下降的更新为:x_{k+1} = exp_{x_k}(-λ grad f(x_k))。
由于指数映射可能计算复杂,常用收缩来*似:x_{k+1} = R_{x_k}(-λ grad f(x_k))。
2. 黎曼牛顿法
欧几里得牛顿法的更新通过求解 ∇²f(x_k) Δx = -∇f(x_k) 得到 Δx,然后 x_{k+1} = x_k + Δx。
推广到黎曼几何,我们求解关于切向量 ζ 的方程:Hess f(x_k)[ζ] = -grad f(x_k)。
然后通过指数映射或收缩进行更新:x_{k+1} = exp_{x_k}(ζ) 或 x_{k+1} = R_{x_k}(ζ)。
对于大规模问题,二阶方法中需要*似Hessian矩阵。L-BFGS(有限内存BFGS)是一种流行的拟牛顿法。黎曼L-BFGS 将L-BFGS推广到黎曼流形。一个关键区别是,在黎曼几何中,不同迭代点的梯度位于不同的切空间中,因此需要使用向量传输 来将向量从一个切空间移动到另一个切空间,以便进行向量运算。
重要的黎曼矩阵流形
上一节介绍了算法,本节中我们简要介绍优化中常见的几个具体矩阵流形。
- Stiefel 流形 St(p, d):所有满足
X^T X = I_p的d × p矩阵 X 的集合,即列标准正交的矩阵。记为St(p, d) = {X ∈ R^{d×p} : X^T X = I}。 - Grassmann 流形 Gr(p, d):所有 R^d 中 p 维线性子空间的集合。它可以表示为Stiefel流形关于
p × p正交群的商流形:Gr(p, d) = St(p, d) / O(p)。Grassmann流形与线性投影矩阵密切相关,出现在PCA、FDA以及神经网络(在非线性激活之前)中。 - 对称正定 (SPD) 流形 S_{++}^d:所有
d × d对称正定矩阵的集合。正定性意味着所有特征值为正。协方差矩阵、二次型中的权重矩阵、广义马氏距离中的权重矩阵都是SPD矩阵的例子。
工具、文献与学者
上一节我们了解了几种具体的流形,本节中我们来看看这个领域有哪些可用资源和重要贡献者。
工具箱
- Manopt (MATLAB): 最著名的黎曼优化工具箱。
- Pymanopt (Python): Manopt 的 Python 版本。
- Geoopt (PyTorch): 用于深度学习的几何优化库。
- ROPTLIB (C++): Manopt 的 C++ 版本。
- Mixtools (MATLAB): 实现了黎曼L-BFGS和混合模型。
重要书籍
- Optimization Algorithms on Matrix Manifolds by P.-A. Absil, R. Mahony, and R. Sepulchre.
- An Introduction to Optimization on Smooth Manifolds by N. Boumal.
- Introduction to Topological Manifolds by J. M. Lee.
- Introduction to Smooth Manifolds by J. M. Lee.
重要学者(部分)
- P.-A. Absil (UC Louvain, 比利时)
- N. Boumal (EPFL, 瑞士)
- S. Sra (MIT, 美国)
- R. Hosseini (University of Tehran, 伊朗)
- S. Hauberg (Technical University of Denmark, 丹麦)

总结
本节课中,我们一起学习了黎曼优化的基础知识。我们从向量空间和流形的定义出发,理解了黎曼流形是如何为光滑流形添加度量结构的。我们比较了欧几里得优化和黎曼优化,并学习了如何将某些带约束的欧氏问题转化为黎曼优化问题。为了深入理解流形,我们介绍了拓扑、图卡、光滑图册等概念。接着,我们探讨了黎曼流形的核心工具,如切空间、度量、梯度、指数与对数映射等。基于这些工具,我们看到了如何将梯度下降和牛顿法等经典算法推广到黎曼流形上。最后,我们认识了Stiefel流形、Grassmann流形和SPD流形这几个重要的矩阵流形,并了解了该领域的常用工具箱和重要文献。黎曼优化为处理变量属于特定弯曲空间(如正交矩阵、子空间、正定矩阵)的优化问题提供了强大而优雅的框架。
014:总结与结论 📚

在本节课中,我们将对本课程所学的优化技术进行全面的回顾与总结。我们将梳理核心概念,并提供一个清晰的框架,帮助你在面对具体优化问题时,能够选择和应用合适的方法。
课程概述 📖
本课程涵盖了优化技术的主要方法。我们从预备知识开始,包括集合、范数、函数、局部与全局极小值、导数、梯度、雅可比矩阵、海森矩阵、集合与函数的凸性。我们还介绍了标准问题形式,如凸优化问题、线性规划、二次规划和半定规划。
补充内容:未涵盖的重要方法 🔍
上一节我们回顾了课程的核心内容。本节中,我们来看看一些课程中未深入讲解,但值得了解的重要优化方法。
割*面法
割*面法,也称为定位法,是一类方法的统称。其核心思想是:从一个包含待求解的大可行集开始,然后迭代地通过“切割”掉一部分不含解的区域来缩小可行集。
以下是其基本步骤:
- 从一个大的可行集(由不等式约束、等式约束和优化变量定义域决定)开始。
- 在每次迭代中,找到一个超*面将当前可行集分割成两个互不相交的部分。
- 通过某种算法判断解位于哪个部分,然后舍弃不含解的那个部分。
- 重复此过程,直到可行集变得非常小,收敛到解。
核心思想:我们虽然不知道解的确切位置,但可以判断它位于分割后的哪个部分。这类似于“猜数字”游戏中的二分查找法。
与二分法的关系:二分法是割*面法的一个特例,它总是将可行集*分为两个相等的部分。割*面法则允许以不同方式(如选择重心、最大体积椭球中心等)进行分割。
重要算法:重心法、最大体积椭球法、切比雪夫中心法、解析中心法。
应用:与次梯度法类似,割*面法也可用于优化非光滑函数。
椭球法
椭球法由多位学者在1976-1977年间提出,最初应用于线性规划。它在迭代缩小可行集这一点上与割*面法相似。
以下是其工作原理:
- 在每次迭代中,以当前解 x_k 为中心构造一个椭球 E_k。
- 椭球定义为:{ z | (z - x_k)^T P^{-1} (z - x_k) ≤ 1 },其中 P 是对称正定矩阵。
- 判断解位于椭球的哪一半,并舍弃不含解的那一半。
- 在更新后的解处构造一个新的、更小的椭球。
- 重复此过程,直到椭球体积变得非常小,收敛到解。
关键点:与割*面法使用超*面切割不同,椭球法直接构造并切割椭球。对于凸优化问题,可以利用梯度方向来判断应保留椭球的哪一半。
极小极大与极大极小问题
考虑一个双变量函数 f(x1, x2) 的优化问题。
- 极小极大问题:先关于 x2 最大化,再关于 x1 最小化。
- 公式:min_{x1} max_{x2} f(x1, x2)
- 极大极小问题:先关于 x1 最小化,再关于 x2 最大化。
- 公式:max_{x2} min_{x1} f(x1, x2)
核心概念:这两个变量具有冲突的目标。一个想最大化函数值,另一个想最小化函数值。因此,这类问题在博弈论中应用广泛。
等价条件:在特定条件下(当极大化和极小化的变量对象保持一致时),极小极大问题与极大极小问题是等价的。
应用实例:
- 机器学习:生成对抗网络(GAN)中,生成器试图最大化判别器的损失,而判别器试图最小化该损失。
- 经济学:双头垄断市场中竞争者的策略分析。
课程内容总结 🧠
现在,让我们系统地总结在本课程中学到的所有优化方法。
课程提供了优化的主要方法。首先,我们从预备知识开始,包括集合、范数、函数、局部与全局极小值、导数、梯度、雅可比矩阵、海森矩阵、集合与函数的凸性。我们还介绍了标准问题形式,如凸优化问题、线性规划、二次规划、半定规划。
我们涵盖了线性规划,介绍了单纯形算法及其表格法实现。我们还介绍了整数线性规划,以及用于求解它的分支定界法。
我们介绍了KKT条件、拉格朗日函数和拉格朗日乘子法。
我们涵盖了无约束一阶优化,包括梯度下降、反向传播、加速梯度法、随机梯度下降、SAGA算法、神经网络。为了处理约束一阶优化,我们还涵盖了*端方法,如投影梯度法。
我们涵盖了无约束和约束二阶优化。对于二阶优化,我们需要一阶和二阶导数。我们介绍了用于无约束二阶优化的牛顿法,以及用于约束二阶优化的内点法(如对数障碍法)。我们还介绍了分解方法和共轭梯度法来加速牛顿法。我们介绍了拟牛顿法,如BFGS和有限内存BFGS,用于*似牛顿法中的海森矩阵或其逆矩阵。
我们学习了分布式优化,如交替优化和交替方向乘子法,以解决复杂的多变量优化问题。
我们涵盖了非光滑优化,通过凸共轭和Huber函数进行*似,并介绍了*端算法、软阈值化、坐标下降和次梯度法。
我们涵盖了非凸优化,将其分为局部方法和全局方法。局部方法(如序列凸规划)更快,但不保证找到全局解。全局方法(如分支定界法)较慢,但能保证并验证全局解。
我们涵盖了重要的基于搜索的元启发式优化方法,用于处理高度非线性和非凸问题,例如遗传算法、粒子群优化、模拟退火和MATLAB中fminsearch使用的Nelder-Mead单纯形算法。
最后,我们在课程的附加讲座中介绍了用于黎曼流形优化的黎曼优化。
如何应对优化问题:决策流程 🗺️
学习了这么多方法后,面对一个具体的优化问题,我们该如何着手解决呢?本节将提供一个清晰的决策流程。
假设我们有一个优化问题,需要最小化或最大化一个成本函数,并可能带有等式和/或不等式约束。
1. 判断问题类型
首先,识别问题是无约束还是有约束的。如果有约束,进一步区分是仅等式约束、仅不等式约束,还是两者混合。
2. 无约束问题的处理
对于无约束最小化问题 min f(x):
- 第一步:求导并令其为零 (∇f(x) = 0)。这是基于一阶最优性条件(也是KKT条件的推论)。
- 若能求出闭式解:检查该点是极小值、极大值还是鞍点。通过计算该点处的二阶导数(海森矩阵)来判断:
- 若在邻域内海森矩阵半正定,则为(局部)极小值。
- 若半负定,则为(局部)极大值。
- 若不定,则为鞍点。
- 若无法求出闭式解:需要使用数值优化方法。这本质上等同于寻找 ∇f(x) = 0 的根。数值方法分为:
- 一阶方法:只需梯度,更简单但收敛慢(如梯度下降)。
- 二阶方法:需要梯度和海森矩阵,更复杂但收敛快(如牛顿法)。
3. 约束问题的处理:转化为无约束问题
对于约束问题,一种策略是将其转化为无约束问题。
- 软惩罚/正则化:将约束作为惩罚项加入目标函数。
- 公式:min f(x) + Σ λ_i * penalty(g_i(x)) + Σ μ_j * penalty(h_j(x))
- 当约束满足时惩罚为0,违反时惩罚增加。
- 硬惩罚/指示函数:使用指示函数 I_S(x),当 x 在可行集 S 内时为0,否则为无穷大。
- 公式:min f(x) + I_S(x)
- 由于无穷大难以计算,通常用障碍函数(如对数障碍)来*似,这引出了内点法。
4. 针对特定问题结构的专用方法
- 线性规划:目标函数和约束均为仿射函数。可使用单纯形算法(如表格法)或内点法求解。若只有2-3个变量,可视化是最简单的方法。
- 整数线性规划:变量为整数。使用分支定界法,其中每个子问题可用单纯形法求解。
- 可用拉格朗日乘子法的问题:对于不太复杂的约束问题,可建立拉格朗日函数并应用KKT条件求解方程组。
- 分布式/多变量问题:使用交替优化或交替方向乘子法,这些方法易于并行化。
- 非光滑问题:目标函数在某些点不可微。可使用*端算法、软阈值化、坐标下降、次梯度法,或用Huber函数等光滑函数进行*似。
- 非凸问题:目标函数非凸和/或可行集非凸。
- 局部方法:如序列凸规划,每次迭代将问题*似为凸问题,速度快但不保证全局最优。
- 全局方法:如分支定界法,速度慢但能保证找到全局解。
- 元启发式方法:适用于高度非线性、非凸、梯度难以计算或函数为黑盒的情况。例如遗传算法、粒子群优化、模拟退火。
- 黎曼流形上的问题:如果约束集可以视为一个黎曼流形(如正交矩阵集、正定矩阵集),则使用黎曼优化方法。
优化之精髓:KKT条件与拉格朗日函数 💡
回顾本课程的所有算法,你会发现一个共通的精髓:大多数优化算法的核心是KKT条件和拉格朗日函数。
这是优化领域的“顿悟时刻”。无论是推导一阶、二阶方法,还是内点法、交替方向乘子法,我们几乎总是在利用拉格朗日函数和KKT条件。拉格朗日函数可以看作是对约束的软惩罚,而KKT条件则系统化地表述了最优解必须满足的一阶条件。
各种算法之间也存在着深刻的联系和共享的思想。例如,加速梯度法中交替更新变量的思想与交替优化相通;坐标下降可以视为在坐标方向上的交替优化;许多算法都利用了“动量”或历史信息的理念。
建议你回顾所学算法,体会它们是如何以KKT和拉格朗日函数为基石,并通过共享的思想相互关联的。
致谢与参考资料 📚
本讲稿的部分内容受Stephen Boyd教授关于椭球法和割*面法的讲义启发。课程教程也包含了本讲稿的一些材料。
主要参考资料:
- Boyd 等人的割*面法讲义。
- 数值分析相关书籍。
- 解析中心割*面法相关论文 (1993, 1995)。
- 椭球法相关论文 (1976-1977, 1980, 2009)。
- 关于极小极大原理及其在博弈论中应用的论文 (1972)。
- 优化教程论文。
总结 🎯

本节课中,我们一起学习了优化技术课程的全面总结。我们回顾了从基础概念到高级算法的知识体系,梳理了包括割*面法、椭球法、极小极大问题在内的补充内容。最重要的是,我们建立了一个清晰的决策框架,帮助你根据优化问题的具体特征(如是否有约束、是否线性、是否光滑、是否凸等)来选择最合适的求解路径。最后,我们指出了KKT条件和拉格朗日函数作为贯穿整个优化理论的核心支柱。希望本课程对你深入理解和应用优化技术有所帮助。

浙公网安备 33010602011771号