IIT-CS769-机器学习优化笔记-全-

IIT CS769 机器学习优化笔记(全)

002:机器学习中的优化问题

在本节课中,我们将正式开启机器学习优化的主题。我们将聚焦于优化在机器学习中的应用,首先介绍连续优化的应用,然后简要探讨离散优化。通过具体的例子,我们将理解如何将常见的机器学习问题形式化为优化问题。

概述:监督学习中的优化

任何标准的机器学习课程都会从分类或回归等问题开始。在分类问题中,标签通常是 +1-1;而在回归问题中,标签是连续值。例如,垃圾邮件过滤、手写数字识别和房价预测都是典型的监督学习任务。

解决这些问题的典型方法是学习一个从输入特征 X 到输出 Y 的映射。这个映射通常涉及一组权重参数 θ(或 W),可能通过一个广义线性函数 f 来实现。在深度学习中,这个映射可能由多层非线性函数 f1, f2, ..., fL 递归构成。

我们的目标是找到一个参数 θ,使得模型的预测 F(x; θ) 尽可能接近真实标签 y。这通过定义一个损失函数 L 来衡量预测值与真实值之间的差距。同时,为了控制模型复杂度、防止过拟合或加速优化过程,我们通常会加入一个正则化项 R。因此,监督学习的核心优化框架可以概括为:

最小化: L(θ) + λ R(θ)

其中,λ 是控制正则化强度的超参数。

上一节我们介绍了监督学习的基本优化框架,本节中我们来看看损失函数和正则化项的具体形式。

常见的损失函数

以下是几种常见的损失函数示例,它们衡量预测值与真实值之间的差异:

  • 0-1损失(黑色):如果预测标签与真实标签不一致,损失为1,否则为0。它既不连续也不可微。
  • 合页损失(绿色):用于支持向量机(SVM)。它是连续的,但在 y·f(x) = 1 处不可微。
  • 指数损失(蓝色):用于AdaBoost等提升算法。
  • 逻辑损失/交叉熵损失:用于逻辑回归和多分类的Softmax回归。它是连续且处处可微的。
  • 最小二乘损失:用于线性回归,计算预测值与真实值之差的平方。
  • 绝对误差损失:计算预测值与真实值之差的绝对值,在差值为0处不可微。

常见的正则化项

正则化项 R(θ) 为模型参数 θ 添加了先验约束,主要目的包括:防止过拟合、使优化问题更易于求解(例如,通过增强凸性来加速收敛)。

以下是两种最著名的正则化项:

  • L2正则化R(θ) = ||θ||₂²,即权重的平方和。它对应于高斯先验,倾向于让所有权重都变得较小,但很少精确为零。
  • L1正则化R(θ) = ||θ||₁,即权重的绝对值之和。它对应于拉普拉斯先验,倾向于产生稀疏解,即许多权重值恰好为零。

L1正则化之所以能产生稀疏解,可以从几何和算法角度理解。从几何上看,L1范数的等高线是“菱形”,其顶点位于坐标轴上,优化解容易落在这些顶点上,导致某些维度为零。从算法上看,在求解Lasso(L1正则化线性回归)时,近端梯度下降法等算法会包含一个“软阈值”操作:如果权重估计值 w_i 的绝对值小于某个阈值 λη,则将其置为零。

这种稀疏性有助于模型压缩、提高解释性,并可能提升泛化能力。

应用二:聚类问题

聚类是无监督学习的一个典型例子。给定一组未标记的数据点 {x_i} 和聚类数量 K,目标是将数据点划分为 K 个组(簇),使得同一簇内的点彼此相似,不同簇的点彼此相异。

连续优化 formulations 通常会产生凸形状的簇。相似性可以通过距离(如欧氏距离、L1距离)或相似度度量(如余弦相似度、正定核函数)来定义。

一个著名的聚类方法是 K-Means。其优化目标是:找到簇中心 {μ_i} 和簇分配 {C_i},最小化所有点到其所属簇中心的距离平方和。

目标函数: min_{ {μ_i}, {C_i} } Σ_{i=1}^{K} Σ_{x∈C_i} ||x - μ_i||₂²

这是一个混合连续与离散的优化问题μ_i 连续,C_i 离散)。通常采用迭代算法(如EM算法)求解:先固定 μ_i 优化 C_i(将每个点分配给最近的中心),再固定 C_i 优化 μ_i(将中心更新为簇内点的均值)。

应用三:主成分分析

主成分分析(PCA)是另一种无监督学习技术,用于降维和特征提取。给定高维数据 {x_i},PCA的目标是找到一组正交基(主成分),将数据投影到低维空间后,能最大程度地保留原始数据的方差(或最小化重构误差)。

可以从两个等价的角度来理解PCA的优化问题:

  1. 最大方差角度:寻找投影方向,使得投影后数据的方差最大。
  2. 最小重构误差角度:寻找一个压缩矩阵 U 和重构矩阵 V,使得原始数据 x 与经过压缩再重构的数据 V(Ux) 之间的误差最小。

在一定的约束下(如 U 的列是单位正交的,且 V = Uᵀ),PCA的优化问题可以写为:

目标函数: min_U Σ_i ||x_i - UUᵀ x_i||₂²,其中 UᵀU = I

其解就是数据协方差矩阵的特征向量。

应用四:矩阵补全

矩阵补全问题在推荐系统中非常常见。例如,有一个用户-电影评分矩阵,其中很多条目是缺失的(用户未评分)。目标是根据已知的评分,预测缺失的评分。

这个问题可以形式化为一个优化问题:寻找一个低秩矩阵 M(因为用户偏好通常可以由少数几个潜在因子解释),使得 M 在已知评分位置上的值与观测值尽可能接近。常用的模型是带正则化的矩阵分解

目标函数: min_{U,V} Σ_{(i,j)∈Ω} (M_{ij} - u_iᵀ v_j)² + λ(||U||_F² + ||V||_F²)

其中,Ω 是已知评分的索引集合,UV 是低维的用户和电影特征矩阵,||·||_F 是Frobenius范数,用于正则化。

总结

本节课中,我们一起学习了优化在机器学习中的几个核心应用:

  1. 监督学习:通过“损失函数 + 正则化项”的框架,将分类、回归等问题转化为参数优化问题。我们讨论了不同损失函数(如0-1损失、合页损失、交叉熵损失)和正则化项(L1、L2)的特性及其影响。
  2. 聚类(K-Means):作为一个混合连续与离散的优化问题,其目标是最小化样本到簇中心的距离。
  3. 主成分分析(PCA):可以从最大化投影方差或最小化重构误差两个角度构建为连续优化问题,用于数据降维。
  4. 矩阵补全:在推荐系统等场景中,通过低秩矩阵分解来预测缺失值,也是一个带正则化的优化问题。

这些例子表明,许多机器学习算法的核心都可以清晰地表述为一个优化问题。理解这些优化形式,是设计新算法、分析模型性质和改进求解效率的基础。在后续课程中,我们将深入探讨求解这些优化问题的具体方法与理论。

003:机器学习中的连续优化问题(结束)🎯

在本节课中,我们将学习机器学习中的几个核心连续优化问题。我们将从主成分分析(PCA)的解法开始,然后探讨矩阵补全、低秩与非负矩阵分解以及上下文老丨虎丨机问题。最后,我们会简要介绍离散优化问题,为后续课程做铺垫。

主成分分析(PCA)的解法 🔍

上一节我们介绍了PCA作为一种数据压缩和降维的优化问题。本节中我们来看看如何求解这个优化问题。

给定一个数据矩阵 X,其列向量为 x₁, x₂, ..., xₙ。PCA的目标是找到一个投影矩阵 U,使得重构误差最小化。该优化问题可以表述为:

minimize ||X - UUᵀX||²

其中,U 的列是标准正交的。

这个问题的解法基于矩阵的奇异值分解(SVD)。回顾一下,对于任意矩阵 B,其SVD可以表示为:
B = VΣUᵀ
其中,Σ 是一个对角矩阵,其对角线上的非零元素称为奇异值,数量等于矩阵 B 的秩。

对于PCA问题,解 U 的列对应于数据协方差矩阵 XᵀX 的前 k 个最大特征值所对应的特征向量。而这些特征值正是 X 的奇异值的平方。因此,求解PCA等价于对数据矩阵 X 进行SVD,并选取其最大的几个奇异值所对应的右奇异向量。

矩阵补全问题 🧩

接下来,我们探讨矩阵补全问题。设想一个用户-产品评分矩阵 X,其中许多条目是未知的(用问号表示)。我们的目标是根据已知的评分,合理地填充这些缺失值。

一个关键的思路是假设完整的矩阵 X 是“简单”的,例如它是低秩的。低秩意味着矩阵的行或列之间存在较强的线性相关性,这符合许多现实场景(如用户偏好可以由少数几个潜在因素解释)。

然而,直接最小化矩阵的秩是一个非凸且不连续的难题。因此,我们使用核范数(nuclear norm)作为秩函数的凸近似。矩阵 X 的核范数定义为其所有奇异值之和:
||X||_ = Σ σ_i*

因此,矩阵补全的优化问题可以形式化为:
minimize ||X||_ subject to A_j(X) = y_j for all j*
其中,A_j 是观测算子,y_j 是已知的观测值。

以下是解决此问题的一种迭代算法思路:

  1. 从一个初始矩阵 X₀ 开始(例如,用简单方法填充缺失值)。
  2. 对当前矩阵 X_t 进行奇异值分解(SVD)。
  3. 对得到的奇异值进行阈值处理(例如,保留最大的 k 个,或将小于某个阈值的奇异值设为零),得到一个新的奇异值矩阵 Σ̃
  4. Σ̃ 和原来的左右奇异向量重构矩阵,得到 X_{t+1}
  5. 重复步骤2-4,直到收敛。

这种方法被称为迭代奇异值阈值算法

低秩与非负矩阵分解(NMF) ➕

矩阵补全自然引出了更一般的矩阵分解问题。低秩与非负矩阵分解要求我们将一个数据矩阵 X 近似分解为两个矩阵的乘积 X ≈ LR,并且要求 LR 都是非负的,同时 k 较小以保证低秩。

其优化问题为:
minimize ||X - LR||² subject to L ≥ 0, R ≥ 0

非负约束使得分解结果具有更好的可解释性(例如,在主题模型中,单词权重和文档主题权重不应为负)。

以下是两种求解思路:

1. 重参数化方法:
LR 本身表示为其他非负矩阵的乘积,例如令 L = L̃L̃ᵀR = R̃R̃ᵀ,从而天然满足非负约束。

2. 投影梯度法:
采用迭代优化方法。在每一步更新 LR 后,将其所有负值元素投影到0(即设置为0),以保证非负性。更新规则通常具有如下形式(以 L 为例):
L_{i,j}^{(new)} = L_{i,j}^{(old)} * ( [X Rᵀ]{i,j} ) / ( [L R Rᵀ] )
这是一个乘法更新规则,能自动保持非负性。

上下文老丨虎丨机问题 🎰

现在,我们进入在线学习场景,讨论上下文老丨虎丨机问题。以文章推荐系统为例:

  • 上下文(Context): 用户特征 x_i(如性别、年龄)。
  • 动作(Action): 系统选择的文章 a_i
  • 奖励(Reward): 用户点击或阅读文章产生的反馈 r_i
  • 策略(Policy): 系统根据用户上下文选择动作的概率分布 π_θ(a|x)

我们拥有一个由历史日志数据构成的集合:{ (x₁, a₁, r₁), (x₂, a₂, r₂), ... }。这些数据是由某个已有的(可能是有偏的)线上策略 π_0 产生的。我们的目标是利用这些离线数据,学习一个新的、更好的策略 π_θ

这里存在一个挑战:日志数据存在选择偏差。例如,编辑可能有意地将电影文章更多地推荐给女性用户(π_0(电影|女性) 很高),导致数据中“女性-电影”组合的样本过多。如果我们直接根据观测到的奖励平均值来评估新策略,会得到有偏的估计。

为了解决这个问题,我们使用逆倾向评分(Inverse Propensity Scoring, IPS) 进行纠偏。我们希望优化以下目标函数:
maximize_θ Σ_i [ (r_i / π_0(a_i | x_i)) * I{ π_θ(a_i | x_i) } ]
其中,I{·} 是指示函数,表示新策略 π_θ 是否选择了日志中的动作 a_i

为了使其可微并便于优化,我们用 softmax 函数松弛离散的指示函数:
maximize_θ Σ_i [ (r_i / π_0(a_i | x_i)) * softmax( f_θ(x_i, a_i) ) ]
这里,f_θ(x, a) 是一个打分函数(例如线性模型或神经网络),参数为 θ。通过最大化这个纠偏后的期望奖励,我们可以从离线数据中学习更优的推荐策略。

离散优化问题简介 ⚙️

最后,我们简要介绍离散优化问题,它将在后续课程中详细展开。一个典型的例子是序列标注中的最大后验(MAP)推理

任务是为一个序列(如句子中的单词)分配一组标签(如词性)。每个可能的标签序列 y 都有一个由模型参数 θ 决定的“能量”或“得分” E(y; θ)。MAP推理的目标是找到得分最高的标签序列:
y = argmax_y E(y; θ)*

这是一个离散优化问题,因为 y 来自一个有限的、但可能是指数级大的组合空间。

对于某些具有特殊结构的问题(如链式结构或树形结构),可以利用动态规划等算法高效求解。此外,如果目标函数满足次模性等性质,也存在有效的优化算法。我们将在未来的课程中深入探讨这些内容。


本节课中我们一起学习了机器学习中几个重要的连续优化问题及其应用。我们从PCA的SVD解法出发,探讨了利用核范数解决矩阵补全问题,介绍了带有非负约束的低秩矩阵分解方法,并学习了在存在选择偏差的离线数据中,如何使用逆倾向评分来优化上下文老丨虎丨机策略。最后,我们引出了离散优化问题的概念。理解这些问题的形式化和基本解决思路,是构建复杂机器学习模型的基础。

004:机器学习中的离散优化问题基础 🧩

在本节课中,我们将学习机器学习中常见的离散优化问题,并了解其基本概念和公式化方法。我们将探讨图像分割、特征选择、数据子集选择和K-Medoids聚类等问题,并理解它们如何与子模函数等核心概念相关联。


上一节我们介绍了机器学习中的连续优化问题,本节中我们来看看离散优化问题。离散优化问题在机器学习中同样至关重要,例如在图像处理、特征选择和数据子集选择等任务中。

图像分割与最小割问题 ✂️

在图像分割任务中,我们的目标是将图像划分为前景和背景两个区域。例如,在一张飞机在天空中飞行的图片中,我们希望将飞机(前景)与天空(背景)分开。

以下是图像分割问题的数学描述:

设图像中的像素点集合为 ( V ),边集合为 ( E ),每条边 ( (u, v) ) 有一个代价 ( C_{uv} )。我们希望找到一个子集 ( S \subseteq V )(前景),使得分割的代价最小。优化问题可以表述为:

[
\min_{S \subseteq V} \sum_{u \in S, v \notin S} C_{uv}
]

这个最小割问题可以在多项式时间内求解,特别是当代价函数满足子模性等性质时。

图像对应与最大流问题 🔄

图像对应问题涉及在两幅图像之间建立像素点的匹配关系。这可以形式化为一个二分图匹配问题,进而转化为最大流问题。

以下是最大流问题的数学描述:

我们引入一个源点 ( s ) 和一个汇点 ( t )。源点 ( s ) 连接到左图的所有像素点 ( U ),右图的所有像素点 ( V ) 连接到汇点 ( t )。所有边的容量设为1。目标是最大化从 ( s ) 到 ( t ) 的流量 ( f ),约束条件是每个节点的流入等于流出。

[
\max \sum_{(s,u) \in E} f_{su}
]
[
\text{subject to: } \sum_{(q,p) \in E} f_{qp} = \sum_{(p,r) \in E} f_{pr} \quad \forall p \in U \cup V
]
[
0 \leq f_{uv} \leq 1 \quad \forall (u,v) \in E
]

特征选择与互信息 📊

特征选择的目标是从所有特征中选择一个子集,使得该子集在预测任务中尽可能有效。互信息是衡量特征与类别标签之间相关性的常用指标。

互信息的定义基于熵。对于随机变量 ( X ) 和 ( Y ),互信息 ( I(X;Y) ) 定义为:

[
I(X;Y) = H(X) + H(Y) - H(X,Y)
]

其中 ( H(\cdot) ) 表示熵。特征选择问题可以形式化为:

[
\max_{A \subseteq {X_1, \dots, X_n}} I(X_A; Y)
]

这里 ( X_A ) 表示特征子集 ( A ) 对应的随机变量。互信息函数具有子模性,这意味着它具有边际收益递减的性质。

数据子集选择 📉

在训练机器学习模型时,我们可能希望只使用数据集的子集,以节省计算资源或处理标注数据缺失的情况。目标是选择一个子集 ( D' \subseteq D ),使得在 ( D' ) 上训练的模型性能与在整个数据集 ( D ) 上训练的模型性能相近。

一个具体的优化思路是梯度匹配,即选择子集 ( A ),使得在该子集上计算的损失函数梯度与在整个数据集上计算的梯度尽可能接近:

[
\min_{A \subseteq V} \left| \nabla \mathcal{L}(A) - \nabla \mathcal{L}(V) \right|_2
]

K-Medoids聚类 🎯

K-Medoids聚类是K-Means聚类的一种变体,要求聚类中心必须是数据集中的实际点,而不是像K-Means那样计算均值点。这类似于设施选址问题。

给定数据点集 ( V )、点对之间的相似度 ( s_{ij} ) 和预算 ( k ),K-Medoids问题旨在选择 ( k ) 个中心点(Medoids)( A \subseteq V ),以最大化每个点与其最近中心点的相似度之和:

[
\max_{A \subseteq V, |A|=k} \sum_{i \in V} \max_{j \in A} s_{ij}
]

这个目标函数也具有子模性。


从离散到连续:凸优化的重要性 🔗

尽管本节重点讨论了离散优化问题,但机器学习中的大多数问题本质上是混合的,其核心通常涉及连续优化。凸性在理解算法收敛性和处理非凸问题的凸区域方面至关重要。

凸函数具有许多优良性质,例如:

  • 局部最小值就是全局最小值。
  • 梯度为零的点(对于可微凸函数)是最小点。
  • 存在高效的优化算法。

即使是处理离散优化问题(如子模函数最大化),其分析也常常借鉴凸优化的思想,因为子模函数在最大化时表现出类似凹函数的性质。


基础回顾:向量、矩阵与梯度 📚

为了深入理解后续的优化算法,我们需要掌握一些数学基础。

向量与矩阵

  • 通常用 ( n ) 表示训练样本数,( m ) 表示特征数。
  • 特征向量 ( \mathbf{x} \in \mathbb{R}^m ),其第 ( j ) 个元素记为 ( x_j )。
  • 标签通常用 ( y ) 表示。
  • 向量内积:( \mathbf{w}^\top \mathbf{x} = \sum_{j=1}^m w_j x_j )。
  • 范数:L1范数 ( |\mathbf{w}|_1 = \sum_j |w_j| ),L2范数平方 ( |\mathbf{w}|_2^2 = \sum_j w_j^2 )。

梯度与Hessian矩阵

对于多元函数 ( f(\mathbf{w}) ),其梯度 ( \nabla f(\mathbf{w}) ) 是一个向量,由所有偏导数组成:

[
\nabla f(\mathbf{w}) = \left[ \frac{\partial f}{\partial w_1}, \frac{\partial f}{\partial w_2}, \dots, \frac{\partial f}{\partial w_m} \right]^\top
]

Hessian矩阵 ( \nabla^2 f(\mathbf{w}) ) 是一个矩阵,包含所有二阶偏导数:

[
[\nabla^2 f(\mathbf{w})]_{ij} = \frac{\partial^2 f}{\partial w_i \partial w_j}
]

当二阶偏导数连续时,Hessian矩阵是对称的。

示例:正则化逻辑回归的梯度

逻辑回归的损失函数(带L2正则化)为:

[
\mathcal{L}(\mathbf{w}) = \frac{\lambda}{2} |\mathbf{w}|^2 + \sum_{i=1}^n \log\left(1 + \exp(-y_i \mathbf{w}^\top \mathbf{x}_i)\right)
]

其梯度为:

[
\nabla \mathcal{L}(\mathbf{w}) = \lambda \mathbf{w} - \sum_{i=1}^n \frac{y_i \mathbf{x}_i}{1 + \exp(y_i \mathbf{w}^\top \mathbf{x}_i)}
]

建议读者通过链式法则自行推导,以加深理解。


课后练习 ✍️

为了巩固本节课的内容,请完成以下练习:

  1. 推导正则化逻辑回归损失的梯度公式。
  2. 尝试推导以下常见损失函数的梯度和Hessian矩阵:
    • 合页损失(Hinge Loss):( \max(0, 1 - y\mathbf{w}^\top\mathbf{x}) )
    • 最小二乘损失(Least Squares Loss):( (y - \mathbf{w}\top\mathbf{x})2 )
    • Softmax函数

本节课中我们一起学习了机器学习中的几个经典离散优化问题,包括图像分割、特征选择、数据子集选择和K-Medoids聚类,并理解了它们如何通过最小割、最大流、互信息最大化等框架进行形式化。我们还回顾了向量、矩阵、梯度和Hessian矩阵等必要的数学基础,为后续学习连续优化和凸性理论做好了准备。

005:凸性-集合、函数、性质及其与机器学习的关系 🎯

在本节课中,我们将要学习凸性(Convexity)这一优化理论中的核心概念。我们将从凸集的定义和性质开始,然后过渡到凸函数,并探讨它们与机器学习问题的紧密联系。理解凸性对于设计高效、可靠的优化算法至关重要。


凸集的定义与性质

上一节我们介绍了梯度、海森矩阵等基本概念,并讨论了它们在机器学习损失函数中的应用。本节中,我们来看看优化问题中另一个至关重要的概念——凸集。

一个集合 C 被称为凸集,如果对于集合内的任意两点,连接这两点的线段上的所有点也都在该集合内。

用公式表示,即对于任意 x, y ∈ C 和任意标量 λ ∈ [0, 1],都有:
λx + (1-λ)y ∈ C

以下是凸集的一些关键性质:

  • 交集性质:多个凸集的交集仍然是凸集。
  • 投影性质:点到凸集上的投影(即集合中离该点最近的点)是唯一的。这对于约束优化算法(如投影梯度下降)非常重要。
  • 凸包:给定任意集合 S,其凸包(包含 S 中所有点的最小凸集)总是凸的。

常见的凸集例子包括:

  • 超平面和半空间:例如,所有满足 wᵀx ≤ b 的点 x 构成的集合。
  • 范数球:对于任意范数,满足 ||x|| ≤ r 的点构成的集合都是凸集。
  • 椭球:满足 (x - x_c)ᵀP⁻¹(x - x_c) ≤ 1 的点集,其中 P 是正定矩阵。

凸函数的定义与性质

理解了凸集后,我们现在可以定义凸函数。凸函数要求其定义域首先是一个凸集。

一个函数 f: ℝⁿ → ℝ 是凸函数,如果其定义域 dom f 是凸集,并且对于定义域内任意两点 x, y 和任意 λ ∈ [0, 1],满足以下不等式(Jensen不等式):
f(λx + (1-λ)y) ≤ λf(x) + (1-λ)f(y)

几何意义是:函数图像上任意两点之间的线段,总是位于函数图像的上方(或重合)。

以下是凸函数的一些重要类别和运算性质:

  • 严格凸函数:上述不等式对 λ ∈ (0, 1) 严格成立(<)。
  • 强凸函数:存在常数 μ > 0,使得函数 f(x) - (μ/2)||x||² 仍然是凸的。这为优化提供了更强的收敛保证。
  • 保凸运算
    • 非负加权和:若 fᵢ 是凸函数,αᵢ ≥ 0,则 Σ αᵢ fᵢ 是凸函数。
    • 仿射变换:若 f 是凸函数,则 g(x) = f(Ax + b) 也是凸函数。
    • 逐点最大值:若 f₁, f₂ 是凸函数,则 h(x) = max{f₁(x), f₂(x)} 也是凸函数。

常见的凸函数例子包括:

  • 仿射函数f(x) = aᵀx + b
  • 指数函数f(x) = exp(ax)
  • 负对数函数f(x) = -log(x) (定义域为 x > 0
  • 范数:任意范数 f(x) = ||x|| 都是凸函数。

凸性与机器学习的关系

现在,让我们将凸性的概念与机器学习的具体问题联系起来。凸性之所以重要,有以下几个关键原因:

首先,许多机器学习模型的损失函数(如逻辑回归的负对数似然、支持向量机的合页损失加上正则项)在其参数空间中是凸的或具有凸的区域。这意味着:

  • 任何找到的局部最小值也必然是全局最小值
  • 我们可以设计出具有理论收敛保证的高效算法(如梯度下降)来找到这个最优解。

其次,即使对于非凸函数(如深度神经网络),其损失曲面通常也包含大的凸区域。优化算法(如随机梯度下降)在这些区域内的行为更容易分析和保证。

再者,凸性处理了不可微点的问题。对于凸函数,即使在某些点不可微(如合页损失在零点),我们也可以定义和使用次梯度,从而扩展梯度下降类算法的适用范围。

最后,在带有约束的优化问题中(如将模型参数限制在某个范围内),如果约束集是凸的,那么像投影梯度下降这样的算法就能保证迭代点始终落在可行域内,并且投影操作是唯一且高效的。


总结

本节课中我们一起学习了凸性这一优化理论的核心基石。我们首先定义了凸集,并了解了其基本性质,如交集保持凸性以及投影的唯一性。接着,我们定义了凸函数,探讨了严格凸和强凸等变体,并学习了通过加权和、仿射变换等运算保持凸性的规则。最后,我们深入探讨了凸性对于机器学习的重要性,包括它如何保证找到全局最优解、如何处理非光滑函数,以及为何在约束优化中不可或缺。理解这些概念,将为后续学习具体的优化算法打下坚实的基础。

006:凸函数进一步性质与机器学习应用

在本节课中,我们将深入学习凸函数的更多性质,并通过机器学习中的具体例子来加深理解。我们将从回顾作业问题开始,探讨范数、强凸性等核心概念的证明,然后分析机器学习中常见损失函数的凸性,最后介绍点态最大值和上确界等高级性质。

作业问题回顾与讨论

上一讲我们介绍了凸函数的基本定义和性质。本节中,我们来看看一些作业中的具体问题,以巩固对凸性证明方法的掌握。

以下是几个关键作业问题的讨论:

  1. 证明任意范数是凸函数

    • 思路:利用范数的三角不等式性质。对于任意两点 x1, x2θ ∈ [0, 1],需要证明:
      ||θx1 + (1-θ)x2|| ≤ θ||x1|| + (1-θ)||x2||
    • 证明:直接应用范数的三角不等式:
      ||θx1 + (1-θ)x2|| ≤ ||θx1|| + ||(1-θ)x2|| = θ||x1|| + (1-θ)||x2||
    • 结论:该不等式正是凸函数的定义式,因此任意范数都是凸函数。
  2. 强凸性的两种等价定义

    • 定义A(边际形式):函数 f(x)μ-强凸的,如果对于所有 x1, x2θ ∈ [0, 1],有:
      f(θx1 + (1-θ)x2) ≤ θf(x1) + (1-θ)f(x2) - (μ/2)θ(1-θ)||x1 - x2||^2
    • 定义B(操作形式):函数 f(x)μ-强凸的,当且仅当函数 g(x) = f(x) - (μ/2)||x||^2 是凸函数。
    • 等价性证明:可以从定义B出发,利用凸函数 g(x) 的定义,经过代数展开和整理,最终得到定义A中的边际项 (μ/2)θ(1-θ)||x1 - x2||^2。反之亦然。
    • 意义:操作形式 f(x) - (μ/2)||x||^2 非常实用,它表明强凸函数可以通过减去一个正则项(二次项)转化为凸函数。这在优化中能带来更快的收敛速度。
  3. 复合函数的凸性:对数-求和-指数函数

    • 函数形式h(x) = log( sum_i exp(g_i(x)) ),其中 g_i(x) 是凸函数。
    • 结论h(x) 是凸函数。
    • 证明思路(利用中点凸性)
      1. 中点凸性指出,一个函数是凸的当且仅当对于所有 x1, x2,满足 f((x1+x2)/2) ≤ (f(x1)+f(x2))/2
      2. h(x) 代入中点凸性不等式。
      3. 利用柯西-施瓦茨不等式 (∑ a_i b_i) ≤ sqrt(∑ a_i^2) * sqrt(∑ b_i^2)
      4. 结合对数函数的单调递增性,即可完成证明。
    • 应用:该函数在机器学习中非常常见,例如多项逻辑回归(Softmax)的损失函数就包含类似结构。
    • 进一步思考log-sum-exp 函数是严格凸的,但不一定是强凸的,因为它缺少一个强制的二次下界。

点态最大值与上确界

了解了基本复合函数的性质后,我们来看一类通过最大化操作构造凸函数的方法。

点态最大值:如果一组函数 {f_1(x), f_2(x), ..., f_m(x)} 都是凸函数,那么它们的点态最大值函数 f(x) = max{f_1(x), f_2(x), ..., f_m(x)} 也是凸函数。

  • 直观理解:取最大值相当于在函数图像的上方取“包络”,这个包络线保持了下凸的形状。
  • 例子:向量 x 的无穷范数 ||x||_∞ = max{|x1|, |x2|, ..., |xn|} 是凸函数,因为绝对值函数 |xi| 是凸的。
  • 例子:向量 x 中前 r 个最大分量之和是凸函数。这可以写成所有可能的 r 个分量组合的线性函数的最大值。

点态上确界:这是点态最大值的推广。如果对于每个 y ∈ S,函数 f(x, y) 关于 x 是凸的,那么函数 g(x) = sup_{y ∈ S} f(x, y) 关于 x 也是凸的。

  • 理解:上确界(sup)可以理解为可能无法取到的“最紧上界”。即使有无穷多个 y,只要每个 f(x,y)x 凸,它们的上界 g(x) 也凸。
  • 关键例子:矩阵的谱范数
    • 矩阵 A 的谱范数(2-范数)定义为 ||A||_2 = sup_{x ≠ 0} (||Ax||_2 / ||x||_2)
    • 对于固定的 x,函数 f(A, x) = ||Ax||_2 / ||x||_2 关于 A 是凸的(实际上是线性函数后接范数)。
    • 因此,对其取上确界得到的谱范数 ||A||_2 关于 A 也是凸函数。
    • 这等价于矩阵 A^T A 的最大特征值的平方根。

由向量范数诱导的矩阵范数

更一般地,给定一个向量范数 ||·||,可以诱导出一个矩阵范数:
||A|| = sup_{x ≠ 0} (||Ax|| / ||x||)
根据点态上确界的性质,这样的矩阵范数关于矩阵 A 总是凸的。

以下是两个重要特例:

  1. 诱导出1-范数||A||_1 = max_j (∑_i |A_{ij}|)

    • 解释:等于矩阵 A 的列和范数,即所有列向量的1-范数中的最大值。
  2. 诱导出无穷范数||A||_∞ = max_i (∑_j |A_{ij}|)

    • 解释:等于矩阵 A 的行和范数,即所有行向量的1-范数中的最大值。

Schatten范数:谱范数的推广

Schatten范数提供了一种统一看待多种矩阵范数的方式。对于矩阵 A,令 σ_i 为其奇异值。

  • 定义:Schatten p-范数定义为 ||A||_p = (∑_i σ_i^p)^{1/p}
  • 特例
    • p = 1:核范数(或迹范数)||A||_* = ∑_i σ_i。在矩阵补全、低秩逼近中非常有用。
    • p = 2:Frobenius范数 ||A||_F = sqrt(∑_i σ_i^2)
    • p = ∞:谱范数 ||A||_2 = max_i σ_i
  • 性质:所有的Schatten范数都是凸函数。

机器学习损失函数的凸性分析(课后作业)

现在,请大家运用本节课所学的工具,分析以下常见机器学习损失函数的凸性(关于模型参数 w):

  1. 平方损失:L(w) = (y - w^T x)^2
  2. 绝对损失:L(w) = |y - w^T x|
  3. Huber损失:L_δ(w) = { 0.5*(y - w^T x)^2 if |y - w^T x| ≤ δ; δ*(|y - w^T x| - 0.5δ) otherwise }
  4. 逻辑损失:L(w) = log(1 + exp(-y * w^T x)),其中 y ∈ {-1, +1}
  5. 铰链损失(Hinge Loss):L(w) = max(0, 1 - y * w^T x),其中 y ∈ {-1, +1}

分析提示:考虑它们是否由基本凸函数(如仿射函数、二次函数、绝对值、指数、对数等)通过保持凸性的操作(如非负加权和、仿射映射、点态最大值、与单调凸函数的复合等)组合而成。

总结

本节课中我们一起学习了:

  1. 如何证明范数、强凸性等价定义等基本性质的凸性。
  2. 掌握了 log-sum-exp 这类重要复合函数的凸性证明技巧。
  3. 理解了通过点态最大值点态上确界构造凸函数的方法,并以矩阵谱范数为例进行了深入分析。
  4. 了解了由向量范数诱导的矩阵范数以及更一般的Schatten范数家族。
  5. 最后,我们布置了分析经典机器学习损失函数凸性的作业,这是将理论应用于实践的关键一步。

掌握这些凸函数的性质与判别方法,是设计和分析高效、可靠的机器学习优化算法的基础。下一讲,我们将开始深入具体的优化算法。

007:边界与联合学习教程 - SPEAR Python 库

在本教程中,我们将学习SPEAR库中的CAGE联合学习模块和子集选择模块。我们将了解如何使用这些工具进行半监督数据编程,以程序化方式标注和构建训练数据。

概述

SPEAR是一个用于半监督数据编程的Python库。它实现了多种前沿的数据编程方法,其核心流程分为三步:创建标注函数、生成包含标注信息的pickle文件,以及使用标签聚合器生成最终标签。本教程将重点介绍CAGE联合学习模块和子集选择功能。

SPEAR库简介

SPEAR库的GitHub地址为 DeL-team/spear。该库提供了一个简单的三阶段流水线。

以下是SPEAR库的基本工作流程:

  1. 创建标注函数:这些函数以原始数据为输入,基于启发式规则返回一个标签。
  2. 生成Pickle文件:此文件包含标注函数为原始数据关联的标签。
  3. 标签聚合:将Pickle文件传递给标签聚合器,以获得最终的标签。

本教程假设您已了解标注函数的基础知识。我们将重点讲解CAGE联合学习模块。

CAGE模块使用指南

CAGE模块是SPEAR库中的一个标签聚合器。以下将逐步介绍其使用方法。

数据加载与预处理

首先,我们需要加载原始数据。用户可以使用任何方法加载数据,但需要准备好未标注数据、测试数据以及测试数据的真实标签(如果可用)。

# 示例:加载数据(此函数非库内置,用户需自定义)
unlabeled_data = load_unlabeled_data()
test_data, test_labels = load_test_data()

接下来,声明PreLabels类对象并生成包含标注函数结果的Pickle和JSON文件。

from spear.labeling import PreLabels

![](https://github.com/OpenDocCN/dsai-notes-zh/raw/master/docs/iit-cs769-ml-opti/img/6ed7ec3b5a290e24941a489e80202c72_9.png)

# 为测试数据和未标注数据创建PreLabels对象
# 注意:测试数据需要传入真实标签,未标注数据则不需要
test_pre_labels = PreLabels(test_data, gold_labels=test_labels)
unlabeled_pre_labels = PreLabels(unlabeled_data)

![](https://github.com/OpenDocCN/dsai-notes-zh/raw/master/docs/iit-cs769-ml-opti/img/6ed7ec3b5a290e24941a489e80202c72_11.png)

# 生成Pickle和JSON文件(JSON文件只需生成一次)
test_pre_labels.generate_pickle_file(‘test.pkl’)
unlabeled_pre_labels.generate_pickle_file(‘unlabeled.pkl’)
unlabeled_pre_labels.generate_json_file(‘unlabeled.json’)

使用CAGE类获取最终标签

生成必要的文件后,我们可以使用CAGE类来获取最终的聚合标签。

from spear.cage import CAGE

![](https://github.com/OpenDocCN/dsai-notes-zh/raw/master/docs/iit-cs769-ml-opti/img/6ed7ec3b5a290e24941a489e80202c72_13.png)

# 声明CAGE类,L是标注函数的总数
cage = CAGE(L=num_labeling_functions)

CAGE类提供了几个核心方法:

  • predict_proba函数:此函数聚合标签并返回每个实例属于各个类别的概率。返回值是一个NumPy数组,形状为 (实例数量, 标签数量)。类别顺序与之前定义的Enum类中的值升序排列一致。
    probabilities = cage.predict_proba(‘unlabeled.pkl’, ‘unlabeled.json’)
    

  • predict函数:此函数基于predict_proba返回的最大概率,为每个实例分配一个最终标签。返回值是一个包含与Enum类对应的整数的NumPy数组。

    predicted_labels_int = cage.predict(‘unlabeled.pkl’, ‘unlabeled.json’)
    

    此函数还有另一个用例,可以直接返回字符串标签数组。

    predicted_labels_str = cage.predict(‘unlabeled.pkl’, ‘unlabeled.json’, return_probs=False)
    
  • 参数保存与加载:可以保存训练好的模型参数,以便后续使用。

    # 保存参数(指定目录必须存在)
    cage.save_parameters(‘path/to/params.pkl’)
    # 加载参数
    cage.load_parameters(‘path/to/params.pkl’)
    

  • 基于已训练参数的预测:加载参数后,可以直接进行预测而无需重新训练。

    probs = cage.predict_proba_from_parameters(‘new_data.pkl’, ‘new_data.json’)
    final_labels = cage.predict_from_parameters(‘new_data.pkl’, ‘new_data.json’)
    
  • get_enum函数:此工具函数可用于将整数标签数组转换回之前定义的Enum数组。

    enum_labels = cage.get_enum(predicted_labels_int)
    

上一节我们介绍了基础的CAGE模块,本节中我们来看看功能更强大的联合学习模块。

联合学习模块使用指南

联合学习模块训练两个模型:一个特征模型(如神经网络或逻辑回归)和一个类似于CAGE中使用的图模型。它需要额外的特征矩阵和少量专家标注数据。

数据准备

除了未标注和测试数据,联合学习还需要特征矩阵、验证数据和少量标注数据。

# 加载额外数据
feature_matrix = load_features()
validation_data = load_validation_data()
label_data = load_expert_labeled_data() # 少量专家标注数据

创建PreLabels对象时,注意我们向未标注数据的PreLabels类传递真实标签。

unlabeled_pre_labels = PreLabels(unlabeled_data) # 不传递gold_labels
unlabeled_pre_labels.generate_pickle_file(‘unlabeled.pkl’)

使用联合学习类

声明JointLearning类并开始训练。

from spear.joint_learning import JointLearning

![](https://github.com/OpenDocCN/dsai-notes-zh/raw/master/docs/iit-cs769-ml-opti/img/6ed7ec3b5a290e24941a489e80202c72_28.png)

# 创建联合学习对象,feature_model可以是’nn’(神经网络)或’lr’(逻辑回归)
jl = JointLearning(feature_model=‘nn’)

联合学习模块的核心方法如下:

  • predict_proba函数:此函数训练模型并返回预测概率。参数loss_mask指定训练中使用的七种损失函数之一(详情请参阅相关论文)。当return_gm=True时,返回两个值:特征模型的概率和图模型的概率。通常建议使用特征模型的概率。

    # 返回两个模型的概率
    probs_fm, probs_gm = jl.predict_proba(‘unlabeled.pkl’, feature_matrix, label_data, validation_data, return_gm=True)
    # 仅返回特征模型的概率
    probs_fm = jl.predict_proba(‘unlabeled.pkl’, feature_matrix, label_data, validation_data, return_gm=False)
    

    训练过程会基于验证数据使用早停策略。

  • predict函数:此函数返回最终的标签数组。同样,通过return_gm参数控制返回一个还是两个结果。

    labels_fm, labels_gm = jl.predict(…, return_gm=True)
    labels_fm = jl.predict(…, return_gm=False)
    

  • 参数保存与加载:与CAGE模块类似。

    jl.save_parameters(‘jl_params.pkl’)
    jl.load_parameters(‘jl_params.pkl’)
    
  • 基于已训练参数的预测:加载参数后,可以分别使用特征模型或图模型进行预测。

    # 预测概率
    probs_fm = jl.predict_fm_proba_from_parameters(…)
    probs_gm = jl.predict_gm_proba_from_parameters(…)
    # 预测标签
    labels_fm = jl.predict_fm_from_parameters(…)
    labels_gm = jl.predict_gm_from_parameters(…)
    

在联合学习中,专家标注数据的质量至关重要。接下来,我们将介绍如何智能地选择需要标注的数据子集,以提升模型效果。

子集选择模块

为了优化专家标注资源的利用,我们可以使用子集选择函数从未标注数据中挑选一个子集进行标注,使得该子集的标签能最好地补充标注函数的信息。

SPEAR库提供了几种子集选择策略:

  • 随机子集选择:使用random_subset函数随机选择索引。
    from spear.subset_selection import random_subset
    indices_to_label = random_subset(unlabeled_data_size, subset_size)
    

  • Uncertainty-Probit子集选择:使用uncertainty_probit_subset函数,该方法需要特征矩阵。

    from spear.subset_selection import uncertainty_probit_subset
    indices_to_label = uncertainty_probit_subset(feature_matrix, subset_size)
    
  • 监督式子集选择:使用supervised_subset_indices函数。此方法需要利用标注函数生成的标签数据,返回从未标注数据中选出的、最值得标注的索引。

    from spear.subset_selection import supervised_subset_indices
    indices_to_label = supervised_subset_indices(‘unlabeled.pkl’, subset_size)
    
  • s_subset_save_files函数:此函数功能与上一个类似,但额外将未标注数据分割成两个独立的Pickle文件:一个包含待标注数据,另一个包含剩余数据。

    from spear.subset_selection import s_subset_save_files
    indices, to_label_pkl, remaining_pkl = s_subset_save_files(‘unlabeled.pkl’, ‘to_label.pkl’, ‘remaining.pkl’, subset_size)
    

  • insert_gold_labels函数:当使用s_subset_save_files选出的子集被专家标注后,可以使用此函数将真实标签插入到对应的Pickle文件中。
    from spear.subset_selection import insert_gold_labels
    insert_gold_labels(‘to_label.pkl’, expert_gold_labels, ‘labeled.pkl’)
    

  • replace_pickle函数:此工具函数可用于替换Pickle文件中的任何数组。

总结

本节课中我们一起学习了SPEAR库中的三个核心部分:

  1. CAGE模块:用于基础的标签聚合,通过图模型从多个标注函数中学习并输出最终标签。
  2. 联合学习模块:结合特征模型和图模型,利用少量专家标注数据提升半监督学习性能。
  3. 子集选择模块:提供了多种策略(随机、Uncertainty-Probit、监督式)来智能选择需要专家标注的数据子集,以高效利用标注资源。

通过掌握这些工具,您可以更有效地利用弱监督和半监督方法构建机器学习训练数据集。

008:暗示损失与Learn2Reweight教程 - SPEAR Python库

在本教程中,我们将学习如何使用SPEAR库中的高级监督模块,对SMS垃圾邮件数据集进行端到端的标注和模型训练。我们将涵盖从数据预处理、定义标注函数到选择训练算法和评估模型的完整流程。


定义标签枚举

首先,我们需要定义一个枚举来存储数据集的标签。在SMS垃圾邮件数据集中,包含两个类别:ham(正常邮件)和spam(垃圾邮件)。

from enum import Enum

class Labels(Enum):
    HAM = 0
    SPAM = 1

注意:虽然类别可以映射到任意数字,但建议使用从0开始的连续整数进行映射,即 0类别数 - 1


定义预处理函数与标注函数

上一节我们定义了数据标签,本节中我们来看看如何为数据定义预处理函数和标注函数。为了演示,我们展示一个将文本转换为小写的预处理函数声明方式。

def convert_to_lower(text):
    return text.lower()

以下是标注函数和连续评分函数的定义方式(此处不展开详述)。


理解训练模式

高级监督模块支持两种主要的训练模式:FDFDU

  • FD 模式:模型仅在已标注数据上进行训练。
  • FDU 模式:模型在已标注和未标注数据上共同进行训练。

选择哪种模式取决于你拥有的数据类型。


导入库与设置检查点

接下来,我们需要导入必要的功能库。同时,为了便于后续使用,我们会保存模型的检查点。保存检查点的数量可以作为参数传入。

import torch
import spear_ml

![](https://github.com/OpenDocCN/dsai-notes-zh/raw/master/docs/iit-cs769-ml-opti/img/f18966fb0d0bd1b69cb671210459d7ba_18.png)

# 保存模型检查点,num_checkpoints 由用户决定
def save_checkpoints(model, path, num_checkpoints=5):
    # ... 保存逻辑

初始化目录与参数

我们为不同的日志记录和结果存储初始化对应的目录。如果这些目录不存在,则创建它们。

import os

![](https://github.com/OpenDocCN/dsai-notes-zh/raw/master/docs/iit-cs769-ml-opti/img/f18966fb0d0bd1b69cb671210459d7ba_22.png)

log_dir = './logs'
result_dir = './results'
os.makedirs(log_dir, exist_ok=True)
os.makedirs(result_dir, exist_ok=True)

然后,我们初始化决定模型输出的各种参数和超参数。

以下是 FD 模式的一些常见参数:

learning_rate = 0.001
batch_size = 32
num_epochs = 10

对于 FDU 模式,也需要初始化相应的参数。我们还需要设置评估模型性能的主要指标,可以是准确率或 F1 分数。

primary_metric = 'accuracy'  # 或 'f1_score'

此外,还有两个超参数 gammalambda,它们有其特定的用途。


选择训练与测试算法

高级监督模块支持多种训练算法。我们需要通过初始化 mode 变量来选择要使用的算法。

mode = 'implication'  # 可选:'implication', 'learn2reweight', 'pr_loss', 'maj_voter'
  • implication:暗示损失算法。
  • learn2reweight:Learn2Reweight 算法。
  • pr_loss:PR 损失算法。
  • maj_voter (FD):多数投票算法。

该模块基于两个网络:F网络(分类网络)和 W网络(规则网络)。在测试时,我们可以选择测试哪个网络。

test_mode = 'both'  # 可选:'f_network', 'w_network', 'both'

我们还需要初始化类别数量,以及一个布尔变量 use_joint_fw 来决定在推理和测试时是否同时使用 F 和 W 网络。

num_classes = 2
use_joint_fw = True  # True 表示同时使用 F 和 W 网络

之后,初始化存储相关数据的变量,并根据模式、超参数等系统化地命名输出测试文件。


创建数据供给器

我们创建一个数据供给器类,其目的是对数据进行预处理。此时,我们拥有了一个数据供给器对象,将在后续命令中使用。

data_feeder = DataFeeder(preprocessor=convert_to_lower, ...其他参数)

为了解输入数据的结构,我们可以提取以下信息:

  • 输入特征数量
  • 使用的类别数量
  • 使用的规则数量
  • 训练所用的规则数量


初始化网络模型

接着,我们初始化之前提到的 F 网络和 W 网络。

f_network = ClassificationNetwork(input_dim, num_classes)
w_network = RuleNetwork(num_rules)

训练与测试模型

我们创建一个高级监督网络类的对象 HLS,该对象包含 traintest 等成员函数,用于在可用数据上训练和测试模型。

hls = HighLevelSupervisionNetwork(f_network, w_network, mode=mode)

根据选择的训练算法调用不同的训练方法:

if mode == 'maj_voter':
    # FD 模式,需要已标注数据
    hls.train_f_on_d(labeled_data)
else:
    # 其他算法(如 implication, learn2reweight),可使用已标注和未标注数据
    hls.train_on_fdu(labeled_data, unlabeled_data)

同样,根据测试模式调用对应的测试函数。


总结

本节课中,我们一起学习了使用 SPEAR 库的高级监督模块进行数据标注和模型训练的完整流程。我们从定义标签和预处理函数开始,逐步讲解了训练模式的选择、超参数设置、网络初始化以及最终的训练与测试步骤。通过本教程,你应该能够利用标注函数和其他相关组件,对你自己的数据集应用高级监督学习算法。

如有任何疑问、建议或反馈,欢迎联系 SPEAR 研究小组。感谢观看本视频。

009:凸函数、拟凸性与方向导数

在本节课中,我们将结束对机器学习中凸函数的讨论,并引入一个非常重要的概念——方向向量。方向向量将帮助我们过渡到凸函数的一阶和二阶定义与性质。我们将从作业问题讨论开始,然后总结凸函数的剩余性质或示例,最后探讨方向向量、梯度和次梯度的概念。

作业问题讨论

以下是本周作业中关于损失函数凸性的讨论。

1. L1/L2正则化逻辑回归损失函数

该损失函数是凸的。原因在于,其内部第一项(对数求和指数项)在特定替换下是凸函数,而正则化项(范数)也是凸函数。凸函数之和仍为凸函数,因此整个函数是凸的。

核心概念

  • 凸函数之和:若 f(x)g(x) 是凸函数,则 h(x) = f(x) + g(x) 也是凸函数。
  • 对数求和指数函数log(sum(exp(g_i(x))))g_i(x) 为仿射函数(或常数)时是凸的。

2. L1/L2正则化支持向量机(SVM)损失函数

该损失函数是凸的。原因在于,它是两个函数的逐点最大值:一个常数函数 0 和一个线性函数 1 - y_i * theta^T * x_i。线性函数是凸的,常数函数也是凸的,而有限个凸函数的逐点最大值仍是凸函数。

核心概念

  • 逐点最大值:若 f_1(x), ..., f_k(x) 是凸函数,则 h(x) = max(f_1(x), ..., f_k(x)) 也是凸函数。

3. L1/L2正则化多类逻辑回归损失函数

该损失函数是凸的。可以将其视为单类逻辑回归损失函数的推广,本质上是线性项与对数求和指数项的组合,因此是凸的。

4. L1/L2正则化最小二乘损失函数

该损失函数是凸的。第一项可以视为平方函数与线性函数的复合,平方函数是凸的,线性函数是仿射的,因此复合后是凸的。第二项是范数正则化项,也是凸的。

核心概念

  • 凸函数的仿射复合:若 f(x) 是凸函数,g(x) = Ax + b 是仿射函数,则 h(x) = f(g(x)) 是凸函数。

5. 矩阵补全损失函数

该损失函数是凸的。第一项是仿射函数(观测矩阵与参数矩阵之差)的范数,是凸的。第二项是谱范数(核范数),即矩阵奇异值向量的范数,也是凸的。

核心概念

  • 谱范数(核范数):矩阵 X 的谱范数 ||X||_* 等于其奇异值之和,是一种凸的范数。

6. Softmax上下文赌博机损失函数

该函数在参数 theta 上既不是凸函数,也不是凹函数。分母中也包含参数 theta,导致其性质复杂。尽管如此,该问题仍有高效的求解方法。

强凸性回顾

上一节我们介绍了凸函数的基本性质,本节中我们简要回顾一个重要的强化概念——强凸性,它在算法收敛性分析中扮演关键角色。

一个函数 f 是强凸的,如果存在常数 mu > 0,使得函数 f(x) - (mu/2) * ||x||^2 仍然是凸函数。参数 mu 被称为强凸性参数。

核心概念

  • 强凸性定义f 是强凸的,若 g(x) = f(x) - (mu/2) * ||x||^2 是凸函数,其中 mu > 0
  • 意义:强凸性意味着函数存在一个二次下界,这通常能带来更快的算法收敛速度。需要注意的是,强凸性并不保证函数处处可微(例如,L1正则化的Hinge损失函数是强凸但不可微的)。

方向导数

理解了函数的凸性后,我们自然要问:如何找到函数的最小值点?对于单变量函数,我们令导数 f'(x) = 0。对于多变量函数,我们需要推广这一概念,这就引出了方向导数。

方向导数衡量的是函数在某一点沿特定方向的变化率。

定义:对于函数 f: R^n -> R,在点 x 处沿单位向量 v (即 ||v|| = 1) 的方向导数定义为:
D_v f(x) = lim_{h->0} [f(x + h*v) - f(x)] / h
前提是该极限存在。

重要性质

  1. 如果取 v 为坐标轴方向的单位向量 e_k(第k个分量为1,其余为0),那么方向导数 D_{e_k} f(x) 就是偏导数 ∂f/∂x_k
  2. 如果函数 f 在点 x 可微,那么沿任意方向 v 的方向导数存在,且可以通过梯度计算:D_v f(x) = ∇f(x)^T * v
  3. 由性质2和柯西-施瓦茨不等式可知,方向导数的最大值出现在 v 与梯度 ∇f(x) 同向时,且最大值为 ||∇f(x)||。这为梯度下降算法提供了动机。

几何直观:考虑函数的等高线图。在一点处,沿等高线切线方向移动,方向导数为零(函数值不变)。沿垂直于等高线向函数值降低最快的方向移动,方向导数负值最大(绝对值最大),此方向正是负梯度方向。

下水平集与拟凸性

在观察函数等高线时,我们注意到凸函数的等高线所围成的内部区域(即下水平集)似乎是凸的。本节中我们来看看这一观察是否普遍成立,并引出拟凸性的概念。

定义:函数 fα-下水平集定义为:L_α = {x | f(x) ≤ α}

凸函数的下水平集:如果函数 f 是凸函数,那么对于任意 α,其下水平集 L_α 都是凸集。

  • 证明思路:任取 x1, x2 ∈ L_α,即 f(x1) ≤ α, f(x2) ≤ α。根据凸性,对任意 θ ∈ [0,1],有 f(θ*x1 + (1-θ)*x2) ≤ θ*f(x1) + (1-θ)*f(x2) ≤ θ*α + (1-θ)*α = α。因此 θ*x1 + (1-θ)*x2 ∈ L_α,故 L_α 是凸集。

逆命题是否成立? 如果一个函数的所有下水平集都是凸集,那么这个函数本身一定是凸函数吗?答案是否定的。

反例:函数 f(x) = log(|x|)。对于任意 α,其下水平集 {x | log(|x|) ≤ α} = {x | |x| ≤ e^α} 是一个关于原点对称的区间,是凸集。但 f(x) 本身并不是凸函数(例如,在 x=0 处未定义,且图形不是“碗状”)。

拟凸函数:我们将所有下水平集均为凸集的函数称为拟凸函数

  • 所有凸函数都是拟凸函数,但反之不成立(如 log(|x|))。
  • 拟凸性比凸性更弱,条件更宽松。

课后思考:尝试绘制或分析标准正态分布密度函数的负值(即 f(x) = -exp(-x^2/2))的下水平集。验证其是否为拟凸函数?它是否是凸函数?

总结

本节课中我们一起学习了:

  1. 作业回顾:分析了多种常见机器学习损失函数的凸性,并运用了凸函数的和、逐点最大值、仿射复合等保持凸性的运算性质。
  2. 强凸性:回顾了强凸性的定义及其在加速算法收敛中的作用。
  3. 方向导数:引入了方向导数的概念,将其定义为函数沿特定方向的变化率,并建立了其与梯度的关系(D_v f(x) = ∇f(x)^T v),指出梯度方向是函数上升最快的方向。
  4. 下水平集与拟凸性:证明了凸函数的下水平集必为凸集。反之则不成立,从而引出了拟凸函数的定义——所有下水平集均为凸集的函数。拟凸性是比凸性更广泛的一类函数性质。

这些概念为我们后续深入理解一阶优化条件、次梯度计算以及设计优化算法奠定了重要的基础。

010:凸性与一阶性质

在本节课中,我们将要学习凸函数的一阶性质,包括如何通过梯度来定义凸函数的支撑超平面,并初步了解次梯度的概念。我们首先会回顾上节课关于拟凸性的内容,然后深入探讨凸函数与其上图的关系,最后引出次梯度的定义。

回顾:凸函数的次水平集

上一节我们介绍了凸函数的次水平集。对于一个凸函数 f,其所有次水平集 L_α(f) = {x | f(x) ≤ α} 都是凸集。然而,反之则不成立:一个函数的所有次水平集都是凸集,并不能保证该函数本身是凸的,这类函数被称为拟凸函数

拟凸性示例:负高斯函数

以下是关于负高斯函数拟凸性的证明思路。

我们考虑一个简化后的函数:f(x) = -exp(-(x-μ)²)。我们的目标是证明该函数是拟凸的,但不是凸的。

证明其非凸性:
对于标量情况,我们可以检查其二阶导数。函数 f(x) 的二阶导数在某些区间内为负值,例如当 |x-μ| > 1/√2 时。由于凸函数要求二阶导数处处非负,因此该函数不是凸函数。

证明其拟凸性:
我们需要证明对于任意 α,次水平集 {x | -exp(-(x-μ)²) ≤ α} 是凸集。这等价于证明集合 {x | exp(-(x-μ)²) ≥ -α} 是一个连续的区间(在 μ 附近)。由于指数函数在 x<μ 时单调递增,在 x>μ 时单调递减,因此该集合总是一个连续的区间,从而是凸集。这证明了 f(x) 是拟凸函数。

凸函数与上图

本节中我们来看看凸函数的另一种等价定义——通过其上图

函数 f上图是位于其图像上方的所有点的集合,即 epi(f) = {(x, t) | x ∈ D, t ≥ f(x)},这是一个 R^(n+1) 空间中的集合。

核心结论:
一个函数是凸函数,当且仅当其上图是凸集。

这个性质比次水平集的性质更强,因为它建立了凸函数与凸集之间的一一对应关系。这对于我们后续理解对偶性等问题非常重要。

凸函数的一阶性质

基于上图的概念,我们可以推导出凸函数的一阶性质。直观理解是,凸函数在其定义域内任意一点的切线(或更一般地,支撑超平面)都位于函数图像的下方。

一阶条件:
f 是在凸集 D 上可微的函数,则 f 是凸函数当且仅当对于所有 x, y ∈ D,有:
f(y) ≥ f(x) + ∇f(x)^T (y - x)

这个公式意味着,函数在任何点 x 处的线性近似(由梯度给出)都是该函数的一个全局下界估计。

几何解释:
在点 (x, f(x)) 处,由梯度 ∇f(x) 和偏移量 -1 定义的超平面 h = [∇f(x); -1] 支撑着函数的上图。这个超平面在 x 处与函数相切,并且整个上图都位于该超平面的一侧。

对于严格凸和强凸函数,有类似但更强的一阶条件:

  • 严格凸:当 x ≠ y 时,有严格不等式 f(y) > f(x) + ∇f(x)^T (y - x)
  • 强凸:存在常数 m > 0,使得 f(y) ≥ f(x) + ∇f(x)^T (y - x) + (m/2) ||y - x||²

从一阶条件证明凸性

充分性证明:
假设一阶条件成立。取任意 x1, x2 ∈ Dθ ∈ [0,1],令 x = θ x1 + (1-θ)x2。分别对 (x, x1)(x, x2) 应用一阶条件:

  1. f(x1) ≥ f(x) + ∇f(x)^T (x1 - x)
  2. f(x2) ≥ f(x) + ∇f(x)^T (x2 - x)

将第一个不等式乘以 θ,第二个乘以 (1-θ),然后相加。利用 θ(x1 - x) + (1-θ)(x2 - x) = 0,我们得到:
θ f(x1) + (1-θ) f(x2) ≥ f(x) = f(θ x1 + (1-θ)x2)
这正是凸函数的定义。

必要性证明:
需要利用导数的定义。对于凸函数 f 和任意点 x, y,根据凸性定义,对于任意 θ ∈ (0,1],有:
f(x + θ(y - x)) ≤ (1-θ)f(x) + θ f(y)
整理可得:
[f(x + θ(y - x)) - f(x)] / θ ≤ f(y) - f(x)
θ → 0,左边即为方向导数 ∇f(x)^T (y - x),于是得到:
∇f(x)^T (y - x) ≤ f(y) - f(x)
这等价于一阶条件 f(y) ≥ f(x) + ∇f(x)^T (y - x)

次梯度的引入

上一节我们介绍了可微凸函数的一阶性质。本节中我们来看看当函数凸但不可微时的情况。

对于在某些点不可微的凸函数(例如 hinge loss 函数),在不可微点(如“拐点”处),可能不存在唯一的梯度,但依然存在支撑函数上图的超平面。实际上,可能存在无数个这样的超平面。

次梯度定义:
对于凸函数 f 定义域内的一点 x,一个向量 g 被称为 fx 点的次梯度,如果它满足以下条件:
f(y) ≥ f(x) + g^T (y - x), for all y
所有这样的 g 构成的集合称为 fx 点的次微分,记作 ∂f(x)

几何解释:
每个次梯度 g 都对应一个支撑超平面,其法向量为 [g; -1]。在可微点,次微分只包含一个元素,即梯度 ∇f(x)。在不可微点,次微分是一个集合(可能包含多个向量,甚至是一个线段或更复杂的凸集)。

本节课中我们一起学习了凸函数的一阶性质及其几何意义。我们了解到凸函数在其定义域内任一点的梯度都定义了该函数的一个全局线性下界。更重要的是,我们引入了次梯度的概念,它将可微情况下的梯度性质推广到了不可微的凸函数,为后续研究非光滑优化算法奠定了基础。

011:次梯度计算

在本节课中,我们将要学习凸函数的一阶和二阶性质,并深入探讨一个重要的概念——次梯度。次梯度是梯度概念的推广,它允许我们处理那些不可微的凸函数,这在机器学习优化问题中非常常见。

上一节我们介绍了凸函数的方向导数和曲率,本节中我们来看看当函数不可微时,如何定义其“梯度”。

次梯度的引入

对于一个凸函数,即使它在某点不可微,其上方图(epigraph)在对应点也存在一个支撑超平面。这个支撑超平面对应的法向量,就是原函数在该点的“次梯度”。因此,次梯度是梯度概念的推广。

  • 核心定义:对于凸函数 f,向量 g 是其在点 x 的一个次梯度,当且仅当对于定义域内所有 y,都满足:
    f(y) >= f(x) + g^T (y - x)
    所有次梯度构成的集合称为 次微分,记作 ∂f(x)。它是一个闭凸集。

次梯度的性质与计算

以下是关于次微分的一些重要性质:

  • 唯一性:如果凸函数 f 在点 x 可微,那么其次微分 ∂f(x) 是单点集,且唯一元素就是梯度 ∇f(x)
  • 非空性:对于凸函数,次微分在定义域内每一点都是非空的。
  • 凸组合:如果 g1g2 分别是函数在点 x 的次梯度,那么它们的任何凸组合 θ*g1 + (1-θ)*g2(其中 0 <= θ <= 1)也是 f 在点 x 的次梯度。

现在,让我们看一些具体函数的次梯度例子。

最大值函数的次梯度

考虑函数 f(x) = max(f1(x), f2(x), ..., fm(x)),其中每个 fi 都是凸函数。在点 x 处,令 I(x) 为达到最大值的函数下标集合(即“活跃”函数集)。那么 f 在点 x 的次微分是这些活跃函数在 x 点梯度的凸包。

公式表示
∂f(x) = conv{∇fi(x) | i ∈ I(x)}
其中 conv 表示凸包。

L1 范数的次梯度

L1 范数 ||x||_1 = Σ|xi| 是一个典型的不可微凸函数。我们可以将其重写为最大值形式:||x||_1 = max_{s: si ∈ {-1,1}} s^T x。利用最大值函数的次梯度规则,可以得到:

  • xi ≠ 0 时,次梯度在 i 方向的分量为 sign(xi)
  • xi = 0 时,次梯度在 i 方向的分量可以是 [-1, 1] 区间内的任意值。

公式表示
对于 g ∈ ∂||x||_1,其分量 gi 满足:
gi = sign(xi),若 xi ≠ 0
gi ∈ [-1, 1],若 xi = 0

更一般的 Lp 范数与对偶性

Lp 范数 ||x||_p 的定义涉及 Holder 不等式,这引入了对偶性的概念。Lp 范数可以等价地通过对偶方式定义:
||x||_p = max_{z: ||z||_q <= 1} z^T x
其中 1/p + 1/q = 1。这里 ||·||_q 称为 ||·||_p 的对偶范数。例如,L2 范数的对偶是它自身,L1 范数的对偶是 L∞ 范数。

应用于机器学习:Lasso 问题的次梯度

考虑一个简化的 Lasso 问题目标函数:
F(x) = (1/2) * ||y - x||_2^2 + λ * ||x||_1
其中第一项可微,第二项是 L1 范数。根据次梯度的加法规则(凸函数的正线性组合),F(x) 的次微分为:
∂F(x) = (x - y) + λ * ∂||x||_1
∂||x||_1 的具体形式代入,我们就得到了用于优化(例如次梯度下降法)的关键表达式。

次梯度计算练习

作为课后练习,请思考如何计算复合函数 f(x) = h(g(x)) 的次梯度,其中 h 是凸的且各分量非减,g 是凹的且各分量非增(这正是我们证明 log(sum(exp(x))) 凸性时用到的结构)。提示:尝试从次梯度的基本定义出发进行推导。

本节课中我们一起学习了次梯度的概念、性质和一些重要函数的次梯度计算。次梯度是处理不可微凸优化问题的强大工具,在带有 L1 正则化等结构的机器学习模型中有着直接的应用。理解并掌握次梯度的计算,是进行相关模型优化的重要基础。

012:次梯度计算结束与凸性、局部和全局最小值

在本节课中,我们将结束关于次梯度计算的讨论,并基于作业的讨论,深入探讨局部和全局最小值。我们将审视优化问题的充分条件,建立其与次梯度的联系,并探讨凸性与全局最小值的关系。最后,我们将为后续学习一阶和二阶优化算法打下基础。

次梯度计算回顾与作业讨论

上一节我们介绍了次梯度的基本概念。本节中,我们来看看如何应用这些概念解决具体问题,特别是复合函数的次梯度计算。

以下是关于复合函数 F(x) = P(Q(x)) 次梯度计算的要点,其中 Q(x) = [Q1(x), ..., Qk(x)]

  • 情况一:P 凸且非递减,每个 Qi 凸
    对于这种情况,我们可以推导出 F 的一个次梯度。思路是分两步利用次梯度不等式:

    1. 利用每个凸函数 Qi 的次梯度不等式。
    2. 利用 P 的凸性及其在每一维上的非递减性质,将第一步得到的不等式代入。
      最终得到的次梯度形式为:∑_i (∂P/∂Qi) * ∂Qi,其中 ∂P/∂Qi 和 ∂Qi 分别是 P 在 Q(x) 处和 Qi 在 x 处的(某个)次梯度。需要注意的是,此方法构造出的是 F 次微分的一个子集,未必是全部。
  • 情况二:P 凸且非递增,每个 Qi 凹
    计算逻辑与情况一类似,但需注意由于 Qi 是凹函数,其不等式方向相反(使用超梯度)。最终得到的次梯度表达式形式相同。

邻近算子简介

在分析约束优化问题时,邻近算子是一个非常有用的工具。

考虑点 x 到凸集 C 的距离函数:d(x) = inf_{y∈C} ||x - y||。这个函数是凸的。我们可以通过指示函数重新表述带约束的优化问题:
min_{x∈C} f(x) 等价于 min_x f(x) + I_C(x),其中 I_C(x) 在 x∈C 时为0,否则为+∞。

邻近算子可以看作是对指示函数 I_C(x) 的一种近似。当我们将约束惩罚项替换为 (1/2λ)||x - y||^2 时,就引出了邻近梯度下降算法的基础。与次梯度相关的另一个概念是法锥,它描述了在集合边界点处所有可能的“向外”方向。

单调性与凸性的关系

我们已知,对于一元可微凸函数,其导数 f'(x) 是单调不减的。那么,对于多元函数,梯度的单调性如何定义呢?

我们不能简单地要求梯度的每个分量都单调不减,因为这过于严格且不实用。取而代之的是,我们定义向量值函数 g(x)(例如梯度)的单调性如下:

  • 单调性:如果对于所有 x, y,有 (g(x) - g(y))^T (x - y) ≥ 0,则 g 是单调的。
  • 强单调性:如果存在常数 m > 0,使得对于所有 x, y,有 (g(x) - g(y))^T (x - y) ≥ m ||x - y||^2,则 g 是强单调的。

这与凸性有深刻联系:

  • 定理:一个可微函数 f 是凸的,当且仅当其梯度 ∇f 是单调的。
  • 定理:一个可微函数 f 是强凸的,当且仅当其梯度 ∇f 是强单调的。

直观理解,单调性要求向量 g(x) - g(y) 与向量 x - y 的夹角始终为锐角或直角,这正是一元函数导数不减在高维空间的推广。

优化问题:局部与全局最小值

现在让我们正式进入优化问题的讨论。考虑一个函数,它可能具有多个局部极小值和极大值。

  • 全局最小值:对于定义域 D 中的所有 x,如果 f(c) ≤ f(x),则 c 是全局最小值点。
  • 局部最小值:如果存在一个以 c 为中心的开球 B,使得对于 B 中的所有 x,有 f(c) ≤ f(x),则 c 是局部最小值点。

那么,次梯度与最小值点有何关系?

  • 充分条件:对于凸函数 f,如果 0 ∈ ∂f(x*)(即零向量属于 f 在 x* 处的次微分),那么 x* 是 f 的全局最小值点。
    证明很简单:根据次梯度定义,对于所有 y,有 f(y) ≥ f(x*) + 0^T (y - x*) = f(x*)
    特例:若 f 可微,该条件简化为 ∇f(x*) = 0

应用:LASSO问题的软阈值算子

让我们将上述充分条件应用于 LASSO 问题的简化形式:
min_x (1/2)||x - y||^2 + λ||x||_1
我们已知其目标函数的次微分是:∂f(x) = x - y + λ s,其中 s_i = sign(x_i)(若 x_i ≠ 0),否则 s_i ∈ [-1, 1]

为了找到最小值点,我们应用充分条件 0 ∈ ∂f(x*)。通过分析 x_i 的不同情况,可以得到著名的软阈值算子解:

x*_i = {
    y_i - λ,      if y_i > λ
    0,            if -λ ≤ y_i ≤ λ
    y_i + λ,      if y_i < -λ
}

这个解直观地表示:当 y_i 的绝对值大于 λ 时,将其向零收缩 λ;当 y_i 的绝对值小于等于 λ 时,直接置为零。这恰好是产生稀疏解的原因。该解也是迭代软阈值算法的基础。

凸函数最小值的重要性质

对于凸优化问题,局部最小值和全局最小值之间有非常强的联系:

  • 性质一:对于凸函数,任何局部最小值点同时也是全局最小值点。
    证明思路(反证法):

    1. 假设 x 是局部最小点,y 是全局最小点且 f(y) < f(x)
    2. 构造点 z = θy + (1-θ)x,其中 θ 足够小,使得 z 位于 x 的局部最小邻域内。
    3. 根据凸性,f(z) ≤ θf(y) + (1-θ)f(x)
    4. 由于 f(y) < f(x),可得 f(z) < f(x)
    5. 这与 x 是局部最小值点矛盾。因此,f(x) 必须等于 f(y),x 也是全局最小值点。
  • 性质二:对于严格凸函数,全局最小值点是唯一的。
    证明思路(反证法):

    1. 假设存在两个不同的全局最小值点 x 和 y。
    2. 考虑其中点 z = (x+y)/2
    3. 根据严格凸性,f(z) < (1/2)f(x) + (1/2)f(y) = f(x)
    4. 这与 x, y 是全局最小值点矛盾。因此,全局最小值点只能有一个。

最后需要指出,即使凸函数有下界,其最小值也不一定总能取到(例如 e^x 下界为0但无法取到)。保证最小值存在的一个充分条件是:函数存在一个非空且有界的下水平集。

总结

本节课中我们一起学习了:

  1. 完成了复合函数次梯度计算的讨论,理解了其构造方法。
  2. 介绍了邻近算子的概念及其与约束优化的联系。
  3. 探讨了梯度单调性与函数凸性的等价关系。
  4. 明确了局部最小值与全局最小值的定义,并掌握了利用次梯度判断全局最小值的充分条件。
  5. 将理论应用于LASSO问题,推导出了其解析解——软阈值算子。
  6. 证明了凸函数局部最小值即全局最小值,以及严格凸函数全局最小值唯一这两个关键性质。

这些内容为我们接下来学习具体的优化算法奠定了坚实的理论基础。

013:凸性、最小值与利普希茨连续性对算法的作用 🎯

在本节课中,我们将深入学习凸性与全局最小值的关系,并引入一个对优化算法至关重要的概念——利普希茨连续性。我们将探讨这些概念如何为后续的算法收敛性分析奠定基础。

凸性与最优性条件回顾

上一节我们介绍了凸函数的最优性条件。对于凸函数,零次梯度是全局最小值的充分条件。这意味着,如果在一个点处找到零次梯度,那么该点就是全局最小值点。

此外,我们提到了一个重要的存在性定理:如果一个凸函数存在非空且有界的下水平集,那么该函数必然存在全局最小值。反之,即使函数有下界(如函数 ( e^x )),若其下水平集无界,也可能不存在全局最小值点。

鞍点:非凸优化中的挑战

在讨论全局和局部最小值时,我们无法避开鞍点。鞍点是梯度为零,但既不是局部最小值也不是局部最大值的点。

  • 直观理解:想象一个马鞍的形状。沿着一个方向(如马的前后方向),该点是局部最小值;沿着另一个方向(如马的左右方向),该点则是局部最大值。
  • 数学示例:考虑函数 ( f(x) = x^3 - 5x )。其导数为 ( f'(x) = 3x^2 - 5 )。在 ( x = 0 ) 处,导数为负,但二阶导数(曲率)为零。检查其邻域会发现,它既不是局部最小也不是局部最大,而是一个鞍点。
  • 重要性:在深度神经网络等非凸优化问题中,鞍点的分析至关重要,因为它们可能使优化算法陷入停滞。

约束凸优化问题简介

一个一般的约束凸优化问题形式如下:
[
\min_{x} f(x) \quad \text{subject to} \quad x \in \mathcal{X}
]
其中 ( \mathcal{X} ) 是一个凸集,( f(x) ) 是凸函数。

  • 约束集:通常由一组凸不等式 ( g_i(x) \leq 0 ) 定义,每个不等式都描述了一个凸的“半空间”。整个可行域 ( \mathcal{X} ) 就是这些半空间的交集。
  • 最优性条件:对于约束问题,最优性条件不再仅仅是梯度为零。
    • 如果最优解 ( x^* ) 在可行域内部,那么 ( 0 \in \partial f(x^*) ) 仍然是充分条件。
    • 如果 ( x^* ) 在边界上,则需要满足:对于可行域内所有 ( x ),有 ( \nabla f(x*)\top (x - x^) \geq 0 )。这意味着在 ( x^ ) 处,梯度方向与指向可行域内部的任何方向都成锐角(或直角),你无法沿着一个可行方向使函数值下降。

利普希茨连续性:函数变化的速度上限 🚀

在进入具体算法之前,我们需要理解利普希茨连续性。这个概念描述了函数变化的“最大速度”,对分析算法的收敛性极为关键。

一个函数 ( f ) 被称为是 L-利普希茨连续 的,如果存在常数 ( L > 0 )(利普希茨常数),使得对于所有 ( x, y ) 都有:
[
|f(x) - f(y)| \leq L |x - y|
]
这表示函数值的变化被自变量距离的线性函数所控制。L 越小,函数变化越平缓

  • 与梯度的关系:如果 ( f ) 可微,那么利普希茨连续性等价于其梯度范数有界:( | \nabla f(x) | \leq L )。
  • 性质
    • 两个利普希茨连续函数之和仍是利普希茨连续的,常数约为两者之和。
    • 两个有界的利普希茨连续函数之积也是利普希茨连续的。

利普希茨光滑性:梯度变化的速度上限 📈

一个更严格的概念是 利普希茨光滑性,它约束的是梯度的变化速度。

一个函数 ( f ) 被称为是 L-光滑 的,如果其梯度是 L-利普希茨连续的:
[
| \nabla f(x) - \nabla f(y) | \leq L |x - y|
]
这大致意味着函数的曲率(Hessian矩阵的特征值)有上界。对于二次可微函数,这等价于 ( \nabla^2 f(x) \preceq L I )。

  • 几何意义:L-光滑函数可以被一个二次函数“从上界”紧紧包裹,这为后续梯度下降法的分析提供了关键工具。
  • 与强凸性的对比:回忆一下,强凸性要求曲率有下界(( \nabla^2 f(x) \succeq \mu I )),确保函数不会太平坦。而光滑性要求曲率有上界,确保函数不会太弯曲。两者可以同时存在(( \mu \leq L )),分别从下方和上方约束了函数的形状。

概念层次与实例

在闭有界集上,这些概念之间存在包含关系(从宽到严):

  1. 连续函数
  2. 几乎处处可微的函数(如 ( |x|_1 ))
  3. 利普希茨连续函数
  4. 连续可微函数(梯度连续)
  5. 利普希茨光滑函数(L-光滑)

示例分析

  • ( f(x) = x^2 ):既是强凸的(( \mu=2 )),也是光滑的(( L=2 ))。
  • ( f(x) = |x| ):是利普希茨连续的(( L=1 )),但并非处处可微,因此不属于光滑函数。
  • ( f(x) = x^4 ):在全局范围内不是利普希茨光滑的,因为其梯度 ( 4x^3 ) 的变化速度会随着 ( x ) 增大而无界增长。但在任何闭有界区间内,它是光滑的。

重要函数的性质总结 💡

以下是常见机器学习损失函数及其正则化版本的性质总结,理解这些对选择和使用优化算法至关重要:

  • 逻辑损失:是利普希茨光滑的。
  • 铰链损失:是利普希茨连续的,但非处处可微。
  • 多类逻辑回归损失:是利普希茨光滑的。
  • 最小二乘(平方损失):既是强凸的,也是利普希茨光滑的(理想情况)。
  • L2正则化:使目标函数同时具有强凸性和利普希茨光滑性。
  • L1正则化:通常仅保持利普希茨连续性和凸性,但可能不可微。
  • 组合示例
    • L2正则化逻辑回归:强凸且利普希茨光滑。
    • L1正则化逻辑回归:利普希茨连续。
    • L1正则化最小二乘(LASSO):利普希茨连续且强凸(在特定条件下)。

总结

本节课中,我们一起深入探讨了凸优化问题的核心理论。我们回顾了凸函数的最优性条件,认识了非凸优化中的“拦路虎”——鞍点,并简要了解了约束优化问题的形式。随后,我们重点学习了利普希茨连续性利普希茨光滑性这两个核心概念,它们分别限制了函数值及其梯度的最大变化率,是分析梯度下降等算法收敛性的理论基础。最后,我们总结了常见损失函数的这些性质,为后续实际应用算法做好了准备。下一节,我们将正式进入优化算法的世界。

014:优化算法与收敛性分析

在本节课中,我们将学习机器学习目标函数的利普希茨连续性与平滑性,并探讨这些性质在梯度下降等优化算法收敛性分析中的重要性。我们将通过具体的数学推导,理解如何利用这些性质来证明算法的收敛性。

概述

上一节我们介绍了利普希茨连续性和平滑性的概念。本节中,我们将把这些概念应用到梯度下降算法的分析中,并学习如何利用代数变换和伸缩求和等关键技巧来证明收敛性。

利普希茨性质回顾

利普希茨连续性限制了函数值的变化速度。对于一个函数 f,如果存在常数 L,使得对于所有 xy,都有:
[
|f(x) - f(y)| \leq L |x - y|
]
那么该函数是利普希茨连续的。

利普希茨平滑性则限制了梯度变化的速度。如果函数的梯度 ∇f 是利普希茨连续的,即存在常数 L,使得:
[
|\nabla f(x) - \nabla f(y)| \leq L |x - y|
]
那么该函数是利普希茨平滑的。

常见损失函数的性质分析

以下是几种常见机器学习损失函数和正则化项的性质总结:

  • 逻辑损失:既是利普希茨连续的,也是利普希茨平滑的。
  • Hinge损失:是利普希茨连续的,但不是利普希茨平滑的。
  • 最小二乘损失:在有限定义域内,既是利普希茨连续的,也是利普希茨平滑的,并且是强凸的。
  • L1正则化:是利普希茨连续的。
  • L2正则化:是利普希茨平滑的,并且是强凸的。

对于组合函数,有以下性质:

  • 利普希茨连续函数的和仍然是利普希茨连续的。
  • 利普希茨平滑函数的和仍然是利普希茨平滑的。
  • 凸函数与强凸函数的和是强凸的。

优化算法与水平集

任何优化算法的核心思想都是从参数空间中的一个点移动到另一个点。理解这一点的一个有效工具是水平集的概念。

在水平集的视角下,算法的每次迭代由两个关键部分组成:方向步长(幅度)。利普希茨连续性和强凸性等性质会影响我们选择方向和步长的策略,从而决定了算法收敛到最优解的速度。

梯度下降算法

最流行的优化算法之一是梯度下降。对于凸函数 f,我们希望找到接近最优解 x* 的点。梯度下降的迭代公式为:
[
x_{t+1} = x_t - \gamma \nabla f(x_t)
]
其中,γ 是步长参数,∇f(x_t) 是函数在 x_t 处的梯度。

梯度方向是函数在该点处上升最快的方向,垂直于该点的水平集。然而,这并不意味着可以任意选择大步长。步长过大可能导致在最优解附近震荡,影响收敛。

收敛性分析的关键技巧

分析梯度下降收敛性时,我们主要依赖两种代数技巧:

  1. 代数变换:将点积转化为二次型表达式。
  2. 伸缩求和:对一系列项求和时,中间项相互抵消,只剩下首尾项。

以下是分析的基本步骤框架:

  1. 从梯度下降更新公式出发。
  2. 通过引入最优解 x* 和代数运算,得到包含内积 <∇f(x_t), x_t - x*> 的表达式。
  3. 利用恒等式 2vᵀw = |v|² + |w|² - |v - w|² 将内积转化为范数平方项。
  4. 对迭代次数 t 求和。利用伸缩求和,许多中间项会被消去。
  5. 利用函数的凸性<∇f(x_t), x_t - x*> 项进行下界估计(根据一阶凸性条件,该项不小于 f(x_t) - f(x*))。
  6. 利用函数的利普希茨连续性或平滑性对梯度范数 |∇f(x_t)|² 项进行上界估计。
  7. 将不等式组合起来,最终得到函数值误差 f(x_t) - f(x*) 或解的距离 |x_t - x*|² 的上界,该上界随着迭代次数 t 增加而衰减,从而证明收敛性。

具体的推导过程涉及细致的数学操作,我们鼓励读者作为练习完成整个证明,以深入理解各性质如何共同保证收敛。

总结

本节课中,我们一起学习了如何将利普希茨连续性与平滑性的概念应用于梯度下降算法的理论分析。我们了解到:

  • 不同的损失函数具有不同的利普希茨性质。
  • 水平集视角有助于理解优化算法的方向与步长选择。
  • 收敛性证明依赖于凸性、利普希茨性质以及代数变换和伸缩求和两大核心技巧。
  • 在利普希茨平滑和强凸的假设下,梯度下降能够获得更快的收敛速率(例如线性收敛),而仅有利普希茨连续性时,收敛速率通常较慢(例如次线性收敛)。

理解这些分析工具和思想,是设计和理解更复杂优化算法的基础。

015:凸性、利普希茨假设与技巧

概述

在本节课中,我们将深入探讨梯度下降算法的收敛性分析。我们将回顾凸性和利普希茨连续性这两个核心假设,并学习如何运用一系列数学技巧来推导梯度下降的收敛速率。通过本次学习,你将理解为什么梯度下降在特定条件下能够收敛,以及如何量化其收敛速度。

梯度下降算法回顾

我们从一个简单的梯度下降实现开始。该算法旨在最小化一个目标函数,例如逻辑回归的损失函数。其核心更新规则为:

x_{t+1} = x_t - γ * ∇f(x_t)

其中,γ 是步长(学习率),∇f(x_t) 是在点 x_t 处的梯度。算法在满足优化条件(例如梯度范数足够小)或达到最大迭代次数时停止。

上一节我们介绍了梯度下降的基本流程,本节中我们来看看如何从理论上分析它的收敛行为。

收敛性分析的数学基础

收敛性分析依赖于对目标函数性质的假设。我们主要使用以下两个性质:

  1. 凸性:函数图像在其定义域内任意两点连线之上。对于凸函数 f 和任意点 x, y,有 f(y) ≥ f(x) + ∇f(x)^T (y - x)。这为函数值提供了一个线性下界。
  2. 利普希茨连续性:函数的梯度变化不会太快。存在常数 B > 0,使得对于任意 x, y,有 ||∇f(x) - ∇f(y)|| ≤ B ||x - y||。这为梯度范数提供了一个上界。

在分析中,我们设 x* 为全局最优点,f(x*) 为最优函数值。我们的目标是证明迭代点 x_t 的函数值 f(x_t) 能收敛到 f(x*)

收敛证明的核心技巧

以下是推导收敛速率过程中使用的关键技巧:

技巧一:代数恒等式展开
我们利用向量恒等式 2 * v^T w = ||v||^2 + ||w||^2 - ||v - w||^2 来处理迭代更新公式中的内积项,将其转化为范数平方项,便于后续应用不等式。

技巧二:利用凸性得到关键不等式
将凸性定义应用于 x = x_ty = x*,我们得到 f(x) ≥ f(x_t) + ∇f(x_t)^T (x - x_t)。移项后得到 f(x_t) - f(x) ≤ ∇f(x_t)^T (x_t - x)。这个不等式将函数值的差与梯度和解的距离联系起来。

技巧三:对迭代进行求和(伸缩求和)
我们将从第一次迭代到第 T-1 次迭代得到的不等式进行求和。求和后,许多中间项会相互抵消,最终表达式主要包含首项、末项以及梯度范数的平方和。

技巧四:应用利普希茨连续性
利普希茨连续性给出了梯度范数的上界:||∇f(x_t)|| ≤ B。因此,梯度范数的平方和 ∑||∇f(x_t)||^2 可以被 (T-1) * B^2 所界定。

技巧五:假设初始点不远
我们假设初始迭代点 x_1 距离最优解 x* 不太远,即存在一个常数 R,使得 ||x_1 - x*|| ≤ R。这是一个合理的工程假设。

技巧六:优化步长参数 γ
经过上述步骤,我们得到一个形如 f(x_t) - f(x*) ≤ A(γ) 的上界,其中 A(γ) 是步长 γ 的函数。我们通过最小化 A(γ) 来找到使上界最紧的步长,得到最优步长 γ = R / (B * √T)*。将其代回上界,得到 f(x_t) - f(x*) ≤ (R * B) / √T

收敛速率与含义

x_hat 为所有迭代中函数值最小的点(即最终输出或最佳迭代点)。根据梯度下降使函数值下降的性质,f(x_hat) 不会差于平均表现。因此,我们有:
f(x_hat) - f(x*) ≤ (R * B) / √T

这个结论告诉我们:

  • 收敛性:随着迭代次数 T 增加,最优间隙 f(x_hat) - f(x*)1/√T 的速率趋近于0。
  • 计算复杂度:为了达到精度 ε,即 f(x_hat) - f(x*) ≤ ε,所需的迭代次数 T 至少为 Ω( R² * B² / ε² )。这里 Ω 表示下界,意味着迭代次数随精度要求呈平方反比增长。

当前分析的局限性与改进方向

虽然我们证明了收敛性,但当前分析揭示的收敛速率较慢(次线性收敛)。要达到 ε=0.01 的精度可能需要约 10^4 量级的迭代,对于 ε=0.001 则需要约 10^6 量级,这在实践中可能成本过高。

主要局限性包括:

  1. 使用了“神奇”的理论最优步长 γ*,该步长依赖于未知的 RB,在实际中无法直接计算。
  2. 收敛速率较慢。
  3. 分析基于较弱的 R-收敛 概念。

在实践中,我们使用更鲁棒的方法选择步长,例如:

  • 精确线搜索:在每次迭代中,沿梯度方向寻找精确的最小值点。
  • 回溯线搜索:从一个较大的步长开始,不断按比例缩小,直到满足阿米霍(Armijo)条件等充分下降条件,保证每次迭代有足够的函数值下降。

此外,利普希茨光滑性(Lipschitz Smoothness)是一个比连续性更强的假设,它限制了函数梯度的变化率(即曲率)。在后续课程中我们将看到,利用光滑性假设,结合更先进的算法(如动量法、自适应方法),有望获得更快的收敛速率(例如线性收敛或 log(1/ε) 级别的收敛)。

总结

本节课中我们一起学习了梯度下降在凸性和利普希茨连续性假设下的收敛性证明。我们通过一系列数学技巧,推导出其收敛速率为 O(1/√T),并理解了达到指定精度所需迭代次数的下界。我们也指出了该分析的局限性,包括收敛速度慢和步长选择不实用等问题,并简要介绍了回溯线搜索等实用步长选择策略,以及利用更强假设(如光滑性)来改进收敛速度的可能性。这为后续学习更高效的优化算法奠定了理论基础。

016:梯度下降收敛分析(续)

在本节课中,我们将继续分析梯度下降算法的收敛性。我们将重点探讨利普希茨光滑性这一重要概念,并回顾之前关于利普希茨连续性和凸性的分析。通过结合这些性质,我们将推导出更快的收敛速率。


课程回顾

上一节我们介绍了在利普希茨连续函数假设下,梯度下降的收敛性分析。我们得到的迭代次数与误差平方的倒数成正比,即 T ~ O(1/ε²)。这个收敛速度并不理想。

本节中,我们将引入更强的假设——利普希茨光滑性,看看它是否能帮助我们获得更好的收敛速度。

利普希茨光滑性简介

利普希茨光滑性是对函数梯度变化率的一个上界约束。对于一个利普希茨光滑的函数 f,存在一个常数 L,使得对于任意两点 xy,满足以下不等式:

f(y) ≤ f(x) + ∇f(x)ᵀ(y - x) + (L/2) ||y - x||²

这个性质意味着函数可以被一个二次函数从上方“包住”,它比单纯的利普希茨连续性(只约束函数值)提供了更多关于函数曲率的信息。在实践中,利普希茨光滑性通常比连续性更常见且更有用。

逻辑回归的利普希茨光滑常数

我们之前已经证明,逻辑回归的损失函数是利普希茨光滑的。现在,我们来推导其光滑常数 L 的大致形式。

逻辑回归的损失函数形式为:
L(θ) = Σᵢ log(1 + exp(-yᵢ θᵀxᵢ))

通过分析其梯度的变化,并利用柯西-施瓦茨不等式,我们可以得到 L 的一个上界。这个上界与数据矩阵 X(其中每行是一个样本 xᵢ)的最大奇异值(谱范数)有关。

具体推导涉及复合函数的利普希茨常数计算。最终,逻辑回归的利普希茨光滑常数 L_LR 大致满足:
L_LR ∝ λ_max(XᵀX)
其中 λ_max 是矩阵 XᵀX 的最大特征值。这表明数据的尺度会影响优化速度。

光滑函数下的梯度下降分析

现在,我们分析当目标函数 f利普希茨光滑时,梯度下降的表现。我们暂时不假设凸性

梯度下降的更新公式为:
x_{t+1} = x_t - γ ∇f(x_t)

y = x_{t+1}, x = x_t 代入利普希茨光滑性不等式:
f(x_{t+1}) ≤ f(x_t) - γ ||∇f(x_t)||² + (Lγ²/2) ||∇f(x_t)||²
f(x_{t+1}) ≤ f(x_t) - γ (1 - (Lγ/2)) ||∇f(x_t)||²

我们的目标是找到一个步长 γ,使得每次迭代的函数值下降尽可能多。这引出了我们的第三个技巧最小化上界

我们将不等式右边视为 γ 的函数,并对其进行最小化。求导并令导数为零:
d/dγ [ -γ + (Lγ²/2) ] = -1 + Lγ = 0
解得最优步长为:
γ = 1/L

将这个最优步长代回不等式,我们得到:
f(x_{t+1}) ≤ f(x_t) - (1/(2L)) ||∇f(x_t)||²

这是一个非常有力的结论!即使在没有凸性的情况下,利普希茨光滑性也能保证梯度下降在每一步都使函数值下降,且下降量至少与梯度范数的平方成正比。

结合光滑性与凸性

上一节我们得到了仅凭光滑性就能保证函数值下降。现在,我们引入凸性假设,以期获得关于最优解 x* 的收敛速率。

我们回到之前凸性分析中得到的核心不等式(经过整理):
f(x_t) - f(x*) ≤ (1/(2γ)) [||x_t - x*||² - ||x_{t+1} - x*||²] + (γ/2) ||∇f(x_t)||² - ∇f(x_t)ᵀ(x_t - x*)

利用凸性性质 f(x*) ≥ f(x_t) + ∇f(x_t)ᵀ(x* - x_t),我们可以简化不等式。然后,我们将之前从光滑性得到的不等式 ||∇f(x_t)||² ≤ 2L [f(x_t) - f(x_{t+1})] 代入。

经过一系列代数运算和求和(技巧二:伸缩求和法),并假设初始点 x_0 在最优解 x* 的一个半径为 R 的球内(即 ||x_0 - x*|| ≤ R),我们可以推导出:

f(x_T) - f(x*) ≤ (L R²) / (2T)

这意味着,为了达到 f(x_T) - f(x*) ≤ ε 的精度,所需的迭代次数 T 满足:
T ≥ (L R²) / (2ε)

与仅有利普希茨连续性和凸性时的 T ~ O(1/ε²) 相比,现在的收敛速率是 O(1/ε),这是一个显著的改进!

展望:强凸性与更快的收敛

我们之前提到,利普希茨光滑性给出了函数曲率的一个上界(与最大特征值 λ_max 相关)。自然,我们会想,如果有一个曲率的下界呢?这就是强凸性

一个函数是 μ-强凸的,如果对于任意 x, y,满足:
f(y) ≥ f(x) + ∇f(x)ᵀ(y - x) + (μ/2) ||y - x||²

这为函数提供了一个二次下界。常数 μ 与海森矩阵的最小特征值 λ_min 有关。

当函数同时满足 L-光滑和 μ-强凸时,其收敛分析会引入比值 L/μ,这个比值被称为问题的条件数。条件数越大(即 L >> μ),问题越“病态”,优化越困难;条件数越接近1,问题越“良态”,优化算法收敛越快。

在强凸和光滑的假设下,梯度下降可以实现线性收敛(也称指数收敛),即误差以 O(ρ^T) 的速度下降,其中 ρ < 1 是一个与条件数相关的常数。这比我们目前看到的 O(1/T) 收敛要快得多。

具体的证明会更为复杂,因为强凸性引入的额外项 (μ/2) ||x_t - x*||² 使得直接的伸缩求和不能完全消去所有项,但正是这项的留存导致了误差的指数级衰减。我们将在后续课程中详细探讨。


总结

本节课中我们一起学习了:

  1. 利普希茨光滑性的定义及其意义,它用二次函数上界约束了梯度的变化。
  2. 推导了逻辑回归损失函数的利普希茨光滑常数与数据矩阵谱范数的关系。
  3. 分析了在仅有利普希茨光滑性(无需凸性)下,梯度下降能保证函数值稳定下降,并得到了最优步长 γ = 1/L
  4. 光滑性与凸性结合,证明了梯度下降的收敛速率提升为 O(1/ε),优于仅有连续性和凸性时的 O(1/ε²)
  5. 展望了强凸性的概念,并指出在光滑且强凸的假设下,有望获得更快的线性收敛速率。

理解这些函数性质(连续性、光滑性、凸性、强凸性)如何影响优化算法的收敛行为,是设计和分析高效机器学习算法的基石。

017:中期总结与强凸性+利普希茨平滑假设下的梯度下降收敛性分析

概述

在本节课中,我们将对机器学习优化课程进行中期总结,并深入分析在函数同时满足强凸性利普希茨平滑假设下,梯度下降算法的收敛性。我们将回顾几个关键问题,并逐步推导出更快的收敛速率。

问题一:Min-Max不等式与鞍点

上一节我们介绍了优化中的一些基本概念,本节中我们来看看一个关于Min-Max不等式的问题。该不等式指出,对于任意函数,其最小值与最大值之间存在特定关系。

Min-Max不等式
对于函数 ( f(x, y) ),以下不等式恒成立:
[
\min_x \max_y f(x, y) \geq \max_y \min_x f(x, y)
]

当点 ( (\bar{x}, \bar{y}) ) 是函数的一个鞍点时,上述不等式变为等式。证明该等式的思路是双向证明不等式。

以下是证明的关键步骤:

  1. 首先,对于任意 ( x, y ),显然有 ( f(x, y) \leq \max_{y'} f(x, y') )。
  2. 由于左边与 ( y ) 无关,我们可以对左边取关于 ( y ) 的下确界,得到 ( \inf_y f(x, y) \leq \max_{y} f(x, y) )。
  3. 现在,左边独立于 ( y ),右边独立于 ( x )。我们可以通过分别对左边取关于 ( x ) 的上确界,对右边取关于 ( x ) 的下确界来收紧边界。
  4. 最终得到 ( \sup_x \inf_y f(x, y) \leq \inf_y \sup_x f(x, y) ),这就是Min-Max不等式。
  5. 如果存在鞍点 ( (\bar{x}, \bar{y}) ),将其代入即可证明等式成立。

这个不等式在优化理论中非常重要,特别是在处理博弈论或对抗性训练问题时。

问题二:梯度下降中的常见错误分析

在分析梯度下降收敛性时,初学者常会犯一些代数错误。我们通过一个具体例子来审视这些错误。

考虑在利普希茨平滑的函数上使用梯度下降,步长 ( \gamma = 1/L )。在推导过程中,可能会发生符号错误或项的顺序错误。

例如,在展开式子 ( f(x_{t+1}) - f(x_t) ) 时,可能会错误地写成加号而不是减号。另一个常见错误是在代入表达式时,没有正确地进行合并同类项和消元。

关键是要理解每一步的意图:我们通常试图将函数值的差与梯度范数的平方联系起来,并利用平滑性假设给出的上界。仔细检查每一步的代数变换,确保其与优化目标(如证明函数值下降)保持一致。

问题三:多标签分类中的优化问题解释

现在,我们来看一个更接近实际应用的优化问题:多标签分类。这与我们之前讨论的二元分类不同。

在多标签分类中,一个样本(例如一篇文档)可以同时属于多个类别。例如,一篇关于体育饮料的广告文档可能同时带有“体育”和“食品”的标签。有些标签可能是“特权”的,需要更多关注;有些则是“非特权”的。

我们定义了一个损失函数,其形式类似于支持向量机中的铰链损失,但针对多标签场景进行了扩展。损失函数包含两部分:

  1. 对于特权标签,我们鼓励模型正确标签的得分远高于混淆标签的得分。
  2. 对于非特权标签,我们不希望过度优化其区分度,而是希望其行为与某个先验模型(例如,一个基于流行度的简单模型)的输出保持在一定范围内。

这个优化问题可以表述为一个Min-Max问题,并可能通过寻找鞍点来求解。对最优解的解释有助于我们理解模型在特权标签和非特权标签上的不同行为。

强凸与利普希茨平滑下的梯度下降收敛性分析

回顾了前期问题后,我们进入核心内容:在函数同时满足强凸性利普希茨平滑假设下,分析梯度下降的收敛性。

之前我们分别讨论过:

  • 仅满足利普希茨连续性时,收敛速度为 ( O(1/\sqrt{T}) )。
  • 仅满足利普希茨平滑性时,收敛速度为 ( O(1/T) )。

现在,结合强凸性,我们期望获得更快的收敛速度。

关键不等式与推导

我们从梯度下降的更新公式 ( x_{t+1} = x_t - \gamma \nabla f(x_t) ) 开始。利用强凸性平滑性,我们可以得到关于迭代点与最优解 ( x^* ) 之间距离的不等式。

强凸性给出下界:
[
f(y) \geq f(x) + \nabla f(x)^T (y-x) + \frac{\mu}{2} |y-x|^2
]
其中 ( \mu > 0 ) 是强凸系数。

利普希茨平滑性给出上界:
[
f(y) \leq f(x) + \nabla f(x)^T (y-x) + \frac{L}{2} |y-x|^2
]
其中 ( L ) 是平滑常数。

将 ( y = x_{t+1} ), ( x = x_t ) 代入平滑性条件,并利用梯度下降更新规则,我们得到:
[
f(x_{t+1}) \leq f(x_t) - \gamma (1 - \frac{L\gamma}{2}) |\nabla f(x_t)|^2
]

同时,将 ( y = x^* ), ( x = x_t ) 代入强凸性条件,并利用最优解处梯度为零 ( \nabla f(x^*) = 0 ) 的性质,经过一系列代数运算(包括将距离项 ( |x_t - x*|2 ) 合并到不等式一侧),我们可以推导出:
[
|x_{t+1} - x*|2 \leq (1 - \mu\gamma) |x_t - x*|2 + \text{其他项}
]

这里的“其他项”包含 ( f(x^*) - f(x_t) ) 和 ( |\nabla f(x_t)|^2 )。我们的目标是证明这个“其他项”是非正的,或者能被控制。

收敛速率

通过选择最优步长 ( \gamma = 1/L ),并利用平滑性条件进一步控制梯度范数项,我们可以证明:
[
|x_{t+1} - x*|2 \leq (1 - \frac{\mu}{L}) |x_t - x*|2
]

由于 ( \mu \leq L )(海森矩阵的特征值介于 ( \mu ) 和 ( L ) 之间),因此 ( 0 < 1 - \frac{\mu}{L} < 1 )。这意味着迭代点与最优解的距离以线性(指数)速率收敛:
[
|x_t - x*|2 \leq (1 - \frac{\mu}{L})^t |x_0 - x*|2
]

为了得到函数值的收敛速率,我们再次利用平滑性条件。在最优解 ( x^* ) 处应用平滑性,并注意到 ( \nabla f(x^) = 0 ),可得:
[
f(x_t) - f(x^
) \leq \frac{L}{2} |x_t - x*|2
]

将距离的收敛上界代入,我们最终得到函数值的线性收敛速率:
[
f(x_t) - f(x^*) \leq \frac{L}{2} (1 - \frac{\mu}{L})^t |x_0 - x*|2
]

这比仅满足平滑性时的 ( O(1/T) ) 速率快得多。

总结

本节课中我们一起学习了:

  1. Min-Max不等式及其在鞍点处取等式的性质,这是分析对偶问题和对抗训练的基础。
  2. 在梯度下降收敛性推导中需要避免的常见代数错误,强调了严谨推导的重要性。
  3. 一个实际的多标签分类优化问题,展示了如何将理论应用于设计具有特定偏好的损失函数。
  4. 在函数同时满足强凸性利普希茨平滑性的强假设下,梯度下降算法可以达到线性收敛速率。这是目前我们得到的最快的确定性收敛速率,其关键条件是问题的条件数 ( L/\mu )。条件数越接近1,收敛越快。

这个分析为我们理解优化算法的效率提供了重要基准,后续我们将探讨如何加速梯度下降,以及处理非平滑和非凸等更复杂情况的方法。

018:凸性和利普希茨假设下梯度下降收敛分析的上界与加速梯度下降方法

在本节课中,我们将继续讨论在强凸性和利普希茨连续性假设下梯度下降的收敛性分析。我们将回顾之前得出的结论,并探讨如何通过引入加速方法来改进算法性能。最后,我们将介绍加速梯度下降方法的基本动机和两种主要实现形式。

回顾:强凸性与利普希茨光滑性下的收敛性

上一节我们分析了在强凸性和利普希茨光滑性假设下梯度下降的收敛行为。我们得到了一个关键的递推不等式:

公式:|x_{t+1} - x*|2 \leq (1 - \frac{\mu}{L}) |x_t - x*|2

其中,(\mu) 是强凸性系数,(L) 是利普希茨光滑系数。由于 (1 - \frac{\mu}{L}) 的值在0到1之间,这个不等式保证了迭代误差会指数级衰减。

为了将误差与函数值联系起来,我们结合了光滑性条件和最优解处梯度为零的条件,得到了函数值差的界:

公式:f(x_t) - f(x^*) \leq \frac{L}{2} |x_t - x*|2

进一步,我们假设初始点 (x_0) 与最优解 (x^) 的距离存在一个上界 (R),即 (|x_0 - x^| \leq R)。基于此,我们可以推导出达到预定精度 (\epsilon) 所需的迭代次数 (T)。

以下是达到精度 (\epsilon) 所需迭代次数的推导步骤:

  1. 将距离上界代入函数值差的不等式。
  2. 利用递推关系将误差表示为初始误差和衰减因子的乘积。
  3. 解出满足 (f(x_T) - f(x^*) \leq \epsilon) 的最小 (T)。

最终,我们得到所需迭代次数为 (T = O(\frac{L}{\mu} \log(\frac{R^2L}{2\epsilon})))。与仅满足光滑性和凸性(非强凸)时所需的 (O(1/\epsilon)) 次迭代相比,强凸性带来了对数级别的显著加速,这被称为线性收敛。

利普希茨连续与强凸函数下的收敛分析

在实际机器学习问题中,目标函数可能不可微(例如使用某些激活函数时),因此我们常常需要考虑利普希茨连续但非光滑的函数。通过添加正则项(如 (\lambda |w|^2)),我们可以使函数具有强凸性,同时保持利普希茨连续性。

一个自然的问题是:对于利普希茨连续且强凸的函数,梯度下降的收敛速度能否比 (O(1/\epsilon)) 更好?

我们回顾在利普希茨连续(系数为 (G))和强凸(系数为 (\mu))假设下的分析。通过选择递减的步长 (\gamma_t = \frac{2}{\mu (t+1)}) 并进行伸缩求和,我们可以得到如下收敛上界:

公式:f(\bar{x}_T) - f(x^*) \leq \frac{2G^2}{\mu (T+1)}

其中 (\bar{x}_T) 是迭代点的加权平均。这个上界表明收敛速度为 (O(1/T)),等价于 (O(1/\epsilon))。有趣的是,这与光滑+强凸情况下的对数收敛不同,而与仅满足光滑+凸性的情况在阶数上相同(尽管常数项更优)。

理论下界分析表明,对于利普希茨连续且强凸的函数,任何基于一阶信息的黑箱优化算法,其误差下界也是 (\Omega(1/T))。因此,标准梯度下降在这个设定下已经达到了最优的收敛阶。

加速梯度下降的动机

然而,在光滑且凸(非强凸)的函数上,我们发现了改进的空间。标准梯度下降的收敛上界是 (O(1/T)),而理论下界是 (\Omega(1/T^2))。这之间存在一个明显的差距,激励我们去寻找更快的算法。

加速梯度下降的核心思想是引入“动量”项。直观上,当梯度方向在连续迭代中变化不大时,我们可以通过结合当前梯度和历史更新方向(即动量)来获得一个更有效的搜索方向,减少振荡,从而加速收敛。

以下是一个物理类比:将参数更新想象为一个在损失函数地形中滚动的球。梯度提供了瞬时力,而动量代表了球由于惯性而保持之前运动趋势的倾向。结合两者可以更平滑、更快速地到达谷底。

两种加速梯度下降方法

基于动量的思想,有两种著名的加速算法变体。

1. 重球法

重球法在标准梯度下降更新中显式地加入了一个动量项。

算法步骤

  1. 计算当前点的梯度 (\nabla f(x_t))。
  2. 更新速度(动量)项:(v_{t+1} = \alpha v_t - \gamma \nabla f(x_t)),其中 (\alpha \in [0,1)) 是动量衰减系数。
  3. 更新参数:(x_{t+1} = x_t + v_{t+1})。

这种方法直观地模拟了带有惯性的运动。

2. 涅斯捷罗夫加速梯度法

涅斯捷罗夫加速梯度法采用了一种“前瞻”策略,它在动量点处计算梯度,而不是在当前点。

算法步骤

  1. 计算一个“展望”点:(y_t = x_t + \alpha (x_t - x_{t-1}))。
  2. 在展望点 (y_t) 处计算梯度 (\nabla f(y_t))。
  3. 更新参数:(x_{t+1} = y_t - \gamma \nabla f(y_t))。

这种方法的关键在于,梯度是在一个结合了当前动量的点 (y_t) 上计算的,这使得更新方向能更好地预测未来的地形,从而更有效地利用函数的光滑性信息。理论证明,对于光滑凸函数,NAG可以达到 (O(1/T^2)) 的最优收敛率。

对于光滑强凸函数,两种加速方法都能达到接近理论下界的收敛速度,显著快于标准梯度下降。

总结

本节课中我们一起学习了梯度下降在不同函数假设下的收敛性上界,以及加速梯度下降方法的动机和原理。

  1. 收敛性回顾:强凸性结合利普希茨光滑性能带来指数级(线性)收敛,远快于仅凸性时的次线性收敛。
  2. 利普希茨连续场景:对于利普希茨连续且强凸的函数,梯度下降的收敛阶为 (O(1/\epsilon)),且已达到理论下界。
  3. 加速动机:在光滑凸函数上,标准梯度下降的 (O(1/\epsilon)) 上界与理论下界 (\Omega(1/\epsilon^2)) 存在差距,这为加速算法提供了可能。
  4. 加速方法:引入动量是加速的关键思想。我们介绍了重球法涅斯捷罗夫加速梯度法,后者通过“前瞻”梯度计算,能够最优地利用函数光滑性,达到 (O(1/\epsilon^2)) 的收敛速度。

理解这些上界、下界和加速原理,有助于我们在实践中根据目标函数的性质选择合适的优化算法,并理解其背后的理论保证。

019:加速梯度下降与线搜索方法演示

在本节课中,我们将要学习梯度下降的收敛性分析,并探讨如何通过加速梯度下降来弥补理论上的性能差距。我们还将通过演示线搜索方法,直观地理解步长选择的重要性,并初步介绍次梯度下降的概念。

回顾与问题引入

上一节我们讨论了梯度下降在光滑且强凸函数上的优异表现,其收敛速度为 O(log(1/ε))。然而,对于仅满足光滑性(Lipschitz连续梯度)但非强凸的函数,我们遇到了一个理论上的性能差距。

  • 梯度下降的上界为:f(x_t) - f(x*) ≤ (L R^2) / (2t)
  • 理论下界为:f(x_t) - f(x*) ≥ (L R^2) / (8(t+1)^2)

这个差距促使我们寻找更优的算法。加速梯度下降(如Nesterov动量法)正是为了弥合这一差距而设计的。其核心思想是引入“动量”或“速度”项,利用历史梯度信息来修正当前更新方向,减少振荡,从而走得更“直”。

加速梯度下降的核心思想

加速梯度下降的更新规则可以直观地理解为结合了速度与梯度信息。速度项本身是负梯度的一个指数衰减移动平均,这有助于逐渐淡去过早的历史信息。

以下是两种主要的动量更新方式:

  1. Polyak Heavy Ball(动量法):在当前点计算梯度,然后与上一步的速度(动量)结合。
    • 公式:v_{t+1} = β v_t - α ∇f(x_t), x_{t+1} = x_t + v_{t+1}
  2. Nesterov Accelerated Gradient(NAG):先根据当前速度“展望”到一个未来点,在该点计算梯度,再用这个梯度来修正速度。
    • 公式:y_{t+1} = x_t + β v_t, v_{t+1} = β v_t - α ∇f(y_{t+1}), x_{t+1} = x_t + v_{t+1}

对于光滑强凸函数,NAG可以达到 O((1 - 1/√κ)^t) 的收敛速度,这与理论下界匹配。更重要的是,对于仅光滑的函数,NAG可以将收敛上界提升至 O(L R^2 / t^2),从而填补了与理论下界之间的差距。

线搜索方法演示

尽管加速梯度下降在理论上很完美,但其更新公式中的步长和动量参数设置可能较为复杂。在实践中,线搜索方法提供了一种自适应确定步长的替代方案,有时也能达到类似的效果。

线搜索的基本思想是:沿着负梯度方向(射线),动态地尝试不同的步长 α,直到找到一个满足“充分下降条件”的步长。这个过程通常通过“回溯”来实现。

以下是几种线搜索策略的演示和比较:

  • 固定步长梯度下降:使用一个恒定的学习率。
  • 简单回溯线搜索(版本1):从一个较大的初始步长开始,如果不满足充分下降条件,则将步长减半,直到条件满足。
  • 重置回溯线搜索(版本2):在每次迭代开始时,都将步长重置为初始值,然后进行回溯。
  • 插值回溯线搜索(版本3/4):基于当前函数值和梯度信息,对最优步长进行多项式插值估计,而不是简单地减半。

通过在一个逻辑回归任务(使用SMS垃圾邮件数据集)上的演示,我们发现:

  • 简单的固定步长梯度下降收敛较慢。
  • 即使是基本的回溯线搜索(版本1)也能显著改善性能。
  • 插值法(版本4)通过更智能地猜测步长,减少了回溯次数,从而提高了效率。
  • 在本例中,由于目标函数(带正则化的逻辑损失)既是光滑的也是强凸的,因此加速梯度下降的优势没有完全凸显,但线搜索方法已经表现出了强大的实用性。

线搜索的动机来源于对“充分下降条件”的追求,并试图在多次迭代中通过插值来维持良好的步长序列。

次梯度下降简介

接下来,我们将目光转向更具挑战性的情况:当目标函数不可微,因而无法计算标准梯度时,我们该怎么办?这时,次梯度下降法将成为我们的工具。

对于非光滑凸函数,我们在不可微点(如L1范数的零点)有多个次梯度(构成一个次微分集合)。次梯度下降法允许我们选择任何一个次梯度方向进行下降。

然而,“下降”并非总能保证。因此,次梯度下降法通常采用两种策略:

  1. 记录历史最优值:由于目标函数值可能震荡,我们记录并返回所有迭代中函数值最小的那个点 x_t_best
  2. 使用递减步长:固定步长通常效果不佳。我们常使用满足以下条件的递减步长序列:
    • lim_{t->∞} α_t = 0
    • ∑_{t=1}^{∞} α_t = ∞ (步长衰减不能太快)
    • 例如,α_t = 1/√t 是一个常见选择。

在假设函数是Lipschitz连续且迭代点有界的前提下,使用步长 α_t = 1/√t 的次梯度下降法可以达到 O(1/√t) 的收敛速率。虽然这比光滑情况下的速率慢,但对于处理不可微函数来说是标准且可接受的结果。

总结

本节课中我们一起学习了:

  1. 加速梯度下降:通过引入动量(Nesterov动量),我们能够弥合光滑非强凸函数上梯度下降的理论性能差距,达到 O(1/t^2) 的最优收敛速率。
  2. 线搜索方法:作为一种实践工具,线搜索通过自适应地选择步长,能够有效改善梯度下降的性能,其核心是回溯和充分下降条件。
  3. 次梯度下降:当函数不可微时,我们可以使用次梯度代替梯度。为了确保收敛,需要采用记录历史最优点和使用递减步长(如 1/√t)的策略。

这些方法构成了处理从光滑到非光滑、从凸到非凸(部分方法可扩展)优化问题的基础工具箱。下一讲,我们将进入更具随机性的领域:随机梯度下降。

020:次梯度与随机算法

在本节课中,我们将要学习次梯度下降算法的收敛性分析,并探讨其在机器学习中的应用,特别是如何通过数据子集选择来优化损失函数的计算。

概述

上一节我们介绍了次梯度下降的基本概念。本节中,我们将深入分析其收敛性,并探讨如何将其思想应用于机器学习,特别是通过选择数据子集来高效计算损失函数。

次梯度下降的收敛性分析

我们之前已经看到,对于光滑凸函数,加速梯度下降能够达到 O(1/√ε) 的收敛速度。然而,当我们将其推广到次梯度下降时,情况有所不同。

由于次梯度下降不再保证每一步都是下降的,我们需要关注迄今为止的最佳迭代点。对于递减的步长序列 η_t,可以证明存在以下收敛界:

f(x_{best}) ≤ f(x*) + (R² + L² ∑ η_t²) / (2 ∑ η_t)

其中 R 是初始点与最优解的距离上界,L 是 Lipschitz 常数。

为了使上述界收敛到 f(x*),我们需要对步长序列 η_t 施加条件。以下是关键条件:

  • 条件一∑ η_t² 必须收敛(即有限)。
  • 条件二∑ η_t 必须发散到无穷大。

一个满足条件的经典步长选择是 η_t = R/(L√t)。将其代入界中,我们可以推导出达到精度 ε 所需的迭代次数 T 满足:

T ≥ (L² R²) / ε²

这意味着收敛速度为 O(1/ε²)。这与我们之前在 Lipschitz 连续函数上得到的结果一致,但分析过程有两个重要区别:

  1. 步长选择需要更严格的假设。
  2. 分析对象是“最佳迭代点”,而非最后迭代点,因为算法不保证单调下降。

从优化到机器学习:数据子集选择

次梯度下降在机器学习中尤其常见。机器学习损失函数通常具有一个显著特点:它是所有训练样本损失的和。

L(w) = (1/n) ∑_{i=1}^{n} l_i(w)

计算完整梯度 ∇L(w) 需要遍历所有 n 个样本,计算成本为 O(n)。然而,数据通常存在冗余,并非所有样本对每次更新都同等重要。这就引出了一个核心问题:我们能否只选择一个数据子集来计算梯度近似,从而显著提高效率?

以下是选择重要数据子集的一些思路:

  • 靠近决策边界的样本:这些点通常对定义模型最为关键。但确定边界本身可能需要模型,存在“先有鸡还是先有蛋”的问题。
  • 具有大梯度范数的样本:梯度大小可以反映模型在该样本上的“不确定”程度。但远离边界的点也可能有较大梯度。
  • 类别代表点(核心集):在每个类别内进行聚类(如在特征空间或梯度空间),选择簇中心或代表点,剔除可能的噪声点。例如 CRAIG 算法。
  • 基于梯度的聚类:将全部样本的梯度堆叠成雅可比矩阵,通过特征值分解区分信息空间和噪声空间,或直接在梯度空间进行核聚类。
  • 随机子集:一个简单而强大的基线方法是均匀随机采样。如果数据冗余度高,随机子集通常能提供良好的梯度近似,并且是许多复杂方法需要超越的基准。

随机梯度下降

基于随机子集选择的最简单算法就是经典的随机梯度下降。其更新公式如下:

w_{t+1} = w_t - η_t * ∇ l_i(w_t)

其中索引 i 是在每轮迭代中从 {1,...,n}均匀随机采样得到的(通常是有放回采样)。

SGD 的核心在于其梯度估计的无偏性E[∇ l_i(w_t)] = ∇L(w_t)。这使得我们可以在期望意义上进行分析。

对于凸且 Lipschitz 连续的损失函数,若最优解 w* 在一个半径为 R 的球内,并选择步长 η_t = R/(B√t)(其中 B 是随机梯度范数期望的上界),则 SGD 满足以下收敛界:

E[L( (∑_{t=1}^{T} w_t / T) )] - L(w*) ≤ (R B) / √T

如果函数还具有强凸性(参数为 μ),并选择步长 η_t = 2/(μ (t+1)),则收敛速度可以提升至 O(1/T)

与经典梯度下降的对比

将 SGD 的收敛结果与经典梯度下降(GD)进行对比很有启发性。假设梯度的 Lipschitz 常数上界为 G,随机梯度范数期望的上界为 B。根据 Jensen 不等式,有 G ≤ B。因此,SGD 的收敛界中的常数 B 通常比 GD 中的 G 更大,这反映了一次只用一个样本带来的方差。然而,SGD 每次迭代的成本远低于 GD(O(1) vs O(n)),这使得它在总计算时间上往往具有巨大优势。

总结

本节课中我们一起学习了:

  1. 次梯度下降的收敛性:分析了其 O(1/ε²) 的收敛速度,并理解了其与梯度下降在分析上的差异(需关注最佳迭代点,对步长要求更严)。
  2. 机器学习中的数据子集选择:探讨了通过选择重要样本来近似全梯度、提升优化效率的动机和多种方法(如边界样本、大梯度样本、核心集、随机采样)。
  3. 随机梯度下降:介绍了 SGD 的基本框架,基于随机采样的无偏梯度估计,以及其在凸和强凸设置下的收敛性理论。
  4. 实践意义:理解这些理论有助于我们在实际应用(如深度学习)中根据问题特性(数据冗余度、计算瓶颈、模型凸性)选择合适的优化算法及其变种。

021:小批次、方差缩减与自适应方法

在本节课中,我们将要学习随机梯度下降算法的几种重要变体。我们将探讨如何通过使用小批次、方差缩减技术以及自适应学习率方法来改进算法的性能,特别是针对强凸和平滑问题中存在的收敛速度差距。

上一节我们介绍了经典的随机梯度下降及其收敛性分析。本节中我们来看看如何通过一些改进策略来弥补其理论上的不足。

小批次随机梯度下降

为了降低随机梯度估计的方差,一个直观的改进是使用小批次数据。我们不再基于单个样本计算梯度,而是基于一小批样本计算梯度的平均值。

核心公式
G_t^B = (1/|B|) * Σ_{i∈B} ∇f_i(w_t)

其中,B 是随机选取的一批样本索引,|B| 是批次大小。

以下是使用小批次的主要影响:

  • 方差降低:梯度的方差降低为单样本随机梯度的 1/|B|
  • 计算成本:每次迭代的计算成本从 O(1) 变为 O(|B|),但仍比全梯度下降的 O(n) 便宜 n/|B| 倍。
  • 实践优势:小批次能更好地代表整个数据集,通常在实践中能带来更稳定的收敛和更快的初始进展。

方差缩减技术

小批次虽然能降低方差,但并未从根本上解决强凸问题中线性收敛与次线性收敛的巨大差距。方差缩减技术旨在更有效地利用历史梯度信息来降低当前梯度估计的方差。

其核心思想是:与其在每次迭代后丢弃计算过的梯度,不如将它们累积起来,作为一个“修正项”或“控制变量”,以减少新梯度估计的波动。

一个开创性的方法是随机平均梯度。其基本思路是维护一个表,存储每个数据点最近一次计算得到的梯度。在每次迭代中,随机选择一个样本 i_t,仅更新该样本对应的梯度,然后使用所有存储梯度的平均值来更新参数。

算法示意

  1. 初始化:为所有 i=1,...,n 存储梯度 g_i(初始需计算一次)。
  2. 迭代:随机选取索引 i_t
  3. 计算新梯度:∇f_{i_t}(w_t)
  4. 更新存储:g_{i_t} = ∇f_{i_t}(w_t)
  5. 参数更新:w_{t+1} = w_t - η_t * (1/n) * Σ_{i=1}^n g_i

这种方法及其后续改进(如SVRG)能够显著提升强凸问题下的收敛速度,使其接近全梯度下降的线性收敛率。

自适应梯度方法

除了降低方差,另一个改进方向是自适应地调整每个参数的学习率。传统的SGD对所有参数使用相同的全局学习率,这在高维、稀疏或非平稳梯度的问题中可能效率低下。

自适应方法的动机部分来源于牛顿法。牛顿法使用Hessian矩阵的逆来缩放梯度步长,从而考虑损失函数的曲率信息。然而,直接计算Hessian在深度学习中通常不可行。

自适应方法通过一个正定矩阵 H_t(或其逆)来近似曲率信息,并据此调整更新方向。这个矩阵通常基于历史梯度信息(如梯度分量平方的累积)构造,而非直接计算二阶导数。

通用自适应更新框架
w_{t+1} = w_t - α_t * (H_t)^{-1} * m_t
其中 m_t 是动量项(如当前梯度与历史速度的组合),H_t 是自适应缩放矩阵。

以下是几种常见自适应算法的 H_t 和动量构造方式对比:

算法 G_t (定义 H_t = sqrt(G_t)) 动量项 m_t 特点
SGD / SGD+Momentum I (单位矩阵) β * m_{t-1} + (1-β)*g_tg_t 非自适应,全局学习率。
AdaGrad G_{t-1} + diag(g_t ⊙ g_t) g_t 累积历史梯度平方,对频繁更新的参数减小步长。
RMSProp β_2 * G_{t-1} + (1-β_2) * diag(g_t ⊙ g_t) g_t 使用指数移动平均累积梯度平方,解决AdaGrad学习率持续衰减问题。
Adam β_2 * G_{t-1} + (1-β_2) * diag(g_t ⊙ g_t) β_1 * m_{t-1} + (1-β_1)*g_t 结合了RMSProp的自适应学习率和动量。对 m_tG_t 进行偏差校正。

:表中 表示逐元素乘积,diag() 取对角线矩阵,β, β_1, β_2 是超参数(通常接近1,如0.9)。

自适应方法(尤其是Adam)因其对超参数相对鲁棒、在实践中表现良好,已成为深度学习优化中的主流选择。

本节课中我们一起学习了随机梯度下降的三个关键改进方向:小批次、方差缩减和自适应方法。小批次通过平均降低了梯度噪声;方差缩减技术(如SAG)通过巧妙利用历史梯度信息,显著改善了强凸问题下的收敛速率;自适应方法(如AdaGrad, RMSProp, Adam)则为每个参数动态调整学习率,更好地适应损失函数的几何结构。这些技术共同构成了现代机器学习,特别是深度学习优化器的基础。

022:随机梯度下降、自适应学习率、动量方法及实践

在本节课中,我们将总结随机梯度下降(SGD)的收敛性分析,并深入探讨其多种变体,包括动量方法、自适应学习率算法(如AdaGrad、RMSprop、Adam)以及广义梯度下降框架。我们将重点关注这些方法的核心思想、公式差异及其在实际应用中的表现。

自适应学习率与动量方法的动机

上一节我们介绍了随机梯度下降的基本框架及其收敛性。本节中,我们来看看如何通过引入自适应学习率和动量来改进优化过程。

最初的动机源于对函数曲率(Hessian矩阵)的考虑,希望通过二阶信息来调整学习率。然而,另一种更直观的视角是从累积梯度累积梯度平方的角度来理解。

  • 累积梯度:这与动量方法相关,旨在平滑优化路径,减少振荡。
  • 累积梯度平方:这与曲率或特征的重要性相关,用于实现自适应学习率,即对不同的模型参数使用不同的学习步长。

统一更新框架

以下是概括多种优化算法的通用更新公式:

W_{t+1} = W_t - \alpha_t H_t^{-1} ( \beta_t \nabla L(W_t) + \gamma_t H_t H_{t-1}^{-1} (W_t - W_{t-1}) )

其中:

  • W_t 是第 t 次迭代的参数。
  • \alpha_t 是学习率。
  • H_t 是一个(通常是对角的)矩阵,与累积梯度平方相关,用于调整学习率。
  • \beta_t\gamma_t 是控制梯度项和动量项权重的系数。
  • \nabla L(W_t) 是在 W_t 处计算的损失函数梯度(或随机估计)。

在这个框架下,不同的优化算法对应于不同的 H_t\beta_t\gamma_t 选择。

以下是几种常见算法在该框架下的具体形式:

  1. 随机梯度下降 (SGD)

    • H_t = I (单位矩阵),\beta_t = 1\gamma_t = 0
    • 更新公式简化为:W_{t+1} = W_t - \alpha_t \nabla L(W_t)
  2. 重球动量法 (Heavy Ball Momentum)

    • H_t = I\beta_t = 1,但 \gamma_t > 0
    • 在SGD基础上增加了一个动量项:W_{t+1} = W_t - \alpha_t \nabla L(W_t) + \gamma_t (W_t - W_{t-1})
  3. Nesterov 加速梯度法

    • 与重球法类似,但梯度是在一个“向前看”的位置 W_t + \gamma_t (W_t - W_{t-1}) 计算的,而不是直接在 W_t
  4. 自适应算法 (AdaGrad, RMSprop, Adam)

    • 关键区别在于 H_t 不再是单位矩阵。
    • H_t 是一个对角矩阵,其元素是历史梯度平方的累积(或指数移动平均)的平方根。H_t^{-1} 的作用相当于对每个参数坐标进行缩放(即除法)。
    • 这实现了自适应学习率:频繁更新的参数(对应大梯度平方累积)获得较小的有效学习步长,而不频繁更新的参数获得较大的步长。这对于稀疏数据特别有用。

自适应算法详解

现在,让我们具体看看几种重要的自适应算法。

AdaGrad

  • 核心思想:累积整个训练历史中所有梯度的平方。
  • 更新规则G_t = G_{t-1} + (\nabla L(W_t))^2H_t = \sqrt{G_t} + \epsilonW_{t+1} = W_t - \alpha H_t^{-1} \nabla L(W_t)
  • 优点:自动为不同特征调整学习率。
  • 缺点:随着训练进行,G_t 单调增长,导致有效学习率 \alpha H_t^{-1} 可能变得极小,使得训练过早停止。

RMSprop 与 AdaDelta

  • 核心思想:解决 AdaGrad 学习率急剧衰减的问题。采用指数移动平均来累积梯度平方,而不是简单求和。
  • 更新规则 (RMSprop)E[g^2]_t = \rho E[g^2]_{t-1} + (1-\rho) (\nabla L(W_t))^2W_{t+1} = W_t - \alpha \frac{\nabla L(W_t)}{\sqrt{E[g^2]_t + \epsilon}}
  • 作用\rho 是衰减率,使得久远的历史梯度影响逐渐减弱,避免了学习率无限变小。

Adam (Adaptive Moment Estimation)

  • 核心思想:结合了动量(累积梯度一阶矩)和 RMSprop(累积梯度平方二阶矩)的优点。
  • 更新规则
    1. 计算梯度一阶矩的指数移动平均(动量):m_t = \beta_1 m_{t-1} + (1-\beta_1) \nabla L(W_t)
    2. 计算梯度二阶矩的指数移动平均:v_t = \beta_2 v_{t-1} + (1-\beta_2) (\nabla L(W_t))^2
    3. 偏差修正(因初始化为0):\hat{m}_t = m_t / (1-\beta_1^t)\hat{v}_t = v_t / (1-\beta_2^t)
    4. 参数更新:W_{t+1} = W_t - \alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}
  • 特点:通常能快速收敛,且对超参数选择相对鲁棒,是目前最流行的优化器之一。

实践表现与泛化思考

在诸如MNIST数据集上的实验表明:

  • 自适应方法 (如Adam):通常训练初期收敛速度非常快。
  • 带动量的SGD:初期可能较慢,但后期表现强劲,有时能找到泛化性能更好的解。
  • 一个重要观察:尽管自适应方法能快速降低训练损失,但一些研究表明,过于激进的适应性可能导致解陷入复杂的区域,从而损害模型的泛化能力。简单的SGD或带动量的SGD有时能获得泛化 gap 更小的解。

因此,没有绝对的“最佳”优化器。选择取决于具体问题、数据结构和我们对训练速度与泛化性能的权衡。

广义梯度下降:近端梯度法

到目前为止,我们讨论的方法都假设损失函数 F(x) 是可微的。但在机器学习中,我们经常遇到目标函数包含不可微部分的情况,例如使用 L1 正则化(LASSO):\min_x f(x) + \lambda ||x||_1,其中 ||x||_1 不可微。

近端梯度法提供了一种优雅的解决方案。其核心思想是将可微部分 f(x) 和不可微部分 g(x)(如正则项)分开处理。

推导思路

  1. 在当前点 x_t,对可微函数 f(x) 做一阶泰勒展开近似,并增加一个二次惩罚项。
  2. 最小化这个近似函数与不可微函数 g(x) 之和。

经过推导(如完成平方),可以得到近端梯度更新公式:

x_{t+1} = \text{prox}_{\alpha g} (x_t - \alpha \nabla f(x_t))

其中 \text{prox}近端算子,定义为:

\text{prox}_{\alpha g}(v) = \arg\min_x ( g(x) + \frac{1}{2\alpha} ||x - v||^2 )

直观理解:先对可微部分 f(x) 做一个普通的梯度下降步,得到中间点 v = x_t - \alpha \nabla f(x_t)。然后,将这个中间点“映射”回一个同时考虑不可微项 g(x) 和距离原始中间点不要太远的点。这个映射操作就是近端算子。

经典例子:LASSO 的软阈值算子
对于 g(x) = \lambda ||x||_1,其近端算子就是著名的软阈值函数
[\text{prox}_{\alpha \lambda ||\cdot||_1}(v)]_i = \text{sign}(v_i) \max(|v_i| - \alpha \lambda, 0)

这意味着,近端梯度法求解 LASSO 的每一步是:先梯度下降,再对结果进行软阈值收缩。

总结

本节课中我们一起学习了随机梯度下降家族的多种高级变体。

  • 我们首先通过一个统一框架理解了动量方法(平滑更新方向)和自适应学习率方法(如AdaGrad, RMSprop, Adam,根据梯度历史调整每参数步长)的核心区别与联系。
  • 我们讨论了这些优化器在实践中的表现,认识到自适应方法虽常收敛更快,但需关注其泛化性能。
  • 最后,我们介绍了近端梯度法,它将可微与不可微的优化目标分离处理,通过“梯度步+近端映射”的方式,优雅地解决了包含L1正则等不可微项的优化问题,并将此与LASSO的软阈值求解联系起来。

掌握这些优化技术,能帮助你为不同的机器学习任务选择并调整合适的优化策略。

023:广义(加速)梯度下降收敛性与近端投影梯度下降

在本节课中,我们将要学习广义梯度下降方法,特别是近端梯度下降及其加速版本。我们将探讨其收敛性,并了解如何通过近端算子高效处理目标函数中的非可微部分。

概述

我们考虑最小化一个复合目标函数 F(x) = f(x) + c(x),其中 f(x) 是可微的,而 c(x) 是非可微的(例如 L1 范数正则项或约束的指示函数)。标准的梯度下降法无法直接处理此类问题。近端梯度下降法通过将 f(x) 进行一阶近似,并保留 c(x) 的原貌,提供了一种有效的解决方案。

上一节我们介绍了近端梯度下降的基本思想,本节中我们来看看其收敛性分析以及如何通过“近端算子”高效实现更新步骤。

近端梯度下降算法回顾

算法的核心更新步骤如下:

  1. 首先,对可微部分 f(x) 执行一步梯度下降,得到一个中间点 z
    [
    z = x_t - \gamma \nabla f(x_t)
    ]
  2. 然后,求解一个近端最小化问题,该问题结合了中间点 z 和非可微项 c(x)
    [
    x_{t+1} = \text{prox}_{\gamma c}(z) = \arg\min_x \frac{1}{2\gamma} |x - z|^2 + c(x)
    ]

这个“近端”步骤得名于它试图找到一个点,该点既接近梯度下降的结果 z,又考虑了非可微项 c(x) 的影响。

收敛性分析

现在,我们来分析这种方法的收敛速度。一个关键问题是:与标准的次梯度下降法相比,近端梯度下降的收敛性如何?

对于次梯度下降法,在凸函数下,其误差界为 O(1/√T)。这个速度通常较慢。

然而,对于近端梯度下降,如果我们假设可微部分 f(x) 是凸函数且其梯度是 Lipschitz 连续的(即 fL-光滑 的),并且非可微部分 c(x) 是凸的,同时近端算子可以精确求解,那么我们可以获得更好的收敛速度。

在这种情况下,近端梯度下降的收敛速度可以达到 O(1/T)。这比次梯度下降的 O(1/√T) 要快得多。

收敛速度提升的原因

  • 我们充分利用了 f(x) 的可微性和光滑性,对其执行了完整的梯度步。
  • 我们分离处理了非可微部分 c(x),而不是对整个函数使用次梯度。

更重要的是,这种分解结构允许我们应用加速技术,例如动量法(如Nesterov加速)。通过将标准梯度步替换为加速梯度步,我们可以进一步将收敛速度提升至 O(1/T²),这在许多机器学习问题中至关重要。

近端算子的计算

算法的效率取决于近端算子 prox_{\gamma c}(z) 能否被高效计算。以下是几个关键例子:

1. Lasso 回归(L1 正则化)
c(x) = λ|x|_1 时,近端算子就是著名的软阈值算子:
[
[\text{prox}_{\gamma \lambda |\cdot|_1}(z)]_i = \text{sign}(z_i) \max(|z_i| - \gamma \lambda, 0)
]
这个操作可以按分量独立进行,非常高效。

2. 指示函数(投影)
c(x) 是集合 C 的指示函数时(在 C 内值为0,否则为∞),近端算子退化为到集合 C 的欧几里得投影:
[
\text{prox}{I_C}(z) = \arg\min |x - z|^2
]
这被称为投影梯度下降。例如,对于非负约束 C = {x | x ≥ 0},投影操作就是将 z 的负分量置零。

3. 其他可计算近端算子的函数

  • 二次函数
  • Huber 函数
  • 对数障碍函数

存在一个关于近端算子的“微积分”,允许我们通过简单函数的近端算子组合出复杂函数的近端算子。例如:

  • 缩放与平移:如果 c(x) = h(ax+b),那么其近端算子可以通过 h 的近端算子表示。
  • 可分离和:如果 c(x) = Σ c_i(x_i),那么其近端算子可以按分量独立计算。

总结

本节课中我们一起学习了:

  1. 近端梯度下降法通过分解目标函数,分别处理可微部分(用梯度下降)和非可微部分(用近端算子),有效解决了一类复合优化问题。
  2. f(x) 光滑、c(x) 凸且近端算子可精确计算的条件下,该方法的收敛速度(O(1/T))远优于次梯度下降法(O(1/√T))。
  3. 该框架天然支持加速技术(如Nesterov动量),可进一步提升收敛速度至 O(1/T²)
  4. 许多机器学习中常见的非可微项(如L1范数、约束指示函数)都有高效甚至闭式解的近端算子,这使得算法在实践中非常快速和实用。

近端梯度下降及其加速变体是现代机器学习优化工具箱中的核心工具,广泛应用于稀疏学习、约束优化等问题。下一讲,我们将更深入地探讨投影梯度下降及其相关的投影算子计算。

025:数据高效性机器学习算法与工具包(福斯讲座,2021年8月11日)

在本节课中,我们将学习数据高效性机器学习的概念,并了解一个名为 decile 的开源工具包。我们将探讨如何通过子集选择技术,在数据准备、模型训练和验证等阶段提升效率,同时保证模型的鲁棒性。

概述

深度学习模型虽然在多个领域取得了接近人类水平的性能,但其成功往往依赖于海量数据和巨大的计算成本。这带来了计算效率和数据效率两方面的挑战。计算效率体现在高昂的训练和推理成本上,而数据效率则涉及需要大量人工标注,且标注数据可能存在偏差、不一致和噪声。

本次讲座的核心是介绍一种基于子集选择的通用框架,利用子模函数信息论的性质,从大规模数据、架构空间或超参数空间中智能地选取一个子集,以实现数据高效且鲁棒的机器学习。

子模函数与子集选择

上一节我们概述了数据效率的挑战,本节中我们来看看实现数据高效性的核心数学工具:子模函数。

我们有一个基础集合 V(例如所有数据点),目标是选择一个子集 A ⊆ V,以最大化某个反映成本或信息量的函数 F(A)。我们主要关注 F(A) 具有子模性的情况。

什么是子模函数?

子模函数的核心性质是边际收益递减。假设有两个集合 AB,且 A ⊆ B。当向这两个集合中添加同一个新元素 e 时,该元素给较小集合 A 带来的增益,不小于给较大集合 B 带来的增益。

一个经典例子是“不同颜色球”的数量函数。假设一个集合代表罐子里的球,函数 F 计算球的不同颜色数。向一个已有多种颜色球的罐子(集合 B)里添加一个新颜色球带来的颜色数增加(边际收益),通常小于向一个颜色较少的罐子(集合 A)添加同一个球带来的增加。

用公式表示子模性:
F(A ∪ {e}) - F(A) >= F(B ∪ {e}) - F(B),对于所有 A ⊆ B ⊆ Ve ∉ B

子模函数在离散空间上的行为类似于连续空间上的凹函数,并且存在高效的优化算法。

子集选择的两个场景

根据可用数据的类型,子集选择可分为两类:

  • 冷启动:只有大量未标注数据和极少量标注数据。目标是从未标注数据中选取一个信息量最大的子集进行标注。
  • 热启动:已有一定量的标注数据。目标是从未标注数据中选取一个子集进行标注,以最有效的方式扩充现有标注集。

信息函数与三类子模函数

了解了子模性的基本概念后,我们来看看如何将其与信息论结合,并应用于不同类型的目标。

我们将熵、互信息等经典信息论度量中的熵函数 H(.),替换为更一般的子模函数 F(.),从而定义出一类新的信息函数。例如:

  • 互信息变体:I_F(A; Q) = F(A) + F(Q) - F(A ∪ Q)
  • 条件增益变体:F(A | P) = F(A ∪ P) - F(P)

这些变体允许我们实现查询相关(最大化与查询集 Q 的相关性)或隐私保护(最小化与隐私集 P 的相关性)的子集选择。

接下来,我们将介绍三类基本的子模函数,它们可以与上述信息函数组合使用。

以下是三类核心的子模函数示例:

  1. 表征函数:目标是选择的子集能很好地“代表”整个基础集。

    • 设施选址函数:选择 k 个“设施点”(即数据点),使得所有点到其最近设施点的相似度之和最大。公式为:F(A) = Σ_{i∈V} max_{j∈A} s(i, j),其中 s(i, j) 是相似度核函数。
  2. 多样性函数:目标是选择的子集内部元素尽可能多样。

    • 行列式点过程:基于相似度矩阵的子矩阵的行列式。行列式值大致对应于所选点所张成的体积,体积越大意味着多样性越高。公式为:F(A) = log det(L_A),其中 L 是相似度矩阵,L_A 是其对应于子集 A 的子矩阵。
  3. 覆盖函数:目标是选择的子集能覆盖尽可能多的“概念”或特征。

    • 概率覆盖函数:每个数据点 i 以一定概率 p_{ij} 覆盖概念 j。目标是最大化至少被一个点覆盖的概念的加权和。公式可表示为:F(A) = Σ_{j} w_j [1 - Π_{i∈A} (1 - p_{ij})]

通过将这三类基础函数与信息函数(互信息、条件增益等)组合,我们可以得到查询相关的表征总结、隐私保护的多样性选择等强大工具。

优化算法:贪心算法

定义了目标函数后,我们需要解决如何优化它,即在给定约束下选择最优子集。本节介绍最常用的算法——贪心算法。

我们面临的问题是:在约束条件 cost(A) ≤ B(例如 |A| ≤ k)下,最大化子模函数 F(A)。当 F 是单调子模函数且成本函数是模函数(即 cost(A) = Σ_{e∈A} c(e))时,贪心算法能提供优秀的理论保证和实际效果。

贪心算法流程如下:

  1. 初始化 A = ∅
  2. 循环直到违反约束:
    a. 找到使单位成本增益最大化的元素 ee* = argmax_{e∉A, cost(A∪{e})≤B} [F(A∪{e}) - F(A)] / c(e)
    b. 将 e* 加入集合 AA = A ∪ {e*}

对于简单的基数约束(|A| ≤ k),步骤 (a) 简化为选择增益最大的元素。

理论保证:对于单调子模函数和基数约束,贪心算法获得的解 A_k 满足 F(A_k) ≥ (1 - 1/e) * F(OPT),其中 OPT 是最优解。这意味着贪心解至少能达到最优解 63% 的值,且没有多项式时间算法能在最坏情况下做得更好。

在实际应用中,如传感器布置覆盖区域,贪心算法通常能达到最优解 95% 以上的性能。

decile 工具包与核心模块

前面我们介绍了子模函数和优化算法的理论基础,本节中我们来看看基于这些理论构建的实践工具——decile 工具包。

decile 是一个基于 PyTorch 的开源工具包(MIT 许可证),旨在提供数据高效机器学习的一站式解决方案。它包含多个模块,覆盖从冷启动到热启动的各种场景。使用 submodlib(子模优化库)非常简单,只需几行代码即可实现复杂的子集选择策略。

以下是 decile 工具包的核心模块:

  1. TRUST:专注于冷启动场景。用户提供一个大的未标注数据集 V 和一个小的目标查询集 Q(例如,感兴趣的图像类别)。TRUST 利用查询相关的信息函数(如互信息),从 V 中选出与 Q 最相关且信息量最大的子集供人工标注,从而高效地构建初始训练集。

  2. SPR半监督数据编程。允许用户编写标注函数(Python 函数或基于样本的规则)来对未标注数据生成弱标签。SPR 的创新在于引入了隐私保护子集选择的思想:主动选择那些现有标注函数不确定或分歧大的样本进行人工标注,从而与自动标注形成互补,提升整体数据效率和模型鲁棒性。

  3. CARDS:专注于热启动场景下的高效稳健训练。核心思想是:并非所有训练数据都对当前模型或验证集性能同等重要。CARDS 通过选择训练数据的一个子集,使得在该子集上训练的模型在验证集上表现最好。这可以显著减少训练时间(从几天到几小时,或从几小时到几分钟),同时保持甚至提升模型性能。代表性算法如 GLISTERGraNdMatch

  4. DISTIL深度多样化交互式学习(即主动学习)。在热启动基础上,DISTIL 指导我们如何与标注者(Oracle)交互,以最少的询问次数最大化模型性能提升。它集成了多种先进的主动学习算法,并考虑了数据增强的影响,确保评估的公平性和实用性。

应用案例与总结

最后,我们来看一些 decile 工具包的实际应用,并对本节课内容进行总结。

decile 已在多个真实场景中得到应用,例如视频分析、OCR(光学字符识别)和个性化语音识别。在视频分析中,利用 TRUST 模块可以快速针对特定目标(如特定类型的异常事件)构建标注数据集。工具包的有效性也获得了业界的关注。

总结
在本节课中,我们一起学习了数据高效性机器学习的重要性及其面临的挑战。我们深入探讨了实现数据高效性的核心——子模函数子集选择框架,并介绍了三类基本函数(表征、多样性、覆盖)及其与信息函数的组合。我们了解了解决此类优化问题的贪心算法及其理论保证。最后,我们介绍了基于这些理论构建的、覆盖完整机器学习流程的 decile 开源工具包及其四大核心模块:TRUST(冷启动标注)、SPR(半监督数据编程)、CARDS(高效训练)和 DISTIL(主动学习)。通过利用这些工具和思想,我们可以在减少对数据和计算资源依赖的同时,构建出更加强大和鲁棒的机器学习模型。

026:子模函数的性质与优化示例 🧮

在本节课中,我们将学习子模函数的进一步性质,并通过具体的极大化和极小化示例来理解其在机器学习优化问题中的应用。我们将从子模函数的定义和基本性质出发,探讨其与凸函数、凹函数的相似性,并分析多种实际优化问题中的子模函数实例。

上一节我们介绍了子模函数的基本定义和递减回报特性,本节中我们来看看子模函数的具体性质和一些重要的优化示例。

子模函数的性质 🔍

子模函数具有一系列重要的性质,这些性质有助于我们判断一个函数是否为子模函数,并在优化问题中利用这些性质。

凸组合性质

非负线性组合(凸组合)保持子模性。如果 ( F_1, F_2, \ldots, F_k ) 是定义在同一全集 ( V ) 上的子模函数,且 ( \lambda_1, \lambda_2, \ldots, \lambda_k \geq 0 ),那么函数 ( F(S) = \sum_{i=1}^{k} \lambda_i F_i(S) ) 也是子模函数。

限制与条件化性质

给定一个固定的集合 ( W \subseteq V ),以下操作保持子模性:

  • 限制:函数 ( F'(S) = F(S \cap W) ) 是子模的。
  • 条件化:函数 ( F'(S) = F(S \cup W) ) 是子模的。
  • 补集:函数 ( F'(S) = F(V \setminus S) ) 是子模的。

等价定义

除了递减回报定义,子模函数还有一个等价的“并交不等式”定义:对于任意集合 ( A, B \subseteq V ),有
[
F(A) + F(B) \geq F(A \cup B) + F(A \cap B)
]
模函数(如集合基数)满足等式,子模函数满足不等式。

最大值与最小值

与凸函数类似,子模函数的最大值不一定是子模的。同样,子模函数的最小值也不一定是子模的。这与凹函数的行为不完全一致。

凹函数复合性质

如果一个函数 ( F ) 是单调非负模函数,而 ( g: \mathbb{R} \to \mathbb{R} ) 是一个凹函数,那么复合函数 ( g \circ F ) 是子模的。例如,( \sqrt{|S|} ) 是子模的,因为基数函数 ( |S| ) 是模函数,而平方根函数是凹函数。

极小化问题中的子模函数示例 📉

以下是子模函数在极小化问题中的一些典型应用。

合作成本函数

考虑采购场景,目标是最小化获取所有物品的总成本。成本函数可能具有“批量折扣”效应,即在同一地点购买更多商品会降低单价。这类函数通常可以表示为:
[
F(A) = \sum_{P_i \in \mathcal{P}} \sqrt{\sum_{j \in A \cap P_i} r_j}
]
其中 ( \mathcal{P} ) 是地点的划分,( r_j ) 是物品 ( j ) 的成本权重。由于平方根函数是凹函数,而内部求和是模函数,因此整体是子模函数。

吸引势函数

在图像分割或马尔可夫随机场中,我们常希望相邻像素的标签(如0或1)趋于一致。这种“吸引”性质可以建模为一个子模能量函数。对于相邻像素对 ( (i, j) ),其势能 ( E_{ij} ) 如果满足:
[
E_{ij}(1,1) + E_{ij}(0,0) \leq E_{ij}(1,0) + E_{ij}(0,1)
]
即相同标签的能量低于不同标签的能量,那么整个系统的能量函数(求和)是子模的。这对应于希望能量最小化的配置中相似点聚集在一起。

复杂度函数

在构建精简模型(如选择核心词汇表)时,我们希望用最小的子集 ( A ) 来覆盖或表示整个数据集 ( V )。复杂度函数可以定义为:
[
F(A) = \sum_{x \in V} \gamma( \min_{a \in A} \text{dist}(x, a) )
]
其中 ( \gamma ) 是一个凹的、非递减的函数(如平方根)。该函数衡量了使用集合 ( A ) 表示所有点的“代价”,并且是子模的。

极大化问题中的子模函数示例 📈

以下是子模函数在极大化问题中的一些典型应用。

设施选址函数

目标是选择一组设施点 ( A ),使得所有客户点 ( i \in V ) 都能被其最相似的设施点服务。函数定义为:
[
F(A) = \sum_{i \in V} \max_{j \in A} s_{ij}
]
其中 ( s_{ij} ) 表示客户点 ( i ) 与设施点 ( j ) 之间的相似度。该函数是子模的,体现了“递减回报”:增加一个新设施对已经拥有良好服务的客户收益很小。

饱和覆盖函数

与设施选址不同,饱和覆盖允许每个客户点从所有设施点获得相似度贡献,但有一个上限 ( \alpha )。函数定义为:
[
F(A) = \sum_{i \in V} \min{\alpha, \sum_{j \in A} s_{ij}}
]
当 ( \alpha ) 有限时,该函数是子模的。它鼓励选择多样化的设施点,以使更多客户的总相似度达到饱和阈值 ( \alpha )。

图割函数

在图模型中,选择顶点子集 ( A ) 的目标通常是最大化 ( A ) 与其余部分 ( V \setminus A ) 之间的连接,同时抑制 ( A ) 内部的连接。一种常见的子模图割函数是:
[
F(A) = \sum_{i \in A, j \in V} s_{ij} - \lambda \sum_{i, j \in A} s_{ij}
]
其中 ( \lambda \geq 1 )。第一项鼓励 ( A ) 与全图的连接,第二项惩罚 ( A ) 内部的紧密连接。当 ( \lambda \geq 2 ) 时,该函数不仅是子模的,还是单调的。

总结 🎯

本节课中我们一起学习了子模函数的核心性质及其在优化问题中的强大建模能力。我们看到了子模函数在极小化问题(如合作成本、吸引势、模型复杂度)和极大化问题(如设施选址、饱和覆盖、图割)中的丰富应用。理解这些性质与示例,是后续设计高效子模优化算法的基础。下一讲,我们将开始探讨针对这些子模优化问题的具体算法。

028:数据高效机器学习最新技术

在本节课中,我们将与Ganesh Ramakrishnan教授一同了解数据高效机器学习的前沿技术。我们将探讨一个旨在帮助资源受限环境构建高效模型的开源平台,涵盖其核心模块、理论基础和应用场景。

概述:数据与计算效率的挑战

深度学习已在多个领域达到接近人类的性能,但其成功依赖于大规模数据集和复杂模型。这带来了高昂的数据标注成本、巨大的计算开销(例如,训练一个BERT模型可能花费20万美元)以及显著的碳足迹。因此,在整个机器学习流程(数据准备、模型训练、验证与部署)中,追求数据与计算效率至关重要。

一个通用的解决框架是子集选择。我们有一个包含所有数据点的全集 B,目标是找到一个子集 A,使其在某个信息函数 F 的衡量下,性能尽可能接近全集。这可以应用于多种场景:在“冷启动”设置(标注数据极少)下减少标注成本;在“热启动”设置(已有大量标注数据)下减少训练时间;甚至选择模型参数的子集以减少推理时间。

尽管该领域已有大量研究(如贪婪算法、元学习、半监督学习),但一直缺乏优秀的工具包和基准测试。接下来,我们将介绍数据高效机器学习平台及其核心模块。

核心模块一:Submodular 优化库 (SubmodLib)

上一节我们介绍了子集选择的通用框架,本节中我们来看看实现这一目标的核心数学工具——次模函数优化库(SubmodLib)。它是所有其他模块的基础,用于通过次模优化来总结海量数据集。

什么是次模函数?

次模函数具有“边际收益递减”的特性。一个简单的例子是衡量一个罐子中不同颜色小球数量的函数 F。假设集合 AB 的子集,那么向较小的集合 A 中添加一个蓝色小球所带来的边际增益,大于或等于向较大的集合 B 中添加同一个蓝色小球所带来的边际增益。满足此性质的函数即为次模函数。

公式化定义:对于集合函数 F: 2^V -> R,若对所有 A ⊆ B ⊆ V 和所有 e ∈ V \ B,满足:
F(A ∪ {e}) - F(A) ≥ F(B ∪ {e}) - F(B)
F 是次模函数。

SubmodLib 提供了详尽的文档和大量已实现的次模函数及其最大化算法。安装非常简单:

pip install submodlib

次模函数的类别

以下是SubmodLib中实现的几类主要次模函数:

  1. 表征函数:旨在从数据集中选取有代表性的点。

    • 设施选址:选择 k 个“设施”点,使得所有点到其最近设施点的相似度之和最大。其函数形式为:F(A) = Σ_{i∈V} max_{j∈A} s_{ij},其中 s_{ij} 是点 ij 之间的相似度。
    • 图割:同时考虑子集与全集的相似度,并减去子集内部的相似度:F(A) = Σ_{i∈A, j∈V} s_{ij} - λ Σ_{i,j∈A} s_{ij}
  2. 覆盖函数:旨在选择能覆盖一组概念(如关键词、视觉概念)的实例。

    • 集合覆盖:选择最少的文档来覆盖所有关键词。
    • 概率集合覆盖:允许以概率形式覆盖概念。
  3. 多样性函数:旨在选择彼此差异最大的项。

    • 行列式点过程:其对数概率是次模函数,log det(L_A),其中 L 是相似度核矩阵,L_A 是其子矩阵。
    • 分散度函数:例如最大-最小分散度(Max-Min Dispersion)。

信息函数:查询与隐私

我们可以将“查询相关性”和“隐私保护”的需求,通过信息函数的形式叠加到上述任何一类次模函数上。

  • 互信息:衡量子集 A 与查询集 Q 的相关性。广义定义为:MI_F(A; Q) = F(A) + F(Q) - F(A ∪ Q)
  • 条件增益:衡量在已知隐私集 P 的情况下,子集 A 的增益,用于隐私保护。定义为:CG_F(A|P) = F(A ∪ P) - F(P)

通过组合,SubmodLib 提供了一个统一的框架,支持提取式摘要查询敏感子集选择隐私保护子集选择

优化算法:贪婪法及其理论保证

子集选择的核心优化问题是在基数约束下最大化次模函数(或其变体):
max_{A ⊆ V, |A|≤k} F(A)

最直观的算法是贪婪算法:每次选择能带来最大边际增益的元素。

# 贪婪算法伪代码
S = empty set
for i in 1 to k:
    e = argmax_{e ∈ V\S} [F(S ∪ {e}) - F(S)]
    S = S ∪ {e}

该算法具有优秀的理论保证:对于单调非递减的次模函数,贪婪解 S_k 的值至少是最优解 S* 值的 (1 - 1/e) ≈ 63%。在实践中,其性能通常接近最优。值得注意的是,在多项式时间内没有算法能在最坏情况下做得比这更好。

对于带权重的预算约束,可以使用成本效益比贪婪算法,其近似比约为 1/2

SubmodLib 将这些复杂的优化过程封装成简单的API,只需几行代码即可实现各种子集选择策略,并可视化结果。

核心模块二:冷启动设置下的工具

在“冷启动”设置中,我们面临标注数据极少的挑战。以下模块基于SubmodLib构建,专门应对此场景。

TRUST:面向目标与稀有事件的子集选择

当拥有大量未标注数据池,但目标域(例如“夜间图像”中的异常检测)数据稀缺时,TRUST 模块可以利用基于互信息的函数,选择与目标域高度相关的子集进行标注,从而提升模型在目标域上的性能。

以下是TRUST的一些应用场景:

  • 性能导向的数据选择:根据模型在验证集上的混淆矩阵,选择能改进特定类别(对角线)或区分易混淆类别(非对角线)的数据进行标注。
  • 稀有类增强:主动选择并标注稀有事件样本,以改善模型对稀有类的识别能力。
  • 个性化目标选择:例如,针对特定用户的笔迹进行个性化模型训练。

实验表明,结合了互信息(如 LogDetMI)的次模函数能显著提升在有限标注预算下的模型精度。

SPR:利用数据编程与规则进行子集选择

有时,我们不仅拥有少量标注样本,还可能拥有一些领域规则或启发式程序(即“标注函数”)。SPR 模块利用“数据编程”范式,通过聚合这些弱监督信号的输出,来生成伪标签数据。

工作原理

  1. 用户编写多个可能不完美但有一定准确性的标注函数(例如:“如果文本包含‘how’,则标记为‘描述性问题’”;“如果图片看起来像张三,则加入‘张三’相册”)。
  2. SPR 使用标签聚合器(如来自Snorkel的算法或我们自研的CAGE算法)来融合这些冲突的弱信号,生成更可靠的伪标签。
  3. 生成的伪标签数据集可用于训练下游判别模型。

进阶——联合训练:最新的方法不满足于“先生成伪标签,再训练模型”的两阶段流程。SPR 也实现了联合训练模型,该模型同时从少量真实标注数据和大量由标注函数生成的弱监督信号中学习。这通过一个联合损失函数实现,鼓励特征模型与真实标签一致、在未标注数据上具有低熵,并且其预测与(阈值化或未阈值化的)标注函数模型的输出尽可能一致。

主动子集选择与标注函数互补:一个关键思想是,应选择那些标注函数感到“困惑”或相互矛盾的样本进行人工标注。因为这些样本能提供标注函数之外的新信息。这可以通过条件增益框架来实现,选择与当前标注函数集“不相关”(即能提供新信息)的样本。实验证明,这种智能选择策略甚至优于人工挑选样本。

核心模块三:热启动设置下的工具

在“热启动”设置中,我们拥有相对充足的标注数据,目标是提升训练和模型维护的效率。

Coresets:用于高效训练的数据核心集

核心集的思想是寻找训练数据的一个小子集,使得在其上训练得到的模型性能与在全集上训练的模型性能相近。这类似于支持向量机中的“支持向量”。

CARD 模块提供了多种核心集选择与高效训练算法。一个代表性算法是 GLISTER

GLISTER 算法思想
其优化目标是:选择一个训练子集 S,使得在该子集上训练得到的模型参数 θ,在验证集上的损失最小。
min_{S ⊆ Train, |S|≤k} L_val(θ(S)), 其中 θ(S) = argmin_θ L_train(S; θ)

这是一个双层优化问题,直接求解计算量巨大。GLISTER 采用了两种近似:

  1. 单步梯度近似:用训练子集上的一步梯度更新来近似内层优化的解。
  2. 泰勒展开近似:对验证损失函数进行泰勒展开,忽略高阶项。经过近似后,子集选择问题简化为计算梯度内积的形式,大大降低了计算开销。

GLISTER 采用交替优化的策略:先进行几轮模型参数更新,然后基于当前模型选择新的数据子集,如此反复。理论证明,在一定条件下,该算法能够收敛。

效果:GLISTER 能在保持模型精度基本不变的情况下,实现高达 3倍 的训练加速。如果允许轻微精度损失,加速比可达 10倍。它在自动化超参数调优和鲁棒性学习任务中也表现出色。

Distill:高效主动学习与数据蒸馏

在热启动场景下,我们仍希望进一步降低持续增长的标注成本。Distill 模块集成了多种最先进的主动学习算法。

主动学习:模型主动选择“最有价值”的未标注样本(例如,模型最不确定的样本)交由人类标注,从而以最少的标注代价获得最大的性能提升。

Distill 的特点:

  • 算法丰富:集成了多种主动学习算法,方便用户比较和切换。
  • 与深度学习框架兼容:易于与常见的深度学习模型结合。
  • 强调数据增强:在主动学习循环中集成了强数据增强,这迫使主动学习策略必须证明其超越简单数据增强的价值。
  • GLISTER-Active:将 GLISTER 的思想应用于主动学习,使用假设的伪标签来选择信息量最大的未标注样本进行真实标注。

实验显示,GLISTER-Active 等算法能在仅使用 10% 数据时实现 7倍 加速,使用 30% 数据时实现 3倍 加速。

应用与总结

本节课中,我们一起学习了数据高效机器学习平台及其核心模块。我们从次模优化这一数学基础出发,探讨了在冷启动(TRUST, SPR)和热启动(CARD, Distill)不同场景下,如何通过智能的数据子集选择来降低标注成本和计算开销。

这些工具已在多个实际应用中得到验证,包括:

  • 为印度安全机构进行的视频分析(高效数据处理)。
  • 与 Abacus/AIBM 合作的高效自动化机器学习。
  • 低资源语言的OCR和机器翻译(利用SPR和TRUST)。
  • 个性化语音识别(利用TRUST)。
  • 生物医学成像分析。

总结来说,该平台通过提供一套强大、易用且理论扎实的开源工具包(SubmodLib, TRUST, SPR, CARD, Distill),使研究者和开发者能够在资源受限的环境中,更高效、更经济地构建和部署机器学习模型。我们鼓励社区使用这些工具,并将其集成到自己的应用或算法研究中。

029:基于熵函数性质的子模信息函数构建 🧠

在本节课中,我们将总结关于子模函数熵相关性质的讨论,并快速介绍子模信息函数,同时了解子模函数最大化。我们将从熵的定义开始,回顾信息增益、互信息、条件熵和KL散度等核心概念,并探讨如何将这些信息论概念推广到一般的子模函数上,构建子模信息函数。


熵与信息论概念回顾 📚

上一节我们介绍了子模函数的基本性质。本节中,我们首先回顾一些核心的信息论概念,它们是构建子模信息函数的基础。

H(X) 衡量随机变量 X 的不确定性。对于离散随机变量,其定义为:

H(X) = - Σ_{x ∈ X} P(x) log P(x)

互信息

互信息 I(X; Y) 衡量两个随机变量 XY 之间共享的信息量。它可以表示为:

I(X; Y) = H(X) + H(Y) - H(X, Y)

它等价于联合分布 P(X, Y) 与独立分布 P(X)P(Y) 之间的KL散度,因此总是非负的。

条件熵

条件熵 H(X | Y) 表示在已知 Y 的条件下,X 剩余的不确定性。

H(X | Y) = H(X, Y) - H(Y)

KL散度

KL散度 D(P || Q) 衡量两个概率分布 PQ 之间的差异。它是非对称的,定义为:

D(P || Q) = Σ_{x} P(x) log (P(x) / Q(x))

信息不等式指出,D(P || Q) ≥ 0,当且仅当 P = Q 时取等号。


熵的子模性证明 🔍

我们已经知道熵函数是子模的。其证明思路利用了互信息与KL散度的关系,以及信息不等式。具体来说,互信息 I(X; Y) 可以表示为联合分布与独立分布之间的KL散度,其非负性保证了条件熵不大于边际熵,即 H(X|Y) ≤ H(X)。通过将此性质推广到集合上,可以证明熵满足子模性的递减回报特性。


从熵到一般子模函数:子模信息函数 🧩

上一节我们基于熵定义了各种信息度量。本节中,我们将看看如何将这些概念推广到任意子模函数 F 上,而不仅仅是熵。这样,我们就得到了“子模信息函数”。

其核心思想是:用任意子模函数 F 替换掉熵 H 在定义中的位置。

以下是关键的定义:

子模互信息

子模互信息衡量两个集合 AB 之间,通过子模函数 F 透镜观察到的共享“信息”。

I_F(A; B) = F(A) + F(B) - F(A ∪ B)

F 是熵函数时,这就变回了经典的互信息。

子模条件增益

子模条件增益表示在已知集合 B 的条件下,添加集合 A 所带来的增益。

F(A | B) = F(A ∪ B) - F(B)

这类似于条件熵。

子模条件互信息

子模条件互信息表示在给定集合 C 的条件下,集合 AB 之间的互信息。

I_F(A; B | C) = F(A | C) + F(B | C) - F(A ∪ B | C)

通过这些定义,我们可以将信息论中的独立性、相关性等概念迁移到子模函数的框架下。例如,如果 I_F(A; B) = 0,则称集合 AB 关于函数 F 是独立的。


子模信息函数示例 📊

现在,我们通过几个具体的子模函数例子,来看看这些子模信息度量在实际中意味着什么。

以下是几个常见子模函数及其对应的子模信息函数解释:

1. 加权覆盖函数

  • 函数 F(A):集合 A 所覆盖的所有元素的权重之和。
  • 条件增益 F(A | B)A 覆盖但 B 未覆盖的那些元素的权重之和。
  • 互信息 I_F(A; B):同时被 AB 覆盖的那些元素的权重之和。
  • 独立性:当 AB 覆盖的元素没有交集时,两者独立。

2. 设施选址函数

  • 函数 F(A):对于每个元素 i,计算其与 A 中最相似元素的距离,并求和(或取最大)。
  • 条件增益 F(A | B):对于每个元素 i,计算 (到A中最相似点的距离) - (到B中最相似点的距离),并对正值求和。这衡量了 A 相对于 B 的额外代表性。
  • 互信息 I_F(A; B):对于每个元素 i,计算其到 AB 中最相似点的距离的最小值(或某种组合)。这衡量了 AB 共同覆盖或代表该元素的程度。

3. 图割函数

  • 函数 F(A):集合 A 与其补集 V\A 之间所有边的权重之和。
  • 互信息 I_F(A; B):集合 AB 之间所有边的权重之和。这直观地衡量了 AB 之间的连接强度。
  • 独立性:当 AB 之间没有边连接时,两者独立。

多拟阵函数与性质 ⚙️

在结束之前,我们需要引入一个重要的子模函数子类:多拟阵函数

一个归一化的、单调的、子模的函数被称为多拟阵函数。熵函数是多拟阵函数的一个特例,但多拟阵函数族更大,它严格包含了熵函数,并且是子模函数的一个子集。

对于多拟阵函数 F,其导出的子模信息函数具有一些良好性质:

  1. 非负性F(A), F(A|B), I_F(A;B) 等都非负。
  2. 单调性F(A)A 单调。I_F(A; B) 在固定 B 时对 A 单调,在固定 A 时对 B 单调。
  3. 边界F(A) ≥ F(A|B),并且 I_F(A; B) 不大于 F(A)F(B) 中的较小值。

这些性质与信息论中熵和互信息的性质类似,但适用范围更广。


总结与展望 🎯

本节课中我们一起学习了:

  1. 回顾了信息论核心概念:熵、互信息、条件熵和KL散度,并理解了熵的子模性。
  2. 构建了子模信息函数:通过用任意子模函数 F 替代熵,我们将互信息、条件增益等概念推广到了更一般的框架。
  3. 分析了具体示例:我们查看了加权覆盖、设施选址和图割函数,解释了其子模信息度量的实际含义。
  4. 介绍了多拟阵函数:这是一个包含熵函数、具有良好性质的子模函数子类。

子模信息函数为我们提供了一套强大的语言,可以用信息论的视角来分析和设计各种机器学习任务中的目标函数,例如特征选择、数据摘要和聚类等。

在接下来的课程中,我们将转向子模函数最大化的算法,并探索这些理论在机器学习中的丰富应用。

030:子模函数极大化算法

概述

在本节课中,我们将学习子模函数极大化问题及其算法。我们将首先回顾子模信息函数的性质,然后重点探讨在基数约束或预算约束下,如何利用贪心算法求解子模函数极大化问题,并分析其近似保证。


子模信息函数回顾

上一节我们介绍了子模信息函数。本节中,我们来看看它们的一些关键性质。

子模信息函数,例如互信息,具有以下特性:

  • 函数值非负:I(A; B) >= 0,条件互信息 I(A; B|C) >= 0
  • 单调性:对于固定集合 BC,函数 I(A; B|C) 关于 A 是单调的。反之,固定 AC,则关于 B 单调。
  • 条件作用:增加条件集合的大小通常会降低函数值。
  • 下界:F(A ∩ B) <= I(A; B)。互信息可视作交集的信息量,但函数在交集上的值仍小于互信息。
  • 上界:F(A ∩ B) <= min(F(A), F(B))

此外,F(A|B) 关于 A 是子模的,但关于 B 既非子模也非超模。


偏导数与高阶性质

子模性与偏导数密切相关。

以下是偏导数与函数性质的关系:

  • 单调性要求一阶偏导数非负。
  • 子模性要求二阶偏导数非正,这类似于凹性(凸函数要求二阶导非负)。
  • 对于互信息等函数,三阶偏导数非负是一个重要性质。这意味着在给定集合 K 的情况下,增加两个元素 (I, J) 带来的增益,不小于不给定 K 时的增益。

满足三阶偏导数非负性质的函数包括集合覆盖、设施选址和幂律函数,这意味着它们的互信息是子模的。而均匀秩函数(如矩阵秩)是一个反例,它不满足此性质。


应用场景

子模函数极大化有广泛的应用。

以下是几个典型应用场景:

  1. 查询聚焦摘要:目标是选择与查询最相关的文档集合 A,即最大化互信息 I(A; Q)
  2. 隐私保护摘要:目标是选择集合 A,使其在保护隐私信息集 P 的同时,尽可能多地保留信息,即最大化条件增益 F(A|P)
  3. 组合目标:可以结合查询相关性和隐私保护,形成统一的目标函数,例如 max I(A; Q|P),并通常附加基数约束 |A| <= k

这些框架可以应用于图像摘要、目标子集选择(例如,从未标注数据中选择与目标域相似的样本进行标注)等任务。


优化视角:凸性与凹性

从优化角度看,子模性兼具凸性和凹性的特点。

  • 凸性方面:子模函数存在凸扩展(如Lovász扩展),使得子模函数最小化存在多项式时间算法(例如,图割用于图像分割)。
  • 凹性方面:子模函数表现出的“收益递减”性质类似于凹函数,这使其极大化问题也能获得有效的近似算法。

然而,子模函数极大化通常是NP难的。幸运的是,贪心算法在实践中非常有效,并且具有可证明的近似保证。


单调子模函数极大化与贪心算法

对于单调子模函数的极大化问题,若不加约束,最优解是选择整个集合。因此,我们通常需要施加约束,例如基数约束 |A| <= k

以下是经典的贪心算法步骤:

  1. 初始化 S_0 = ∅
  2. 对于 i = 1k
    • 在剩余元素 V \ S_{i-1} 中,找到能带来最大边际增益的元素 e*e* = argmax_{e ∈ V \ S_{i-1}} F(S_{i-1} ∪ {e}) - F(S_{i-1})
    • S_i = S_{i-1} ∪ {e*}
  3. 返回 S_k

该算法具有优异的近似保证:设 OPT 为最优解的函数值,S_k 为贪心算法得到的解,则有 F(S_k) >= (1 - 1/e) * OPT ≈ 0.63 * OPT。对于单调子模函数极大化,没有多项式时间算法能获得比 (1 - 1/e) 更好的近似比。


近似比证明概要

贪心算法近似比的证明思路巧妙,核心步骤如下:

  1. 伸缩和展开:将最优解 A* 的函数值 F(A*) 用贪心解序列 A_i 进行展开。利用单调性,有 F(A*) <= F(A* ∪ A_i)。再将 F(A* ∪ A_i) 写成关于 A* 中元素的边际增益的伸缩和形式。
  2. 利用子模性:根据子模性,一个元素加入较大集合(A_i)的边际增益,不大于其加入较小集合的边际增益。因此,A* 中所有元素的边际增益之和,可以用 A* 的大小 k 乘以某个上界来限定。
  3. 关联贪心选择:这个上界恰好是贪心算法在第 i+1 步选择的元素 e_{i+1} 的边际增益。因为 e_{i+1} 是在所有剩余元素中边际增益最大的。
  4. 推导递推不等式:定义差距 Δ_i = OPT - F(A_i)。通过上述关系,可以推导出 Δ_{i+1} <= (1 - 1/k) * Δ_i
  5. 递推求解:递归应用此不等式,得到 Δ_k <= (1 - 1/k)^k * Δ_0 <= (1/e) * OPT。由于 Δ_0 = OPT - F(∅)F(∅) >= 0,最终得到 F(A_k) >= (1 - 1/e) * OPT

推广至预算约束

当每个元素 e 具有选择成本 c(e),且总预算为 B 时,问题变为预算约束下的极大化。

以下是两种扩展的贪心策略:

  1. 成本归一化贪心:每一步选择边际增益与成本之比最大的元素:e* = argmax_{e ∈ V \ S, c(S)+c(e)<=B} (F(S∪{e}) - F(S)) / c(e)。单纯使用此策略,近似比可能较差。
  2. 初始化枚举+贪心:先枚举所有不超过3个元素的初始集合作为起点,然后对每个起点运行成本归一化贪心,最后取最优解。这能获得 (1 - 1/e) 的近似比,但复杂度高达 O(n^3)
  3. 双策略取优:同时运行普通贪心(忽略成本,直到违反预算)和成本归一化贪心,然后取两者中函数值更高的解。这种方法在实践中效果很好,且具有常数近似比。

此外,该问题还存在对偶形式:给定一个覆盖阈值 Q,寻找满足 F(A) >= Q 的最小成本集合 A。这也可以通过修改贪心算法来求解。


总结

本节课中我们一起学习了子模函数极大化算法。

  • 我们回顾了子模信息函数的性质及其与偏导数的联系。
  • 我们探讨了子模函数极大化在查询摘要、隐私保护等领域的应用。
  • 我们重点分析了在基数约束下,单调子模函数极大化的贪心算法,并详细讲解了其 (1 - 1/e) 近似保证的证明过程。
  • 最后,我们将问题推广到一般的预算约束情形,并介绍了相应的贪心变种算法及其特点。

贪心算法因其简单、高效且具有理论保证,成为解决子模函数极大化问题的重要工具。

031:约束非单调子模极大化算法与技巧

概述

在本节课中,我们将学习约束条件下的非单调子模函数极大化算法。我们将回顾上一节课的内容,并探讨其“对偶”问题,即子模覆盖问题。接着,我们将引入更复杂的约束类型,如拟阵约束,并学习相应的贪心算法。最后,我们将介绍一些实用的工程技巧,如“惰性贪心”和“随机贪心”,以提升算法效率,并简要了解一个名为Decile的子模优化工具库。

回顾:子模极大化与对偶问题

上一节我们介绍了在成本或基数约束下,最大化单调子模函数的贪心算法框架。该算法在每一步选择能带来最大条件增益 f(e|S) 的元素,或者选择单位成本条件增益 f(e|S)/c(e) 最大的元素。

本节中,我们来看看这个问题的“对偶”形式——子模覆盖问题。其目标不再是最大化函数值,而是寻找一个最小的集合,使其函数值至少达到某个目标值 Q

问题定义(对偶-子模覆盖)

最小化 |S| (或总成本 c(S))
约束条件: f(S) >= Q

对于这个最小化问题,同样可以采用贪心算法:从一个空集开始,当 f(S) < Q 时,持续添加能带来最大条件增益 f(e|S) 的元素。理论分析表明,该贪心解的大小最多是最优解的 O(log( max_e f({e}) )) 倍。

一个有趣的现象是,对于原问题(给定预算 C,最大化 f(S))和对偶问题(给定目标 Q,最小化 |S|),如果参数设置得当(例如,将原问题最优解的函数值作为对偶问题的 Q),两种算法得出的解集在实践中往往非常相似。

复杂约束:拟阵约束

在实际问题中,约束可能更为复杂。例如,在部署传感器时,我们可能有一系列分区,每个分区内最多只能选择一个点(如 {1A, 1B} 中二选一)。这类约束可以统一用拟阵来描述。

拟阵是一种组合结构,它定义在集合上,并满足以下三条公理:

  1. 遗传性:如果集合 S 是独立的,那么它的任何子集也是独立的。
  2. 交换性:如果 AB 都是独立集,且 |A| < |B|,那么存在某个元素 e ∈ B \ A,使得 A ∪ {e} 也是独立的。
  3. 基的大小相同:所有极大的独立集(称为“基”)具有相同的大小。

常见的拟阵类型包括:

  • 均匀拟阵:独立集定义为大小不超过 k 的任意集合。这对应基数约束。
  • 分区拟阵:元素被划分到不同组,独立集定义为每组中最多包含一个元素的集合。这对应上述传感器部署约束。
  • 图拟阵:元素是图的边,独立集定义为不包含环的边集(即森林)。

对于单调子模函数在拟阵约束下的极大化问题,可以采用一种类似投影梯度法的贪心策略:

从空集 S 开始。
当 S 不是基时:
    在满足“S ∪ {e} 仍是独立集”的元素 e 中,选择使条件增益 f(e|S) 最大的那个。
    将 e 加入 S。

该算法能保证获得至少 1/2 的最优解近似比。这可以看作是在每步贪心选择后,将解“投影”回可行域(独立集族)。

处理非单调性子模函数

当子模函数 f 是非单调的(即添加元素可能使函数值减少)时,简单的贪心添加策略可能失效。以下是两种应对策略:

1. 双向贪心算法
该算法同时维护两个集合 AB,并始终保持 A ⊆ B ⊆ V(全集)。

  • 初始化:A = ∅, B = V
  • 在每一步,以概率 p 考虑向 A 添加元素,以概率 1-p 考虑从 B 中移除元素。
  • 添加概率 p 基于当前最佳“添加收益”和“移除收益”计算:p = δ⁺ / (δ⁺ + δ⁻),其中:
    • δ⁺ = max_{e∉A} f(e|A) (若为负则忽略此操作)
    • δ⁻ = max_{e∈B} f({e}|B\{e}) (若为负则忽略此操作)
  • 算法运行直至 A = B,最终输出 A(或 B)。该算法为无约束非单调子模极大化提供了 1/2 的近似保证。

2. 随机贪心算法
这是针对基数约束的非单调子模极大化的一种变体。

S = ∅
for i = 1 to k:
    // 1. 找到能带来最大总边际收益的候选集
    X = argmax_{X⊆V\S, |X|=k} Σ_{v∈X} f(v|S)
    // 2. 从候选集 X 中随机选择一个元素 v
    v = RandomSelect(X)
    // 3. 将其加入解集
    S = S ∪ {v}

该算法通过随机化来避免非单调性可能导致的局部最优。

在实践中,对于许多非单调函数,标准的贪心算法(总是添加当前边际收益最大的元素)往往表现得出奇地好,因为函数的非单调性可能只体现在局部区域。

提升效率的工程技巧

子模贪心算法的复杂度通常是 O(nk),其中 n 是地面集大小,k 是解集大小。以下技巧可以显著加速计算:

1. 惰性贪心(Lazy Greedy)
利用子模性的递减收益性质,通过优先队列避免不必要的计算。

  • 为每个剩余元素 e 维护一个上界 u[e],表示其边际收益可能达到的最大值(例如,使用上一轮迭代计算出的边际收益值)。
  • 将元素按上界 u[e] 降序排列在优先队列中。
  • 每轮迭代,取出队首元素 e_hat,计算其真实的当前边际收益 f(e_hat|S)
  • 如果 f(e_hat|S) >= u[next](即队首元素的真实收益不低于队列中下一个元素的上界),那么 e_hat 就是本轮最佳选择,无需检查其他元素。
  • 否则,更新 e_hat 的上界为 f(e_hat|S),重新插入优先队列,然后检查新的队首元素。
    惰性贪心能得到与标准贪心完全相同的结果,但在实践中能大幅减少函数评估次数。

2. 随机采样 + 惰性贪心(Stochastic + Lazy Greedy)
为了进一步加速,可以在每轮迭代中,不是从全部剩余元素中寻找最佳者,而是先随机采样一个子集 R(大小约为 (n/k) log(1/ε)),然后仅在这个子集上运行惰性贪心选择最佳元素。这以微小的近似比损失(1 - 1/e - ε)换取了计算速度的显著提升。

Decile 工具库简介

Decile 是一个用于子模优化的 C++ 库,提供了丰富的函数类型和高效的优化器实现。

支持的核心函数类型包括

  • 设施选址函数
  • 分散求和/最小函数
  • 对数行列式函数
  • 互信息函数
  • 条件增益函数

内置的优化器

  • 标准贪心
  • 惰性贪心
  • 加速贪心(惰性+随机)
  • 双向贪心

关键特性:记忆化
Decile 利用子模函数的特性,为许多函数实现了记忆化。它预先计算并缓存一些中间统计量,使得在迭代过程中评估边际收益 f(e|S) 的复杂度从 O(n) 降为 O(1)O(log n),从而带来数量级的速度提升。

使用示例

# 伪代码示例
from decile import FacilityLocation, AcceleratedGreedy

# 定义数据和查询点
data = ... # 数据点
query = ... # 查询点
# 创建查询敏感的设施选址函数对象
func = FacilityLocation(query_data=query, data=data)
# 创建优化器
optimizer = AcceleratedGreedy(budget=10) # 预算为10
# 执行优化
selected_items = optimizer.optimize(func, data)

通过指定 query_data,可以实现查询聚焦的子集选择;通过结合隐私数据约束,可以实现隐私保护的数据选择。

总结

本节课我们一起学习了约束下非单调子模函数极大化的算法与技巧。我们从子模极大化问题的对偶形式——子模覆盖问题入手,然后引入了更一般的拟阵约束及其贪心算法。针对非单调性,我们介绍了双向贪心和随机贪心等策略。为了提升计算效率,我们探讨了惰性贪心和随机采样等工程优化技巧。最后,我们简要了解了 Decile 这一强大的子模优化工具库,它集成了多种函数和优化器,并能通过记忆化等技术实现高效计算。掌握这些内容,将有助于你在实际机器学习任务中应用子模优化来选择代表性、多样性或信息量最大的数据子集。

032:用于数据、特征和主题摘要的子模优化 - 第一部分

概述

在本教程的第一部分中,我们将学习子模优化及其在机器学习中的应用。我们将从子模函数的基本概念和建模能力开始,然后探讨针对不同函数类别和约束条件的优化算法。最后,我们将了解一些实际应用场景,如流式处理和分布式环境下的优化,以及近似子模性和实用的实现技巧。


子模函数:动机与定义

上一节我们概述了本教程的内容。本节中,我们来看看子模优化的核心动机和子模函数的定义。

机器学习,特别是深度学习,正日益影响着个性化、机器人技术、物流和自动驾驶等多个领域。然而,深度学习模型和数据集的规模不断增长,带来了高昂的训练成本、标注成本以及数据过载等问题。一个核心挑战是:如何利用“正确的”小数据,使其性能与大数据相当,并显著优于随机选择的小数据?子模优化为解决数据子集选择、特征选择和摘要生成等问题提供了强大的理论框架。

我们首先定义一些术语。设 V 为全集(或称为基础集),包含所有可能的数据点。子集选择问题通常通过一个估值函数 F 来建模,该函数为 V 的任意子集 A 分配一个实数值,即 F: 2^V → R。如果没有特定的结构,优化 F 通常是 NP 难问题。子模性是一种特殊的结构,它基于“收益递减”的直观准则。

子模性的定义如下:对于任意集合 A ⊆ B ⊆ V 和任意元素 e ∈ V \ B,有:
F(A ∪ {e}) - F(A) ≥ F(B ∪ {e}) - F(B)
这意味着,随着集合的扩大(上下文更丰富),添加一个新元素所带来的边际增益会减少。这类似于凹函数。反之,超模函数则类似于凸函数,边际增益随集合扩大而增加。

子模函数有两个等价定义:

  1. 收益递减定义:如上所述。
  2. 并交不等式定义:对于任意集合 A, B ⊆ V,有 F(A) + F(B) ≥ F(A ∪ B) + F(A ∩ B)

如果函数 F 是单调的,则意味着对于 A ⊆ B,有 F(A) ≤ F(B),即集合越大,信息量(或价值)越高。许多信息函数(如影响力、熵、信息增益)都是单调子模函数。


子模函数的建模能力

上一节我们介绍了子模性的基本定义。本节中,我们来看看子模函数强大的建模能力,它能够捕捉摘要生成和数据选择中的多种特性。

子模函数可以建模摘要生成中的信息含量。当我们总结一个大型数据集时,我们希望用一个函数来度量子集的信息含量。随着集合扩大,新元素与现有元素相似的可能性增加,因此其边际增益倾向于减少,这符合子模性。

以下是几类重要的子模函数示例:

1. 代表性函数

这类函数旨在找到一个能代表整个数据集的子集。它更关注数据点簇的中心,而非离群点。

  • 设施选址函数:类似于 K-Medoids 目标,旨在选择能使数据点得到良好“代表”的中心点。
    • 公式F(A) = Σ_{i∈V} max_{j∈A} s_{ij},其中 s_{ij} 是相似度。

2. 多样性函数

这类函数关注所选点之间的差异程度,希望点与点之间尽可能远离。

  • 分散函数:例如最小成对距离,旨在最大化点之间的最小距离。

3. 覆盖函数

这类函数旨在选择能覆盖一组概念(如关键词、主题)的最小子集。

  • 加权集合覆盖:每个数据点覆盖一组带权重的概念,目标是最大化所选子集覆盖的概念总权重。
    • 公式F(A) = w(Γ(A)),其中 Γ(A) 是子集 A 覆盖的概念集合,w 是权重函数。
  • 概率集合覆盖:概念覆盖是概率性的,而非二元的。

4. 基于特征和深度子模函数

这类函数在模型诱导的特征空间上操作,以建模特征间的多样性。深度子模函数通过端到端的深度模型来学习特征并保持子模性。

5. 信息函数

这类函数定义在随机变量上,例如熵。

  • :子集 S 中随机变量的联合熵 H(X_S) 是单调子模函数。证明基于“信息永不有害”的原则。

受熵的启发,我们可以定义子模信息度量,作为熵的推广:

  • 子模互信息I_F(A; B) = F(A) + F(B) - F(A ∪ B)
  • 子模条件增益F(A | B) = F(A ∪ B) - F(B)
  • 子模条件互信息I_F(A; B | C) = F(A | C) + F(B | C) - F(A ∪ B | C)

这些度量在查询相关摘要、隐私保护摘要等应用中非常有用。例如,最大化 F(A | Q) 可以得到与查询集 Q 尽可能不同的摘要(即最小化与 Q 的互信息)。


子模优化算法:单调子模最大化

上一节我们探讨了子模函数的建模能力。本节中,我们开始学习如何优化子模函数,首先从最简单的单调子模最大化问题开始。

我们关注的核心优化问题是子模最大化:max_{A ⊆ V} F(A),通常带有约束。对于数据子集选择等问题,我们希望最大化信息或多样性。

首先考虑基数约束下的单调子模最大化问题:
max_{A ⊆ V, |A|≤k} F(A)

解决此问题的经典算法是贪心算法

  1. 从空集 S = ∅ 开始。
  2. 在每一轮迭代中,选择能带来最大边际增益的元素:e = argmax_{e ∈ V \ S} F(S ∪ {e}) - F(S)
  3. 将该元素加入 S
  4. 重复步骤2和3,直到 |S| = k

理论保证:Nemhauser 等人 (1978) 证明,贪心算法得到的解 S_k 满足:
F(S_k) ≥ (1 - 1/e) * F(OPT) ≈ 0.63 * F(OPT)
其中 OPT 是最优解。并且,没有多项式时间算法能在最坏情况下取得比这更好的近似比。在实践中,贪心算法的性能通常远优于理论下界。

证明思路

  1. 利用单调性:F(OPT) ≤ F(OPT ∪ A_i)
  2. F(OPT ∪ A_i) - F(A_i) 写成关于 OPT 中元素的边际增益的求和。
  3. 利用子模性,将每个边际增益上界为贪心算法在第 i 步的增益 δ_i
  4. 得到递推关系:δ_{i+1} ≥ (OPT - F(A_i)) / k
  5. 通过数学推导,最终得到 F(A_k) ≥ (1 - 1/e) * OPT

扩展的优化问题与算法

上一节我们学习了基数约束下的单调子模最大化。本节中,我们来看看其他常见的约束和问题变体,以及对应的算法。

1. 背包约束

当每个元素 e 有成本 c(e),且总预算为 B 时,问题变为:
max_{A ⊆ V, Σ_{e∈A} c(e) ≤ B} F(A)
修改后的贪心算法在每一步选择单位成本边际增益最大的元素:e = argmax_{e ∈ V \ S} (F(S ∪ {e}) - F(S)) / c(e)
结合枚举小规模子集等技术,可以获得 1 - 1/e 的近似保证。

2. 子模集合覆盖

这是最大化问题的对偶形式:寻找满足性能要求的最小集合。
min_{A ⊆ V} |A|, s.t. F(A) ≥ Q
这在希望用最小数据子集达到特定准确度时很有用。

3. 拟阵约束

拟阵是更复杂的组合结构,可以统一建模分区约束(每组至多选一个)、基数约束等。

  • 分区拟阵:每组至多选一个元素。
  • 均匀拟阵:即基数约束。
    对于单调子模函数在拟阵约束下的最大化,贪心算法能提供 1/2 的近似保证。

4. 非单调子模最大化

当函数 F 非单调时,需要使用随机化贪心算法。该算法不是直接选择增益最大的元素,而是从增益最大的前 k 个元素中随机选择一个加入。该算法能提供约 1/e ≈ 0.37 的近似保证。

5. 正则化/无约束问题

考虑问题:max_{A ⊆ V} F(A) - λ|A|。即使 F 单调,整个目标也是非单调的。
可以使用双向贪心算法:维护两个集合 A(从空集开始扩张)和 B(从全集开始收缩),根据边际增益随机决定添加或删除元素。该算法能提供 1/2 的近似保证。

6. 子模+分散函数

对于子模函数与分散函数(如最小成对距离)的和或最小值优化,也有相应的常数近似比算法。


高效算法与扩展场景

上一节我们介绍了多种约束下的优化算法。本节中,我们关注算法的计算效率,并探讨流式处理和分布式计算这两种重要场景。

计算效率

标准贪心算法的复杂度是 O(nk * T),其中 n 是全集大小,k 是所选子集大小,T 是计算一次边际增益的时间。当 n 很大时,这可能很慢。

  • 惰性贪心:通过优先队列维护边际增益上界,避免每次重新计算所有增益,在实践中能大幅加速,但最坏复杂度不变。
  • 随机贪心:在每轮迭代中,只从随机采样的子集中(大小为 O((n/k) log(1/ε)))选择最佳元素。总复杂度为 O(n log(1/ε)),并能获得 1 - 1/e - ε 的近似保证,在实践中非常高效。

流式处理

数据以流的形式到达,算法只能单遍扫描数据,且内存有限。

  • 算法思想:维护多个阈值和候选集。当新元素到达时,计算其相对于各候选集的增益,若超过对应阈值则加入。最终从所有候选集中选最好的。
  • 理论保证:单遍扫描,1/2 近似比,内存和计算复杂度低。

分布式处理

数据量过大,无法存放在单台机器上。需要将数据随机分割到多台机器上并行处理。

  • 简单方法:每台机器对自己的数据分区运行贪心算法,选出 k 个元素。将所有机器选出的元素(共 m*k 个)汇总到一台机器,再运行一次贪心算法选出最终的 k 个元素。
  • 理论保证:通过改进(例如,比较各机器局部解与全局汇总解),可以获得 1/2 * (1 - 1/e) 的近似保证。

近似子模性与实用工具

上一节我们讨论了高效算法和扩展场景。本节中,我们将了解近似子模性的概念,并介绍一些实用的子模优化工具包。

近似子模性

许多实际函数并不是严格的子模函数,而是近似子模的(也称为弱子模或伪子模)。对于单调函数,如果存在 γ ∈ (0,1],使得对于所有 A ⊆ Be ∉ B,有:
F(A ∪ {e}) - F(A) ≥ γ (F(B ∪ {e}) - F(B))
则称 Fγ-弱子模。当 γ=1 时就是严格子模。
对于这类函数,贪心算法仍能提供理论保证,例如对于单调 γ-弱子模函数,近似比为 1 - e^{-γ}

实用技巧:记忆化

对于许多具体的子模函数(如设施选址、覆盖函数),可以预先计算并缓存一些中间统计量。在贪心算法运行过程中,可以利用这些缓存快速计算边际增益,而无需每次都从头计算。这能带来数量级的速度提升。

子模优化工具包

以下是几个可用于实现子模优化的工具包:

  1. SubmodLib:C++ 实现,带有 Python 接口。高效,支持多种函数和优化器。
  2. Apricot:纯 Python 实现。易于使用,同样支持多种函数和优化器。
  3. SFO Toolbox:MATLAB 工具箱。功能全面,但依赖于 MATLAB 环境。

建议根据熟悉的编程语言和性能需求选择合适的工具包进行实践。


总结

在本教程的第一部分中,我们一起学习了子模优化在机器学习中的核心作用。我们从子模函数的定义和直观理解开始,认识到其“收益递减”特性非常适合建模信息、多样性和覆盖度。接着,我们探索了子模函数强大的建模能力,包括代表性、多样性、覆盖性和信息度量等多种函数类别。

在算法方面,我们重点研究了单调子模最大化问题,并学习了经典的贪心算法及其理论保证。我们还扩展到了背包约束、拟阵约束、非单调子模最大化以及正则化问题等更复杂的场景。为了处理大规模数据,我们介绍了提升计算效率的技术(如惰性贪心和随机贪心),以及流式处理和分布式环境下的优化算法。最后,我们了解了近似子模性的概念和一些实用的优化工具包。

这些理论和算法为第二部分将要深入探讨的具体应用——数据子集选择、特征选择和数据摘要——奠定了坚实的基础。通过选择“正确的”小数据,我们有望以更低的成本获得与大数据相媲美的性能。

033:用于数据、特征和主题摘要的子模优化 📊

概述

在本节课程中,我们将学习子模优化在机器学习中的关键应用,特别是如何利用子模函数进行高效的数据子集选择、特征选择以及内容摘要。我们将从数据选择的基础方法开始,逐步深入到主动学习、数据编程、特征选择,最后探讨在图像、视频和文本领域的摘要应用。


数据子集选择 📈

上一部分我们介绍了子模优化的基本概念。本节中,我们来看看如何将其应用于数据子集选择,以降低标注成本、减少训练时间,同时保持模型性能。

数据选择的挑战与动机

标注大规模数据集可能极其昂贵。例如,通过众包平台标注一个5万张图像的分类数据集,成本可能在5000到32000美元之间。此外,标注过程可能引入噪声,且数据分布可能存在长尾效应,即许多类别的样本数量很少。

机器学习的数据准备和模型训练是一个需要多次迭代的循环。我们的目标是:在给定的训练预算下,能否选择一个训练数据的子集,使得模型训练和超参数调优能更高效地进行,同时不牺牲准确性?

以下是实现鲁棒且高效机器学习的一些关键组件:

  • 高效机器学习: 旨在减少标注成本和时间、减少训练时间和计算开销、减少超参数调优和网络架构搜索时间。
  • 鲁棒机器学习: 旨在减少特征噪声、对类别不平衡具有鲁棒性、处理分布外数据。

数据子集选择的应用包括快速训练和推理、快速超参数调优、从无标签数据中学习(主动学习、半监督学习)以及鲁棒学习。

问题设定

我们假设参数 θ 表征机器学习模型。我们有一个训练数据集 U 和一个验证数据集 V。损失函数(例如似然函数)可以在训练集 U 上评估(记作 L_T),也可以在验证集 V 上评估(记作 L_V)。通常,参数 θ 是在带标签的训练数据 U 上估计的。我们的目标是选择一个 U 的子集,使得在该子集上训练的模型性能最佳。

挑战在于,我们需要在庞大的子集空间(大小为 2^N)中进行搜索,同时这个选择过程还需要与参数 θ 的估计过程交织在一起。即使选择10%的数据子集能带来10倍的训练加速,如果子集选择过程本身耗时过长,其优势也会被抵消。因此,我们希望子集选择算法的时间复杂度可以忽略不计,并且最好能有理论保证。

方法一:使用子模函数作为代理

一种直接的方法是使用子模函数作为数据子集选择的代理函数。给定一个基础集 U,我们有一个衡量子集 X 质量的集合函数 F(X)。在基数约束下最大化 F(X) 的问题,如果 F 是单调子模的,贪婪算法可以提供 (1 - 1/e) 的近似保证。在实践中,我们通常能得到接近最优的解。当 F 是分散函数时,我们可以获得 1/2 的近似保证。

许多论文使用了代理子模函数,例如基于特征的加权集合覆盖函数(子模)、分散函数、对数行列式(也是子模)等。经验表明,这些函数通常表现出收益递减的特性,这恰好符合子模函数的定义,因此使用子模函数是合理的。

方法二:通过梯度近似进行选择

我们尝试选择一个数据子集,使其梯度加权平均能够近似整个数据集的梯度。假设选中的子集 X ⊆ U 中的点 i 被赋予权重 w_i。点 i 的损失梯度为 ∇l_i(θ)。我们希望所选子集上梯度的加权和能近似整个数据集上的全梯度。

一个收敛性定理表明,有效的数据选择算法应努力最小化加权子集梯度与全梯度之间的误差范数。因此,我们可以将问题形式化为:在给定子集基数约束下,估计权重 w 并确定子集 X,使得上述梯度误差尽可能小。

CRAIG算法 就是通过一个上界推导出来的,该上界本质上是一个设施选址问题。最大化设施选址函数(在基数约束下)是一个单调子模最大化问题,存在高效的近似算法。然而,基于设施选址的方法可能需要较大的子集规模才能达到期望的梯度误差。

我们能否通过直接优化误差项来做得更好?答案是肯定的。我们可以直接优化一个带正则化的误差函数,并将其转化为一个最大化问题。可以证明,这个目标函数是近似子模的,贪婪算法能提供 1 - exp(-γ) 的近似保证。但贪婪算法计算开销较大。

一个更好的提议是使用正交匹配追踪(OMP)算法。在基数约束下,OMP 也能提供 1 - exp(-γ) 的近似保证。该算法迭代地选择与当前残差(即全梯度与当前加权子集梯度之差)投影最大的样本加入子集,并更新权重。这种方法中,训练梯度与验证梯度之间的点积影响了算法的选择。

方法三:通过双层优化进行选择

目标是选择一个数据子集,使其能近似整个训练集(或验证集)的性能。这可以通过一个双层优化问题来形式化:外层最小化验证集损失,内层在选定的训练子集上估计模型参数。

对于某些简单分类器(如朴素贝叶斯、最近邻、线性回归),内层问题有闭式解。在某些假设下(如基数约束、类别平衡),优化目标可以表示为关于子集的子模函数,从而可以使用高效的贪婪算法。

然而,即使内层有闭式解,为了求解外层优化,仍然需要对每个候选子集求解内层问题,这违背了通过子集选择加速训练的初衷。因此,我们需要将 θ 的求解与子集 X 的选择交织起来。

一种方法是使用在线单步元近似,即用单个梯度步长来近似内层优化问题的解。将这种近似代入外层问题后,对于许多常用的损失函数(如负对数损失、负平方损失、负合页损失等),该优化问题变成了一个基数约束的子模最大化问题。如果验证损失是负交叉熵损失,则目标函数是弱子模的,也有相应的近似保证。

为了进一步降低计算成本,我们可以使用泰勒展开的一阶近似,从而只需要 K 次前向传播和 K 次反向传播来计算验证损失及其梯度。我们还可以使用“陈旧”的似然值、随机贪婪选择、每隔多个周期才重新选择子集、在深度网络中仅使用最后一层梯度等工程技巧来加速。此外,可以加入设施选址或随机正则化来防止过拟合。

整个 GLISTER 策略流程是:用随机参数和随机子集初始化,在子集 S_n 上进行 L 步随机梯度下降得到参数 θ_L,然后使用泰勒近似进行贪婪数据子集选择得到新子集 S_{n+1},如此循环。

收敛性分析表明,如果验证损失函数是 Lipschitz 光滑的,并且训练和验证损失的梯度范数有界,那么验证损失会随着每个训练周期单调递减。在训练梯度与验证梯度点积非负的假设下,收敛速度是 O(1/ε²) 个周期。收敛界中的一个关键项与训练梯度及验证梯度之间的夹角余弦有关,而泰勒近似法选择的子集正是最大化这个点积的,因此我们期望该夹角接近0,从而获得快速收敛。

方法四:通过最小化散度进行选择

这类方法将数据子集选择的目标视为最小化原始完整数据分布与子集数据分布之间的某种散度(如 KL 散度)。在实践中,可以使用任何子模模型(如代表性、覆盖度、多样性等)作为数据子集选择的代理函数。

应用与实验结果

  • 高效学习: 在最近邻分类任务中,仅使用40%的训练数据就能达到与使用100%数据相似的准确率。设施选址方法明显优于随机采样和分散最小化方法。
  • GLISTER 加速: 在 MNIST 数据集上,GLISTER 使用10%的数据子集实现了7.2倍的加速,准确率仅下降2.5%;使用30%数据实现3.5倍加速;使用50%数据实现2倍加速。
  • 鲁棒学习: 在存在类别分布偏移或噪声的情况下,GLISTER 的性能甚至可能优于使用全部数据,准确率提升可达15-20%。
  • 超参数调优: 使用5-10%的数据子集进行超参数调优,设施选址方法选择的超参数相比随机子集选择的超参数,能带来10.5%的 top-5 准确率提升。
  • 无监督数据选择: 在视频数据标注中,使用无监督摘要方法选择子集进行标注,分散最小化和设施选址方法相比随机子集,在平均精度上带来近5%的提升。


主动学习 🎯

上一节我们介绍了通用的数据子集选择方法。本节中,我们来看看其在主动学习这一特定场景中的应用,目标是利用尽可能少的标注查询获得高性能模型。

多样化主动学习

在多样化主动学习中,我们通常从一个“热启动”开始(即已有部分标注数据)。基于当前模型,我们可以估计未标注样本的不确定性(例如熵)。主动学习的目标是选择一批样本进行标注,以最大化模型提升。

如果逐一样本查询,可以选择最不确定的样本(熵最高)。但实践中标注通常是批量的,因此我们希望选择一批既不确定又多样化的样本。多样性可以通过行列式点过程(DPP)来衡量,覆盖度可以通过设施选址或加权集合覆盖来衡量。

过滤式主动子模选择 分为两步:首先进行不确定性过滤,移除模型已经很确定的样本;然后在剩余的不确定样本上,使用子模函数(结合假设的标签)进行子集选择,以获取多样化和有代表性的样本集。实验表明,在不确定性采样基础上加入子模选择(多样化或代表性),其性能优于单纯的不确定性采样和随机采样。

基于影响的采样

另一种思路是衡量选择一个未标注样本(并赋予其假设标签)后,对分类器整体准确率或似然的影响。虽然计算精确影响很困难,但可以通过近似方法进行估计。研究表明,结合影响力考虑的采样方法具有很大价值。

基于核心集的主动学习

可以通过一个经验风险的上界来推导核心集选择方法。最小化这个上界等价于选择一个样本集,以最大化一个鲁棒版本的设施选址目标(即 k-Center 问题)。贪婪算法能为这个非子模问题提供 2 倍近似。实验表明,该方法相比当时其他先进方法有显著优势。

基于梯度多样性的主动学习

BADGE 算法是 CRAIG 在主动学习中的变体。它选择一批具有多样化梯度的样本,其中梯度是基于当前模型为未标注样本赋予的假设标签计算的。通过选择梯度多样化的样本,BADGE 同时兼顾了不确定性和多样性。它在多个数据集上保持了性能领先。

基于代理的选择

SVP 方法的核心思想是:训练一个缩小版的代理模型,用它来估计各个训练数据点的效用(如不确定性),然后选择信息量最大的样本用于训练大型目标模型。实验显示,仅选择60%的数据子集,就能获得1.6倍到1.8倍的加速。

GLISTER 在主动学习中的应用:GLISTER-ACTIVE

GLISTER-ACTIVE 是 GLISTER 算法在主动学习中的改进。它在每个周期选择一批未标注样本进行标注,并将其加入当前标注集。选择过程中,使用假设的标签进行内部优化。实验表明,GLISTER-ACTIVE 在多个数据集上优于当时的主流方法(包括 BADGE),并且具有计算效率高的优势。


数据编程与半监督学习 🤖

上一节我们讨论了主动学习。本节中,我们来看一种互补的方法:数据编程,它结合了少量标注数据和大量弱监督规则(或标注函数)。

假设我们有多个标注器,这些标注器可能是规则、弱分类器或人类。在标注数据极少或没有的情况下,估计标注器的可靠性至关重要。一个简单的想法是观察标注器与多数投票结果的差异。

标注器可能具有互补的专业知识。主动学习可以用于选择那些标注器之间分歧大的样本进行人工标注,从而以最小的标注预算补充规则标注的不足,获得高质量的标注数据集。

数据编程的目标是,不仅要在标注函数之间达成共识,还要确定需要人工标注的样本子集。我们希望基于特征的预测模型 F 和基于标注函数的共识模型 G 在标注数据和未标注数据上都达成一致。具体来说,在标注数据上,特征模型应具有低熵;在未标注数据上,特征模型的预测应与标注函数模型的预测一致。这方面的研究正在不断发展中。


特征选择与压缩 🔍

从数据空间转向特征空间,特征选择同样可以受益于子模优化。我们将探讨信息论特征选择、特征选择中的弱子模性、分类特征压缩以及学习组合特征。

信息论特征选择

互信息常用于特征选择。虽然互信息本身并不总是子模的,但如果所有特征在给定类别条件下相互独立,则关于特征子集的互信息函数是子模的。即使不满足条件独立性,互信息也可以表示为两个子模函数之差。

由于在高维特征空间中直接估计互信息困难,许多方法采用近似,如 最大相关最小冗余(mRMR) 准则。它将互信息近似为相关性减去冗余性,旨在选择与目标高度相关但彼此之间冗余度低的特征。

成本敏感的特征选择

在医疗等领域,获取特征本身可能成本高昂。成本敏感特征选择 方法可以考虑特征获取成本,并结合患者聚类信息,为不同的患者群体选择不同的特征子集。

基于损失函数的特征选择

对于线性回归等模型,可以直接最大化决定系数 。研究表明,在限制强凸和平滑的假设下,负对数似然(与 相关)是弱子模的。基于弱子模性,可以为正交匹配追踪(OMP)和前向选择算法提供数据依赖的近似保证。

分类特征压缩

对于分类特征,目标不是选择特征,而是将原始特征值(如“中国”、“日本”)压缩映射到更少的类别(如“亚洲”)。这可以看作一种特征压缩。最大化压缩后特征与目标类别的互信息,可以重新参数化为一个子模函数,从而有高效的拟阵约束算法。

学习组合特征

在许多任务中,我们需要学习基本特征的组合(如合取、序列模式)。搜索空间可能非常大(如格结构)。目标是选择格中的一组节点(即特征组合),使其在分类任务上表现良好。可以通过块范数正则化等方法来实现,例如对每个节点的所有后代施加 L1 范数惩罚,以获得稀疏且紧凑的规则集。这项工作已推广到多类、多标签、多任务场景,并适用于更一般的结构(如一阶逻辑公式)。


摘要应用:图像、视频与文本 📝

最后,我们探讨子模优化在内容摘要中的应用。摘要可以看作一种特殊的数据子集选择,但在图像、视频和文本领域有其独特的要求。

摘要的基本原理

摘要的目标是从一个大型集合(如图像集、文档集)中选择一个子集,使其具有多样性、覆盖度和代表性。通常,摘要可能需要与查询相关,或者需要保护隐私(即隐藏与查询相关的内容)。

通用流程是:首先进行特征提取,然后实例化一个子模函数(如基于相似性的覆盖函数、设施选址函数等),最后在预算约束下运行摘要算法(如贪婪算法)。

图像摘要

在图像收集中,用户可能需要进行基于查询的摘要(如“海滩”),或隐私保护摘要(隐藏私人信息)。研究表明,单纯追求多样性可能选择离群点,而单纯追求代表性可能错过孤立点。因此,需要结合多样性和代表性。学习子模函数的混合权重(例如通过最大边际学习)可以生成更符合人类偏好的摘要。

视频摘要

视频摘要更为复杂,除了多样性、代表性,还需考虑时序连贯性。早期工作将视频片段可视化,并组合“趣味性”(模块化)、“代表性”(k-Medoid)和“均匀性”(时序平滑)目标。后续工作引入了 DPP、LSTM 与 DPP 的结合等方法来同时捕获时序信息和多样性。

VisioSum 是一个新提出的大规模视频摘要数据集和评估框架。它包含71小时视频,并通过基于客观标准(如“进球”)生成参考摘要,以解决“没有单一正确答案”和人工摘要一致性低的问题。该框架支持通过一组评估指标来学习摘要模型,这些指标衡量摘要的不同特性。

文本与主题摘要

子模优化也可用于摘要主题层次结构(如维基百科分类体系)。目标是从庞大的主题树中选择一个节点子集,使其能很好地覆盖底层文档,同时满足预算约束,并避免选择彼此包含的冗余节点。这可以通过覆盖度、特异性、清晰度等子模函数来建模。

类似地,在机器翻译等领域,可以从大规模有向无环图中提取高质量的短语模式集合,同时考虑单个模式的质量和集合整体的覆盖度与多样性。


总结 🎓

本节课中,我们一起学习了子模优化在机器学习中的多种高级应用。

  1. 数据子集选择与主动学习: 我们探讨了使用代理函数、梯度近似、双层优化和散度最小化等方法进行数据选择。在主动学习中,我们看到了如何结合不确定性、多样性、影响力和梯度信息来高效选择样本进行标注。
  2. 数据编程: 我们了解了如何结合少量标注数据和大量弱监督规则,并通过主动学习选择关键样本来提升标注质量。
  3. 特征选择与压缩: 我们回顾了信息论方法、成本敏感方法、基于损失函数的方法、分类特征压缩以及学习特征组合等技术,其中子模性或弱子模性起到了关键作用。
  4. 摘要应用: 我们深入研究了子模优化在图像、视频和文本摘要中的应用,包括查询相关摘要、隐私保护摘要、视频时序摘要以及主题层次结构摘要。

子模优化为这些机器学习中的核心问题提供了强大的理论工具和高效的实用算法,帮助我们在数据爆炸的时代实现更高效、更鲁棒的模型学习与信息处理。

034:子模优化算法在数据编程与子集选择中的应用

概述

在本节课中,我们将学习子模优化算法在机器学习,特别是数据编程(Data Programming)和数据子集选择(Data Subset Selection)中的具体应用。我们将探讨如何利用标注函数(Labeling Functions)和少量标注数据来高效地生成训练数据,以及如何智能地选择数据子集来加速模型训练并提升鲁棒性。


数据编程(Data Programming)简介

上一节我们介绍了子模函数的基本概念。本节中,我们来看看如何将其应用于数据稀缺场景下的机器学习问题,即数据编程。

数据编程的核心思想是,当我们缺乏大量标注数据时,可以利用人工编写的规则或弱监督模型(统称为“标注函数”)为未标注数据自动生成噪声标签,然后通过一个聚合模型将这些可能存在冲突的噪声标签整合成相对可靠的伪标签。

标注函数示例

以下是几种常见的标注函数类型:

  • 基于规则的函数:例如,在文本中,如果“配偶”和“丈夫/妻子”等关键词在特定距离内同时出现,则判定句子描述的是婚姻关系。
  • 基于相似度的函数(连续型):例如,计算句子中实体与“配偶”词典中词的余弦相似度最大值,作为该句子描述婚姻关系的置信度分数。
  • 基于样本的函数:例如,给定一张“兄弟”的示例照片,在相册中寻找与之相似的所有照片并打上“兄弟”标签。

标签聚合模型

标注函数可能产生冲突或噪声。我们需要一个模型来聚合这些信号。早期的Snorkel模型使用了一个概率图模型,其核心是最大化以下形式的联合概率(简化表示):
P_θ(Y, Λ) ∝ exp(∑_j θ_j * 1{Λ_j = Y})
其中,Y是真实标签,Λ_j是第j个标注函数的输出,θ_j是该函数的权重参数。

然而,该模型存在对初始化敏感、不支持连续型标注函数输出等问题。


改进的CAGE模型

为了解决上述问题,我们引入了CAGE模型。它对标注函数的建模进行了重要改进。

关键改进点

  1. 支持连续型标注函数:模型能够处理输出为连续置信度分数的标注函数。
  2. 引入质量引导(Quality Guides):允许用户为标注函数提供先验的质量估计(例如,函数A的准确率约为90%),并将其作为正则化项加入目标函数,极大地稳定了训练过程。

改进后的模型势函数(以离散标注函数为例)形式如下:
ψ_j(Y, Λ_j) = exp(θ_{j,Y}),当标注函数j被触发且其输出与估计标签Y一致时。
这里的关键是exp(θ_{j,Y})永远为正,避免了原始模型中参数符号翻转导致似然值不变的问题。

质量引导正则项R(θ)的形式类似于衡量模型估计的标注函数准确率与用户提供的先验准确率之间的KL散度,从而将先验知识融入学习过程。


联合学习与级联学习

在数据编程的实践中,我们可能拥有少量标注数据。如何利用它们?通常有两种范式:

  • 级联学习(Cascaded Approach):先仅使用标注函数在未标注数据上生成伪标签,然后用生成的伪标签数据集去训练一个最终的判别模型(如逻辑回归、神经网络)。标注数据仅用于最终模型的评估。
  • 联合学习(Joint Learning):将标注函数模型(如CAGE)和最终的判别模型(称为特征模型)同时进行优化。目标函数同时考虑标注函数的一致性、特征模型在标注数据上的损失、特征模型在未标注数据上的预测熵、以及两个模型预测之间的一致性等。

联合学习能够实现标注函数与标注数据之间的互补,通常能获得比级联学习更好的性能。


智能数据子集选择

即使我们采用了联合学习,另一个关键问题是:应该标注哪些数据? 盲目地随机选择或全量标注成本高昂。我们希望智能地选择一个数据子集进行标注,使其能最大程度地提升模型性能。

问题形式化

我们可以将数据子集选择表述为一个双层优化问题:

  • 内层优化:在选定的训练子集S上训练模型,得到参数θ_S
  • 外层优化:寻找一个大小固定的子集S,使得用θ_S验证集上计算得到的损失L_val(θ_S)最小化。

外层优化是一个离散组合优化问题,直接求解非常困难。

高效近似算法:GLISTER

为了高效求解,我们采用一阶元近似

  1. 我们不对内层进行完整优化,而是假设模型参数从某个初始点θ仅沿在子集S上计算的梯度方向更新一步:θ_S ≈ θ + η * ∇_θ L_train(θ, S)
  2. 将这个近似代入外层验证损失,并进一步做泰勒展开。最终,外层优化目标可以近似为最大化验证集梯度与训练子集梯度之间的点积,即寻求一个其梯度方向与验证集梯度方向最一致的训练子集。

在一定的假设下(如使用逻辑损失),这个近似后的目标函数具有弱子模性。因此,我们可以使用贪心算法来高效地选择数据子集,并享有理论上的近似比保证。

这种方法(如GLISTER算法)能在几乎不损失模型精度的情况下,将训练速度提升数倍至数十倍,特别适用于超参数调优和架构搜索等需要多次训练的场景。

子集选择的意义

所选的数据子集应补充而非替代标注函数的信息。例如,我们应优先选择那些标注函数之间产生冲突置信度低的样本进行人工标注,因为这些样本能提供最大的信息增益。


总结

本节课中我们一起学习了子模优化在机器学习前沿领域的两个紧密相连的应用:

  1. 数据编程:利用子模优化思想(如通过质量引导实现稳定学习),我们能够整合多源、可能冲突的弱监督信号(标注函数)和少量标注数据,高效地生成高质量的训练数据集。
  2. 数据子集选择:通过将子集选择问题形式化为一个可近似为子模优化的双层优化问题,我们能够智能地选择最具信息量的数据进行标注或训练,从而在保证模型性能的同时,大幅降低标注成本和计算开销。

这两个方向为在资源受限环境下开展机器学习提供了强大的工具,也是当前研究的热点。

posted @ 2026-03-26 08:53  布客飞龙II  阅读(0)  评论(0)    收藏  举报