UCB-CS189-机器学习笔记-全-

UCB CS189 机器学习笔记(全)

1:课程介绍与安排 🎓

在本节课中,我们将学习课程的基本安排、机器学习的基本概念以及一个简单的分类问题示例。课程将涵盖从数据表示到模型训练和评估的全过程。


课程安排与政策 📋

课程已满员,无法容纳更多学生。任何未在正式座位就座的人员必须离开教室,以避免违反消防规定并导致高额罚款。课程的所有材料,包括视频和幻灯片,都将在课程网站上提供。只有注册的学生才能通过B课程访问作业和考试的答案。

讨论课将线下进行。考试必须亲自参加,且不提供补考。课程评分由期末考试(45%)、期中考试(35%)和作业(20%)组成。共有七次作业,允许放弃两次最低分。如果作业得分达到80%,则该次作业计为满分。

鼓励学生以2-5人的小组形式讨论作业,但禁止互相查看最终答案。严禁抄袭和作弊,包括使用往届作业答案。所有课程相关问题应通过Ed论坛公开提问。

课程材料包括讲座幻灯片和Chris Bishop的《模式识别与机器学习》教材。相关章节将作为阅读材料发布,以巩固学习内容。


机器学习概述 🤖

机器学习问题无处不在。例如,识别图像中的手写数字、检测医学影像中的肿瘤、过滤垃圾邮件、预测蛋白质结构或股票价格。这些问题主要分为几类:

  • 分类:预测离散的类别标签,例如判断一张图片是否是数字“7”。
  • 回归:预测连续的实数值,例如预测血压。
  • 排序:预测项目的相对顺序,例如网络搜索引擎的结果排序。
  • 无监督学习:没有对应标签,目标是学习数据本身的分布,例如大型语言模型对网络文本的建模。

前三种属于监督学习,即我们有输入数据和对应的输出标签。无监督学习则没有这样的标签。


一个简单的分类示例 🔢

我们将以著名的MNIST手写数字数据集为例。每个数字图像是28x28的灰度像素矩阵,可以“展平”成一个784维的特征向量

假设我们只区分数字“7”和非“7”。在训练阶段,我们使用带有标签(“7”或“非7”)的数据来训练一个分类器。在测试阶段,我们使用未参与训练的数据来评估模型的性能。此外,在实际部署模型时,我们会使用所有可用数据重新训练模型,并将其应用于未知的新数据。

我们可以将高维特征向量在二维平面上示意。红色点代表“7”,蓝色点代表“非“7”。一种简单的分类思路是找到一条直线(决策边界),尽可能地将两类点分开,这类似于逻辑回归的思想。

另一种简单的方法是最近邻分类:对于一个新点,将其类别预测为训练数据中离它最近的点的类别。使用更多邻居(K近邻)并进行投票,可以得到更平滑的决策边界。

然而,数据可能无法用一条直线完美分开。例如,正例点分布在一个圆盘内,而负例点分布在圆盘外。在这种情况下,线性分类器效果不佳。

解决这个问题的一种方法是进行特征变换基扩展。例如,除了原始特征x1和x2,我们还可以加入新特征如x1²、x2²和x1*x2。在这个新的高维特征空间中,数据可能变得线性可分。神经网络的核心思想之一就是自动学习这种有效的特征表示。


神经网络简介 🧠

神经网络可以看作是多个简单函数(如逻辑回归单元)的堆叠组合。

一个最简单的单层神经网络单元接收输入特征向量,计算其与参数向量的内积,然后通过一个非线性激活函数(如Sigmoid函数)产生输出。Sigmoid函数的输出在0到1之间,可以解释为属于某个类别的概率。

通过堆叠这样的层,就形成了深度神经网络。每一层的输入是前一层的输出。这种结构被称为前馈网络

训练神经网络需要定义一个损失函数,用于衡量模型预测与真实标签之间的差异。常见的损失函数包括交叉熵损失,它与统计学中的最大似然估计原理相通。

我们通过优化算法来寻找使损失函数最小化的模型参数。最常用的方法是梯度下降:计算损失函数关于参数的梯度,然后沿着梯度的反方向以小步长更新参数,逐步降低损失。

将以上步骤整合:准备训练数据,定义网络架构和损失函数,然后使用梯度下降法迭代优化参数,最终得到训练好的模型。


总结 📝

本节课我们一起学习了课程的基本安排和机器学习的基础概念。我们了解了监督学习中的分类、回归等问题,并通过一个手写数字分类的例子,直观感受了从数据表示、模型构建(如线性分类器、最近邻、神经网络)到模型训练与评估的完整流程。我们还初步认识了神经网络的核心组成和训练原理。在接下来的课程中,我们将深入探讨这些概念背后的数学原理和实现细节。

2:最大似然估计

在本节课中,我们将学习机器学习与统计学中的一个核心概念:最大似然估计。这是一种为统计模型寻找最优参数的方法,构成了许多现代机器学习算法的基础。

上一节我们介绍了机器学习的基本框架,包括模型、参数和损失函数。本节中,我们将深入探讨如何通过最大似然估计来定义并优化这个损失函数。

模型与参数

在监督式学习中,我们有一个训练数据集 D,包含 n 个样本。每个样本由输入特征 x_i(例如,一张展平后的图像像素向量)和对应的标签 y_i 组成。我们的目标是学习一个从特征空间到标签的映射。

为此,我们需要选择一个模型族假设类。这是一个带有自由参数 θ(有时也写作 w)的函数形式。例如,一个线性分类器或一个高斯分布族。一旦我们固定了参数 θ 的值,就得到了该模型族中的一个具体模型实例。

最大似然估计原理

最大似然估计的核心思想是:找到能使观测到的数据出现概率最大的参数值

我们假设数据集 D 中的样本是独立同分布的,即每个样本都从同一个由参数 θ 定义的分布中独立抽取。这个假设使得我们可以将整个数据集的联合概率分解为每个样本概率的乘积。

似然函数 定义为给定参数时数据的概率:L(θ) = P(D | θ)。由于 IID 假设,它可以写为:
L(θ) = ∏_{i=1}^{n} P(x_i | θ)

我们的目标是找到最大化这个似然函数的参数值:
θ_MLE = argmax_θ L(θ)

在实际操作中,我们通常最大化对数似然函数,因为求和比连乘更容易处理,且对数函数是单调的,不会改变最大值的位置:
θ_MLE = argmax_θ log L(θ) = argmax_θ Σ_{i=1}^{n} log P(x_i | θ)

这个对数似然函数就是我们的损失函数(有时取负号成为最小化问题)。通过优化它,我们可以“学习”或“估计”出模型参数。

示例:单变量高斯分布的最大似然估计

让我们通过一个具体例子来实践最大似然估计:估计单变量高斯分布的参数(均值 μ 和方差 σ²)。

假设我们有一组数据点 {x_1, x_2, ..., x_n},例如一群人的身高测量值。我们假设这些数据点独立地从一个高斯分布 N(μ, σ²) 中抽取。

高斯分布的概率密度函数为:
P(x | μ, σ²) = (1 / √(2πσ²)) * exp(-(x - μ)² / (2σ²))

第一步:写出似然函数
根据 IID 假设,整个数据集的似然函数是每个数据点概率的乘积:
L(μ, σ²) = ∏_{i=1}^{n} (1 / √(2πσ²)) * exp(-(x_i - μ)² / (2σ²))

第二步:转为对数似然函数
取对数将乘积化为求和:
log L(μ, σ²) = Σ_{i=1}^{n} [ -½ log(2πσ²) - (x_i - μ)² / (2σ²) ]
= - (n/2) log(2πσ²) - (1/(2σ²)) Σ_{i=1}^{n} (x_i - μ)²

第三步:对参数求导并令其为零
我们分别对 μ 和 σ² 求偏导数,找到令导数为零的驻点。

  • 对 μ 求导:
    ∂ log L / ∂μ = (1/σ²) Σ_{i=1}^{n} (x_i - μ)
    令其等于零:
    Σ_{i=1}^{n} (x_i - μ) = 0 => Σ_{i=1}^{n} x_i = nμ
    解得:
    μ_MLE = (1/n) Σ_{i=1}^{n} x_i
    这正是数据的样本均值

  • 对 σ² 求导(将 σ² 视为一个整体变量):
    经过求导和化简(过程略),并令导数为零,可得:
    σ²_MLE = (1/n) Σ_{i=1}^{n} (x_i - μ_MLE)²
    这正是数据的样本方差(注意,统计学中常使用 1/(n-1) 作为无偏估计,但在机器学习中,我们通常使用 MLE 得出的 1/n 版本)。

第四步:验证其为最大值
通过计算二阶导数(或海森矩阵)并验证其为负定,可以确认我们找到的驻点是最大值点。对于高斯分布,这个条件是满足的。

最大似然估计的性质与思考

最大似然估计拥有一些良好的理论性质:

  • 一致性:如果数据确实来自假设的分布族,那么随着数据量增加,MLE 估计值会收敛到真实参数值。
  • 统计有效性:在给定的数据量下,MLE 能高效地提取信息。
  • 参数化不变性:如果对模型进行参数重整化(例如,用 α = μ + 2 代替 μ),虽然估计出的参数值会变,但最终的模型分布(即似然值)是不变的。

然而,也需要注意:

  • MLE 严重依赖于我们选择的模型族。如果模型假设错误,估计结果可能很差。
  • MLE 给出的是一个点估计,即单个最优参数值。有时,参数空间可能存在一个“宽而平”的高似然区域,相比一个“尖而陡”的峰值,前者可能更稳健。我们将在后续课程中讨论如何考虑参数的不确定性(如贝叶斯方法)或避免过拟合(如正则化)。

与机器学习的联系

在机器学习中,我们经常听到交叉熵损失。对于分类问题,最小化交叉熵损失等价于对模型输出的类别概率分布进行最大似然估计。同样,均方误差损失则等价于在高斯噪声假设下进行回归问题的最大似然估计。

因此,最大似然估计为许多常见的机器学习损失函数提供了概率论上的 justification。


本节课中我们一起学习了最大似然估计的基本原理,并通过单变量高斯分布的实例,一步步推导了其参数估计公式。我们了解到,MLE 的核心是最大化观测数据的概率,其结果是许多经典统计估计和现代机器学习损失函数的基础。下一节课,我们将探讨更复杂的模型与分布。

3:多元高斯分布 🧮

在本节课中,我们将要学习多元高斯分布。我们将从回顾最大似然估计的原理开始,然后深入探讨多元高斯分布的定义、几何直观、数学性质及其在机器学习中的重要性。我们将学习如何从几何角度理解协方差矩阵,以及如何通过线性变换(如缩放和旋转)来操作高斯分布。


最大似然估计回顾

上一节我们介绍了最大似然估计的原理,并将其应用于一元高斯分布。本节中,我们来看看如何将其应用于一个离散随机变量的例子——多项分布。

最大似然估计的目标是找到一组参数,使得观测数据的概率(似然)最大化。我们假设数据是独立同分布的,因此似然函数是每个数据点概率的乘积。

多项分布的最大似然估计

考虑一个六面骰子。每次投掷会以概率 θ_k 出现第 k 面(k=1,...,6)。我们的目标是通过 n 次独立投掷的观测结果,估计这些参数 θ

首先,我们写出似然函数。由于每次投掷是独立的,n 次观测的联合概率是每次概率的乘积。我们可以使用一个技巧来简化表达式:统计每个面出现的次数 N_k

似然函数可以写为:

L(θ) = ∏_{k=1}^{6} θ_k^{N_k}

其中,N_k 是第 k 面出现的次数,且 ∑_{k=1}^{6} N_k = n

然而,参数 θ 有一个约束:它们必须构成一个有效的概率分布,即 ∑_{k=1}^{6} θ_k = 1。因此,我们的优化问题是一个带约束的最大化问题。

为了解决这个带等式约束的优化问题,我们使用拉格朗日乘数法。我们构造拉格朗日函数:

L(θ, λ) = ∑_{k=1}^{6} N_k log(θ_k) + λ (1 - ∑_{k=1}^{6} θ_k)

接下来,我们分别对拉格朗日乘子 λ 和每个参数 θ_k 求偏导数,并令其为零。

  1. λ 求偏导:得到约束条件 ∑ θ_k = 1
  2. θ_k 求偏导:得到 N_k / θ_k - λ = 0,即 θ_k = N_k / λ

θ_k = N_k / λ 代入约束条件 ∑ θ_k = 1,可以解出 λ = n。因此,最大似然估计为:

θ_k_hat = N_k / n

这个结果非常直观:第 k 面的概率估计值,就是该面在观测中出现的频率。

与高斯分布的案例一样,我们得到了参数的解析解。然而,对于更复杂的模型(如神经网络),我们通常无法获得闭式解,而必须使用迭代优化算法(如梯度下降)来最大化似然函数。


多元高斯分布介绍

现在,我们进入本节课的核心内容:多元高斯分布。一元高斯分布描述了一个标量随机变量,而多元高斯分布则描述了一个随机向量。

定义与公式

一个 d 维的多元高斯分布由均值向量 μ 和协方差矩阵 Σ 参数化。其概率密度函数为:

p(x | μ, Σ) = (1 / ((2π)^{d/2} |Σ|^{1/2})) * exp( -1/2 (x - μ)^T Σ^{-1} (x - μ) )

其中:

  • xμd 维向量。
  • Σ 是一个 d × d 的对称正定矩阵,称为协方差矩阵。
  • Σ^{-1}Σ 的逆矩阵,也称为精度矩阵。
  • |Σ|Σ 的行列式。

这个分布在机器学习中无处不在,部分原因是中心极限定理,部分原因是其数学上的便利性。理解其几何直观对于掌握主成分分析、生成分类器等后续主题至关重要。

从一元到多元:联合分布的思考

假设我们有两个随机变量:身高和体重。各自都(近似)服从一元高斯分布。但我们想知道它们的联合分布。

如果我们绘制来自联合分布的样本点,它们会形成一个椭圆形的点云。这个椭圆的“中心”由两个变量的均值组成。描述这个点云的“展布”不再是一个标量方差,而需要协方差矩阵。

协方差矩阵 Σ 的对角线元素是各个变量的方差,非对角线元素是变量之间的协方差。对于二维情况:

Σ = [ Var(X)    Cov(X, Y) ]
    [ Cov(Y, X)  Var(Y)   ]

如果 XY 独立,则 Cov(X, Y) = 0,协方差矩阵是对角阵,数据点云是轴对齐的椭圆。如果它们相关,则非对角线元素不为零,椭圆是倾斜的。

一个关键性质是:对于多元高斯分布,变量之间互不相关(协方差为零)与变量之间相互独立是等价的。这个性质是高斯分布特有的,对于一般分布,不相关并不蕴含独立。


多元高斯的几何直观

理解多元高斯几何的关键在于观察其概率密度函数的等高线。

等高线与椭圆

如果我们固定概率密度函数为一个常数 c,即 p(x) = c,那么满足条件的 x 的集合由方程 (x - μ)^T Σ^{-1} (x - μ) = constant 决定。这是一个二次型方程,其解在二维空间中形成一个椭圆,在高维空间中形成一个椭球面。

因此,协方差矩阵 Σ 本质上描述了这些椭球面的形状、方向和尺度

对角化与谱分解

如何理解一个倾斜的椭圆?我们可以通过线性变换将其变为轴对齐的椭圆。这对应于对协方差矩阵进行对角化。

根据谱定理,任何实对称矩阵 Σ 都可以分解为:

Σ = Q Λ Q^T

其中:

  • Q 是一个正交矩阵,其列向量是 Σ 的特征向量。Q 代表一个旋转。
  • Λ 是一个对角矩阵,其对角线元素是 Σ 的特征值。Λ 代表沿新坐标轴方向的缩放。

这个分解的几何意义非常强大:

  1. 特征向量(Q 的列)指出了椭球主轴的方向。
  2. 特征值(Λ 的对角元素)决定了沿各主轴方向的伸展程度。等高线椭球沿第 i 个主轴方向的“半径”与 √(λ_i) 成正比。

白化与仿射性质

基于谱分解,我们可以实现两个重要的操作:

  1. 白化:将一个任意的多元高斯分布转化为标准高斯分布 N(0, I)

    • 步骤:z = Λ^{-1/2} Q^T (x - μ)
    • 几何解释:先中心化(减去均值),再旋转(Q^T 将主轴对齐到坐标轴),最后缩放(Λ^{-1/2} 将各轴方差变为1)。
  2. 仿射性质:这是操作高斯分布的核心工具。

    • 如果 x ~ N(0, I) 是标准高斯,那么 y = A x + μ 服从分布 N(μ, A A^T)
    • 反之,如果 y ~ N(μ, Σ),那么 x = A^{-1} (y - μ) 服从标准高斯,其中 A 是满足 A A^T = Σ 的矩阵(例如 A = Q Λ^{1/2})。

仿射性质的几何直观:我们可以从标准高斯球出发,通过以下步骤得到任意高斯分布:
a. 缩放:用 Λ^{1/2} 沿坐标轴拉伸或压缩,得到轴对齐的椭圆。
b. 旋转:用 Q 旋转这个椭圆到任意方向。
c. 平移:加上均值 μ,将椭圆中心移动到指定位置。

这个过程完美地将协方差矩阵的数学定义(Σ = A A^T)与其几何含义(旋转加缩放)联系了起来。


总结

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

  1. 最大似然估计在多项分布上的应用,通过拉格朗日乘数法处理概率之和为1的约束,得到了频率即概率的直观估计。
  2. 多元高斯分布的定义和核心公式,理解了其由均值向量和协方差矩阵参数化。
  3. 协方差矩阵的几何意义:它定义了概率密度等高线椭球的方向和形状。特征向量指向主轴,特征值决定沿主轴的伸展程度。
  4. 谱分解的关键作用:它将协方差矩阵分解为旋转(特征向量)和缩放(特征值),为理解高斯分布的几何形态提供了数学工具。
  5. 仿射性质:这是连接标准高斯与任意高斯的桥梁,允许我们通过线性变换在分布间进行转换,是后续许多推导和算法的基础。

掌握多元高斯分布的这些基本概念和性质,将为学习线性判别分析、主成分分析、高斯过程等更高级的机器学习主题奠定坚实的基础。

4:线性回归 1

概述

在本节课中,我们将学习线性回归。我们将利用前两节课学到的最大似然估计和高斯分布知识,来构建一个用于预测连续值标签的监督学习模型。我们将从概率统计的角度出发,理解线性回归的核心假设,并推导出其参数估计的解析解。


回归:监督学习的一种形式

回归是监督学习的一种形式。我们的数据是成对的 (X, Y)X 是一个输入特征向量,Y 是一个输出。今天,我们主要考虑 Y 是实值标量的情况。特征 X 可以是离散的,也可以是连续的,我们在此不做假设。

在回归中,与分类不同,标签 Y 是实数值的。从形式上说,当我们说学习一个回归模型时,我们想要估计的是给定输入特征 X 时,目标标签 Y 的条件概率密度函数 P(Y|X)。这是一个关于随机变量 Y 的条件概率密度函数,对于 X 的每一个取值,都会得到一个不同的密度函数。

在回归中,我们通常考虑获得标签的一个点预测。也就是说,在模型训练完成后,给定一些特征,我们希望得到对 Y 的最佳估计或预测。如果我们已经估计出了条件概率分布 P(Y|X),那么获得单点预测的方法就是计算 Y 相对于该分布的期望值,这将是目标标签正确值的最佳猜测。

我们将先思考这个期望值,然后再回到实际的概率分布。今天我们会涉及这两个概念。


线性回归的直观理解

每个人都见过线性回归。通常在二维示意图中,输入特征是 x,输出特征是 y。你会看到一些观测点 (x, y),线性回归就像一条穿过这些点的“最佳拟合”直线。

当你将其视为一个统计模型时,实际上你考虑的是:对于 x 的每一个值,y 都有其自身的分布。例如,对于这个 x 值,y 的分布就像一个侧放的高斯分布。同样地,对于另一个 x 值也是如此。当我们讨论回归中的预测误差时,我们讨论的是一个观测值距离该高斯分布均值的距离,对于高斯分布来说,这个均值也是其期望值。

在这个模型中,每个 x 值都有其对应的 y 的均值。这个 y 的均值与另一个 x 值对应的 y 的均值是不同的。


获取条件概率密度的两种策略

我们的目标是估计条件概率密度 P(Y|X)。有不同的统计建模策略可以达到这个目的。

以下是两种主要策略:

  1. 生成式方法:我可以假设 XY 的联合概率密度函数属于某一类分布(例如多元高斯分布)。虽然我关心的对象是条件密度,但通过使用最大似然估计等方法从数据中拟合出这个联合分布模型后,我可以利用概率规则,从这个联合分布中计算出所需的条件分布。具体来说,P(Y|X) = P(X, Y) / P(X),而 P(X) 可以通过对联合分布 P(X, Y) 关于 Y 积分得到。

  2. 判别式方法:我可以直接基于数据对 (X, Y) 来学习条件密度 P(Y|X)。例如,我可以假设对于每个 XY 的条件分布是一个高斯分布,然后拟合这些高斯分布的参数(即条件均值和方差)。在标准线性回归中,通常假设所有 X 对应的方差是相同的。

这两种策略的一个关键区别在于对 X 的假设。在生成式方法中,我必须对 X 的分布做出假设(例如,XY 是联合高斯的)。在判别式方法中,我不需要将 X 视为随机变量,也不需要对其分布做任何假设,我只需要对给定 XY 的分布做出假设。

直观上,如果我对 X 的分布一无所知,那么生成式方法可能不是一个好主意,因为我需要做出可能不正确的假设。此时,判别式方法更合适,因为它不对 X 的分布做任何假设。然而,如果我确实知道 XY 是联合高斯的,那么将这个知识融入到模型中(生成式方法)通常会使模型在估计参数时更高效,即用更少的数据达到相同的精度。

“生成式”这个术语源于,因为学习了 XY 的联合密度,原则上你可以从这个密度中采样,生成看起来像原始数据集的新数据。而判别式模型无法生成 X,因为它没有将 X 建模为随机变量。

今天线性回归的剩余部分将采用判别式方法。


线性回归模型

在线性回归中,预测(即预测分布的期望值)将是参数的线性函数。这就是“线性”在线性回归中的含义。任何参数以线性函数形式出现的模型都是线性回归模型。

例如,如果我的点预测(期望值)具有以下形式:
ŷ = w₀ + w₁x₁ + w₂x₂ + ... + w_Dx_D
其中 w 是参数向量,x 是输入特征向量,w₀ 是偏置项或截距。

为了数学推导的简便,我们通常使用一个技巧:在原始特征向量 x 的末尾总是附加一个 1。这样,新的特征向量变为 [x₁, x₂, ..., x_D, 1],参数向量变为 [w₁, w₂, ..., w_D, w₀]。于是,模型可以简洁地写为:
ŷ = wᵀx
其中 wx 都已经是扩展后的向量。这样,偏置项 w₀ 就被吸收到了参数向量中。


基函数扩展

线性回归的“线性”指的是参数 w 是线性的,而不是特征 x。这意味着我们可以对原始特征进行非线性变换,只要变换后的新特征与参数 w 的关系是线性的即可。这极大地增强了模型的表达能力。

这个过程称为基函数扩展。我们通过一个预定的函数 φ 将原始 D 维特征 x 映射到一个新的 K 维特征空间。
φ(x): ℝᴰ → ℝᴷ
然后,我们在新的特征空间 φ(x) 上进行线性回归。

常见的基函数扩展包括:

  • 多项式扩展:添加原始特征的平方项、立方项以及交叉项。这允许模型拟合曲线。
  • 径向基函数:基于到一组中心点的距离来构造特征。
  • 傅里叶基:将信号(如图像)转换到频域。

基函数扩展的美妙之处在于,一旦我们完成了扩展,我们就得到了一组固定的新特征。之后,所有针对原始特征的线性回归方法都可以直接应用。这使我们能够用线性回归的简单性获得任意复杂的模型。

一个前瞻性的提示是,神经网络的一个强大之处在于,它不是在事先定义基函数,而是在学习过程中动态地学习有用的特征表示(可以看作是多层的基函数扩展),最后一层通常就是在这些学习到的特征上进行线性回归。


高斯线性回归与最大似然估计

在标准线性回归中,我们通常指的是高斯线性回归。这意味着我们假设条件分布 P(Y|X) 是一个高斯分布。具体来说,对于每个 xy 的分布是一个高斯分布,并且所有 x 对应的方差 σ² 是相同的。

我们如何得到条件均值呢?我们让参数向量 w 与输入特征 x 做内积:
μ = wᵀx
这个标量 μ 就是给定 xy 的条件均值。

我们可以等价地写成:
y = wᵀx + ε
其中 ε 是一个随机噪声项,服从均值为 0、方差为 σ² 的高斯分布:ε ~ N(0, σ²)

移项后得到:
y - wᵀx = ε ~ N(0, σ²)
我们通常称 y - ŷ残差。在线性回归中,我们假设残差是高斯分布的。

为了拟合参数 wσ²,我们将使用最大似然估计

我们假设有 N 个独立同分布的数据点 {(x_i, y_i)}。条件似然函数为:
L(w, σ²) = ∏_{i=1}^N P(y_i | x_i; w, σ²)
代入高斯分布的概率密度函数并取对数,得到对数似然函数:
log L(w, σ²) = ∑_{i=1}^N [ -1/2 log(2πσ²) - (y_i - wᵀx_i)²/(2σ²) ]

如果我们只关心估计 w,可以忽略与 w 无关的项。最大化对数似然等价于最小化负对数似然。去掉常数项后,我们得到:
argmin_w ∑_{i=1}^N (y_i - wᵀx_i)²
这正是最小二乘损失函数,也称为均方误差。因此,最小二乘法自然地源于高斯线性回归的最大似然估计。


推导解析解

为了便于推导,我们将损失函数写成向量和矩阵形式。

定义:

  • y:一个 N×1 的向量,包含所有 N 个观测值 y_i
  • X设计矩阵,维度为 N×D。每一行对应一个数据点的特征向量 x_iᵀ(已包含偏置项对应的 1)。
  • wD×1 的参数向量。

预测向量为 ŷ = Xw
残差向量为 e = y - Xw
损失函数(平方和)可以写为:
L(w) = ||y - Xw||² = (y - Xw)ᵀ(y - Xw)

我们的目标是最小化 L(w)。为此,我们计算梯度并令其为零。

首先展开损失函数:
L(w) = yᵀy - 2yᵀXw + wᵀXᵀXw

接下来,我们利用向量微积分的规则求梯度。有用的规则包括:

  • ∇_w (aᵀw) = aa 是常数向量)
  • ∇_w (wᵀAw) = 2Aw (当 A 是对称矩阵时)

L(w) 求关于 w 的梯度:
∇_w L(w) = -2Xᵀy + 2XᵀXw

令梯度为零以找到临界点:
-2Xᵀy + 2XᵀXw = 0
=> XᵀXw = Xᵀy

为了解出 w,我们需要在等式两边左乘 (XᵀX)⁻¹(假设 XᵀX 是可逆的):
w_MLE = (XᵀX)⁻¹ Xᵀy

这个解被称为 w最大似然估计。量 (XᵀX)⁻¹ Xᵀ 被称为矩阵 X左伪逆


解的存在性与唯一性

w_MLE = (XᵀX)⁻¹ Xᵀy 要求 XᵀX 是可逆的。XᵀX 可逆的充要条件是设计矩阵 X满秩的,即它的列(特征)是线性无关的。

如果 X 的列是线性相关的(例如,特征之间存在冗余,或者数据点数量 N 小于特征数量 D),那么 X 就不是满秩的,XᵀX 是奇异的(不可逆)。此时,存在无穷多个 w 都能使损失函数最小化(达到相同的损失值)。

在这种情况下,我们可以使用摩尔-彭罗斯伪逆,记作 X⁺。伪逆总是存在的。使用伪逆得到的解 w = X⁺y 具有一个良好的性质:它是所有可能的最小二乘解中欧几里得范数最小的那个。这在机器学习中通常被认为是一个好的归纳偏置,可能有助于模型在新数据上的泛化。

为了确认我们找到的临界点是最小值点,可以检查损失函数的海森矩阵(二阶导数矩阵):
H = ∇²_w L(w) = 2XᵀX
XᵀX 是正定矩阵时(即 X 满秩),海森矩阵是正定的,这意味着临界点是一个严格的局部最小值。


几何视角

除了概率视角,线性回归还有一个优美的几何视角,它不依赖于高斯假设。

在这个视角下,我们希望找到一个参数向量 w,使得预测值 Xw 尽可能接近真实值 y。预测值 Xw 位于设计矩阵 X 的列空间(一个超平面)中。真实向量 y 通常不在这个列空间中。

我们的目标是找到列空间中离 y 最近的点。根据几何知识,从 y 到列空间的最短距离是通过 y 向列空间做垂直投影得到的。这个垂直投影的条件是:连接 y 和其投影点 Xw 的向量(即残差向量 e = y - Xw)与列空间中的每一个基向量(即 X 的每一列)都垂直。

用数学语言表达,垂直意味着内积为零:
Xᵀ e = 0
代入 e = y - Xw
Xᵀ (y - Xw) = 0
=> XᵀXw = Xᵀy

这恰好与我们通过最大似然估计(或最小二乘法)导出的方程相同!因此,我们从纯粹的几何最优性(最小化欧几里得距离)出发,得到了完全相同的解。

这个几何解释非常直观,但它没有提供关于噪声分布或不确定性估计的信息。概率视角的优势在于,它提供了一个框架,可以轻松地推广到其他噪声分布(例如,学生 t 分布用于处理异常值),并自然地给出预测的不确定性。


潜在问题与总结

线性回归虽然强大且简单,但也面临一些挑战:

  • 过参数化与过拟合:当我们使用基函数扩展添加大量特征时,参数数量 D 会增加,但数据量 N 保持不变。这可能导致模型有足够的能力去“记忆”训练数据中的噪声,而不是学习潜在规律,从而在新数据上表现不佳(过拟合)。特别是当 D 接近甚至大于 N 时,模型几乎总能完美拟合训练数据,但这通常不是泛化能力好的标志。

  • 特征共线性:如果特征之间高度相关,设计矩阵 X 的列接近线性相关,会导致 XᵀX 接近奇异。虽然伪逆可以提供解,但估计出的参数 w 可能非常不稳定(对数据微小变化敏感),且难以解释。

本节课中,我们一起学习了线性回归的基础。我们从概率统计的角度出发,将线性回归定义为对条件高斯分布 P(Y|X) 的建模,并通过最大似然估计推导出了最小二乘解 w_MLE = (XᵀX)⁻¹ Xᵀy。我们还探讨了基函数扩展如何极大地增强线性模型的表达能力,并从几何视角重新审视了最小二乘解,发现它与概率视角下的解一致。最后,我们讨论了解的存在性、唯一性以及模型可能面临的问题。理解线性回归的这些基本原理,是学习更复杂机器学习模型的重要基石。

5:线性回归 2 🧮

在本节课中,我们将继续学习线性回归,并深入探讨一个核心概念:正则化。我们将了解当线性回归模型遇到“欠定”问题时,如何通过添加约束来获得更稳定、泛化能力更强的解。我们还将学习两种最常用的正则化方法:L2正则化(岭回归)和L1正则化(Lasso),并理解它们背后的概率解释(贝叶斯视角)以及如何选择超参数。


欠定系统与正则化动机

上一节我们介绍了高斯线性回归及其最大似然估计。我们通过求解方程 A^T A w = A^T y 来得到权重 w 的估计,其中 A 是设计矩阵。然而,这个解要求 A^T A 是可逆的。

当设计矩阵 A 不是满秩时(例如,特征之间存在线性依赖,或者特征数量 D 大于样本数量 n),A^T A 不可逆。此时,我们有无穷多个 w 都能使训练数据的似然函数达到相同的最大值。这样的系统被称为欠定系统

为了解决这个问题,一个直观的想法是直接删除一些特征,但这可能丢失信息。另一种更优雅、更通用的方法是正则化。正则化的核心思想是:保持参数数量不变,但对其添加约束,从而有效减少模型的“自由度”,防止过拟合,并提高模型在未知数据上的鲁棒性。


为何选择小范数解?🤔

在欠定系统中,穆尔-彭罗斯广义逆给出的解是所有可能解中范数最小的那个。为什么这是一个好的选择?

考虑一个简单的例子:假设有两个线性相关的特征 x1x2(即 x2 = α * x1)。模型预测为 ŷ = w1*x1 + w2*x2。可以证明,存在无穷多组 (w1, w2) 能给出完全相同的训练集预测值。

直觉是:在训练集上表现相同的参数向量,在测试集上的表现可能大不相同。范数较小的参数向量(即各 wi 值较小)通常意味着模型更“平滑”。当输入 x 有微小扰动时,预测 ŷ 的变化也更小。这种对噪声的鲁棒性是我们所期望的,因为机器学习通常假设真实世界中的函数具有一定的平滑性。

因此,即使是在 A^T A 可逆的“超定”系统中,我们也有动机去约束 w 的范数,使其小于最大似然估计得到的范数。这虽然会略微降低模型在训练集上的拟合程度(似然值下降),但往往能显著提升其泛化能力。


L2正则化线性回归(岭回归)🏔️

现在,我们正式引入第一种正则化方法。我们不再仅仅最大化似然函数,而是在损失函数中添加一个关于参数 w 的L2范数惩罚项。

损失函数公式
L(w) = ||y - A w||² + λ ||w||²
其中 λ > 0 是一个超参数,控制正则化的强度。

贝叶斯视角下的推导 🧠

我们可以从概率角度理解L2正则化。这涉及到最大后验概率估计

  • 贝叶斯方法:将参数 w 视为随机变量,引入一个先验分布 p(w) 来表示我们在看到数据之前对参数的信念。看到数据 D 后,我们根据贝叶斯规则计算后验分布 p(w|D) ∝ p(D|w) * p(w)
  • “懒惰”的贝叶斯方法(MAP):我们不计算整个后验分布,而是寻找使后验概率最大的单个 w,即最大后验概率估计
    w_MAP = argmax_w [ p(D|w) * p(w) ]
  • 与L2正则化的对应:如果我们选择先验分布 p(w) 为一个零均值、方差由 λ 控制的高斯分布,即 w ~ N(0, (1/λ)I),那么最大化后验概率 p(w|D) 的对数,正好等价于最小化上述的L2正则化损失函数 L(w)

因此,L2正则化等价于假设参数服从高斯先验的MAP估计。这个先验表达了我们“认为参数值应该接近零”的信念。

求解与性质 🔍

对新的损失函数求导并令其为零,我们可以得到解析解:

权重解公式
w_Ridge = (A^T A + λ I)^(-1) A^T y

与普通最小二乘解 (A^T A)^(-1) A^T y 相比,岭回归的解在 A^T A 上加了一个 λ I。只要 λ > 0(A^T A + λ I) 就总是可逆的,即使 A^T A 原本不可逆。这从数值计算上也更加稳定。


L1正则化线性回归(Lasso)🎯

第二种广泛使用的正则化方法是L1正则化,它在损失函数中添加参数向量的L1范数(绝对值之和)作为惩罚项。

损失函数公式
L(w) = ||y - A w||² + λ ||w||₁
其中 ||w||₁ = Σ_i |w_i|

几何解释与稀疏性 ✨

L1正则化最引人注目的特性是它能产生稀疏解,即最终得到的权重向量 w 中许多项恰好为0。这实现了自动的特征选择

我们可以从约束优化的几何视角来理解这一点:

  • 将L1正则化视为在最大化似然的同时,要求 ||w||₁ ≤ tt 是与 λ 相关的常数)。
  • 这个约束在二维参数空间中是一个菱形,而在高维空间中是具有“尖角”的多面体。
  • 似然函数的等高线是椭圆。在约束优化中,最优解通常出现在约束区域的边界与似然等高线“相切”的地方。
  • 由于L1约束区域有“尖角”,相切点有很大概率落在坐标轴上,这意味着某些 w_i = 0

相比之下,L2约束 (||w||₂ ≤ t) 区域是一个“光滑”的球体,与等高线相切在坐标轴上的概率很小,因此通常不会产生精确为零的权重。

贝叶斯视角 🧠

类似于岭回归,Lasso也有其贝叶斯解释。它对应于假设参数 w 服从拉普拉斯先验(又称双指数分布)。拉普拉斯分布在零点有更高的概率密度,这同样表达了我们期望许多参数为零或接近零的信念。


如何设置超参数 λ?🎛️

正则化强度 λ 是一个超参数,我们不能通过最大化训练集似然来学习它(因为那样总会得到 λ = 0)。必须使用独立的验证集来评估不同 λ 值下模型的性能。

以下是标准流程:

  1. 分割数据:将全部数据分为训练集验证集测试集
  2. 交叉验证:对于每个候选的 λ 值:
    • 在训练集上训练模型(最小化 L(w))。
    • 在验证集上评估模型性能(使用原始的、未正则化的损失,如平方误差)。
  3. 选择最优λ:选择在验证集上性能最好的 λ 值。
  4. 最终训练与测试:使用选定的 λ,用全部训练集+验证集数据重新训练最终模型,然后在测试集上进行一次性的最终性能评估,以估计模型在真实场景中的表现。

常用的交叉验证方法是 k折交叉验证,它能更有效地利用数据来估计验证误差。


L2 vs L1 vs 弹性网络 🤼

以下是两种正则化方法的简单比较:

  • 岭回归 (L2)
    • 优点:总是可解,数值稳定,能处理特征相关性。
    • 缺点:不产生稀疏模型,所有特征都会被保留,只是系数被缩小。
  • Lasso (L1)
    • 优点:能产生稀疏模型,自动进行特征选择,模型更易解释。
    • 缺点:如果一组特征高度相关,Lasso倾向于只从中随机选择一个,这可能不稳定。

有时,为了结合两者的优点,会使用弹性网络,它同时包含L1和L2惩罚项:
L(w) = ||y - A w||² + λ₁ ||w||₁ + λ₂ ||w||²
但这引入了两个需要调优的超参数。


总结 📚

本节课我们一起深入学习了线性回归的正则化技术。

  1. 问题起源:我们首先了解了当线性回归面临欠定系统时,最大似然估计会得到无穷多解。
  2. 核心思想:引入了正则化的概念,通过给损失函数添加关于参数的惩罚项,来约束模型复杂度,提高泛化能力。
  3. L2正则化 (岭回归):我们学习了添加L2范数惩罚项的方法,推导了其解析解 (A^T A + λ I)^(-1) A^T y,并从贝叶斯最大后验概率估计的角度理解了它对应于高斯先验。
  4. L1正则化 (Lasso):我们学习了添加L1范数惩罚项的方法,理解了其能产生稀疏解的特性,并从几何和贝叶斯(拉普拉斯先验)角度进行了解释。
  5. 超参数调优:我们明确了正则化系数 λ 是超参数,必须使用验证集交叉验证技术来选择。
  6. 方法比较:我们对比了岭回归和Lasso的优缺点,并简要介绍了结合二者的弹性网络。

正则化是机器学习的核心概念之一,其思想远超线性回归,将贯穿于我们后续学习的所有复杂模型(如逻辑回归、神经网络)中。掌握它,是构建稳健、高性能机器学习模型的关键。

6:分类 - 生成式与判别式方法

在本节课中,我们将要学习分类问题的两种核心方法:生成式方法和判别式方法。我们将从概率论的基础出发,理解如何从数据中学习分类规则,并重点介绍逻辑回归这一重要工具。

概述:分类问题

分类问题是机器学习中的核心任务之一。给定输入数据(例如,胆固醇水平、蛋白质结构、手写数字图像),我们的目标是将其映射到一个离散的类别标签(例如,健康/患病、结合/不结合、数字0-9)。

形式上,我们有一个数据集,包含成对的样本 \((x_i, y_i)\),其中 \(x_i \in \mathcal{X}\) 是输入,\(y_i \in \{0, 1, ..., K-1\}\) 是类别标签。我们的目标是学习一个映射 \(f: \mathcal{X} \rightarrow \{0, 1, ..., K-1\}\)

一个直观的例子:胆固醇水平与心脏病

让我们从一个简单的二元分类例子开始:根据胆固醇水平预测一个人是否患有心脏病。

我们有两组人群的数据分布:健康人群和心脏病患者人群的胆固醇水平分布。通常,心脏病患者的平均胆固醇水平更高。这两个分布都是高斯分布,并且具有相同的方差,但它们之间存在重叠区域。

上一节我们介绍了分类问题的基本形式,本节中我们来看看如何从概率角度构建分类器。

贝叶斯定理与后验概率

我们真正关心的是给定胆固醇测量值 \(x\) 后,一个人患病的概率,即后验概率 \(P(\text{患病} | x)\)。根据贝叶斯定理,我们可以计算它:

\[P(y | x) = \frac{P(x | y) P(y)}{P(x)} \]

其中:

  • \(P(x | y)\)类条件概率(例如,给定一个人患病时,其胆固醇水平的分布)。
  • \(P(y)\)先验概率(例如,人群中患病和健康的比例)。
  • \(P(x)\) 是证据因子,通过全概率公式计算:\(P(x) = \sum_{y} P(x | y) P(y)\)

先验概率 \(P(y)\) 可以通过统计数据集中各类别的比例来简单估计。而类条件概率 \(P(x | y)\) 的估计则是更核心的问题。

计算出后验概率后,我们得到了一个概率分布。但医生需要做出明确的诊断决策,这就引出了决策理论。

决策边界与决策理论

我们需要一个规则,将连续的后验概率转化为一个确定的类别标签。一个直观的决策规则是:选择后验概率最大的类别。

\[\hat{y} = \arg\max_{y} P(y | x) \]

对于我们的二元例子,这等价于找到一个决策边界 \(x^*\)。当 \(x < x^*\) 时,我们预测为健康 \((y=0)\);当 \(x > x^*\) 时,我们预测为患病 \((y=1)\)。一个自然的选择是两条类条件概率曲线相交的点。

然而,最小化分类错误率并非总是最佳目标。在医疗诊断等场景中,假阴性(漏诊)和假阳性(误诊)的代价是不同的。因此,在实际应用中,决策边界可能需要根据代价进行调整。

上一节我们讨论了如何从概率到决策,本节中我们来看看解决分类问题的两种不同哲学。

生成式方法与判别式方法

生成式方法 🧬

我们刚才走过的路径——先估计类条件概率 \(P(x | y)\) 和先验 \(P(y)\),然后利用贝叶斯定理计算后验 \(P(y | x)\),最后做出决策——被称为生成式方法

它之所以被称为“生成式”,是因为一旦我们学到了类条件概率 \(P(x | y)\),我们就可以为每个类别生成新的样本数据。这相当于我们为每个类别建立了一个数据生成模型。

生成式方法将分类问题转化为一个看似更复杂的密度估计问题。但它有一个优点:由于我们建模了 \(P(x)\),当遇到与训练数据分布迥异的新数据(分布外样本)时,模型可以给出较低的置信度,这对于安全关键型应用很重要。

判别式方法 🎯

另一种思路是绕过生成模型,直接对后验概率 \(P(y | x)\) 进行建模。这被称为判别式方法

我们不再关心数据 \(x\) 本身是如何生成的(即不关心 \(P(x | y)\)\(P(x)\)),而是集中精力学习类别之间的“边界”。这种方法通常更直接,因为分类本身就是我们的最终目标。

第三种思路:直接学习函数

更进一步,我们甚至可以绕过概率建模,直接学习从输入 \(x\) 到类别标签 \(y\) 的映射函数 \(f(x)\)。许多现代深度学习模型采用这种思路。

但直接学习函数会丢失不确定性信息。我们无法知道预测的置信度,也无法判断样本是否属于已知分布。因此,保留概率框架(判别式方法)通常更有优势。

上一节我们对比了不同方法,本节中我们聚焦于一个从生成式方法中自然涌现出的强大函数。

逻辑函数:从高斯假设中诞生

假设我们的类条件概率 \(P(x | y)\) 是高斯分布,并且两个类别的方差相同。对于类别 \(y=0\)\(y=1\),有:

\[P(x | y=k) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x - \mu_k)^2}{2\sigma^2}\right), \quad k \in \{0,1\} \]

在这个假设下,我们可以推导出后验概率 \(P(y=1 | x)\) 具有一个非常优美的形式:

\[P(y=1 | x) = \frac{1}{1 + e^{-z}} \quad \text{其中} \quad z = \theta_1 x + \theta_0 \]

这个函数被称为逻辑函数Sigmoid 函数。参数 \(\theta_1\)\(\theta_0\) 由高斯分布的均值、方差以及先验概率决定:

\[\theta_1 = \frac{\mu_1 - \mu_0}{\sigma^2}, \quad \theta_0 = \log\left(\frac{P(y=1)}{P(y=0)}\right) - \frac{\mu_1^2 - \mu_0^2}{2\sigma^2} \]

关键推导步骤:推导的核心在于计算对数几率比(Log-Odds)。

  1. 应用贝叶斯公式写出 \(P(y=1|x)\)\(P(y=0|x)\) 的表达式。
  2. 计算它们的比值 \(P(y=1|x) / P(y=0|x)\)
  3. 由于高斯分布指数项中的二次项 \(x^2\) 在方差相同的假设下会相互抵消,结果只剩下关于 \(x\)线性项 \(z = \theta_1 x + \theta_0\)
  4. 通过代数变换,即可得到逻辑函数的形式 \(P(y=1|x) = 1 / (1 + e^{-z})\)

逻辑函数具有以下重要性质:

  • 值域:将整个实数域 \(z \in (-\infty, +\infty)\) 映射到 \((0, 1)\) 区间,完美符合概率的定义。
  • 单调性:其导数 \(d\sigma(z)/dz = \sigma(z)(1-\sigma(z)) > 0\),是单调递增函数。
  • 对称性\(1 - \sigma(z) = \sigma(-z)\)

这个结果可以推广到多维特征 \(x \in \mathbb{R}^D\) 的情况。如果类条件概率是多维高斯分布 \(P(x|y=k) = \mathcal{N}(x; \mu_k, \Sigma)\),且协方差矩阵 \(\Sigma\) 相同,那么后验概率仍然是逻辑函数的形式:

\[P(y=1 | x) = \frac{1}{1 + e^{-z}} \quad \text{其中} \quad z = \theta^T x + \theta_0 \]

此时,参数 \(\theta = \Sigma^{-1}(\mu_1 - \mu_0)\)\(\theta_0\) 也包含先验信息。

重要启示:方差相同(或协方差相同)的假设至关重要,它保证了对数几率比 \(z\) 是输入 \(x\)线性函数。如果方差不同,\(z\) 中将包含 \(x\) 的二次项,后验概率就不再是标准的逻辑函数形式。

上一节我们从高斯假设推导出了逻辑函数,本节中我们从一个更通用的视角来理解它。

逻辑函数的启发式推导

即使没有高斯假设,我们也可以从另一个角度理解为什么逻辑函数是建模概率的自然选择。

我们的目标是直接建模后验概率 \(P(y=1|x)\)。一个天真的想法是直接用线性函数建模:\(P(y=1|x) \approx \theta^T x + \theta_0\)。但这显然不行,因为线性函数的值域是整个实数域,而概率必须在 \([0, 1]\) 之间。

为了解决这个问题,我们考虑几率(Odds):$ \frac{P}{1-P} $。当 \(P\)\([0,1)\) 内变化时,几率在 \([0, +\infty)\) 内变化。

为了让值域覆盖整个实数域 \((-\infty, +\infty)\),我们对其取对数,得到对数几率(Log-Odds 或 Logit):

\[\text{logit}(P) = \ln\left(\frac{P}{1-P}\right) \]

现在,我们可以安全地假设这个对数几率是输入 \(x\) 的线性函数:

\[\ln\left(\frac{P(y=1|x)}{1 - P(y=1|x)}\right) = \theta^T x + \theta_0 \]

对这个等式进行简单的代数变换,即可解出 \(P(y=1|x)\)

\[P(y=1|x) = \frac{1}{1 + e^{-(\theta^T x + \theta_0)}} = \sigma(\theta^T x + \theta_0) \]

看,我们又得到了逻辑函数!这个推导表明,逻辑回归模型的核心假设是:对数几率是特征的线性函数。这是一个比“类条件高斯且同方差”更本质、更通用的动机。

逻辑函数的重要性与历史

逻辑函数不仅在统计学和机器学习中地位重要,在神经网络发展史上也扮演了关键角色。

在神经网络中,逻辑函数常被用作激活函数,负责引入非线性。它模拟了神经元的“饱和”特性:对于过小或过大的输入,神经元的输出会趋于0或1。

一个著名的理论结果是通用近似定理:只要使用足够多的隐藏层单元,以Sigmoid函数(如逻辑函数)为激活函数的前馈神经网络,可以以任意精度逼近任何定义在紧集上的连续函数。这奠定了神经网络作为强大函数逼近器的基础。

总结与下节预告

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

  1. 分类问题的定义:学习从输入空间到离散标签的映射。
  2. 概率框架:使用贝叶斯定理,通过类条件概率和先验概率计算后验概率。
  3. 决策理论:将后验概率转化为分类决策,并讨论了错误代价不对称的问题。
  4. 两种方法论
    • 生成式方法:建模 \(P(x|y)\)\(P(y)\),可生成数据,能处理分布外检测。
    • 判别式方法:直接建模 \(P(y|x)\),更直接针对分类目标。
  5. 逻辑函数的诞生
    • 在“类条件高斯且同方差”的假设下,后验概率具有逻辑函数形式。
    • 其核心是对数几率是特征的线性函数这一更通用的假设。
  6. 逻辑函数的重要性:值域适合表示概率,是神经网络历史上的核心激活函数,并满足通用近似定理。

现在,我们已经确定了用于建模 \(P(y|x)\) 的函数形式——逻辑函数。在下节课中,我们将进入逻辑回归的学习。我们将讨论:

  • 如何根据训练数据,通过最大似然估计来求解逻辑回归模型的参数 \((\theta, \theta_0)\)
  • 逻辑回归的损失函数(对数损失)及其优化方法。
  • 如何将二元逻辑回归扩展到多类别分类(Softmax回归)。

我们将完成从概率模型到实用分类算法的最后一步。

7:逻辑回归与神经网络

在本节课中,我们将要学习逻辑回归的判别式学习方法,并初步了解神经网络的基本概念。我们将从几何角度理解逻辑回归的参数,推导多分类逻辑回归的公式,并学习如何通过梯度下降法进行参数学习。最后,我们将从神经科学的视角出发,引出神经网络的基本模型。


逻辑回归的几何解释

上一节我们介绍了逻辑回归的生成式方法。本节中,我们来看看其参数的几何意义。

逻辑回归模型的核心公式为:

\[P(y=1 \mid \mathbf{x}; \boldsymbol{\theta}) = \frac{1}{1 + e^{-\boldsymbol{\theta}^T \mathbf{x}}} \]

参数 \(\boldsymbol{\theta}\) 的几何意义如下:

  • 方向\(\boldsymbol{\theta}\) 的方向决定了决策边界(即概率为0.5的等高面)的法线方向。数据点 \(\mathbf{x}\) 可以分解为平行于 \(\boldsymbol{\theta}\) 的分量 \(\mathbf{x}_{\parallel}\) 和垂直于 \(\boldsymbol{\theta}\) 的分量 \(\mathbf{x}_{\perp}\)。垂直于 \(\boldsymbol{\theta}\) 方向上的移动不会改变分类概率。
  • 大小\(\boldsymbol{\theta}\) 的范数影响决策边界的“锐利”程度。
  • 偏置:参数 \(\theta_0\) (通常与一个常数特征 \(x_0=1\) 结合)决定了决策边界沿法线方向的平移。

如果 \(\boldsymbol{\theta}\) 指向“类别1”区域,那么沿着 \(\boldsymbol{\theta}\) 方向移动,\(P(y=1 \mid \mathbf{x})\) 会趋近于1;反之则趋近于0。这为参数学习提供了直观的更新方向。


多分类逻辑回归

接下来,我们将逻辑回归从二分类推广到多分类(K > 2)场景。

我们同样可以从生成式方法出发进行推导。假设每个类别的类条件概率密度 \(p(\mathbf{x} \mid y=k)\) 是同协方差矩阵 \(\boldsymbol{\Sigma}\) 的高斯分布。通过贝叶斯定理计算后验概率 \(P(y=k \mid \mathbf{x})\),并消去分子分母中的公共项,我们可以得到如下形式:

\[P(y=k \mid \mathbf{x}) = \frac{e^{a_k}}{\sum_{j=1}^{K} e^{a_j}} \]

其中,

\[a_k = \boldsymbol{\theta}_k^T \mathbf{x} + \theta_{k0} \]

这个映射函数被称为 Softmax 函数。它具有以下重要性质:

  • 输出归一化:所有类别的概率之和为1。
  • 可微分性:便于使用基于梯度的优化方法。
  • 赢者通吃:如果某个 \(a_k\) 远大于其他 \(a_j\),则 \(P(y=k \mid \mathbf{x}) \approx 1\),而其他类别的概率趋近于0。这使得模型能够做出“硬”决策。

在生成式方法中,我们需要估计所有类别的均值 \(\boldsymbol{\mu}_k\) 和共享的协方差矩阵 \(\boldsymbol{\Sigma}\),参数数量为 \(O(K D + D^2)\)。当特征维度 \(D\) 很高时(例如图像像素),估计协方差矩阵会非常困难,这为判别式方法提供了动机。


判别式学习与梯度下降

现在,我们忘记生成式假设,直接从逻辑函数形式出发,通过判别式方法进行参数学习。

对于二分类问题,给定数据集 \(\{(\mathbf{x}_i, y_i)\}\),其中 \(y_i \in \{0, 1\}\)。我们采用负对数似然(交叉熵)作为损失函数。对于单个样本,其损失为:

\[\mathcal{L}(\boldsymbol{\theta}) = - \left[ y \log(p) + (1-y) \log(1-p) \right] \]

其中 \(p = P(y=1 \mid \mathbf{x}; \boldsymbol{\theta})\)

我们的目标是最小化总损失(所有样本损失之和)。我们使用梯度下降法进行优化,需要计算损失函数对参数 \(\boldsymbol{\theta}\) 的梯度。

以下是梯度计算的关键步骤:

  1. \(z = \boldsymbol{\theta}^T \mathbf{x}\),则 \(p = \sigma(z) = 1/(1+e^{-z})\)
  2. 应用链式法则:\(\nabla_{\boldsymbol{\theta}} \mathcal{L} = (\frac{d \mathcal{L}}{d z}) (\nabla_{\boldsymbol{\theta}} z)\)
  3. 经过计算和化简,可以得到一个非常简洁的梯度表达式:

    \[\nabla_{\boldsymbol{\theta}} \mathcal{L} = (p - y) \mathbf{x} \]

这个结果非常直观:

  • 梯度方向:梯度指向数据点 \(\mathbf{x}\) 的方向。
  • 更新规则:参数更新为 \(\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \eta (p - y) \mathbf{x}\),其中 \(\eta\) 是学习率。
  • 物理意义:如果真实标签 \(y=1\) 但模型预测概率 \(p\) 很小,则 \((p-y)\) 为负,更新会使 \(\boldsymbol{\theta}\)\(\mathbf{x}\) 的方向增加,从而提高下次预测 \(p\) 的值。反之亦然。每个数据点都在“推动”参数向正确的方向调整。

这个推导的优美之处在于其通用性。即使 \(z\) 不是 \(\boldsymbol{\theta}^T \mathbf{x}\) 这样的线性函数,而是任何复杂的可微函数(例如神经网络的输出),梯度计算的核心部分 \((p-y) \nabla_{\boldsymbol{\theta}} z\) 依然成立。这为深度学习中的反向传播算法奠定了基础。

多分类逻辑回归的梯度推导与此类似,鼓励大家课后自行完成。


神经网络:来自神经科学的启发

最后,我们从一个不同的视角——神经科学——来引出神经网络的基本思想。

历史上,人们对大脑结构的认识不断深入。从11世纪最早的神经系统手绘图,到19世纪末Cajal和Golgi利用染色技术绘制的精美神经元图谱,揭示了大脑是由离散的神经元细胞通过突触连接而成的网络。

关键生物学事实为神经网络提供了灵感:

  1. 结构:神经元由接收信号的树突、处理信号的细胞体和发送信号的轴突组成。
  2. 信号:神经元通过电脉冲(动作电位)通信,可以近似看作一种二值(激活/静息)或频率编码信号。
  3. 连接:神经元之间通过突触连接,突触具有强度(权重),可表现为兴奋性(正权重)或抑制性(负权重)。
  4. 整合与激活:一个神经元接收来自众多前序神经元的信号,进行加权求和。如果总输入超过某个阈值,则产生输出脉冲。这个“整合-发放”过程可以抽象为一个加权和 followed by 一个非线性激活函数(如Sigmoid函数,将输入映射到[0,1]区间,模拟放电率)。

基于这些观察,我们可以构建一个简化的计算模型:

  • 输入层:对应感觉神经元,接收外部特征 \(\mathbf{x} = (x_1, x_2, ...)\)
  • 隐藏层:对应大脑中的中间神经元。每个神经元计算 \(z_j = \sigma(\sum_i \theta_{ji}^{(1)} x_i)\),其中 \(\sigma\) 是激活函数。
  • 输出层:对应决策神经元,计算 \(y_k = \sigma(\sum_j \theta_{kj}^{(2)} z_j)\)
  • 组合:通过堆叠多个这样的层,就构成了一个前馈神经网络。其核心特点是层级化和组合性

现代大型神经网络(如GPT-4)拥有约 \(10^{12}\) 量级的参数(突触权重)。作为对比,人脑约有 \(10^{11}\) 个神经元和 \(10^{15}\) 个突触。尽管在规模和结构上存在差异,但二者都体现了通过大量简单计算单元互联来解决复杂问题的核心思想。


本节课中我们一起学习了逻辑回归的几何解释与判别式学习方法,推导了多分类Softmax回归,并理解了梯度下降更新规则的直观意义。最后,我们从神经科学的历史和原理出发,引出了人工神经网络的基本构建思想。下一讲,我们将深入探讨神经网络的训练算法——反向传播。

8:反向传播与梯度下降 1

在本节课中,我们将学习神经网络的基础、梯度下降的几何意义以及随机梯度下降的原理。我们将从回顾逻辑回归开始,逐步构建对神经网络和其训练算法的理解。

回顾:逻辑回归与决策边界

上一节我们介绍了逻辑回归的几何解释。核心思想是将输入向量 x 分解为与参数向量 θ 平行和垂直的两个部分:x = x∥ + x⊥。

由于 θ · x⊥ = 0,垂直于 θx 分量不影响分类概率。因此,决策边界垂直于 θ。同时,θ 指向类别 1 的方向,因为当 θ · x 趋近于正无穷时,P(y=1|x) 趋近于 1。

对于多类分类(K > 2),在类条件密度为具有固定协方差矩阵的高斯分布这一假设下,我们推导出了 softmax 函数。

从最大似然的角度,我们定义了损失函数(负对数似然)并计算了其梯度。梯度的解释很直观:对于每个数据点,如果其真实标签与模型预测不符,梯度会推动参数 θ 向正确的方向调整。

神经网络作为非线性函数

本节中,我们来看看神经网络如何作为一种强大的非线性函数逼近器。

基本结构与符号

一个神经网络接收输入 x⁰(第0层,即输入层)。每一层(第 l 层)的神经元接收来自前一层(第 l-1 层)的信号,进行线性组合后,再通过一个非线性激活函数 g

公式:对于第 l 层的第 j 个神经元,其激活值 xⱼˡ 计算如下:

zⱼˡ = Σᵢ θⱼᵢˡ * xᵢˍˡ⁻¹ + bⱼˡ
xⱼˡ = g(zⱼˡ)

其中,θⱼᵢˡ 是连接权重,bⱼˡ 是偏置项(通常通过添加一个值恒为1的“偏置神经元”来实现)。

激活函数示例

激活函数 g 引入了非线性,这是神经网络表达能力的关键。以下是一些常见例子:

  • Sigmoid/Logistic: g(z) = 1 / (1 + e⁻ᶻ)。将输出压缩到(0,1)区间,常用于二分类输出层。
  • 线性: g(z) = z。用于回归问题的输出层。
  • ReLU (整流线性单元): g(z) = max(0, z)。计算高效,能缓解梯度消失问题,是隐藏层最常用的激活函数之一。
  • SiLU/Swish: g(z) = z * sigmoid(z)。一种平滑的、表现良好的激活函数。

重要提示:如果所有激活函数都是线性的,那么整个多层网络将退化为一个单层线性网络,失去其强大的表示能力。因此,隐藏层必须使用非线性激活函数。

多层神经网络与通用近似定理

我们可以堆叠多个层来构建深度神经网络。一个著名的理论结果是通用近似定理:只要使用非线性激活函数(如Sigmoid),一个单隐藏层的前馈神经网络,在隐藏层神经元足够多的情况下,可以以任意精度逼近任何连续函数。

这意味着神经网络在理论上具有强大的函数表示能力。输入层和输出层的维度由问题本身决定(如图像像素数、分类类别数),而中间隐藏层的结构和大小则是我们可以设计的超参数。

优化基础:梯度下降

为了训练神经网络,我们需要优化其参数以最小化损失函数。这通常通过梯度下降法及其变种来实现。

梯度的几何解释

梯度 ∇f(θ) 指向函数 f 在点 θ增长最快的方向。其大小表示增长率。

一个关键的性质是:在任意点 θ,梯度向量垂直于该点处函数的等高线(即所有使函数值相等的点构成的曲面)。这可以通过链式法则证明:考虑一个在等高线上运动的轨迹 θ(t),由于 f(θ(t)) 为常数,其对时间的导数为零,即 ∇f · (dθ/dt) = 0。由于 dθ/dt 是等高线的切向方向,因此梯度 ∇f 必垂直于该切线方向。

学习率与收敛性

梯度下降的更新规则为:
公式θ_{t+1} = θ_t - ε ∇f(θ_t)
其中 ε 是学习率。

学习率的选择至关重要。以一个简单的一维二次函数 f(θ) = θ² / (2α) 为例:

  • 如果 ε 设置过小,收敛速度会非常慢。
  • 如果 ε 设置得恰到好处(例如 ε = α),可以一步到达最优解。
  • 如果 ε 设置过大(例如 ε > 2α),更新过程将会发散,参数在最优解两侧震荡甚至趋于无穷。

在高维空间中,损失函数的“地形”可能非常复杂,在不同方向上具有不同的曲率(即二阶导数)。最陡峭的方向决定了我们能使用的最大稳定学习率,而最平缓的方向则决定了收敛到最小值所需的时间。这解释了为什么优化深度神经网络具有挑战性。

随机梯度下降

在实际的机器学习问题中,损失函数通常是所有训练样本上个体损失之和:
公式L(θ) = (1/N) Σ_{i=1}^N L_i(θ)
其中 L_i(θ) 是第 i 个样本的损失。

标准的(批量)梯度下降需要计算整个训练集上的梯度,这在数据集很大时计算代价极高。随机梯度下降 采用了一种近似但高效的方法:

  • 在每一步,随机选取一个(或一小批)样本。
  • 仅用这个(批)样本的梯度 ∇L_i(θ) 来近似整个数据集的梯度 ∇L(θ)
  • 进行参数更新:θ_{t+1} = θ_t - ε ∇L_i(θ_t)

可以将小批量梯度视为真实梯度加上一个“噪声”。这个噪声有其两面性:

  1. 好处:在非凸的损失地形中,噪声可以帮助参数跳出较差的局部极小值,有可能找到更好的解。
  2. 坏处:噪声会导致更新路径不稳定,在接近最优解时会产生震荡,减慢收敛速度。

为了平衡,实践中常采用小批量随机梯度下降,即每次使用一小批(例如32、64、128个)样本计算梯度。常见的策略是,在训练初期使用较小的批量大小以利用噪声的探索能力,在训练后期增大批量大小或降低学习率以减少噪声,实现稳定收敛。

总结

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

  1. 神经网络的基础:了解了其作为非线性函数逼近器的结构,包括层、神经元、权重、偏置和激活函数。
  2. 优化核心:深入探讨了梯度的几何意义(垂直于等高线),并分析了学习率对梯度下降收敛性的关键影响。
  3. 实用算法:介绍了随机梯度下降及其小批量变种,理解了其通过引入噪声来应对非凸优化问题和提升大规模数据训练效率的原理。

下一节课,我们将在此基础上,深入探讨反向传播算法,它是高效计算神经网络中损失函数对所有权重梯度的核心方法。

9:反向传播与梯度下降 2

在本节课中,我们将学习神经网络中一个核心且优雅的算法——反向传播。我们将从单层网络开始,逐步推导出适用于深度网络的通用梯度计算规则,并理解其高效计算的原理。

上一节我们介绍了神经网络的基本结构和前向传播过程。本节中,我们来看看如何高效地计算损失函数对所有参数的梯度,这是训练神经网络的关键。

神经网络与损失函数回顾

我们有一个由 L 层组成的神经网络。其前向传播过程可以描述为:从输入 x0 开始,逐层计算“预激活”信号 a,然后通过非线性激活函数 g 得到该层的激活值 x,并作为下一层的输入。

公式表示:
对于第 l 层(l 从 1 到 L):

  1. 预激活:a_j^l = Σ_i θ_{ji}^l * x_i^{l-1}
  2. 激活:x_j^l = g(a_j^l)

通常,最后一层(第 L 层)的激活函数是线性的,即 x_j^L = a_j^L。网络的最终输出取决于任务:对于回归,可能是一个标量;对于二分类,是一个代表概率的标量;对于多分类,是 K 个标量,经过 Softmax 后得到类别概率。

损失函数 L 衡量网络预测与真实标签的差距。我们之前已经推导了几种常见任务的损失函数:

  • 回归(高斯假设)L = 1/2 * (y - a^L)^2
  • 二分类(伯努利假设)L = -[y * log(σ(a^L)) + (1-y) * log(1-σ(a^L))],其中 σ 是 Sigmoid 函数。
  • 多分类(多项分布假设)L = -Σ_{k=1}^K y_k * log(p_k),其中 p_k = e^{a_k^L} / Σ_j e^{a_j^L}(Softmax)。

一个关键的观察是:损失函数 L 总是通过最后一层的预激活值 a^L 依赖于网络参数 θ。这强烈暗示我们应该使用链式法则来计算梯度。

单层网络的梯度计算

为了建立直觉,我们先考虑一个单层神经网络(L=1)。此时,预激活 a 就是输入的线性组合:a = θ^T x

我们想计算损失 L 对参数 θ 的梯度。根据链式法则:
∂L/∂θ = (∂L/∂a) * (∂a/∂θ)

这个公式非常通用,即使对于深度网络,其形式也保持不变。其中:

  • ∂a/∂θ 很简单,就是输入 x
  • ∂L/∂a 是损失对最后一层激活的梯度,它包含了“误差”信号。

以下是不同损失函数对应的 ∂L/∂a 计算结果:

回归:
∂L/∂a = -(y - a)
这直观地表示预测值 a 与真实值 y 之间的差距。

二分类:
∂L/∂a = σ(a) - y
其中 σ(a) 是模型预测的概率。当 y=1 时,我们希望 σ(a) 接近 1,误差 σ(a)-1 为负,驱动学习。

多分类:
∂L/∂a_k = p_k - y_k
其中 p_k 是 Softmax 输出的第 k 类概率,y_k 是 one-hot 编码的真实标签(第 k 位为 1,其余为 0)。这同样是预测概率与真实标签的差值。

可以看到,在输出层,∂L/∂a^L 具有清晰的“误差”语义。它衡量了网络顶层预测与目标的差异。

反向传播算法

对于深度网络,我们需要计算损失 L 对网络中任意参数 θ_{ji}^l 的梯度。直接使用有限差分法(对每个参数进行微小扰动)的计算成本是 O(M^2)(M 为参数总数),对于现代动辄数十亿参数的网络来说是不可行的。

反向传播算法提供了一种精确且高效(O(M))的计算方法。其核心思想是利用链式法则,将顶层的误差信号逐层向后(反向)传播

我们定义第 l 层第 j 个神经元的误差为:
δ_j^l = ∂L / ∂a_j^l

我们的目标是计算任意参数 θ_{ji}^l 的梯度。根据链式法则:
∂L/∂θ_{ji}^l = (∂L/∂a_j^l) * (∂a_j^l/∂θ_{ji}^l) = δ_j^l * x_i^{l-1}

因此,问题的关键变成了如何高效计算所有层的 δ_j^l

误差的反向传播公式

我们已知输出层(第 L 层)的误差 δ^L,其计算公式已在上一节给出(即 p_k - y_k 等形式)。

对于第 l 层(l < L)的误差 δ_j^l,我们可以通过第 l+1 层的误差 δ_k^{l+1} 来计算。再次应用链式法则,考虑 a_j^l 如何影响后续所有层的损失:

δ_j^l = ∂L/∂a_j^l = Σ_k (∂L/∂a_k^{l+1}) * (∂a_k^{l+1}/∂a_j^l) = Σ_k δ_k^{l+1} * (∂a_k^{l+1}/∂a_j^l)

现在需要计算 ∂a_k^{l+1}/∂a_j^l。根据前向传播公式:
a_k^{l+1} = Σ_m θ_{km}^{l+1} * x_m^l = Σ_m θ_{km}^{l+1} * g(a_m^l)

当对特定的 a_j^l 求偏导时,求和中只有 m=j 的项有贡献:
∂a_k^{l+1}/∂a_j^l = θ_{kj}^{l+1} * g'(a_j^l)

将其代回误差公式,我们得到反向传播的核心递归公式

δ_j^l = g'(a_j^l) * Σ_k θ_{kj}^{l+1} * δ_k^{l+1}

这个公式非常优美:

  1. 局部梯度g'(a_j^l) 是激活函数在当前位置的导数。
  2. 加权误差和Σ_k θ_{kj}^{l+1} * δ_k^{l+1} 是下一层所有神经元的误差 δ_k^{l+1},以连接权重 θ_{kj}^{l+1} 为权重的加权和。注意:这里使用的权重 θ_{kj}^{l+1} 是前向传播时从本层 j 神经元连接到下一层 k 神经元的权重。在反向传播时,信号沿着相同的连接路径反向流动,但使用了权重的转置形式(下标 kj 与正向的 jk 顺序相反,体现了“反向”)。

算法步骤总结

综合以上,完整的反向传播算法步骤如下:

  1. 前向传播:输入数据,计算每一层的 a^lx^l(即 g(a^l)),并保存下来。
  2. 计算输出层误差:根据损失函数类型,计算 δ^L = ∂L/∂a^L
    • 回归:δ^L = -(y - a^L)
    • 二分类:δ^L = σ(a^L) - y
    • 多分类:δ^L = p - y (向量形式,p 为 Softmax 输出概率)
  3. 反向传播误差:对于 l = L-1, L-2, ..., 1,利用递归公式计算:
    δ^l = g'(a^l) ⊙ ((θ^{l+1})^T δ^{l+1})
    其中 表示逐元素相乘,(θ^{l+1})^T 是权重矩阵的转置。
  4. 计算参数梯度:对于每一层 l,利用保存的 x^{l-1} 和计算好的 δ^l
    ∂L/∂θ^l = δ^l * (x^{l-1})^T
    (对于偏置项,其梯度就是 δ^l)。

该算法只需一次前向传播和一次反向传播,即可计算出损失函数对所有参数的梯度,计算复杂度与参数数量 M 成线性关系,极其高效。

反向传播的直观理解与意义

反向传播算法之所以得名,是因为它沿着网络反向传播误差信号。输出层的误差 δ^L 代表了网络最终输出的“错误程度”。这个误差被分解,并沿着产生它的路径(即网络的连接)分配回中间的神经元。

每个中间神经元的误差 δ_j^l 可以理解为“该神经元对最终输出误差应负的责任”。这个责任由两部分决定:

  1. 该神经元激活函数的局部斜率(g'(a_j^l)):如果它对输入变化不敏感,则责任小。
  2. 以该神经元为起点的所有连接,其下游神经元的误差的加权和(Σ_k θ_{kj}^{l+1} * δ_k^{l+1}):如果它强烈影响了某些犯了大错的下游神经元,则它的责任就大。

这种将误差责任反向分配的过程,与人类学习中的反思过程有相似之处。

扩展:计算图与自动微分

我们推导的反向传播算法针对的是简单的全连接前馈网络。现代神经网络结构复杂,可能包含跳跃连接、分支、循环等。为此,更通用的框架是将计算过程表示为计算图

自动微分(Automatic Differentiation, AD)系统(如 PyTorch、TensorFlow 的核心)允许用户定义任意计算图,并自动计算任意节点的梯度。反向传播是自动微分中“反向模式”的一个特例。

在计算图中,反向传播的本质是:

  • 前向传播:执行图的计算,并保存所有中间结果。
  • 反向传播:从输出(损失)节点开始,应用链式法则,递归地计算每个节点对损失的梯度。对于每个操作节点,都需要定义其“反向传播函数”,该函数知道如何将输出梯度映射回输入梯度。

本节课中我们一起学习了反向传播算法的原理与推导。我们从单层网络的梯度计算出发,通过定义“误差”并推导其层与层之间的递归关系,得到了高效计算深度神经网络所有参数梯度的反向传播算法。理解这一算法是掌握神经网络训练机制的基础。下一讲,我们可能会探讨与此相关的梯度消失/爆炸等问题。

10:神经网络 - CNN、批归一化与残差网络

在本节课中,我们将深入学习一类重要的神经网络架构——卷积神经网络。我们将探讨其核心思想、结构,并了解如何通过批归一化和残差连接等技术来优化深度网络的训练。


课程回顾与动机

上一节我们介绍了如何通过组合简单的线性变换和非线性激活函数来构建强大的神经网络。这种组合可以形式化地表示为函数 F_θ,其中 θ 包含了网络的所有参数。

对于典型的监督学习问题,我们通过最小化负对数似然损失函数来训练网络,其形式通常为:
L(θ) = Σ_i l(y_i, F_θ(x_i))
例如,对于多分类问题,损失函数是交叉熵损失。

我们拥有高效的反向传播算法来计算这个复杂损失函数的梯度。然而,即使有了强大的优化工具,直接将全连接网络应用于某些问题(如图像识别)仍然面临巨大挑战。

接下来,我们将探讨这些挑战以及卷积神经网络如何巧妙地解决它们。


全连接网络的局限性

全连接网络在处理高维输入(如图像)时面临几个主要问题:

  1. 参数爆炸:对于一张百万像素的图片,如果第一个隐藏层有1000个神经元,那么仅这一层就需要10^9个参数。这在计算和存储上都是不可行的。
  2. 过拟合风险:当参数数量远大于训练样本数量时,模型极易记住训练数据中的噪声,导致泛化能力差。
  3. 缺乏归纳偏置:全连接网络没有内置任何关于数据结构的先验知识。例如,它不知道图像中的物体平移后,其类别应该保持不变。网络需要从海量数据中从头学习这些不变性,效率低下。

因此,我们需要一种能够将我们对问题(如图像的平移不变性)的先验知识“烘焙”进网络架构本身的方法。


卷积神经网络的核心思想

卷积神经网络的核心设计理念是引入平移等变性平移不变性的归纳偏置。

  • 平移不变性:对于分类任务,我们希望网络对输入图像中物体的平移不敏感。即,如果 T(x) 是图像 x 的平移版本,那么对于分类函数 F_θ,我们希望 F_θ(T(x)) = F_θ(x)
  • 平移等变性:对于像素级任务(如分割),我们希望网络的输出能随着输入的平移而相应平移。即,F_θ(T(x)) = T(F_θ(x))

CNN 通过一种特殊的、参数共享的层结构来实现这些性质。


卷积操作

与全连接层中每个神经元都与上一层的所有神经元相连不同,卷积层中的每个神经元只与输入数据的一个局部区域(称为感受野)相连。

这个局部连接是通过一个小的、可学习的滤波器(或卷积核)来实现的。滤波器在输入数据上滑动(卷积),计算每个位置的点积并加上偏置,然后通过激活函数。

数学上,对于二维输入(如图像),在位置 (i, j) 的卷积层激活值 a[i, j] 可以表示为:
a[i, j] = σ( Σ_{m=0}^{F-1} Σ_{n=0}^{F-1} θ[m, n] * x[i+m, j+n] + b )
其中:

  • σ 是非线性激活函数(如 ReLU)。
  • θ 是大小为 F x F 的滤波器权重。
  • x 是输入。
  • b 是偏置项。

关键点:同一个滤波器 θ 会被重复应用于整个输入图像的不同位置。这实现了参数共享,极大地减少了参数量,并强制网络学习在空间上平移不变的特征。


卷积层的相关概念

以下是构建卷积层时需要考虑的几个重要操作和超参数:

  • 填充:在输入图像的边缘周围添加额外的像素(通常为0)。这有助于控制输出特征图的空间尺寸。例如,使用 F x F 的滤波器对 W x W 的图像进行卷积,若步长为1且无填充,则输出尺寸为 (W - F + 1) x (W - F + 1)。若希望输入输出尺寸相同,则填充大小 P 应为 (F - 1) / 2(这要求 F 为奇数)。
  • 步长:滤波器在输入上每次滑动的距离。步长大于1会降低输出特征图的空间分辨率,是一种下采样方式。
  • 池化:一种非学习的下采样操作,用于降低特征图尺寸、增加感受野并引入一定程度的平移不变性。最常用的是最大池化,它取局部区域内的最大值作为输出。
  • 通道:输入数据(如RGB图像有3个通道)和卷积层的输出都可以有多个通道。每个通道可以看作是一个独立的特征检测器。卷积操作会跨所有输入通道进行,并生成指定数量的输出通道。

经典CNN架构:VGG16

通过堆叠卷积层、池化层,并在最后连接全连接层,可以构建出强大的图像识别模型。VGG16是一个经典示例:

  1. 输入:224x224 RGB图像。
  2. 主体:一系列卷积层(使用3x3小滤波器)和最大池化层。随着网络加深,特征图空间尺寸逐渐减小(通过池化),而通道数逐渐增加(从64到512),以捕获更抽象的特征。
  3. 分类器:在特征图尺寸变得很小(如7x7)后,将其展平,接入几个全连接层,最终通过softmax输出类别概率。

这种设计非常高效:绝大部分参数集中在最后的全连接层,而前面的卷积层通过参数共享和池化,以较少的参数提取了丰富的层次化特征。


我们学到了什么?可视化与对抗样本

训练好的CNN,其第一层的滤波器通常可以可视化,并常被发现类似于Gabor滤波器(具有特定方向、频率和相位的边缘检测器)。这与生物视觉系统中初级视觉皮层“简单细胞”的响应特性惊人地相似。

我们还可以通过梯度来探究网络内部:

  • 可视化神经元偏好:通过优化输入图像 x 以最大化某个高层神经元的激活,可以生成该神经元所“寻找”的图案(尽管结果可能看起来像抽象的纹理)。
  • 对抗样本:通过对输入图像添加一个精心构造的、人眼难以察觉的小扰动,可以使得网络以高置信度做出错误分类。这揭示了神经网络的决策边界在高维空间中的复杂性。一种防御方法是对抗训练,即将生成的对抗样本加入训练集。

让网络更深:残差网络

理论上,更深的网络应该能学习更复杂的函数。但实践中,单纯增加深度会导致梯度消失/爆炸退化问题:更深网络的训练误差和测试误差反而可能比浅层网络更差。

残差网络 通过引入“快捷连接”巧妙地解决了退化问题。其核心构件是残差块:

在一个残差块中,我们不直接学习从输入 x 到输出 H(x) 的映射,而是学习残差函数 F(x) = H(x) - x。块的输出为:
输出 = F(x) + x
其中 F(x) 通常由两到三个卷积层组成。

直观理解:如果恒等映射 H(x) = x 是最优的,那么将残差 F(x) 推至0比让一堆非线性层去拟合恒等映射要容易得多。快捷连接使得梯度可以直接反向传播到更早的层,缓解了梯度消失问题。

借助残差连接,研究者成功训练了上百甚至上千层的网络,并在多项任务上取得了显著提升。


稳定训练:批归一化

深度网络训练的另一大挑战是内部协变量偏移:随着网络参数的更新,每一层输入的分布会发生改变,这要求后续层不断适应新的分布,减慢了训练速度。

批归一化 的解决方案是:在每一层的激活函数前,对每个小批量数据进行归一化,使其均值为0,方差为1。
对于一个小批量数据 B = {x_1, ..., x_m},批归一化操作如下:
μ_B = (1/m) Σ_{i=1}^{m} x_i // 计算小批量均值
σ_B² = (1/m) Σ_{i=1}^{m} (x_i - μ_B)² // 计算小批量方差
x̂_i = (x_i - μ_B) / √(σ_B² + ε) // 归一化
y_i = γ * x̂_i + β // 缩放和偏移

其中 γβ 是可学习的参数,用于恢复网络的表示能力。ε 是一个小常数,用于数值稳定性。

批归一化使得网络对初始化和学习率更不敏感,允许使用更高的学习率,并具有一定的正则化效果,从而加速训练并常常能提升模型性能。


总结

本节课我们一起深入学习了卷积神经网络及其相关技术:

  1. CNN的核心:通过局部连接、参数共享和池化操作,将平移等变/不变的先验知识嵌入网络架构,高效处理图像等网格化数据。
  2. 经典架构:了解了如VGG16等经典CNN如何通过堆叠卷积层和池化层来构建层次化特征表示。
  3. 可视化与脆弱性:探索了如何可视化网络所学,并认识了对抗样本所揭示的模型决策边界复杂性。
  4. 深度网络训练:认识到训练极深网络的困难,并学习了残差网络通过快捷连接来解决退化问题的巧妙设计。
  5. 训练稳定技术:掌握了批归一化如何通过标准化层激活来加速训练并提升稳定性。

这些概念和组件是现代深度神经网络,尤其是在计算机视觉领域取得成功的基石。

11:注意力机制与Transformer模型

在本节课中,我们将学习如何处理可变长度的输入和输出序列,这是自然语言处理等任务中的核心挑战。我们将从循环神经网络的历史视角出发,探讨其局限性,并最终深入讲解现代序列建模的基石——注意力机制与Transformer架构。

概述:从循环神经网络到注意力机制

上一节我们介绍了卷积神经网络及其在图像处理中的应用。本节中,我们来看看如何处理序列数据,例如句子或蛋白质序列。传统的神经网络要求固定大小的输入,但序列数据长度可变,这带来了挑战。循环神经网络是早期的解决方案,但其存在信息瓶颈和梯度问题。为了解决这些问题,研究者们提出了注意力机制,并最终发展出了强大的Transformer模型。

序列建模的挑战

以下是几种常见的序列建模任务,它们都涉及可变长度的输入或输出:

  1. 固定长度输入到固定长度输出:例如,图像分类。输入(图像)和输出(类别标签)都是固定大小的。
  2. 可变长度输入到单个输出:例如,情感分析。输入是一个可变长的句子,输出是一个情感标签(积极/消极)。
  3. 可变长度输入到等长输出:例如,蛋白质结构预测。输入是氨基酸序列,输出是每个氨基酸的3D坐标,输入输出长度相同。
  4. 可变长度输入到可变长度输出:例如,机器翻译或图像描述生成。输入和输出的长度可以不同,且输出长度由模型决定。

使用我们目前学到的工具(如标准全连接网络或卷积网络)很难直接处理最后两种,尤其是输入输出长度不同的情况。卷积网络虽然输出大小依赖于输入,但其关系是确定性的,难以处理输出长度与输入解耦的任务。

循环神经网络:初步解决方案

为了处理可变长度序列,人们最初设计了循环神经网络。其核心思想是引入一个“记忆”状态,该状态随着序列的推进而更新。

RNN的基本结构

假设我们有一个输入序列 X = [x1, x2, x3, ...]。在RNN中,我们不是一次性处理整个序列,而是按时间步逐步处理。

在时间步 t,RNN单元会做两件事:

  1. 结合当前输入 xt 和上一个时间步的隐藏状态 a(t-1)
  2. 产生当前时间步的隐藏状态 at 和可能的输出 yt

这个过程可以用以下公式描述:
a_t = σ(W * [a_(t-1), x_t] + b)
其中:

  • σ 是非线性激活函数(如Sigmoid或ReLU)。
  • Wb 是可学习的权重矩阵和偏置向量。
  • [a_(t-1), x_t] 表示将两个向量拼接起来。

通过这种方式,at 包含了到时间步 t 为止的所有序列信息。对于分类任务,我们可以取最后一个时间步的隐藏状态 a_T 来进行预测。

RNN的变体与应用

  • 序列标注:如果我们想为序列的每个位置都生成一个输出(如词性标注),可以在每个时间步的隐藏状态 at 上接一个小的解码网络来预测 yt
  • 编码器-解码器架构:对于机器翻译这类任务,我们使用两个RNN。第一个RNN(编码器)将源语言句子编码成一个固定长度的上下文向量。第二个RNN(解码器)以该上下文向量为起点,自回归地(即用上一个输出作为下一个输入)生成目标语言句子。

RNN的局限性

尽管RNN很强大,但它存在两个主要问题:

  1. 信息瓶颈:编码器需要将整个输入序列的信息压缩到一个固定长度的上下文向量中。对于长序列,早期信息很容易在循环过程中被稀释或遗忘。
  2. 梯度消失/爆炸:在长序列上反向传播时,梯度需要通过许多时间步,这可能导致梯度变得极小(消失)或极大(爆炸),使得模型难以训练。

这些局限性促使了注意力机制的发展。

注意力机制:解决信息瓶颈

注意力机制的核心思想是:在解码器生成每一个词的时候,不应该只依赖于编码器最后的那个上下文向量,而应该能够直接“查看”编码器所有时间步的隐藏状态,并动态地决定关注哪些部分。

注意力机制类比:概率化数据库查询

你可以将注意力机制理解为一个概率化的数据库查询系统

  • 数据库:编码器所有时间步的隐藏状态 [h1, h2, ..., hn]。每个状态有两个属性:
  • 查询:解码器当前时间步的隐藏状态 s_t 会生成一个查询向量。
  • 操作查询向量会与数据库中所有的进行匹配(通常计算点积相似度),得到一组“注意力分数”。这些分数经过Softmax归一化后,变成一组权重(概率分布)。最终,解码器得到的上下文向量是数据库中所有的加权和,权重就是这组概率。

公式描述如下:

  1. 计算注意力分数:e_ti = Query(s_t) · Key(h_i)
  2. 归一化得分:α_ti = softmax(e_ti) = exp(e_ti) / Σ_j exp(e_tj)
  3. 计算上下文向量:context_t = Σ_i (α_ti * Value(h_i))

这样,解码器在生成每个词时,都能获取到输入序列中最相关的部分信息,而非仅仅依赖一个压缩的总结。这极大地改善了对长序列的处理能力。

Transformer:基于自注意力的全新架构

注意力机制最初是作为RNN的增强组件出现的。但研究者很快发现,我们可以完全摒弃RNN的循环结构,仅用注意力来构建序列模型。这就是Transformer的核心思想。

自注意力

在编码器-解码器注意力中,查询来自解码器,键和值来自编码器。如果我们想让一个序列内部的元素相互关注(例如,理解一个句子中词与词之间的关系),就需要自注意力

自注意力的计算过程与上述注意力完全相同,只是查询、键、值都来自同一个序列。通过自注意力层,序列中每个位置都能聚合整个序列的信息。

Transformer的核心组件

一个Transformer块通常包含以下层:

  1. 多头自注意力层:这是核心。与其只有一个注意力“头”,我们使用多个头(例如8个)。每个头都有自己独立的查询、键、值变换矩阵,可以学习关注序列中不同方面的信息(例如语法结构、语义关系)。多个头的输出会被拼接并线性变换。
    MultiHead(Q, K, V) = Concat(head1, head2, ..., head_h) * W^O
    where head_i = Attention(Q * W_i^Q, K * W_i^K, V * W_i^V)

  2. 位置编码:自注意力本身是置换等变的,即打乱输入顺序,输出也会相应打乱,但它无法感知原始顺序。为了注入序列的顺序信息,我们在输入词嵌入上加上一个“位置编码”向量。原始Transformer使用不同频率的正弦和余弦函数来生成这个编码:
    PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
    PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
    其中 pos 是位置,i 是维度索引。这种编码既能提供绝对位置信息,也能提供相对位置信息。

  3. 前馈神经网络:在注意力层之后,每个位置会独立地通过一个全连接前馈网络(通常包含两层和非线性激活函数),进行进一步的特征变换。
    FFN(x) = max(0, x * W1 + b1) * W2 + b2

  4. 残差连接与层归一化:每个子层(自注意力层、前馈层)都包裹着残差连接和层归一化,这有助于稳定和加速深度网络的训练。
    LayerNorm(x + Sublayer(x))

Transformer的编码器与解码器

一个完整的Transformer模型用于机器翻译等任务时,包含:

  • 编码器:由N个相同的层堆叠而成,每层包含多头自注意力和前馈网络。编码器处理输入序列,为每个词生成丰富的上下文表示。
  • 解码器:也由N个相同的层堆叠而成。每层包含:
    • 掩码多头自注意力层:确保在预测位置 t 时,只能看到 t 之前的位置,防止信息泄露(自回归特性)。
    • 编码器-解码器注意力层:其查询来自解码器,键和值来自编码器的最终输出。这让解码器在生成每个词时都能聚焦于输入序列的相关部分。
    • 前馈网络。

解码器以自回归方式工作,从<start>标记开始,依次生成输出序列,直到产生<end>标记。

总结

本节课中我们一起学习了序列建模的演进之路。我们从处理可变长度序列的挑战出发,介绍了循环神经网络及其在编码器-解码器架构中的应用。为了克服RNN的信息瓶颈和梯度问题,我们深入探讨了注意力机制,它允许模型动态地关注输入序列的不同部分。最终,我们看到了如何将注意力机制发扬光大,通过引入自注意力、位置编码、多头机制等组件,构建出完全无需循环结构的Transformer模型。Transformer以其强大的并行计算能力和对长程依赖的有效建模,已成为当今自然语言处理乃至多模态人工智能领域最主流的架构基石。

12:降维与PCA

在本节课中,我们将学习一种非常重要的无监督学习技术——主成分分析。我们将从介绍无监督学习的概念开始,然后深入探讨PCA的数学原理、算法步骤及其应用。最后,我们会简要介绍奇异值分解,这是一种更高效计算PCA的方法。

无监督学习简介

上一节我们完成了关于Transformer架构的讨论。本节中,我们来看看机器学习中另一个重要的领域:无监督学习。

在监督学习中,我们处理的是带有标签的数据对 (X, y)。而在无监督学习中,我们只有输入数据 X,没有对应的目标变量 y。那么,我们能用这些数据做什么呢?

以下是几种常见的无监督学习任务:

  • 降维:当数据特征维度非常高时,我们可能希望在不丢失太多信息的前提下,减少特征的数量,使数据处理和分析更加容易。
  • 聚类:将数据样本分组,使得组内样本彼此相似,组间样本差异较大。
  • 表示学习:学习如何将原始特征空间转换到一个新的、对后续任务更有帮助的特征空间。
  • 密度估计:估计数据背后的概率分布。
  • 生成建模:学习数据的分布,以便生成新的、类似的数据样本(例如,大型语言模型)。

降维与流形假设

降维是无监督学习中的一个核心任务。其背后的一个关键思想是流形假设

流形假设认为,现实世界中的高维数据往往分布在一个低维的流形附近。流形是一个数学概念,粗略地说,它是一个局部类似于欧几里得空间的低维结构。

例如,一个三维空间中的瑞士卷形状数据,虽然坐标是三维的 (x, y, z),但本质上可以用两个坐标(沿着卷的长度和环绕的角度)来唯一确定每个点,而不丢失信息。这意味着数据实际上“生活”在一个二维流形上。

降维的目标之一就是找到这个低维流形,将数据嵌入到这个低维空间中。

主成分分析:核心思想

主成分分析是一种经典且广泛使用的线性降维技术。它的目标是为数据找到一组新的正交基(称为主成分),使得当数据投影到这组基上时,能够最大程度地保留原始信息。

我们可以从两个等价的角度来理解PCA:

  1. 最大方差角度:第一个主成分方向是数据投影后方差最大的方向。第二个主成分方向是与第一个正交的方向中,投影后方差最大的方向,依此类推。保留方差最大的方向,意味着保留了数据中最主要的变异信息。
  2. 最小重构误差角度:PCA寻找一组基,使得当数据用这组基的前K个分量(即降维后)来近似重构时,重构数据与原始数据之间的误差(通常用欧氏距离衡量)最小。

这两个视角在数学上是等价的。

PCA算法步骤

接下来,我们一步步地看PCA的具体算法流程。

第一步:数据预处理(中心化)

首先,我们必须对每个特征进行中心化处理,即减去该特征的均值,使得每个特征的均值为0。

公式X_centered = X - mean(X)

中心化是必要的。如果不中心化,第一个主成分可能会指向数据的均值方向,而不是数据变异最大的方向。

第二步:计算协方差矩阵

假设我们有 n 个数据点,每个点有 d 个特征。中心化后的数据矩阵为 Xn x d 维)。我们计算其协方差矩阵 Σ

公式Σ = (1/(n-1)) * X^T * X

这是一个 d x d 的对称矩阵,描述了不同特征之间的协方差关系。

第三步:特征分解(谱分解)

我们对协方差矩阵 Σ 进行特征分解(谱分解)。

公式Σ = Q Λ Q^T

  • Q 是一个 d x d 的正交矩阵,其列向量 q_i 就是特征向量,也就是我们寻找的主成分方向
  • Λ 是一个 d x d 的对角矩阵,对角线上的元素 λ_i 是特征值。特征值 λ_i 的大小代表了其对应的主成分方向所携带的方差量。

特征分解后,我们按特征值从大到小对特征向量进行排序。λ_1 最大,对应的 q_1 是第一主成分;λ_2 次之,对应 q_2,依此类推。

第四步:选择主成分与降维

现在我们需要决定保留多少个主成分 kk < d)。这通常通过观察累计方差贡献率来决定。

每个主成分的方差贡献率为:λ_i / (λ_1 + λ_2 + ... + λ_d)
累计方差贡献率是前 k 个贡献率的和。

我们绘制累计方差贡献率随 k 变化的曲线(碎石图),通常选择在曲线拐点(斜率明显变缓)处的 k 值,作为降维后的维度。

第五步:数据投影(得到低维表示)

我们选取前 k 个特征向量组成矩阵 Q_kd x k 维)。将中心化后的原始数据投影到这个低维空间上,得到降维后的数据表示 Z,也称为主成分得分。

公式Z = X_centered * Q_k

Z 是一个 n x k 的矩阵,即每个原始数据点现在用 k 个新特征(主成分得分)表示。

第六步:数据重构(可选)

为了评估降维效果或可视化,我们可以将低维数据 Z 重构回原始的高维空间。由于我们丢弃了 (d-k) 个主成分,重构会有损失。

公式X_reconstructed = Z * Q_k^T + mean(X)

这里的 X_reconstructed 是使用 k 个主成分对原始数据的最佳线性近似。

PCA实例:特征脸

一个著名的PCA应用是“特征脸”。假设我们有一个包含许多人脸图像的数据集,每张图像是 32x32=1024 像素。将每张图像拉平成一个1024维的向量。

对这个人脸数据矩阵进行PCA:

  • 计算得到的特征向量 q_i 本身也是1024维的向量,可以重新reshape成 32x32 的图像。这些图像看起来像是模糊的人脸基图像,因此被称为“特征脸”。
  • 第一特征脸对应方差最大的方向,捕捉了所有人脸共有的最显著模式(如背景和平均脸结构)。
  • 更高阶的特征脸捕捉了更细微的、频率更高的变化模式(如眼睛、嘴巴的细节)。
  • 我们可以用前100个特征脸来近似表示任何一张原始人脸,只需存储100个系数(主成分得分),从而实现了大幅度的数据压缩。重构后的人脸虽然丢失了一些细节,但视觉上仍然可辨认。

奇异值分解:一种更高效的计算方法

直接对 d x d 的协方差矩阵进行特征分解,计算复杂度是 O(d^3)。当特征维度 d 非常大(例如,图像像素很多)时,这会非常耗时。

更高效的方法是使用奇异值分解直接对中心化后的数据矩阵 Xn x d 维)进行操作。

SVD将矩阵 X 分解为:
公式X = U S V^T

  • Un x n 的正交矩阵。
  • Sn x d 的矩形对角矩阵,对角线上的元素称为奇异值 σ_i
  • Vd x d 的正交矩阵,其列向量 v_i 被称为右奇异向量。

关键联系在于:

  • PCA所需要的特征向量 q_i 正是SVD中的右奇异向量 v_i
  • PCA中的特征值 λ_i 与奇异值 σ_i 的关系为:λ_i = (σ_i^2) / (n-1)

因此,我们可以跳过显式计算协方差矩阵 X^T X 的步骤,直接对数据矩阵 X 进行SVD,并从结果中提取 V 的前 k 列作为主成分方向。当 n < d(样本数少于特征数)时,SVD的计算效率远高于直接的特征分解。

总结

本节课中我们一起学习了主成分分析这一核心的无监督降维技术。

  • 我们首先了解了无监督学习的目标和流形假设。
  • 然后,我们从最大方差和最小重构误差两个角度理解了PCA的直观思想。
  • 我们详细拆解了PCA的标准算法步骤:中心化、计算协方差、特征分解、选择主成分、投影降维。
  • 我们通过“特征脸”的例子看到了PCA的强大应用。
  • 最后,我们介绍了使用奇异值分解来高效计算PCA的数学原理和实用优势。

PCA作为一种基础方法,不仅本身用途广泛,也为理解更复杂的非线性降维和表示学习模型奠定了基础。

13:t-SNE降维教程 🧠

在本节课中,我们将学习一种非常流行的非线性降维方法——t-SNE。我们将从回顾PCA开始,逐步引入非线性降维的思想,最终详细讲解t-SNE的原理、算法及其优缺点。本教程旨在让初学者能够轻松理解。


概述:从线性到非线性降维

上一节我们介绍了主成分分析(PCA),它是一种通过寻找全局最大方差方向来进行线性降维的方法。然而,对于许多复杂的数据结构(如“瑞士卷”或MNIST手写数字),线性方法可能无法有效地揭示数据的真实低维流形结构。

本节中,我们将探讨如何超越线性假设,学习一种旨在保持数据局部邻域结构的非线性降维技术——t-SNE。


PCA回顾与局限

PCA通过奇异值分解(SVD)或协方差矩阵的特征分解,为数据找到一组最优的正交基。新的低维表示通过将原始数据投影到这组基上获得。

核心公式
若数据矩阵为 X(已中心化),其协方差矩阵为 C = X^T X / (n-1)。PCA求解 C 的特征值和特征向量。低维表示 Z 可通过 Z = X V_k 计算,其中 V_k 是前 k 个特征向量组成的矩阵。

然而,PCA存在局限:

  • 全局线性:PCA寻找的是适用于所有数据点的全局线性变换。对于非线性流形上的数据(如瑞士卷),这种全局线性投影无法“展开”数据。
  • 高斯假设:虽然PCA不严格要求数据服从高斯分布,但其“最大方差方向”的直觉在高斯分布或单峰分布的数据上效果最好。对于多类别、多簇结构的数据,PCA可能无法很好地区分。

引入非线性:从ISOMap到t-SNE

为了处理非线性结构,我们需要放弃全局线性变换的思想,转而关注如何保持数据点之间的局部邻近关系

ISOMap:基于邻域图的降维

ISOMap是这一思路的早期代表。其核心思想是:两点间的“距离”不应是欧氏距离,而应是在数据流形上沿着邻域图行走的测地线距离

算法步骤简述

  1. 为每个数据点确定其 k 个最近邻(根据欧氏距离)。
  2. 构建 k-近邻图,将每个点与其 k 个近邻连接。
  3. 计算图中任意两点之间的最短路径距离(例如使用Dijkstra算法),得到距离矩阵 D
  4. 对距离矩阵 D 应用多维缩放(MDS),从而得到低维嵌入 Y。MDS试图找到一组低维点,使得这些点之间的欧氏距离矩阵尽可能接近给定的距离矩阵 D

ISOMap成功的关键在于邻域大小 k 的选择。k 太小可能导致图不连通;k 太大则可能短路流形,将本不该邻近的点连接起来。

随机邻域嵌入(SNE):软化邻域概念

SNE对ISOMap的“硬”邻域分配进行了改进,引入了概率来描述点与点之间的邻近关系,使其更加鲁棒。

核心思想
对于高维空间中的点 x_i,我们定义点 x_jx_i 的“邻居”的概率。这个概率与以 x_i 为中心的高斯分布密度成正比。

高维空间概率公式
p_{j|i} = exp(-||x_i - x_j||^2 / (2σ_i^2)) / (∑_{k≠i} exp(-||x_i - x_k||^2 / (2σ_i^2)))
这里,σ_i 是以 x_i 为中心的高斯分布的方差(带宽参数)。p_{j|i} 可以理解为:如果 x_i 要挑选一个邻居,它选中 x_j 的概率。

为了使概率对称,定义联合概率:
p_{ij} = (p_{j|i} + p_{i|j}) / (2n)

带宽参数 σ_i 的设置
SNE通过设定一个称为困惑度(Perplexity) 的超参数来为每个点 x_i 自动选择 σ_i。困惑度可以理解为对有效邻居数量的平滑度量。通过二分搜索调整 σ_i,使得条件概率分布 P_i 的熵等于 log2(Perplexity)

低维空间与优化目标
现在,我们假设存在一个低维表示 Y = {y_1, y_2, ..., y_n}。在低维空间中,我们同样用高斯分布定义点之间的邻近概率(通常固定方差为 1/√2):

q_{ij} = exp(-||y_i - y_j||^2) / (∑_{k≠l} exp(-||y_k - y_l||^2))

SNE的目标是让低维空间中的邻近分布 Q 尽可能匹配高维空间中的邻近分布 P。衡量两个分布差异的指标是KL散度

损失函数(成本函数)
C = KL(P || Q) = ∑_i ∑_j p_{ij} log(p_{ij} / q_{ij})

通过梯度下降法最小化这个损失函数 C,我们可以优化低维表示 Y


t-SNE:解决“拥挤问题”

SNE存在一个称为“拥挤问题”的缺陷:在高维空间中,中等距离的点在低维空间中可能没有足够的空间来摆放。为了在低维空间中保持局部结构,中距离的点会被挤到远离的位置。

t-SNE对SNE做了一个关键改进:在低维空间中使用学生t分布(自由度为1,即柯西分布)代替高斯分布来定义邻近概率

低维空间概率公式(t-SNE)
q_{ij} = (1 + ||y_i - y_j||^2)^{-1} / (∑_{k≠l} (1 + ||y_k - y_l||^2)^{-1})

为何有效?
学生t分布比高斯分布具有更重的尾部。这意味着:

  1. 在低维空间中,对于相距较远的点,q_{ij} 不会变得像高斯那样小。这减轻了将中距离点推开以匹配极小 p_{ij} 的压力。
  2. 它自然地在低维空间中产生了“排斥力”,使得不属于同一簇的点能够更好地分开。

高维空间的概率 p_{ij} 计算方式与SNE相同(使用高斯分布)。损失函数和优化方法(梯度下降)保持不变。

t-SNE算法流程

以下是t-SNE算法的简要步骤:

  1. 输入:高维数据 X,目标维度 d,困惑度 Perp,迭代次数 T,学习率 η
  2. 计算高维相似度 P
    • 对于每个点 x_i,通过二分搜索找到 σ_i,使得条件分布 P_{i|.} 的困惑度等于 Perp
    • 计算 p_{j|i},然后对称化得到 p_{ij}
  3. 初始化低维表示 Y:通常从均值为0、方差很小的正态分布中随机采样初始化 y_i
  4. 迭代优化
    • for t = 1 to T
      • 根据当前 Y,使用t分布公式计算低维相似度 q_{ij}
      • 计算损失函数 C = KL(P || Q)
      • 计算损失函数关于 Y 的梯度 ∂C/∂Y
      • 更新 Y = Y - η * ∂C/∂Y。(实践中常使用动量加速)
  5. 输出:优化后的低维表示 Y

t-SNE vs PCA:对比总结

本节课我们一起学习了t-SNE,现在我们来总结其与PCA的主要区别:

特性 PCA t-SNE
类型 线性降维 非线性降维
目标 保留全局方差(协方差结构) 保留局部邻域结构
优化 通过SVD/特征分解得到全局最优解 通过梯度下降寻找(局部)最优解,结果受初始化和超参数影响
可解释性 。主成分(特征向量)有明确含义(如“特征脸”)。 。仅得到点的低维坐标,没有全局的“基”或映射函数。
外样本投影 容易。得到投影矩阵后,新点可直接投影。 困难。需要重新运行整个优化过程或训练一个回归模型来近似映射。
计算成本 相对较低(O(min(mn^2, m^2n)))。 较高(O(n^2),需要计算所有点对相似度)。
主要用途 数据压缩、去噪、特征提取、可视化(适用于线性或近似线性结构)。 高维数据可视化(特别适用于探索聚类和流形结构)。
超参数 主成分数量 k 困惑度 Perplexity(最重要),学习率、迭代次数。

重要提示
t-SNE是一种强大的探索性可视化工具,但其结果需要谨慎解读。不同的超参数(尤其是困惑度)和随机初始化可能产生不同的可视化结果。它不适合作为特征提取的预处理步骤,也不应仅基于t-SNE图就做出严格的科学结论。


总结

本节课中,我们一起学习了非线性降维方法t-SNE。我们从PCA的局限性出发,介绍了基于保持局部邻域结构的ISOMap思想,然后深入讲解了通过概率化邻域关系来改进的SNE算法,最后引出了使用学生t分布解决“拥挤问题”的t-SNE。我们详细阐述了t-SNE的原理、算法步骤,并将其与PCA进行了全面对比。理解t-SNE有助于我们在面对复杂高维数据时,选择合适的工具进行有效的可视化分析。

14:聚类

概述

在本节课中,我们将要学习一种重要的无监督学习方法——聚类。我们将从直观概念入手,逐步深入到具体的算法和模型,特别是K均值算法和高斯混合模型。我们将学习如何将数据点分组到不同的簇中,即使没有预先定义的标签。


聚类简介

上一节我们介绍了降维,本节中我们来看看另一种无监督学习任务:聚类。聚类的目标是将数据集中的每个样本映射到一个离散的标签,但这个标签不是预先给定的,而是通过算法在数据中寻找模式,将相似的数据点聚集在一起形成的。

例如,想象一个二维数据集,我们可以直观地看到一些点彼此更相似,聚类算法会为这些相似的点分配相同的标签。在高维空间中,这种模式无法直观看到,因此我们需要算法来帮助我们完成这个任务。

聚类通常用于数据探索,帮助我们理解数据。例如,电商公司可能根据用户的登录频率、购买次数等特征对用户进行聚类,以发现不同的客户类型,从而指导营销策略。

以下是聚类的一些常见应用场景:

  • 客户细分:根据用户行为特征(如登录频率、购买记录)对用户进行聚类,以识别不同的客户群体。
  • 疾病亚型分析:对患有同一种疾病(如高血压)的患者进行基因数据聚类,以发现不同的疾病亚型。
  • 单细胞数据分析:根据细胞中基因的表达量对细胞进行聚类,以识别不同的细胞类型。
  • 异常检测:识别那些不属于任何主要簇的数据点,这些点可能是异常值。

聚类方法概述

聚类主要有三种广泛使用的方法。本课程将重点介绍第三种方法。

  1. 层次聚类:这种方法需要定义数据点之间的距离。算法从每个点作为一个簇开始,然后递归地合并最相似的两个簇,形成一个树状结构(树状图)。通过在不同高度切割这棵树,可以得到不同数量的簇。
  2. 划分式聚类:这种方法直接定义对数据划分的代价函数,并寻找最优划分。例如,图割方法将数据点视为图中的节点,通过切割边权重最小的方式将图划分为不同的部分。
  3. 基于模型的聚类:这是我们本节课的重点。我们首先会学习一个非常著名且古老的算法——K均值,然后将其扩展为一个概率模型,即高斯混合模型。在基于模型的方法中,距离的概念通过概率分布来体现。

K均值聚类

K均值是一种基于质心的聚类方法。每个簇由一个质心代表,质心是输入空间中的一个点(不一定是数据点本身),它代表了该簇中所有点的中心位置。

模型定义

K均值模型有一个超参数 K,即我们期望的簇的数量。模型的目标是找到K个质心,并将每个数据点分配给离它最近的质心所在的簇,同时最小化所有数据点到其所属簇质心的总距离。

公式:损失函数定义为:
L = Σ_{k=1}^{K} Σ_{i ∈ C_k} ||x_i - μ_k||^2
其中,C_k 是分配给第k个簇的数据点集合,μ_k 是第k个簇的质心。

算法:Lloyd算法

K均值通常使用Lloyd算法(也称为K均值算法)进行优化。这是一个交替优化过程,保证每次迭代都能降低损失函数的值,并最终收敛到一个局部最优解。

以下是算法的具体步骤:

  1. 初始化:随机选择K个数据点作为初始质心。
  2. 分配步骤:对于每个数据点 x_i,计算其到所有质心 μ_k 的距离,并将其分配给距离最近的质心所在的簇。
    z_i = argmin_k ||x_i - μ_k||^2
  3. 更新步骤:对于每个簇 k,重新计算其质心,即该簇内所有数据点的均值。
    μ_k = (1 / |C_k|) Σ_{i ∈ C_k} x_i
  4. 迭代:重复步骤2和步骤3,直到质心的位置不再发生变化(或变化很小),此时算法收敛。

算法演示与讨论

通过一个二维数据集的动画演示,我们可以看到Lloyd算法如何从随机初始化的簇分配开始,通过交替执行分配和更新步骤,最终收敛到一个清晰的聚类结果。

需要指出的是,K均值算法存在一些局限性:

  • 局部最优:损失函数是非凸的,算法容易陷入局部最优解。解决方案通常是多次运行算法,选择结果最好的那次。
  • 超参数K的选择:与PCA类似,我们可以通过“肘部法则”来选择K值。绘制不同K值对应的损失函数值,选择损失函数下降速度突然变缓的点(肘部)作为K值。
  • 球形簇假设:K均值使用欧氏距离,这隐含地假设每个簇是球形的。对于拉长的或非球形的簇结构,K均值可能无法得到理想的结果。

从硬K均值到软K均值

K均值算法为每个数据点进行“硬分配”,即一个点只能属于一个簇。当数据点位于两个簇的边界附近时,这种硬性决策可能不够合理。

我们可以将硬分配“软化”,允许数据点以一定的概率属于多个簇。这通过将最小距离决策转换为一个Softmax函数来实现。

公式:软分配概率定义为:
r_{ik} = exp(-β ||x_i - μ_k||^2) / Σ_{j=1}^{K} exp(-β ||x_i - μ_j||^2)
其中,r_{ik} 表示数据点 i 属于簇 k 的概率,β 是一个控制分布“尖锐”程度的参数(称为逆温度参数)。当 β 很大时,软分配趋近于硬分配。

在软K均值中,更新质心时,不再是计算簇内点的简单平均,而是计算所有点的加权平均,权重就是该点属于该簇的概率 r_{ik}

公式:更新后的质心为:
μ_k = (Σ_{i=1}^{N} r_{ik} * x_i) / (Σ_{i=1}^{N} r_{ik})


高斯混合模型

软K均值为我们引入了概率思想,而高斯混合模型则是一个完全的概率生成模型,它是软K均值的自然扩展,也是聚类中最常用的概率模型之一。

模型定义

高斯混合模型假设数据是由K个高斯分布混合生成的。每个高斯分布代表一个簇,有自己的均值 μ_k 和协方差矩阵 Σ_k。此外,还有一个混合权重 π_k,表示数据点来自第k个高斯分布的先验概率。

公式:高斯混合模型的概率密度函数为:
p(x) = Σ_{k=1}^{K} π_k * N(x | μ_k, Σ_k)
其中,Σ_{k=1}^{K} π_k = 1N(x | μ_k, Σ_k) 是第k个高斯分布的概率密度。

引入隐变量

为了便于推导和计算,我们引入一个隐变量 z,它表示数据点 x 来自于哪个高斯分量。z 是一个K维的one-hot向量。

公式:联合概率分布可以分解为:
p(x, z) = p(z) * p(x|z)
其中,p(z_k=1) = π_kp(x | z_k=1) = N(x | μ_k, Σ_k)

通过边缘化隐变量 z,我们可以得到观测数据 x 的似然函数:
p(x) = Σ_{z} p(x, z) = Σ_{k=1}^{K} π_k * N(x | μ_k, Σ_k)

与K均值的联系

高斯混合模型比K均值更强大:

  • 灵活的簇形状:通过协方差矩阵 Σ_k,每个簇可以是任意椭圆形状,而不仅仅是球形。
  • 概率输出:模型可以给出数据点属于每个簇的概率,而不仅仅是硬标签。
  • 生成能力:在估计参数后,我们可以从模型中采样生成新的数据点。

当高斯混合模型中每个分量的协方差矩阵趋于0(即方差无限小)时,模型会退化为K均值。

参数估计:期望最大化算法

高斯混合模型的参数(π_k, μ_k, Σ_k)通常使用期望最大化算法进行估计。EM算法也是一个交替优化过程:

  1. E步(期望步):基于当前参数,计算每个数据点 x_i 属于每个簇 k 的后验概率(责任值 γ_{ik})。
    γ_{ik} = π_k * N(x_i | μ_k, Σ_k) / Σ_{j=1}^{K} π_j * N(x_i | μ_j, Σ_j)
  2. M步(最大化步):基于E步计算出的责任值,更新模型参数,以最大化数据的期望似然。
    μ_k = (Σ_i γ_{ik} * x_i) / (Σ_i γ_{ik})
    Σ_k = (Σ_i γ_{ik} * (x_i - μ_k)(x_i - μ_k)^T) / (Σ_i γ_{ik})
    π_k = (Σ_i γ_{ik}) / N

总结

本节课中我们一起学习了聚类这一核心的无监督学习技术。

我们首先了解了聚类的直观概念和应用场景。然后,我们深入探讨了最经典的K均值算法,包括其损失函数、Lloyd优化算法以及其优缺点(如局部最优、球形假设)。

为了克服硬分配的局限性,我们引入了软K均值的概念。最后,我们系统学习了高斯混合模型这一概率框架。GMM通过引入隐变量和EM算法,提供了更灵活的簇形状建模能力、概率化的簇分配以及生成新数据的能力,是聚类中一个强大而通用的工具。

从K均值到高斯混合模型,我们看到了如何将一个启发式算法逐步完善为一个有坚实概率基础、可扩展的统计模型,这是机器学习中一个典型的思想发展路径。

15:最近邻与度量学习 👨‍🏫

在本节课中,我们将要学习两种重要的机器学习方法:K最近邻分类器和度量学习。我们将从最简单直观的非参数模型开始,探讨其优缺点,并引出在高维数据中遇到的“维度灾难”问题。为了解决这个问题,我们将深入度量学习,特别是对比学习,了解如何通过学习一个更好的数据表示空间来提升模型性能。最后,我们将以OpenAI的CLIP模型作为度量学习的一个前沿应用来结束课程。


参数模型 vs. 非参数模型 🤔

到目前为止,本课程主要关注的是参数模型。我们从线性回归、逻辑回归、Softmax回归开始学习。随后我们了解到,通过神经网络参数化模型,我们可以建立损失函数并计算梯度。

这类模型的优点在于,参数是可以通过数据一次性估计出来的。在估计出参数后,你甚至可以丢弃数据。整个预测模型都封装在参数 θ 中,θ 就是一切。

但在另一个极端,存在一类称为非参数模型的模型。本节课将重点讨论分类问题中的非参数模型。它与参数模型截然相反,基本上不需要“训练”,但你必须存储并保留你的数据集。在进行预测时,你需要实时访问这些数据。

因此,你可以认为参数化这个模型的就是数据集本身。随着数据集的增长,模型的有效参数数量也在增长。这是统计模型中两种极端的范式,各有其优缺点。


度量空间与距离 📏

本节课的核心是“邻近”的概念。我们首先需要从数学上理解“邻近”,这就是度量空间的概念。

度量空间的定义非常简单。你有一个集合,并定义一个函数作为该集合中元素之间的距离度量。

距离函数 d 是一个映射,它将两个元素 x 和 x‘ 映射到一个实数。这个函数必须满足几条公理:

  • 自反性:一个对象到自身的距离为 0。
  • 对称性:距离是对称的。
  • 非负性:距离总是非负的。
  • 三角不等式:对于任意三个点 x1, x2, x3,有 d(x1, x3) ≤ d(x1, x2) + d(x2, x3)

满足这些公理的距离函数有很多种。本节课最相关的一种是马氏距离,它是欧氏距离的推广,其中 M 是一个半正定矩阵。当 M 是单位矩阵时,马氏距离就退化为我们熟悉的欧氏距离。


K最近邻分类器 🎯

K最近邻分类器正如其名,它的设置包含四个步骤:

  1. 存储训练集:你需要将整个训练集保存在某个地方。
  2. 无需训练:这一步没有传统的“训练”过程。
  3. 在测试时,当一个新测试点 x 到来时,你需要在存储的数据集 D 中,根据选定的度量(通常使用欧氏距离),找到与 x 最接近的 K 个点。
  4. 我们记这个包含 K 个最近邻点的集合为 N_K(x)。

以下是一个具体的例子。图中已有的点是带有标签(0 或 1)的训练数据。一个新的测试点 x 到来。我们设定 K=5,并找到距离 x 最近的 5 个点,这就是我们的 N_K(x) 集合。

接下来,我们需要估计后验概率 P(y | x)。我们通过在这个邻域集合内进行计数来定义它:

P(y = c | x) = (1/K) * Σ_{i ∈ N_K(x)} I(y_i = c)

其中 I(.) 是指示函数。对于每个类别 c,我们统计在 N_K(x) 集合中属于该类别的点的数量,然后除以 K。

在这个例子中,对于类别 1,有 3 个点,所以 P(y=1 | x) = 3/5。对于类别 0,有 2 个点,所以 P(y=0 | x) = 2/5。很容易验证,所有类别的概率之和为 1。

对于回归任务,流程非常相似。训练阶段相同,存储数据集。在推断时,对于一个测试点 x,我们同样找到它的 K 个最近邻 N_K(x)。预测值 ŷ 则取这些邻居对应目标值 y_i 的平均值:

ŷ = (1/K) * Σ_{i ∈ N_K(x)} y_i


K=1 的特殊情况与Voronoi图 🧩

K=1 的情况比较特殊,它与乌克兰数学家Voronoi的研究相关,形成了所谓的Voronoi镶嵌或 mosaics。

让我们做一个思想实验。假设数据集中每个点都有不同的标签。在 1-最近邻 的策略下,我们想知道空间中的哪些区域会被分类为某个特定样本点。

这实际上将空间划分成了多个线性区域。可以证明,这些决策边界总是线性的。证明思路是:边界是到两个中心点距离相等的点的集合。设这两个中心点为 x_A 和 x_B,边界条件为 ||x - x_A|| = ||x - x_B||。展开后,两边的平方项 ||x||^2 会抵消,最终只剩下关于 x 的线性项。

当然,现实中每个类别通常不止一个样本点。我们可以将属于同一类别的点的 Voronoi 区域合并起来,这样就得到了最终的分类决策区域。这正是最近邻分类器工作原理的直观体现。


K 值的作用与偏差-方差权衡 ⚖️

K 值在 KNN 中起着至关重要的作用。这里我们可以暂停思考一下。

我们来看一个真实数据集的例子,其中有大约 200 个训练点。左边是某个 K 值的分类结果,右边是另一个 K‘ 值的分类结果。

你能猜出左边是 K=1 的情况吗?是的,例如,围绕某个孤立点的非常紧凑的决策边界表明它只考虑了最近的一个点。这通常会导致过拟合,除非问题非常简单,否则 K=1 通常不是好选择。

那么右边的 K‘ 是多少呢?它可能是 15。当 K 值较大时,决策边界更加平滑。

一个极端情况是,当 K 等于甚至大于样本总数 N 时,我们之前定义的分布会退化成什么?它会退化为先验概率,即 P(y=c | x) ≈ N_c / N,其中 N_c 是类别 c 的样本数。此时,预测与测试点 x 无关,模型变得极其简单。

这引出了机器学习中一个非常普遍且重要的概念:偏差-方差权衡。虽然后续会有专门讲座,但在此结合 KNN 讨论非常合适。

模型的复杂度可以用 N / K 来粗略衡量。当 K 很小时,模型复杂,训练误差可以很低(K=1 时训练误差为 0),但容易过拟合,测试误差较高,此时方差大。当 K 很大时,模型简单,训练误差和测试误差都可能很高,此时偏差大。中间存在一个最佳区域,能在偏差和方差之间取得平衡,使测试误差最小。


KNN 的一个概率论推导 🧮

之前我们对后验概率的定义非常直观。现在,我想给出一个基于生成式分类思想的“信封背面”式推导。

在生成式分类器中,我们需要类别条件概率 P(x | y=c) 和先验概率 P(y=c)。然后使用贝叶斯规则计算后验概率:P(y=c | x) ∝ P(x | y=c) P(y=c)

我们可以这样估计类别条件概率:给定一个测试点 x,我们以一个球体包围它,并不断扩大这个球体,直到它恰好包含 K 个训练样本。设这个球体的体积为 V_K。那么,概率密度 P(x | y=c) 乘以体积 V_K,应该近似等于该体积内属于类别 c 的样本比例,即 P(x | y=c) * V_K ≈ N_c(x) / N_c,其中 N_c(x) 是球体内属于类别 c 的样本数,N_c 是整个数据集中属于类别 c 的样本总数。

由此可得 P(x | y=c) ≈ (N_c(x)) / (V_K * N_c)。将其代入贝叶斯公式:

P(y=c | x) ∝ [N_c(x) / (V_K * N_c)] * (N_c / N) = N_c(x) / (V_K * N)

对所有的类别 c‘ 求和进行归一化时,分母为 Σ_{c‘} N_{c‘}(x) / (V_K * N)。注意,Σ_{c‘} N_{c‘}(x) 就是球体内的总样本数,根据定义,它等于 K。所以分母等于 K / (V_K * N)

最终,体积项 V_K 被抵消,我们得到:

P(y=c | x) = N_c(x) / K

这与我们最初直观的定义完全一致。这个推导的美妙之处在于,它从一个密度估计出发,最终又回到了简单的计数,而体积项在过程中自然消失了。


KNN 的优点与缺点 📊

现在让我们总结一下 KNN 的好坏。

优点:

  • 无需训练:设置简单快速。
  • 可以学习复杂函数:通过控制 K 值,你可以调整模型的复杂度。
  • 易于调参:通过一个验证集,可以快速找到适合当前问题的 K 值。

缺点:

  • 存储成本高:需要保存整个训练集。
  • 推断速度慢:对于每个测试点,都需要在整个数据集中搜索最近邻。
  • 高维空间中表现糟糕**:这是最严重的问题,源于“维度灾难”。在高维空间中,“邻近”的概念会失效,数据点之间变得异常稀疏,需要海量数据才能有效进行最近邻判断。

维度灾难与度量学习的引入 🚀

维度灾难是所有基于距离的算法的根本问题。在高维空间中,体积呈指数级增长,数据点变得极其稀疏。

一个简单的例子是:在一个边长为 2 的高维立方体中,中心处一个边长为 1 的小立方体所占的体积比例是 (1/2)^d。当维度 d 增加时,这个比例迅速趋近于 0。这意味着,要想让数据点“填满”空间或彼此靠近,所需的样本量 N 是指数级的。

从另一个角度看,如果我们希望以精度 ε 逼近一个样本点,所需的样本量 N 大约为 ε^{-d}。即使 ε 取一个中等大小的值(如 0.1),当维度 d 较大时,N 也会变得天文数字般巨大,这在实际中是无法实现的。

那么,如何打破维度灾难呢?完全解决它没有希望,但我们可以利用一个关键观察:现实世界的数据虽然存在于高维空间(如图像像素),但它们通常位于一个低维的流形上。例如,一张人脸图片的所有像素点,其实是由少数几个因素(如姿势、光照、表情)控制的。

因此,问题的核心变成了:如何学习这个低维流形,或者说,如何将数据嵌入到一个更有意义的低维空间中? 在这个嵌入空间中,我们再使用欧氏距离等度量来进行最近邻等操作。这样,问题的复杂性就从“在高维空间中找到好邻居”转移到了“学习一个好的嵌入映射函数”上。


度量学习与对比学习 🎨

度量学习旨在学习一个映射函数,将原始数据转换到一个新的特征空间,使得在这个新空间中,相似样本靠近,不相似样本远离。近年来,对比学习是度量学习中非常成功的一个范式。

所有对比学习方法的核心哲学都包含“拉近”和“推开”两项。我们希望将相似样本(正样本对)的嵌入表示拉近,同时将不相似样本(负样本对)的嵌入表示推开。

1. Siamese Network (孪生网络)
最早的对比学习工作之一。它使用一个共享权重的神经网络来处理两个输入。损失函数由两部分组成:

  • 拉近项:如果两个样本标签相同(相似),则最小化它们嵌入向量之间的距离 ||f(x_i) - f(x_j)||
  • 推开项:如果标签不同,则最大化它们之间的距离,但为了避免优化时无限推开,设置了一个边际 m,损失为 max(0, m - ||f(x_i) - f(x_j)||)
    这个损失函数的问题是拉近和推开项是分离的,每次只激活一项。

2. Triplet Loss (三元组损失)
为了解决上述问题,三元组损失同时考虑三个样本:锚点样本 x,一个正样本 x+,一个负样本 x-。
损失函数为:L = max(0, ||f(x) - f(x+)||² - ||f(x) - f(x-)||² + m)
为了最小化损失,网络需要拉近锚点与正样本的距离,同时拉大锚点与负样本的距离。但它的效率较低,因为每次只用一个负样本。

3. N-Pair Loss & InfoNCE Loss
为了提高效率,我们希望在一个批次中使用多个负样本。一个重要的进展是 InfoNCE 损失。其思想是将问题构建为一个多类分类任务:给定一个锚点,从多个候选(一个正样本,多个负样本)中识别出正样本。
通过将嵌入向量归一化到单位球面上,并使用点积作为相似度度量,InfoNCE 损失可以写成熟悉的 Softmax 交叉熵形式:
L = -log [ exp(sim(z, z+)) / (exp(sim(z, z+)) + Σ_{k} exp(sim(z, z-_k)) ) ]
这正是让模型学习将正样本对的相似度得分提高,同时降低与所有负样本对的相似度得分。


跨模态嵌入:CLIP 模型 🌐

对比学习的前沿应用之一是学习跨模态的联合嵌入空间。OpenAI 的 CLIP 模型是一个里程碑式的工作。

CLIP 的目标是将图像和文本描述嵌入到同一个向量空间中。它使用一个图像编码器和一个文本编码器,分别将图像和文本映射到同一个维度 d 的嵌入空间。

训练时,它利用互联网上大量(图像,文本描述)配对数据。对于一个批次中的 N 个(图像,文本)对,CLIP 将每张图像与所有文本描述计算相似度。损失函数鼓励配对(图像,对应文本)的相似度得分高,而非配对(图像,其他文本)的相似度得分低。这本质上就是一个大规模的 InfoNCE 损失。

通过这种方式,CLIP 学会了图像和文本在语义上的对齐。例如,“狗”的文本嵌入会靠近狗图片的图像嵌入,而远离猫图片的嵌入。这种联合嵌入能力是许多多模态应用(如图文生成模型 DALL-E)的基础。


总结 📝

本节课我们一起学习了机器学习的两个重要主题。

我们首先深入探讨了 K最近邻分类器,这是一种经典的非参数模型。我们了解了其工作原理、K值的选择如何影响模型复杂度以及背后的偏差-方差权衡,并推导了其概率论解释。同时,我们也认识到 KNN 在高维空间中会遭遇严重的维度灾难问题。

为了解决高维数据中距离度量失效的问题,我们引入了 度量学习。重点介绍了对比学习这一强大范式,从 Siamese Network 到 Triplet Loss,再到更高效的 InfoNCE Loss,其核心思想都是学习一个嵌入空间,使得语义相似的样本靠近,不相似的样本远离。

最后,我们以 OpenAI 的 CLIP 模型 作为案例,看到了对比学习如何用于学习跨模态(图像与文本)的联合语义表示,这代表了度量学习在前沿人工智能应用中的强大能力。

从最简单的最近邻到复杂的深度度量学习,我们看到了机器学习中一个核心思想的演进:寻找或学习一个适合问题的数据表示空间,往往比在原始空间中直接使用复杂算法更为有效。

16:模型评估 🧠

在本节课中,我们将要学习如何评估分类器模型。我们将超越简单的准确率,深入探讨更精细的评估方法,特别是ROC曲线AUC,这些工具能帮助我们理解模型在不同决策阈值下的表现,并比较不同模型的优劣。


概述 📋

评估分类器模型时,仅仅计算在某个阈值(如0.5)下的准确率是不够的。模型给出的分数(或概率)可能并未经过良好校准,这意味着分数不能直接解释为真实概率。此外,我们可能还需要比较像SVM这样不输出概率的模型。因此,我们需要一种与具体阈值和模型校准状态无关的评估框架。这就是ROC曲线AUC的用武之地。


校准的概念 ⚖️

上一节我们提到了模型评估的挑战,本节中我们来看看一个关键概念:校准

一个经过良好校准的概率分类器意味着:在所有被预测为具有概率 p 的样本中,真正属于该类的样本比例也恰好是 p。例如,在所有被模型预测为“猫”的概率为0.8的图片中,应有80%的图片确实是猫。

然而,许多模型(即使是使用最大似然估计训练的模型)在实践中可能并未完美校准。一个模型可能非常有区分能力(能很好地对样本排序),但其输出的数值却并非真实的概率。


从分数到决策:混淆矩阵 📊

为了从模型输出的连续分数(或未校准的概率)中得到分类决策,我们必须选择一个决策阈值。根据这个阈值,所有测试样本可以被划分为四个类别,这通常用混淆矩阵来总结。

以下是构成混淆矩阵的四个核心概念:

  • 真正例:实际为正类,且被模型预测为正类。
  • 假正例:实际为负类,但被模型错误预测为正类。
  • 真反例:实际为负类,且被模型预测为负类。
  • 假反例:实际为正类,但被模型错误预测为负类。

所有测试样本都必然属于这四类之一。基于这些计数,我们可以定义更有用的比率


评估比率:TPR与FPR 📈

仅仅使用计数会受测试集规模影响,因此我们更常使用比率。两个最重要的比率是:

  • 真正例率:在所有实际为正类的样本中,被正确预测的比例。
    TPR = TP / (TP + FN)
    TPR也被称为灵敏度召回率

  • 假正例率:在所有实际为负类的样本中,被错误预测为正类的比例。
    FPR = FP / (FP + TN)

选择不同的决策阈值会改变TPR和FPR的值。理想情况下,我们希望TPR高而FPR低。


ROC曲线:可视化所有阈值 🎯

上一节我们介绍了单个阈值下的评估指标,本节中我们来看看如何通过ROC曲线来综合评估所有可能的阈值。

ROC曲线的绘制方法如下:

  1. 将测试样本根据模型输出的分数从高到低排序。
  2. 将阈值依次设置为每个独特的分数(或分数之间的值)。
  3. 对于每个阈值,计算对应的TPRFPR
  4. 在图中以FPR为横轴,TPR为纵轴,绘制所有这些点并连接成线。

这条曲线展示了模型在不同假正例率容忍度下能达到的真正例率,即灵敏度和特异性的权衡。

关于ROC曲线,有几个关键的参考点:

  • 完美分类器:曲线经过左上角点 (0, 1),即FPR=0,TPR=1。
  • 随机分类器:曲线是一条从 (0,0)(1,1) 的对角线。
  • 一般分类器:曲线越靠近左上角,说明模型的区分能力越好。

ROC曲线有一个重要特性:它对测试集中正负样本的比例不敏感(因为TPR和FPR都是比率),并且对模型分数的任何单调变换保持不变(因此不关心校准)。


AUC:曲线下面积 📏

当需要用一个标量来总结模型性能时,我们使用曲线下面积

AUC 的值在0.5(随机模型)到1.0(完美模型)之间。AUC 有一个非常直观的概率解释:它等于“随机选取一个正样本和一个负样本,模型给正样本的分数高于负样本分数”的概率。

AUC 计算的是整个阈值范围内的平均性能。但有时我们只关心FPR低于某个特定值(例如在医疗诊断中要求极低的误诊率)的区域,这时可以计算部分AUC


精确率-召回率曲线 🔍

ROC曲线不关心类别不平衡,但有时我们需要考虑这一点。精确率-召回率曲线是另一种常用工具。

  • 精确率:在所有被预测为正类的样本中,真正为正类的比例。Precision = TP / (TP + FP)
  • 召回率:即TPR。

PR曲线以召回率为横轴,精确率为纵轴。完美分类器位于右上角 (1, 1)。PR曲线受测试集中正负样本比例的影响,因此当类别分布重要时,它比ROC曲线提供的信息更相关。

在实践中,根据具体问题,可能会同时查看ROC曲线和PR曲线。


成本敏感学习 ⚖️➡️🧠

我们讨论了如何评估模型,但评估目标也可以反过来影响我们如何训练模型。标准的极大似然估计平等对待所有类型的错误。然而,在某些领域(如医疗诊断),不同错误的代价截然不同。

例如,将癌症患者误诊为健康(假反例)的代价,远高于将健康人误诊为患病(假正例)。这时,我们可以使用成本敏感损失函数

我们可以在损失函数中为不同类别的错误赋予不同的权重。例如,将假反例的损失乘以一个很大的系数(如1000),从而在训练中迫使模型更倾向于避免这种高代价错误。确定这些权重系数是一个需要领域知识(如医学、伦理学)的决策,无法通过机器学习自动完成。


总结 🎓

本节课中我们一起学习了分类器模型评估的核心方法:

  1. 理解了校准的概念及其重要性。
  2. 掌握了基于混淆矩阵的评估指标,如TPR、FPR、精确率和召回率。
  3. 学会了使用ROC曲线来可视化模型在所有可能阈值下的性能,并用AUC进行量化总结。
  4. 认识了精确率-召回率曲线及其适用场景。
  5. 了解了评估目标如何影响训练过程,引入了成本敏感学习的概念。

关键要点是:没有单一的“最佳”评估指标。选择哪种方法(ROC/AUC, PR曲线, 校准概率的似然)取决于具体的应用场景、对错误类型的容忍度以及是否需要真实的概率估计。

17:决策树与集成学习

在本节课中,我们将学习一种与之前完全不同的建模方法——决策树。尽管神经网络备受瞩目且非常成功,但决策树及其集成方法在特定类型的数据(如表格数据)上表现卓越,是许多实际竞赛中的获胜模型。我们将从决策树的基本概念入手,理解其工作原理,并探讨如何通过集成多个模型来提升性能。


决策树:20个问题的游戏 🎲

上一节我们介绍了本课程将转向一种全新的模型。本节中,我们来看看决策树的核心思想,它类似于“20个问题”游戏:通过一系列关于特征的是/否问题,最终对样本进行分类。

决策树是一种分层模型,它通过递归地根据某个特征对数据进行划分来工作。每个内部节点代表一个特征测试,每个分支代表测试的结果,每个叶节点则代表一个类别标签或预测值。

核心概念:决策树将特征空间划分为一系列轴对齐的矩形区域,每个区域对应一个叶节点和一个预测结果。


决策树的构建与使用 🌳

我们已经了解了决策树的直观形式。本节中,我们来看看如何具体构建和使用一棵决策树。

使用决策树进行预测时,我们从根节点开始,根据样本的特征值选择分支,直到到达某个叶节点,该叶节点的类别即为预测结果。

构建决策树则需要从训练数据中学习树的结构。这是一个NP完全问题,因此我们采用贪心算法递归构建:

  1. 从根节点开始,包含所有训练数据。
  2. 选择“最佳”特征进行分割。
  3. 根据该特征的取值创建子节点。
  4. 对每个子节点递归地重复步骤2-3,直到满足停止条件。

核心概念(伪代码)

def build_tree(data):
    if 所有样本属于同一类别:
        创建叶节点,预测为该类别
        return
    if 所有特征值相同 或 无剩余特征:
        创建叶节点,预测为多数类
        return
    选择最佳分割特征
    根据该特征的每个取值创建分支
    for 每个分支:
        subset = 属于该分支的样本
        build_tree(subset) # 递归构建子树

如何选择最佳分割特征? 🎯

上一节我们介绍了递归构建树的框架。本节中,我们来看看贪心算法的核心:如何量化一个特征的好坏,从而选择“最佳”分割特征。

我们希望选择能最大程度“纯化”子节点的特征。一个节点越“纯”,意味着其包含的样本几乎都属于同一类别,我们做出错误预测的“惊喜”就越小。信息论中的“熵”恰好能度量这种不确定性或“惊喜”程度。

对于一个随机变量Y,其熵H(Y)定义为期望惊喜:
H(Y) = - Σ P(y) log₂ P(y)

在决策树中,我们关注的是按特征X分割后,目标Y的不确定性减少了多少。这可以通过信息增益来度量,它等于分割前Y的熵减去分割后Y的条件熵

条件熵H(Y|X)衡量了在已知特征X的条件下,Y剩余的不确定性:
H(Y|X) = Σ P(x) * H(Y|X=x)

信息增益IG则为:
IG = H(Y) - H(Y|X)

构建策略:在每一步,我们计算每个可用特征的信息增益,然后选择信息增益最大的那个特征进行分割。这等价于选择能使条件熵最小化的特征。


停止递归与过拟合问题 ⚠️

通过贪心选择特征,我们可以持续生长树。但如果不加限制,树会一直生长直到完美拟合训练数据,这通常会导致过拟合。本节中,我们来看看何时应该停止递归,以及决策树面临的其他挑战。

以下是停止递归的常见条件(基础情况):

  • 节点纯度:如果节点中所有样本都属于同一类别,则无需再分割。
  • 特征耗尽:如果节点中所有样本在所有剩余特征上取值相同,无法进一步分割。
  • 数据量过少:如果节点中的样本数量低于预设阈值,停止分割以避免基于过少数据做出不可靠决策。

即使有停止条件,单棵决策树也容易过拟合,并且可能不稳定(训练数据的微小变化可能导致生成完全不同的树)。其决策边界是轴对齐且分段恒定的,对于某些简单模式(如线性可分数据)可能效率低下。

为了解决过拟合问题,我们需要对树进行正则化,常用方法包括:

  • 限制树深:预设树的最大深度。
  • 设置叶节点最小样本数:确保分割时有足够的数据支持。
  • 剪枝:先构建一棵完整的树,然后自底向上移除对泛化性能贡献不大的子树。

集成方法:从单棵树到森林 🌲➡️🌳🌲

上一节我们讨论了单棵决策树的局限性。本节中,我们来看看如何通过集成学习结合多棵决策树,从而获得更强大、更稳定的模型。

集成学习的基本思想是结合多个模型(通常是弱模型)的预测,以获得比单一模型更好的性能。关键在于,集成的各个模型应该尽可能“不同”(即预测误差不相关),这样通过平均可以降低总体方差。

以下是集成决策树的主要方法:

1. 装袋法

  • 核心思想:通过自助采样生成多个不同的训练集,分别训练多个决策树,预测时取平均。
  • 如何降低相关性:对原始训练数据进行有放回抽样,创建多个略有差异的数据集。

2. 随机森林

  • 核心思想:在装袋法的基础上,进一步在每棵树的每个节点分割时,只考虑一个随机子集的特征。
  • 如何降低相关性:同时引入数据扰动(自助采样)和特征扰动(随机特征子集)。

3. 提升法

  • 核心思想:按顺序训练一系列树,每棵新树都专注于纠正前一棵树的错误。
  • 工作原理:是一个贪心的、逐步优化的过程。首先训练一棵树,然后基于前一棵树的残差(预测错误)训练下一棵树,如此迭代。
  • 代表算法:梯度提升决策树,这是在许多表格数据竞赛中表现极其出色的模型。

课程总结 📚

本节课中,我们一起学习了决策树与集成学习。

我们首先将决策树类比为“20个问题”游戏,理解了其通过递归分割特征空间来进行预测的基本原理。接着,我们深入探讨了构建决策树的核心贪心算法:使用信息增益(或等价地,最小化条件熵)来选择最佳分割特征,以追求节点的“纯度”。

我们认识到单棵决策树容易过拟合且不稳定,因此讨论了通过限制树深、最小样本数或剪枝来进行正则化。更重要的是,我们介绍了如何通过集成方法来克服这些缺点。装袋法随机森林通过引入随机性来构建多棵略有差异的树并进行平均,有效降低了方差。而提升法(特别是梯度提升决策树)则通过顺序地、贪心地拟合残差,构建出非常强大的模型序列。

最终,我们了解到,尽管神经网络在图像、语言等领域占据主导,但决策树及其集成方法(尤其是随机森林和梯度提升树)在处理表格数据的分类和回归问题上,常常是实践中的最佳选择,因为它们强大、易于使用且对超参数不敏感。

18:偏差-方差权衡与过拟合/欠拟合

在本节课中,我们将学习机器学习中一个核心概念:偏差-方差权衡。我们将从数学上分解泛化误差,理解其与过拟合和欠拟合的关系,并探讨在现代深度学习背景下,关于模型复杂度的经典观点如何被重新审视。

1. 概述与动机

上一节我们介绍了模型评估的基本概念。本节中,我们来看看一个更深入的问题:为什么我们的模型在训练集上表现良好,却在未见过的测试数据上表现不佳?这个问题的核心在于理解偏差、方差和噪声。

为了直观理解,考虑一个经典的例子:使用不同阶数的多项式去拟合一个正弦函数。我们生成多个不同的数据集(每个数据集包含从正弦函数中采样的少量点),并对每个数据集进行拟合。

  • 欠拟合:当使用非常简单的模型(如低阶多项式或常数函数)时,模型无法捕捉数据中的基本模式。这对应于高偏差
  • 过拟合:当使用非常复杂的模型(如高阶多项式)时,模型会“记住”每个训练数据点,包括噪声,导致在训练集上完美拟合,但在新数据上表现糟糕。这对应于高方差

下图展示了不同正则化强度(λ)下的拟合情况。当λ很大时,所有拟合曲线都收敛到一个简单的函数(高偏差,低方差)。当λ很小时,拟合曲线彼此差异很大(低偏差,高方差)。


2. 关键定义

在深入数学推导之前,我们需要明确几个关键定义。

2.1 最优回归函数

对于回归问题,我们使用平方损失。在已知数据真实分布 P(x, y) 的情况下,使期望损失最小的函数被称为最优回归函数。通过求解最小化问题,我们可以得到:

f*(x) = E[y | x] = ∫ y P(y | x) dy

这个函数 f*(x) 就是在给定 x 时,y 的条件期望。它是我们所能达到的最佳预测。

2.2 期望测试误差(泛化误差)

在实践中,我们不知道真实分布,只能通过训练集 D 学习一个函数 f_D。我们关心的是这个函数在真实数据分布上的表现,即泛化误差 R(f_D)

R(f_D) = E_(x, y)~P[ (f_D(x) - y)^2 ]

这个误差衡量了我们的预测 f_D(x) 与真实值 y 之间的差距。

2.3 期望回归函数

如果我们能多次从数据分布中采样得到不同的训练集 D_1, D_2, ...,并对每个训练集都拟合出一个函数 f_D_i,那么这些函数的平均值就是期望回归函数:

f̄(x) = E_D[ f_D(x) ]

这个函数代表了我们的学习算法在所有可能训练集上的“平均预测”。

3. 偏差-方差-噪声分解

现在,我们可以对泛化误差进行分解。我们的目标是分析 R(f_D),但我们需要考虑算法在所有可能训练集上的平均表现,因此我们最终关心的是期望泛化误差 E_D[ R(f_D) ]

通过巧妙的数学操作(添加再减去 f̄(x)f*(x)),我们可以将 E_D[ R(f_D) ] 分解为三个独立的部分:

E_D[ R(f_D) ] = E_x[ (f̄(x) - f*(x))^2 ] + E_D, x[ (f_D(x) - f̄(x))^2 ] + E_(x, y)[ (y - f*(x))^2 ]

以下是每个部分的含义:

  1. 偏差²E_x[ (f̄(x) - f*(x))^2 ]

    • 这衡量了学习算法的平均预测 f̄(x)最优预测 f*(x) 之间的差距。
    • 高偏差意味着模型过于简单,无法捕捉数据中的潜在关系(欠拟合)。
  2. 方差E_D, x[ (f_D(x) - f̄(x))^2 ]

    • 这衡量了针对不同训练集得到的单个预测函数 f_D(x) 围绕其平均预测 f̄(x) 的波动程度。
    • 高方差意味着模型过于复杂,对训练数据中的随机噪声过于敏感(过拟合)。
  3. 噪声E_(x, y)[ (y - f*(x))^2 ]

    • 这衡量了数据中固有的、不可约的随机性。即使我们知道了最优预测 f*(x),由于 y 本身是随机的,仍然会存在误差。
    • 噪声与模型选择无关,是问题本身固有的。

3.1 直观示例:飞镖游戏

考虑一个飞镖游戏,目标是击中靶心(f*(x))。

  • 高偏差,低方差:你视力不好,没戴眼镜。你每次都稳定地打在同一个偏离靶心的位置。你的平均落点(f̄(x))有偏差,但每次投掷的波动很小。
  • 低偏差,高方差:你喝醉了,但戴着眼镜。你的平均落点可能在靶心附近,但每次投掷都散落在各处。偏差小,但方差大。
  • 噪声:突然刮起大风,即使你是神枪手(低偏差、低方差),飞镖也会被吹离轨迹。这个由风引起的误差就是噪声。

4. 与过拟合/欠拟合的联系

偏差-方差分解完美地解释了过拟合和欠拟合现象。

  • 模型复杂度低(如简单线性模型):
    • 偏差高:模型太简单,无法拟合数据模式。
    • 方差低:模型不灵活,不同训练集得到的模型差异不大。
    • 结果:欠拟合。训练误差和测试误差都较高。
  • 模型复杂度高(如高阶多项式或大型神经网络):
    • 偏差低:模型足够复杂,平均预测接近最优。
    • 方差高:模型过于灵活,会拟合训练数据中的噪声,导致不同训练集得到的模型差异巨大。
    • 结果:过拟合。训练误差很低,但测试误差很高。

经典的机器学习教义是寻找偏差和方差之间的“甜蜜点”,即模型复杂度适中,使总泛化误差最小。

5. 重新思考泛化:现代视角

然而,在现代深度学习中,我们通常使用参数数量远超训练样本数的“过参数化”模型,并且仍然能取得很好的泛化性能。这挑战了经典的偏差-方差权衡观点。

5.1 实验观察:重新思考泛化

一篇2017年的著名论文《理解深度学习需要重新思考泛化》通过实验表明,相同的神经网络架构:

  • 在MNIST真实标签上可以很好地学习和泛化。
  • 在MNIST随机打乱的标签上,同样可以将训练误差降到零,但完全无法泛化。
    既然模型架构(复杂度)相同,为何泛化能力天差地别?这说明参数数量本身并不能很好地定义“模型复杂度”

5.2 双下降现象

另一项研究观察到了“双下降”曲线。当模型参数数量接近训练样本数量时,测试误差会出现一个峰值(这是经典过拟合区域)。但是,当继续增加参数,使模型进入“过参数化”区域后,测试误差会再次下降

这表明,在模型容量极大时,学习算法似乎找到了一种更“平滑”或更“简单”的方式来拟合数据,从而实现了更好的泛化。

5.3 格罗金现象

在一个更极端的例子中,研究者训练一个过参数化模型学习模除运算。在训练初期,模型很快记住了训练集(训练准确率100%),但测试准确率几乎为零(典型过拟合)。然而,继续训练极长时间后,测试准确率突然开始上升,最终达到接近100%。这个现象被称为“格罗金”,意指模型在长时间训练后似乎突然“理解”了任务的内在规律。

5.4 理论见解:过参数化与平滑性

有理论工作证明,在极度过参数化的条件下(参数数量 >> 样本数量),使用梯度下降等算法训练的网络倾向于找到一个平滑的函数解。而平滑函数通常具有更好的泛化能力。这为过参数化模型的成功提供了一种可能的解释:足够的容量让模型有机会找到一个既拟合数据又保持平滑的解,而不是被迫去“记忆”噪声。

6. 总结

本节课中我们一起学习了机器学习中的核心概念——偏差-方差权衡。

  1. 我们从数学上推导了泛化误差可以分解为偏差方差噪声三部分。
  2. 偏差衡量模型本身的系统性误差,方差衡量模型对数据扰动的敏感性,噪声是数据固有的不确定性。
  3. 这一分解清晰地解释了欠拟合(高偏差)过拟合(高方差) 现象。经典机器学习旨在通过调整模型复杂度来平衡二者。
  4. 然而,现代深度学习的实践(使用过参数化模型)对经典观点提出了挑战。实验观察到的“双下降”曲线和“格罗金”等现象表明,模型复杂度不能简单地用参数数量来衡量
  5. 当前的研究表明,在过参数化区域,优化算法可能倾向于找到平滑的解,这或许是其泛化能力良好的关键。关于泛化的本质,仍然是机器学习领域一个活跃且未完全解决的研究课题。

理解偏差-方差权衡为我们诊断模型问题、选择模型复杂度提供了根本性的框架。同时,了解其现代发展也能帮助我们以更开放的视角看待深度学习模型的行为。

19:隐马尔可夫模型与图模型 1

在本节课中,我们将学习两种重要的概率模型:隐马尔可夫模型和概率图模型。我们将从简单的马尔可夫链开始,理解序列数据中的依赖关系,然后引入更复杂的隐马尔可夫模型。最后,我们将学习一种更通用的建模语言——概率图模型,并探讨其中的条件独立性概念。

从独立同分布到序列依赖

到目前为止,在课程中我们讨论的都是独立同分布的随机变量。我们将转向更有趣的情况,考虑一个随机变量序列,并且这个序列中的随机变量不是独立的。也就是说,给定 X_{t'}X_t 的概率不等于 P(X_t)。在 X_{t'}X_t 之间存在依赖关系。

在这个设定中,t 不一定代表时间,但让我们首先将其视为时间。一个简单的例子是天气。随机变量是“热”或“冷”。如果今天是热的,那么明天是热的可能性也更高。你可以想象很多例子,其中随机变量序列的状态在下一个时间步,很大程度上取决于前一个时间步发生了什么。

马尔可夫链

马尔可夫条件是一种在随机变量之间建立依赖关系的非常简单的方式。它说的是:预测未来时,过去无关紧要,只取决于现在。用公式表示,对于未来状态,其概率仅取决于当前状态:

P(未来 | 现在, 所有过去) = P(未来 | 现在)

在天气的例子中,这可能是一个合理的假设。但在语言预测中,下一个词的概率显然依赖于前一个词,但这种依赖可能依赖于过去发生的许多事情。当前的大型语言模型在某种程度上是这种一阶马尔可夫条件的泛化,但其上下文窗口可能长达数千个词。

马尔可夫链的概率分解

如果我们假设马尔可夫条件,我们可以证明整个序列的概率可以分解为一系列条件概率的乘积:

P(x_1, x_2, ..., x_T) = P(x_1) * P(x_2 | x_1) * P(x_3 | x_2) * ... * P(x_T | x_{T-1})

这个分解的关键在于,马尔可夫条件使得联合概率 dramatically 简化。如果我们考虑一个包含 T 个二元随机变量的一般概率分布,我们需要 2^T - 1 个参数来指定它。然而,对于一个具有 K 个状态的一阶马尔可夫链,我们只需要 (K-1) + (T-1)*K*(K-1) 个参数。参数数量从随 T 指数增长,减少为随 T 线性增长,这是一个巨大的简化。

齐次马尔可夫链

另一个简化层次是假设转移概率不依赖于时间。这意味着从状态 s_i 转移到状态 s_j 的概率在任何时间点都是相同的。这被称为时间齐次马尔可夫链。在这种情况下,我们可以用一个固定的转移概率矩阵 A 来描述系统,其中 A_{ij} = P(x_{t+1}=j | x_t=i)。这个矩阵的每一行之和必须为 1。

一个经典的例子是“青蛙跳荷叶”模型。假设有两个荷叶,东边和西边。青蛙根据掷硬币的结果决定是否跳到另一个荷叶。我们可以用状态图来表示这个过程,其中节点是状态(东、西),边是转移概率。通过初始状态向量 π 和转移矩阵 A,我们可以计算任何未来时间步的状态概率分布:π_{t+1} = π_t * A

隐马尔可夫模型

现在,我们在马尔可夫链的基础上引入一个新的随机变量,从而得到隐马尔可夫模型。

假设我们的青蛙在每一个荷叶上都会发出叫声(比如“呱呱”的次数,1到3次)。它发出某种叫声的概率取决于它所在的荷叶(即马尔可夫链的当前状态)。在许多问题中,这个新的随机变量(叫声)是我们能观察到的,而原始的状态(青蛙的位置)是隐藏的、观测不到的。

对于机器学习从业者来说,我们只能观察到 Y(叫声),而我们希望对这个可观测的随机变量进行学习或推断,并试图找出背后隐藏的状态序列 X

HMM 的定义

一个隐马尔可夫模型由以下部分定义:

  • 状态:隐藏的马尔可夫链有 K 个状态(例如,东、西)。
  • 转移概率矩阵 A:描述了状态之间的转移概率,通常假设是时间齐次的。
  • 观测似然 B:对于每个隐藏状态,有一个概率分布来描述产生各种观测的可能性。这被称为发射概率
  • 初始状态分布 π:系统在时间 t=1 时处于各个状态的概率。

一个非常经典的应用是语音识别。观测是声波,而隐藏状态是说话者心中想要表达的单词序列。HMM 的任务就是根据观测到的声波,推断出最可能的单词序列。

HMM 的三大问题

  1. 评估问题:给定模型参数和观测序列,计算该观测序列出现的概率 P(Y | 参数)
  2. 解码问题:给定模型参数和观测序列,找出最有可能产生该观测序列的隐藏状态序列。这正是语音识别要解决的问题。
  3. 学习问题:给定观测序列,估计模型参数 A, B, π。我们将在下一讲讨论这个问题。

概率图模型

现在,我们切换到一个更通用、更强大的建模语言——概率图模型。

概率图模型使用图结构来编码随机变量之间的依赖关系。对于有向无环图,我们可以通过查看每个节点的父节点来构造整个图的联合概率分布。联合概率分解为每个节点在其父节点条件下的概率的乘积:

P(x_1, x_2, ..., x_N) = ∏_{i=1}^{N} P(x_i | parents(x_i))

这种分解带来了巨大的简化。考虑一个包含5个二元变量的全连接图,需要 2^5 - 1 = 31 个参数。但如果图结构稀疏(例如,某些变量之间没有直接边),所需的参数数量会大幅减少。图模型的美妙之处在于,它用直观的图结构捕捉了变量之间依赖关系的缺失。

基本的三节点图与条件独立性

为了理解图模型如何表示独立性,我们需要研究最基本的结构:三个节点的图。本质上,有三种基本结构:

  1. 链式结构X1 -> X2 -> X3
  2. 分叉结构X2 -> X1, X2 -> X3
  3. 汇合结构X1 -> X2, X3 -> X2

以下是关于条件独立性的关键结论:

  • 链式与分叉结构:在这两种结构中,如果中间节点 X2 被观测到,那么 X1X3 在给定 X2 的条件下是独立的。我们说 X2 阻断X1X3 之间的路径。

    • 直观理解:在链式中,X1 的影响必须通过 X2 才能到达 X3。一旦 X2 已知,X1 就不再提供关于 X3 的额外信息。在分叉中,X2X1X3 的共同原因。一旦知道了原因 X2,两个结果 X1X3 就变得独立。
  • 汇合结构:这是最有趣的情况。在汇合结构中,X1X3X2 的父节点,并且它们之间没有直接连接。X2 未被观测时X1X3 是独立的。

    • 然而,当 X2 或其任何子节点被观测到时X1X3 就变得依赖了。这被称为“解释 away”效应。
    • 经典例子X1=地震发生,X3=小偷入室,X2=警报响。地震和小偷入室本是独立事件。但如果警报响了(X2 被观测),你得知刚刚发生了地震,那么你就会认为小偷入室的可能性大大降低。一个原因“解释”了结果,使得另一个原因的可能性下降,从而在两个父节点之间引入了依赖关系。

D-分离:图模型中的独立性检验算法

D-分离是 Judea Pearl 提出的一个图论准则,用于系统性地判断在有向图中,给定一组观测变量 Z 后,两组变量 XY 是否条件独立。

算法思路如下:考虑所有连接 XY 的无向路径。如果对于每一条这样的路径,都存在一个节点使得该路径被“阻断”,那么 XY 在给定 Z 下就是 D-分离的,即条件独立。

一个节点在以下情况下会阻断一条路径:

  1. 该节点在 Z 中,并且它的连接方式是链式或分叉结构。
  2. 该节点不在 Z,它的后代也不在 Z,并且它的连接方式是汇合结构。

通过应用 D-分离规则,我们可以高效地分析复杂图模型中的条件独立性,而无需进行繁琐的概率计算。

回到隐马尔可夫模型

现在,我们可以用新学的概率图模型语言来优雅地表示隐马尔可夫模型。

一个 HMM 的图模型表示是一个长的链式结构:X1 -> X2 -> ... -> X_T,表示隐藏状态序列。然后,每个隐藏状态 X_t 指向一个观测节点 Y_t。联合概率分解为:

P(X, Y) = P(x1) * [∏_{t=2}^{T} P(x_t | x_{t-1})] * [∏_{t=1}^{T} P(y_t | x_t)]

这个分解式与之前代数的定义完全一致。图模型的优势在于,它让模型的结构和条件独立性假设一目了然。例如,从图中我们可以立即看出,任何两个不相邻的隐藏状态 X_iX_j,在给定它们之间所有节点的情况下是条件独立的。


本节课中,我们一起学习了序列建模的基础。我们从马尔可夫链开始,理解了其如何用少量的参数建模序列依赖。然后引入了隐马尔可夫模型,其中可观测的数据由隐藏的状态序列产生。最后,我们学习了概率图模型这一强大框架,它用图结构编码变量间的依赖与独立关系,并通过分析三节点基本结构和 D-分离准则,掌握了判断条件独立性的方法。在下一讲中,我们将深入探讨 HMM 的推断与学习算法。

20:隐马尔可夫模型与图模型 2

在本节课中,我们将继续学习概率图模型。我们将首先完成对d-分离概念的讲解,并通过示例加深理解。接着,我们将探讨概率图模型的核心优势——参数计数,并理解条件独立性如何简化模型。最后,我们将重点介绍隐马尔可夫模型,并学习两种关键的推理算法:用于估计最终状态概率的滤波算法,以及用于寻找最可能隐藏状态序列的维特比算法。

d-分离概念回顾

上一节我们介绍了图模型中的基本结构单元。本节中,我们来看看如何利用这些单元来判断变量间的条件独立性,这个过程称为d-分离。

d-分离的核心思想是检查图中所有连接两个变量的无向路径。如果每条路径都被“阻塞”,那么这两个变量在给定某些观测变量的条件下是独立的。路径的阻塞规则基于我们之前学过的三种基本结构:

  1. 链式结构 (X₁ → X₂ → X₃):当中间节点 X₂ 被观测到时,路径被阻塞,X₁X₃ 条件独立。公式表示为:X₁ ⟂ X₃ | X₂
  2. 分叉结构 (X₁ ← X₂ → X₃):当中间节点 X₂ 被观测到时,路径被阻塞,X₁X₃ 条件独立。公式表示为:X₁ ⟂ X₃ | X₂
  3. 汇合结构 (X₁ → X₂ ← X₃):当中间节点 X₂ 未被观测时,路径被阻塞,X₁X₃ 独立。但当 X₂ 或其子节点被观测时,路径反而畅通,无法保证 X₁X₃ 独立。

d-分离应用示例

让我们通过一个具体图例来练习d-分离。考虑下图,我们需要判断在给定不同观测集时,变量间的条件独立性。

示例1:判断 X₁ 与 X₂ 是否在给定 X₆ 时独立

我们需要检查所有从 X₁ 到 X₂ 的无向路径。

  • 路径1: X₁ — X₃ — X₆ — X₅ — X₂
    • 首先到达节点 X₃。这是一个汇合结构(X₁ → X₃ ← X₄),且 X₃ 未被观测,根据规则,此节点不阻塞路径。
    • 然后到达节点 X₆。这是一个链式结构(X₃ → X₆ → X₅),且 X₆ 被观测到,此节点本应阻塞路径,但由于我们已在 X₃ 处发现路径未被阻塞,整条路径未被阻塞
  • 由于找到一条未被阻塞的路径,因此我们不能保证 X₁ ⟂ X₂ | X₆

示例2:判断 X₃ 与 X₇ 是否在给定 X₂ 时独立

我们需要检查所有从 X₃ 到 X₇ 的无向路径。

  • 路径1: X₃ — X₁ — X₂ — X₅ — X₇
    • 首先到达节点 X₁。这是一个汇合结构(X₃ → X₁ ← X₄)。X₁ 未被观测,且其子节点 X₂ 被观测到,这反而激活了路径,因此该节点不阻塞路径。
    • 接着到达节点 X₂。这是一个分叉结构(X₁ → X₂ → X₅)。X₂ 被观测到,因此该节点阻塞了路径。
    • 由于路径在 X₂ 处被阻塞,整条路径被阻塞
  • 路径2: X₃ — X₆ — X₅ — X₇
    • 首先到达节点 X₆。这是一个分叉结构(X₃ → X₆ → X₅)。X₆ 未被观测,因此该节点不阻塞路径。
    • 接着到达节点 X₅。这是一个汇合结构(X₂ → X₅ ← X₆)。X₅ 未被观测,因此该节点阻塞了路径。
    • 由于路径在 X₅ 处被阻塞,整条路径被阻塞
  • 所有从 X₃ 到 X₇ 的路径都被阻塞,因此 X₃ ⟂ X₇ | X₂ 成立。

图模型的优势:参数计数

我们为什么如此关心条件独立性?因为它能极大简化模型,减少需要估计的参数数量,这是概率图模型的核心优势。

考虑一个简单的例子:三个二元变量R(下雨)、S(洒水器开关)、W(草地湿)。其联合分布 P(R, S, W) 需要一个有 2³ = 8 个条目的概率表,由于概率和为1,我们需要指定 7 个参数。

然而,如果我们根据下图所示的因果关系建模:

联合概率可以分解为:P(R, S, W) = P(R) * P(S|R) * P(W|S, R)

现在,我们只需要估计以下条件概率表(CPT)中的参数:

  • P(R):1个参数(因为 P(R=False) = 1 - P(R=True))。
  • P(S|R):2个参数(需要为R=True和R=False两种情况分别指定P(S=True|R),另一个概率可推导)。
  • P(W|S, R):4种(S,R)组合,需要4个参数?不对。对于每种(S,R)组合,只需指定P(W=True|S,R),P(W=False|S,R)可推导。所以只需要 4 个参数。

总参数为:1 + 2 + 4 = 7 个。虽然总数相同,但关键区别在于:

  1. 结构化:参数现在具有明确的现实意义(如P(S=True|R=True)表示下雨时洒水器打开的概率)。
  2. 可扩展性:对于更多变量,链式分解的优势将呈指数级增长。对于一个具有T个二元变量的马尔可夫链,其联合分布 P(X₁, ..., X_T) 若没有结构,需要 2^T - 1 个参数。但若按马尔可夫链分解:P(X₁)Π P(X_t|X_{t-1}),则仅需:1(初始状态) + 2*(T-1)(转移概率) = 2T - 1 个参数。当T很大时,这带来了巨大的简化。

联合分布是“万能”的

概率图模型给出了联合分布的分解形式。拥有联合分布,我们就能回答关于该系统的任何概率查询。

例如,在洒水器例子中,观察到草地湿了(W=True),想推断下雨的概率(R=True),即计算 P(R=True | W=True)

我们可以通过联合分布来计算:

  1. 利用贝叶斯定理:P(R|W) = P(R, W) / P(W)
  2. P(R, W)P(W) 可通过联合分布的边缘化求得:
    • P(W=True) = Σ_{r, s} P(R=r, S=s, W=True)
    • P(R=True, W=True) = Σ_{s} P(R=True, S=s, W=True)

通过查询联合概率表并求和,即可得到答案。这意味着,一旦定义了图模型及其参数(CPT),原则上我们可以通过计算回答任何推断问题。

隐马尔可夫模型简介

现在,我们将目光转向一种重要的结构化图模型——隐马尔可夫模型。HMM用于建模具有隐藏状态的时间序列数据。

一个经典的例子是“天气-冰淇淋”模型:

  • 隐藏状态 X_t:表示第t天的天气(Hot或Cold),这是一个马尔可夫链。
  • 观测变量 Y_t:表示第t天吃的冰淇淋数量(1,2,3),其概率依赖于当天的天气。

模型由以下参数定义:

  • 初始概率π_i = P(X₁ = i)
  • 状态转移概率A_{ij} = P(X_t = j | X_{t-1} = i)
  • 观测发射概率B_{jk} = P(Y_t = k | X_t = j)

HMM的核心问题是:给定一系列观测序列 y₁, y₂, ..., y_T,我们对隐藏状态进行推断。

动态规划思想回顾

在讲解HMM的推断算法前,先回顾一个关键思想——动态规划。它通过将复杂问题分解为重叠子问题来高效求解。

考虑一个寻找最廉价航班的例子:从火奴鲁鲁出发,经西海岸、中西部,最终到东海岸,每个阶段有多个城市可选,机票价格固定。

  • 暴力方法:枚举所有路径。如果有K个城市可选,阶段数为T,则路径数为 K^T,不可行。
  • 动态规划方法(逆向推导)
    1. 计算到达终点前一站(如芝加哥、丹佛、达拉斯)每个城市的最廉价费用。这需要比较从所有西海岸城市飞来的价格,计算量为
    2. 记录下到达每个城市的最小费用以及对应的前一站城市。
    3. 逐步向前一阶段回溯,重复此过程。
    4. 最终,从起点开始,利用记录的信息正向找出最优路径。

总计算量约为 K² * T,远优于指数复杂度。维特比算法正是这种思想在概率最大化问题上的应用。

HMM推断问题一:滤波

滤波问题是:给定截至当前时间t的所有观测 y₁:t,估计当前隐藏状态 X_t 的概率分布,即计算 P(X_t | y₁:t)

我们利用递归方式计算,定义 α_t(j) = P(X_t = j, y₁:t)。推导如下:

  1. 根据贝叶斯定理,P(X_t | y₁:t) ∝ P(X_t, y₁:t) = α_t(X_t)
  2. α_t(X_t) 进行递归分解:
    α_t(j) = P(X_t=j, y₁:t)
           = Σ_i P(X_t=j, X_{t-1}=i, y₁:t)                // 引入X_{t-1}并求和(边缘化)
           = Σ_i P(y_t | X_t=j) * P(X_t=j | X_{t-1}=i) * P(X_{t-1}=i, y₁:t-1) // 利用条件独立性和链式法则
           = Σ_i [B_{j, y_t} * A_{i, j} * α_{t-1}(i)]
    
  3. 初始条件:α₁(j) = π_j * B_{j, y₁}

通过从 t=1 到 t=T 递归计算 α_t,我们就可以得到滤波分布 P(X_t | y₁:t) ∝ α_t(X_t)。这个算法称为前向算法

HMM推断问题二:解码(维特比算法)

解码问题是:给定整个观测序列 y₁:T,找到最可能的隐藏状态序列 x₁:T,即求 argmax_{x₁:T} P(x₁:T | y₁:T)

由于分母 P(y₁:T) 与状态序列无关,这等价于求 argmax_{x₁:T} P(x₁:T, y₁:T)

维特比算法使用动态规划来解决这个问题。它定义了一个值函数 δ_t(i),表示在时刻t以状态i结尾的所有局部路径中,联合概率的最大值:
δ_t(i) = max_{x₁:t-1} P(x₁:t-1, X_t=i, y₁:t)

递归推导如下:

  1. 初始化δ₁(i) = π_i * B_{i, y₁}
  2. 递归:对于 t = 2 到 T
    δ_t(j) = max_i [ δ_{t-1}(i) * A_{i, j} ] * B_{j, y_t}
    
    同时,我们需要记录使上式取最大值的状态i,保存在 ψ_t(j) 中:ψ_t(j) = argmax_i [ δ_{t-1}(i) * A_{i, j} ]
  3. 终止:最可能序列的概率为 P = max_i δ_T(i),最终状态为 x_T = argmax_i δ_T(i)
  4. 回溯:对于 t = T-1 到 1,利用记录的回溯指针找到最优路径:x_t* = ψ_{t+1}(x_{t+1}*)

这与寻找最廉价航班的动态规划思想完全一致:δ_t(j) 相当于到达城市j的最廉价费用,ψ_t(j) 记录了是从哪个前一站城市来的。

总结

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

  1. d-分离的完整应用:通过分析图中路径的阻塞情况,严谨判断变量间的条件独立性。
  2. 概率图模型的核心优势:通过条件独立性进行因子分解,能指数级减少模型参数,使复杂系统建模变得可行。
  3. 隐马尔可夫模型:一种用于序列数据的经典图模型,包含隐藏状态链和与之相关的观测。
  4. HMM的关键推断算法
    • 滤波算法:递归计算当前状态的后验分布。
    • 维特比算法:基于动态规划,高效找到最可能的隐藏状态序列。

理解这些内容,为我们在实际应用中处理如语音识别、生物信息学、金融分析等领域的序列数据打下了坚实的基础。

21:生成模型 1 🧠

在本节课中,我们将要学习生成模型的基础知识,特别是用于从复杂概率分布中采样的方法。我们将从回顾维特比算法开始,然后深入探讨朗之万动力学,这是一种仅需知道概率分布的“分数函数”(梯度对数概率)即可进行采样的强大算法。

维特比算法回顾 ✈️

上一节我们介绍了用于寻找隐马尔可夫模型中最可能状态序列的维特比算法。本节中,我们来看看该算法的另一种表述,它更贴近作业的实现方式。

首先,快速回顾一下“最廉价航班”问题。我们通过动态规划,计算了从起点到每个中间城市的最廉价路径,最终找到抵达东海岸的最优方案。算法的核心在于,每个阶段的计算只依赖于前一阶段的结果,总计算复杂度为 O(TK²),其中 T 是阶段数,K 是每个阶段的选项数。

对于隐马尔可夫模型,我们面临类似问题:给定观测序列(例如,某人每天吃的冰淇淋数量:1, 3, 1),我们希望找到最可能的隐藏状态序列(例如,天气是热还是冷)。暴力枚举所有可能的隐藏状态序列需要 O(2^T) 次计算,当 T 很大时(例如 T=100),这是不可行的。

维特比算法通过动态规划将复杂度降低到 O(TK²)。其核心思想是递归地计算一个“消息”函数。对于我们的三天气候例子(T=3,状态 K=2:热或冷),算法步骤如下:

  1. 初始化:对于第一个隐藏状态 x₁,计算其联合概率(先验概率 × 发射概率)。
    • ν(x₁) = P(x₁) * P(y₁ | x₁)
  2. 递归:对于后续的每个时间点 t(从 2 到 T),计算:
    • ν(x_t) = max_{x_{t-1}} [ ν(x_{t-1}) * P(x_t | x_{t-1}) * P(y_t | x_t) ]
    • 这个计算为每个可能的 x_t 值,找到能使其概率最大的前一个状态 x_{t-1},并记录下这个最大值以及对应的 argmax(即最优的 x_{t-1})。
  3. 终止:在最后一个时间点 T,选择使 ν(x_T) 最大的 x_T。
  4. 回溯:根据每一步记录的 argmax,从最终状态 x_T* 反向追溯,得到整个最可能的状态序列 (x₁, x₂, x₃*)。

这种算法形式是从前向后计算消息 ν,然后再回溯。它等价于从后向前最大化并传递消息的另一种表述。关键在于理解,每一步我们都在处理一个关于前一个状态的 最大化 操作,从而避免了枚举所有序列。

以下是该算法的另一种常见数学记号,在作业中可能会遇到:

  • 用索引 i, j ∈ {1, ..., K} 表示离散状态。
  • 转移概率 P(x_t = j | x_{t-1} = i) 记为 a_{ij}
  • 发射概率 P(y_t | x_t = j) 记为 b_j(y_t)
  • 递归步骤写作:ν_t(j) = max_{i=1 to K} [ ν_{t-1}(i) * a_{ij} * b_j(y_t) ]

无论哪种表述,其本质都是利用动态规划,将指数级复杂度的搜索问题,转化为多项式复杂度的计算问题。

生成模型与采样简介 🎨

现在,让我们转向生成模型的核心问题。生成模型的目标很简单,但实现起来很有挑战性。

生成模型定义:我们有一些来自未知分布 P_data(x) 的样本。我们的目标是学习一个模型,使得能够从该分布中抽取新的、独立的样本。理想情况下,生成的新样本应该与真实数据样本在统计上无法区分。

这是一个无监督学习问题,因为我们只需要数据样本本身,而不需要标签。这使得我们可以利用海量的无标签数据(如整个互联网的文本或所有YouTube视频)进行训练。

本节课,我们首先关注一个更基础的问题:假设我们已经知道了一个概率分布 P(x),如何从中进行采样? 采样意味着按照 P(x) 的概率密度随机生成数据点。例如,对于一个二维高斯分布,采样就是生成一堆点,这些点在密度高的区域更集中,在密度低的区域更稀疏。

这与优化(寻找概率最高的点,即众数)完全不同。采样要求我们捕获整个分布的特性,包括其尾部。

马尔可夫链蒙特卡洛与朗之万动力学 🔄

一种强大的采样方法是马尔可夫链蒙特卡洛。其核心思想是:构造一个马尔可夫链,其转移核经过足够多次迭代后,链的状态分布会收敛到我们想要的目标分布 P(x)。这样,我们只需运行这个链,并将其最终状态作为样本。

MCMC 方法有很多,本节课我们聚焦于朗之万动力学,它是许多现代生成模型(如扩散模型)的基础。其更新规则非常优雅:

x_{t+1} = x_t + η * ∇_x log P(x_t) + √(2η) * ε_t

其中:

  • x_t 是当前状态(一个向量)。
  • η 是步长(学习率)。
  • ∇_x log P(x_t) 是目标分布对数概率在 x_t 处的梯度,称为分数函数
  • ε_t ~ N(0, I) 是标准高斯噪声。

算法直观理解

  1. 梯度上升项 (η * ∇_x log P(x_t)): 这一项推动粒子向概率更高的区域移动(因为梯度指向概率增加最快的方向)。可以看作是“利用”当前知识,向高概率区域靠拢。
  2. 噪声项 (√(2η) * ε_t): 这一项添加随机噪声,使粒子能够探索空间,避免永远困在局部高概率区域。可以看作是“探索”整个分布。

噪声项中 √(2η) 的由来:可以通过量纲分析简单理解。假设 x 具有长度量纲 L。梯度项 ∇ log P(x) 的量纲是 1/L(因为 log P 无量纲)。为了使等式两边量纲一致(都是 L),噪声系数必须是 √η 的量纲(因为 η 的量纲是 L²,√η 的量纲是 L)。系数 √2 则来自更严格的连续时间推导,确保在连续极限下,链的稳态分布恰好是 P(x)。

当步长 η 很小时,朗之万更新可以近似为一个随机微分方程:
dx_t = ∇_x log P(x_t) dt + √2 dW_t
其中 dW_t 是维纳过程(布朗运动)。理论保证,在温和条件下,运行此链足够长时间后,x_t 的分布会收敛到 P(x)。

朗之万动力学实践演示 📊

让我们通过模拟来直观理解朗之万算法。我们从一个简单的目标分布开始:标准高斯分布 P(x) = N(0, 1)。其分数函数为 ∇ log P(x) = -x

我们运行朗之万链:x_{t+1} = x_t - η * x_t + √(2η) * ε_t

关键观察

  • 步长 η 的选择至关重要
    • η 太大:更新过于激进,粒子容易“冲过头”,导致采样偏差大,样本分布与目标分布差异明显。
    • η 太小:更新步幅小,粒子移动缓慢,需要极长的迭代步数才能探索完整个分布,效率低下,且初始阶段样本会过度集中在起点附近。
    • 需要调优 η 以在偏差和效率之间取得平衡。
  • 初始化:理论上,从任意点初始化,链最终都会收敛到目标分布。但在高维问题中,糟糕的初始化可能需要更长的“预热”时间才能进入典型集。
  • 各向异性分布的挑战:对于协方差矩阵各向异性的高斯分布(例如,在一个方向上拉伸得很长),朗之万采样会遇到困难。步长 η 受限于分布最窄的方向(以确保稳定性),但这会导致在拉伸方向上的探索极其缓慢。这类似于优化中病态条件数问题。

以下是一个各向异性高斯分布的采样示例。假设分布在 x 方向的标准差远大于 y 方向。朗之万算法可以很好地捕捉 y 方向的分布,但在 x 方向的探索不足,导致采样得到的分布比真实分布更“瘦”。这揭示了朴素朗之万动力学的一个主要局限。

下节课预告与总结 🚀

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

  1. 维特比算法的另一种实用表述,用于高效计算隐马尔可夫模型的最可能状态序列。
  2. 生成模型的基本目标:从未知数据分布中生成新样本。
  3. 采样的核心挑战,以及如何通过构造马尔可夫链来解决它。
  4. 朗之万动力学算法:一种仅需分数函数 ∇ log P(x) 即可进行采样的强大 MCMC 方法。我们分析了其更新规则、步长的影响,并通过模拟观察了其行为和局限,特别是在各向异性分布上的困难。

然而,我们遗留了两个关键问题:

  1. 在现实中,我们并不知道真实数据分布 P_data(x),因此也就不知道其分数函数。如何从数据中学习这个分数函数?
  2. 朗之万动力学在处理复杂、高维、多模态分布时可能收敛很慢。如何加速采样过程?

下节课,我们将看到噪声如何成为救星。通过向数据中逐步添加噪声,我们可以将复杂的分布逐渐平滑成简单的高斯分布。学习去噪的过程,恰好等价于学习分数函数!这就是去噪分数匹配扩散模型的核心思想。我们将学习如何利用这一原理,构建能够高效生成高质量样本的现代生成模型。

22:生成模型 2 🧠

在本节课中,我们将继续学习生成模型。上一讲我们介绍了朗之万动力学,这是一种仅需知道分布的得分函数(即对数概率密度的梯度)即可从中采样的方法。然而,该方法在处理多峰分布时可能面临混合缓慢的问题。本节我们将探讨如何学习得分函数,并介绍一种通过添加噪声来平滑分布、从而解决采样难题的强大技术。


朗之万动力学回顾 🔄

上一节我们介绍了朗之万动力学,其核心迭代公式如下:

公式:朗之万更新规则

x_{t+1} = x_t + η * ∇_x log p(x_t) + √(2η) * z_t

其中,η 是步长,z_t ~ N(0, I) 是标准高斯噪声。

这个公式结合了两种力量:

  1. 梯度项 ∇_x log p(x_t):将粒子拉向高概率区域(模式)。
  2. 噪声项 √(2η) * z_t:提供随机探索,使采样能够覆盖分布的尾部。

我们通过量纲分析理解了公式中 √(2η) 的由来:为了保持算法的物理一致性,噪声的幅度必须是步长的平方根。


朗之万动力学面临的挑战 ⚠️

尽管朗之万动力学在理论上可以采样任意分布,但在实践中,当目标分布具有分离良好的多峰结构时,它会遇到严重问题。

以下是朗之万动力学面临的两个主要挑战:

  1. 各向异性协方差问题:当分布在不同方向上的尺度差异很大时(例如一个被拉长的椭圆高斯分布),为某个方向调优的步长可能使在其他方向上的探索变得极其缓慢。
  2. 多峰混合问题:这是更关键的问题。当分布有多个被低概率区域(“沙漠”)隔开的峰(模式)时,朗之万链可能被困在其中一个模式中,无法感知和转移到其他模式。这是因为在低概率区域,梯度几乎为零,仅靠噪声难以跨越巨大的概率鸿沟。

为了直观理解,想象一个由三个相距很远、方差很小的高斯分布组成的混合模型。如果一个粒子初始化在其中一个峰上,它很可能永远无法发现另外两个峰的存在。


解决方案:对数据添加噪声 🌫️

如何解决多峰混合的难题呢?一个巧妙的思路是:不去直接对复杂的原始数据分布 p(x) 进行采样,而是对一个平滑后的、更容易采样的分布进行采样

最常用的平滑方法是向原始数据 x 添加高斯噪声,得到噪声数据 y
公式:添加噪声

y = x + σ * ε, 其中 ε ~ N(0, I)

这等价于用高斯核与原始分布进行卷积:
公式:噪声数据分布

p(y) = ∫ p(y|x) p(x) dx = (p * N(0, σ²I))(y)

添加噪声的效果有兩種理解方式:

几何视角 🌐

在高维空间中,各向同性高斯噪声的样本几乎全部分布在一个以原点为中心、半径为 σ√d 的薄球壳上。向数据添加这种噪声,相当于在每个数据点周围放置这样一个“概率球”。当噪声足够大时,这些球壳会相互重叠,从而在原本是“概率沙漠”的区域创造出概率质量,连接起原本分离的模式,使得朗之万动力学更容易在不同模式间穿梭。

代数(频谱)视角 📊

从傅里叶变换的角度看,卷积在频域中对应于乘法。高斯噪声的傅里叶变换本身也是一个高斯函数,它会衰减信号的高频成分。
核心洞察:添加高斯噪声会抑制原始分布中的高频振荡(即那些尖锐的峰和谷),从而产生一个更平滑、低频的分布 p(y)。平滑后的分布自然更容易采样。


罗宾斯定理:从噪声中恢复信号 🔄

现在我们已经有了平滑的噪声数据分布 p(y),并且可以从中相对容易地采样。但我们的最终目标是获得干净数据 x 的样本。如何从噪声样本 y 中恢复出 x 呢?

这就是赫伯特·罗宾斯在1956年提出的深刻见解。他考虑了一个去噪问题:给定一个噪声观测 y,想要估计原始信号 x。在均方误差准则下,最优估计器是条件期望:
公式:最优去噪估计器

x̂(y) = E[x | y]

令人惊讶的是,罗宾斯证明了这个条件期望可以仅用噪声数据的分布 p(y) 来表达,而无需知道真实的干净数据分布 p(x)

对于加性高斯噪声的特殊情况,推导非常优雅:
推导:得分函数与去噪的关系

∇_y log p(y) = ∇_y p(y) / p(y)
             = ∫ ∇_y p(y|x) p(x) dx / p(y)
             = ∫ [(x - y)/σ²] p(y|x) p(x) dx / p(y)  // 高斯分布梯度性质
             = (1/σ²) [E[x|y] - y]

整理后得到关键公式:
核心公式:得分函数去噪恒等式

x̂(y) = E[x | y] = y + σ² ∇_y log p(y)

这个公式表明,噪声数据分布 p(y) 的得分函数直接给出了最优去噪的方向。我们只需要将当前噪声点 y 沿着得分函数的方向移动 σ² 倍,就能得到对干净数据 x 的最佳估计。


构建生成模型:去噪得分匹配 🏗️

罗宾斯定理为我们搭建生成模型提供了蓝图:

  1. 学习得分函数:我们不需要直接建模复杂的 p(x),而是去学习平滑后分布 p(y) 的得分函数 s_θ(y) ≈ ∇_y log p(y)。这可以通过“去噪得分匹配”目标来实现:
    训练目标:训练一个神经网络 s_θ(y),使其预测最优去噪的方向 (x̂(y) - y)/σ²
    在实践中,我们从一个干净数据集中采样 x,人工添加噪声得到 y,然后训练网络最小化以下损失:
    代码:去噪得分匹配损失

    # 假设:x_clean 是干净样本,sigma 是噪声水平
    noise = torch.randn_like(x_clean) * sigma
    y_noisy = x_clean + noise
    # 网络 s_theta 试图预测得分
    predicted_score = s_theta(y_noisy)
    # 目标得分是 (x_clean - y_noisy) / sigma**2
    target_score = (x_clean - y_noisy) / sigma**2
    loss = torch.mean((predicted_score - target_score)**2)
    
  2. 采样流程

    • 行走(Walk):使用学习到的得分函数 s_θ(y),运行朗之万动力学对平滑的噪声分布 p(y) 进行采样。这个过程相对高效,因为分布是平滑的。
    • 跳跃(Jump):在行走过程中,我们可以定期(例如每10步)对得到的噪声样本 y_t 应用一步去噪操作:x̂_t = y_t + σ² s_θ(y_t),从而获得干净数据样本的估计。

这种“行走-跳跃”的范式解耦了采样和去噪过程。行走阶段专注于从平滑分布中探索,跳跃阶段则利用训练好的网络进行一次性去噪,避免了在耦合的“加噪-去噪”链中误差累积的问题。


总结 📝

本节课我们一起深入探讨了生成模型中的关键进展:

  1. 回顾了朗之万动力学,它利用得分函数进行采样,但在多峰分布上存在混合难题。
  2. 引入了添加高斯噪声的思想作为解决方案,它从几何(连接模式)和频谱(平滑分布)两个角度平滑了目标分布,使采样变得可行。
  3. 介绍了罗宾斯定理,该定理揭示了噪声数据分布的得分函数与最优去噪估计器之间的等价关系,使我们能够从噪声样本中恢复干净信号。
  4. 构建了完整的生成模型框架:通过去噪得分匹配学习得分函数,然后采用“行走-跳跃”策略,先对平滑的噪声分布进行朗之万采样,再对结果进行去噪,最终生成高质量的数据样本。

这套方法构成了许多现代扩散模型或基于得分的生成模型的核心思想。通过巧妙地转换问题——从学习复杂分布到学习平滑分布的得分函数,我们成功地绕过了直接采样的困难,开辟了生成建模的新路径。

23:马尔可夫决策过程与强化学习

在本节课中,我们将学习马尔可夫决策过程的基本概念,这是强化学习的核心框架。我们将从一个简单的网格世界示例开始,逐步理解状态、动作、策略、奖励和价值函数等核心概念,并探讨如何寻找最优策略。


概述

上一节我们介绍了扩散模型和朗之万动力学采样。本节中,我们将转向一个全新的主题:马尔可夫决策过程。这是一种用于建模顺序决策问题的数学框架,是强化学习的基础。我们将从一个具体的网格世界示例入手,直观地理解智能体如何与环境交互以最大化累积奖励。


马尔可夫决策过程:一个直观示例

为了理解MDP,我们首先考虑一个简单的网格世界环境。这是一个4行3列(4x3)的网格。

  • 状态:网格中的每个单元格(除了墙壁和终点)都是一个状态 s。智能体从指定的起始状态开始。
  • 动作:在每个状态,智能体可以采取的动作集合是 {上, 下, 左, 右}
  • 转移模型:环境是随机的。当智能体选择一个方向(例如“右”)时:
    • 0.8 的概率成功移动到目标单元格。
    • 0.1 的概率滑到垂直方向(例如“上”或“下”)。
    • 0.1 的概率滑到相反方向(例如“左”)。
    • 如果移动会导致撞墙,则智能体停留在原地。
  • 奖励:智能体在每次状态转移时会获得即时奖励 r。大多数单元格的奖励是一个小的负值(例如 -0.04),表示“生存成本”。有两个特殊的终止状态
    • +1 奖励状态(目标)。
    • -1 奖励状态(陷阱)。
      进入终止状态后,游戏结束。
  • 策略:策略 π 是一个从状态到动作的映射。它告诉智能体在每个状态下应该做什么。对于这个有限网格,可能的确定性策略数量是 4^(状态数)

智能体的目标是找到一个策略,使得从起始状态开始所获得的期望累积奖励最大化。


形式化定义与核心概念

上一节我们通过网格世界直观感受了MDP。本节中我们来看看如何形式化地定义它。

一个马尔可夫决策过程由以下五元组定义:(S, A, P, R, γ)

  • S: 状态集合。
  • A: 动作集合。
  • P: 转移概率。P(s' | s, a) 表示在状态 s 执行动作 a 后,转移到状态 s' 的概率。这体现了环境的随机性。
  • R: 奖励函数。R(s, a, s') 表示在状态 s 执行动作 a 并到达状态 s' 后获得的即时奖励。
  • γ: 折扣因子,范围在 [0, 1] 之间。用于对未来奖励进行折现,保证无限时间步的累积奖励有限。

马尔可夫性质是核心假设:下一时刻的状态 s_{t+1} 和奖励 r_{t+1} 仅依赖于当前状态 s_t 和当前动作 a_t,而与历史无关。即:
P(s_{t+1}, r_{t+1} | s_t, a_t, s_{t-1}, a_{t-1}, ...) = P(s_{t+1}, r_{t+1} | s_t, a_t)


策略与价值函数

理解了MDP的基本构成后,我们需要定义智能体的行为准则以及如何评估其好坏。

  • 策略:策略 π 定义了智能体的行为方式。它可以是确定性的(a = π(s)),也可以是随机性的(π(a|s) 表示在状态 s 下选择动作 a 的概率)。
  • 回报:从时间 t 开始的累积折现奖励称为回报 G_t
    G_t = r_{t+1} + γ * r_{t+2} + γ^2 * r_{t+3} + ...
  • 状态价值函数:在策略 π 下,状态 s 的价值 V^π(s) 是从状态 s 开始,遵循策略 π 所能获得的期望回报
    V^π(s) = E_π[ G_t | s_t = s ]
    它衡量了处于某个状态的“长期”好坏。
  • 动作价值函数:在策略 π 下,在状态 s 执行动作 a 的价值 Q^π(s, a) 是执行动作 a 后,再遵循策略 π 所能获得的期望回报
    Q^π(s, a) = E_π[ G_t | s_t = s, a_t = a ]
    它衡量了在某个状态下执行某个特定动作的“长期”价值。

V^π(s)Q^π(s, a) 的关系是:V^π(s)Q^π(s, a) 在策略 π 下的期望值。
V^π(s) = Σ_{a ∈ A} π(a|s) * Q^π(s, a)


最优策略与贝尔曼方程

我们知道了如何评估一个给定策略。那么,如何找到最优策略 π* 呢?

最优策略是能够最大化所有状态价值函数的策略。对应的最优状态价值函数和最优动作价值函数定义为:
V*(s) = max_π V^π(s)
Q*(s, a) = max_π Q^π(s, a)

这些最优价值函数满足著名的贝尔曼最优性方程

对于 V*(s)
V*(s) = max_a Σ_{s'} P(s'|s, a) * [ R(s, a, s') + γ * V*(s') ]

对于 Q*(s, a)
Q*(s, a) = Σ_{s'} P(s'|s, a) * [ R(s, a, s') + γ * max_{a'} Q*(s', a') ]

这些方程是递归的,指出一个状态(或状态-动作对)的最优价值,等于所有可能后续状态的最优价值的折现期望加上即时奖励,并在当前动作(对 V*)或下一动作(对 Q*)上取最大值。

一旦我们知道了 Q*(s, a),最优策略就很容易得到:在每个状态 s,选择使 Q*(s, a) 最大的动作 a
π*(s) = argmax_a Q*(s, a)


总结

本节课中我们一起学习了马尔可夫决策过程的基础知识。我们从网格世界的例子出发,理解了状态、动作、转移概率、奖励等基本要素。然后,我们定义了策略、回报以及核心的状态价值函数 V^π(s)动作价值函数 Q^π(s, a)。最后,我们引入了最优策略的概念,并介绍了贝尔曼最优性方程,该方程为求解最优策略提供了理论基础。

下一讲,我们将探讨如何利用动态规划等方法来实际求解这些方程,从而找到最优策略。

24:图神经网络与旋转等变性(第一部分)🎯

在本节课中,我们将学习两个核心主题。首先,我们将快速回顾并完成关于马尔可夫决策过程的讨论,包括贝尔曼方程及其求解算法。随后,我们将开启一个全新的主题:图神经网络,并探讨其核心挑战之一——置换对称性。

马尔可夫决策过程回顾 🔄

上一节我们介绍了马尔可夫决策过程的核心概念。本节中,我们来快速回顾并深入其数学形式。

马尔可夫决策过程在马尔可夫过程的基础上引入了动作奖励的概念。系统具有马尔可夫性,即未来状态仅取决于当前状态和动作,与过去历史无关。

核心定义

以下是MDP中的几个核心定义:

  • 策略:策略 π 是一个从状态到动作概率分布的映射。给定一个状态 s,策略指定了采取每个可能动作 a 的概率,即 π(a|s)。确定性策略是概率性策略的特例(某个动作的概率为1)。
  • 目标:强化学习的目标通常被形式化为最大化期望累积折扣奖励。这是一个极简的还原论观点,即几乎所有目标都可以归结为最大化一个标量数值。
  • 折扣回报:从时刻 t 开始的总折扣回报 G_t 定义为:
    G_t = R_{t+1} + γ R_{t+2} + γ^2 R_{t+3} + ...
    其中 γ 是折扣因子(0 ≤ γ < 1)。引入折扣因子既符合直觉(远期奖励价值较低),也确保了无限序列的总回报是有限的。
  • 状态价值函数:状态价值函数 V^π(s) 表示在状态 s 下,遵循策略 π 所能获得的期望累积折扣回报。其定义为:
    V^π(s) = E_π[ G_t | S_t = s ]
    可以将其理解为:在状态 s 下,根据策略 π 运行大量模拟实验,然后将得到的所有累积回报取平均。
  • 动作价值函数:动作价值函数 Q^π(s, a) 表示在状态 s 下,采取特定动作 a,然后 thereafter 遵循策略 π 所能获得的期望累积折扣回报。其定义为:
    Q^π(s, a) = E_π[ G_t | S_t = s, A_t = a ]
    V^π(s) 的区别在于,Q 函数明确条件于初始采取的动作 a

价值函数与最优策略

Q 函数比 V 函数更具实用性,因为给定 Q 函数,我们可以直接通过选择使 Q(s, a) 最大化的动作来采取最优行动。而仅凭 V 函数,则无法直接确定在某个状态下应该采取哪个具体动作。

最优策略 π* 是在所有状态下都能产生最大可能价值函数的策略。相应的最优价值函数 V* 和最优动作价值函数 Q* 满足以下关系:
V(s) = max_a Q(s, a)
π(s) = argmax_a Q(s, a)

贝尔曼方程与动态规划 🧮

由于马尔可夫性,价值函数之间存在着递归关系,即贝尔曼方程。这是动态规划方法的基础。

贝尔曼最优性方程推导

我们推导最优价值函数 V* 的贝尔曼方程。核心思想是利用折扣回报 G_t 的结构,将其分解为即时奖励和下一状态的折扣回报之和。

从定义出发:
V*(s) = max_a E[ R_{t+1} + γ G_{t+1} | S_t=s, A_t=a ]
其中期望是对下一状态 S' 和即时奖励 R 取的,它们由环境模型 P(S', R | S, A) 决定。

将期望展开,并利用 G_{t+1} 正是从状态 S' 出发的最优价值 V*(S') 这一事实,我们得到:
V(s) = max_a Σ_{s', r} P(s', r | s, a) [ r + γ V(s') ]

这就是贝尔曼最优性方程。它表达了状态 s 的最优价值与其所有可能后继状态 s' 的最优价值之间的关系。

策略评估的贝尔曼方程

对于一个给定的固定策略 π,其状态价值函数 V^π 满足类似的方程,但不需要取最大值操作,而是按照策略的概率对动作进行加权平均:
V^π(s) = Σ_a π(a|s) Σ_{s', r} P(s', r | s, a) [ r + γ V^π(s') ]

求解算法:价值迭代与策略迭代

基于贝尔曼方程,我们可以设计迭代算法来求解MDP。

以下是两种经典算法:

  • 价值迭代:直接迭代求解贝尔曼最优性方程。
    1. 初始化所有状态的价值 V(s)
    2. 对每个状态 s,进行更新:V(s) ← max_a Σ_{s', r} P(s', r | s, a) [ r + γ V(s') ]
    3. 重复步骤2,直到价值函数收敛。
    4. 提取最优策略:π*(s) = argmax_a Σ_{s', r} P(s', r | s, a) [ r + γ V(s') ]
  • 策略迭代:交替进行策略评估和改进。
    1. 初始化一个策略 π
    2. 策略评估:给定当前策略 π,迭代求解贝尔曼方程直到收敛,得到 V^π
    3. 策略改进:基于 V^π,对每个状态更新策略为贪婪策略:π'(s) = argmax_a Σ_{s', r} P(s', r | s, a) [ r + γ V^π(s') ]
    4. 如果策略不再改变,则停止;否则令 π = π',返回步骤2。

从表格法到函数逼近与强化学习 🤖

在状态和动作空间较小的“表格型”MDP中,上述算法是有效的。然而,现实问题往往面临维数灾难——状态空间极其巨大,无法枚举。

解决之道是使用函数逼近,特别是用神经网络来参数化价值函数 V(s; θ) 或策略 π(a|s; θ)。这就是现代强化学习的核心。例如:

  • 1995年,TD-Gammon程序使用神经网络逼近价值函数,在西洋双陆棋上达到了世界冠军水平。
  • 2016年,AlphaGo结合了神经网络与蒙特卡洛树搜索,攻克了围棋这一复杂游戏。

这印证了贝尔曼的前瞻性观点:只要方法得当,维数灾难是可以被克服的。

关于智能本质的两种观点

课程最后简要对比了两种看待智能的极端观点:

  1. “奖励假设”与“奖励即足够”观点:智能体的一切目标都可以被概括为最大化期望累积奖励。所有感知、推理等能力都是服务于这一最终目标的工具。
  2. “无监督学习是蛋糕”观点:智能的主体是无监督学习(从海量未标注数据中学习世界模型),监督学习只是糖霜,而强化学习仅仅是蛋糕上的樱桃。数据本身蕴含的信息远比稀疏的奖励信号丰富。

图神经网络导论 🌐

现在,我们切换到一个新的主题:如何在图结构数据上进行机器学习。

图是一种表示实体(节点)及其关系(边)的通用数据结构。应用场景包括:

  • 分子图:原子是节点,化学键是边。
  • 社交网络:用户是节点,关注/好友关系是边。
  • 推荐系统:用户和商品是节点,交互行为(购买、评分)是边。

图的基本表示

一个图 G 由顶点集 V 和边集 E 组成。边是顶点的无序对。顶点也称为节点,边也称为链接。

图有两种等价的表示方法:

  1. 可视化表示:直观地画出节点和连接线。
  2. 代数表示 - 邻接矩阵 A:对于一个有 n 个节点的图,邻接矩阵 A 是一个 n × n 的矩阵。如果节点 i 和节点 j 之间有边相连,则 A_{ij} = 1,否则为 0。对于无向图,A 是对称矩阵。

核心挑战:置换对称性

一个根本性的挑战是:图没有天然的节点顺序。节点的编号(索引)是任意的。

考虑一个五边形图。我们可以用多种方式给节点编号,每种编号都会产生一个不同的邻接矩阵。然而,这些矩阵都代表同一个图

如果我们简单地将邻接矩阵扁平化,然后输入到一个标准的前馈神经网络中,那么网络的学习将严重依赖于我们这次随机选择的编号方案。当遇到同一个图的不同编号版本时,网络可能会给出完全不同的输出,这是不可接受的。

因此,一个合格的图机器学习模型必须满足置换等变性:对输入图的节点进行任何置换(重新编号),模型的输出应该以相应一致的方式变换(对于节点级任务),或者根本不变(对于图级任务)。如何构建具有这种性质的模型,是图神经网络的核心问题。

总结 📚

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

  1. 完成了对马尔可夫决策过程的讨论,深入理解了贝尔曼方程的推导及其对应的价值迭代和策略迭代算法。
  2. 认识到在大型问题中,必须使用神经网络等函数逼近器来参数化价值函数或策略,从而引出现代强化学习。
  3. 开启了图神经网络的新主题,理解了图的基本表示方法,并认识到置换对称性是设计图学习模型时必须解决的首要核心挑战。

下一讲,我们将深入探讨如何构建满足置换等变性的图神经网络架构。

25:图神经网络与旋转等变性 2

概述

在本节课中,我们将继续学习图神经网络。我们将深入探讨图数据的核心特性——置换对称性,并理解如何构建尊重这种对称性的神经网络架构。我们还将介绍图神经网络的基本框架,并简要探讨其与图同构测试算法之间的深刻联系。


回顾与修正

上一节我们介绍了图的基本概念和邻接矩阵。本节中,我们来看看一个重要的数学概念——置换。

在上一讲的推导中,价值函数部分存在一个笔误。让我们一起来修正它。

我们想评估策略 π 的价值函数 V^π(s),即从状态 s 开始,遵循策略 π 所获得的期望总回报。

总回报 G_t 定义为:
G_t = R_{t+1} + γ R_{t+2} + γ^2 R_{t+3} + ...

根据贝尔曼方程,我们可以将其写为:
V^π(s) = E[ R_{t+1} + γ G_{t+1} | S_t = s ]

进一步展开期望,我们考虑在当前状态 s 下采取动作 a,转移到下一状态 s' 并获得奖励 r 的概率:
V^π(s) = Σ_a π(a|s) Σ_{s', r} p(s', r | s, a) [ r + γ V^π(s') ]

这里的笔误在于:在求和符号内部,价值函数 V^π 的参数应该是下一状态 s',而不是当前状态 s。修正后的公式明确了状态从 s 更新到了 s'


图的置换对称性

现在,让我们回到图神经网络的主题。图数据的一个关键特性是节点没有固有的顺序。

什么是置换?

数学上,对一个包含 n 个节点的集合,置换是一个双射函数 π: {1,...,n} -> {1,...,n}。它将每个节点标签映射到另一个(或相同的)标签。

例如,对于集合 {1,2,3},一个可能的置换是:
π(1)=2, π(2)=3, π(3)=1

我们可以用两行记号表示:

[ 1 2 3 ]
[ 2 3 1 ]

置换矩阵

每个置换都对应一个置换矩阵 P。其定义是:如果 π(u) = v,则 P_{u,v} = 1,否则为 0

根据这个定义,置换矩阵是正交矩阵:
P^T P = P P^T = I

置换对图表示的影响

假设我们有一个图,其节点特征矩阵为 X ∈ R^{n×d},邻接矩阵为 A ∈ R^{n×n}

如果我们对节点应用一个置换 π(对应矩阵 P),那么图的表示将如何变换?

  • 节点特征:新的特征矩阵 是原矩阵行的重排。具体变换为 X̃ = P^T X
  • 邻接矩阵:新的邻接矩阵 Ã 描述了重排后节点间的连接关系。变换为 Ã = P^T A P

关键在于,(X, A)(X̃, Ã) 表示的是同一个图,只是节点的编号(顺序)不同。


图神经网络的任务与对称性要求

基于图的任务主要分为两类,它们对对称性有不同的要求:

以下是两类主要任务及其对称性要求:

  1. 节点级任务(如节点分类):预测图中每个节点的属性。模型输出应对节点置换是等变的。即,如果输入节点被置换,输出预测也应以相同方式置换。
  2. 图级任务(如图分类):预测整个图的属性。模型输出应对节点置换是不变的。即,无论节点如何编号,对同一个图的预测结果应该相同。

我们的目标是设计神经网络函数 FG,使其分别满足不变性和等变性要求。由于节点可能的排序方式有 n! 种(指数级),枚举所有排序是不可行的。


从卷积神经网络到图神经网络

为了理解图神经网络的设计思想,让我们回顾一下卷积神经网络。

在CNN中,每个像素(节点)的更新基于其局部邻居(如3x3窗口)的特征。我们可以将此操作抽象地写为:
h_i^{(l+1)} = σ( W_{self} h_i^{(l)} + Σ_{j ∈ N(i)} W_{neighbor} h_j^{(l)} + b )

其中 N(i) 是像素 i 的邻居集合。CNN的关键在于权重共享:对于所有位置 i,我们使用相同的 W_{self}W_{neighbor}。这使网络具有平移等变性。

图神经网络继承了这种“基于邻居聚合信息”的思想,但将其推广到更一般的图结构,并要求满足置换对称性而非平移对称性。这意味着聚合函数不能依赖于具体的节点ID。


图神经网络通用框架

图神经网络遵循邻域聚合消息传递的哲学。其核心是通过迭代地聚合邻居信息来更新节点表示。

h_v^{(k)} 表示节点 v 在第 k 层的表示。初始表示 h_v^{(0)} 就是节点的输入特征 x_v

每一层的更新包含两个步骤:

以下是消息传递层的两个核心步骤:

  1. 聚合:对于节点 v,聚合其所有邻居 u ∈ N(v) 在上一层的表示。
    a_v^{(k)} = AGGREGATE^{(k)} ( { h_u^{(k-1)} : u ∈ N(v) } )
  2. 更新:将聚合得到的信息 a_v^{(k)} 与节点自身上一层的表示 h_v^{(k-1)} 结合,生成新的表示。
    h_v^{(k)} = COMBINE^{(k)} ( h_v^{(k-1)}, a_v^{(k)} )

函数 AGGREGATECOMBINE 可以是带参数的可学习函数(如神经网络)。为了满足置换对称性,这些函数的参数必须在所有节点间共享(但不同层可以不同)。

层次化感知

这种迭代过程产生了层次化的感知能力。在第一次迭代(k=1),节点只看到其直接邻居的信息。在第二次迭代(k=2),由于邻居的表示在第一次迭代中已经更新(包含了它们邻居的信息),因此节点 v 能感知到其两跳邻居的信息。随着层数增加,每个节点能整合来自图中越来越远区域的信息。


实例:图注意力网络

我们可以基于上述框架推导出复杂的图神经网络架构,如图注意力网络。

在GAT中,AGGREGATE 函数不是简单地对邻居特征取平均,而是进行加权和,权重通过注意力机制计算。

对于节点 v,其第 k 层的聚合步骤为:
a_v^{(k)} = Σ_{u ∈ N(v)} α_{vu}^{(k)} W^{(k)} h_u^{(k-1)}

其中,注意力系数 α_{vu} 计算如下:
α_{vu} = softmax_{u ∈ N(v)} ( LeakyReLU( a^T [ W h_v || W h_u ] ) )

这里,|| 表示向量拼接,aW 是可学习的参数。softmax 确保对节点 v 的所有邻居 u,权重 α_{vu} 之和为1。这种方式允许节点对其不同的邻居分配不同的重要性。


图读出与图同构测试

对于图级任务,在通过 K 层消息传递得到所有节点的最终表示 { h_v^{(K)} } 后,我们需要一个读出函数来生成整个图的表示。

读出函数必须是对节点置换不变的。常见的选择包括:

  • 求和:h_G = Σ_{v∈G} h_v^{(K)}
  • 均值:h_G = mean( { h_v^{(K)} } )
  • 元素级最大值:h_G = max_{v∈G} h_v^{(K)}

得到的图级表示 h_G 可以用于后续的分类或回归任务。

有趣的是,图神经网络的消息传递机制与一个经典的图论算法——Weisfeiler-Lehman 图同构测试有着深刻的联系。WL测试通过迭代地“染色”和“聚合”邻居颜色来区分图结构,其过程与GNN的邻域聚合高度相似。事实上,WL测试的能力界定了GNN的表达能力上限:如果两个图能被WL测试区分,那么也存在一个GNN能够区分它们。


总结

本节课我们一起学习了图神经网络的核心思想。我们首先深入理解了图数据的置换对称性,以及它对神经网络设计提出的约束。然后,我们介绍了图神经网络的通用消息传递框架,该框架通过迭代的聚合与更新操作,使节点能够整合来自其局部邻域乃至全局的信息。我们还看到了如何在此框架下实例化具体的架构,如图注意力网络。最后,我们了解了图读出机制以及GNN与图同构测试之间的理论联系。图神经网络为我们处理非欧几里得空间中的复杂关系数据提供了强大的工具。

26:核方法 🧠

在本节课中,我们将要学习一个经典但至今仍非常重要的机器学习主题——核方法。我们将了解什么是核函数,以及如何利用“核技巧”将线性模型(如线性回归、逻辑回归)扩展到高维甚至无限维的特征空间,而无需显式计算这些高维特征,从而高效地处理非线性问题。


引言与动机

上一节我们介绍了通过基函数扩展(如多项式基)来增强线性模型表达能力的方法。本节中,我们来看看如何更高效地处理这种扩展。

在机器学习中,“核”这个词有多种含义(例如卷积神经网络中的卷积核),但今天我们将聚焦于一种特定的核,它与特征空间的隐式映射密切相关。

为什么核方法仍然重要?

尽管神经网络如今非常流行,但核方法在以下场景中仍有其独特优势:

  • 数据量有限时:神经网络通常需要大量数据,而核方法在小数据集上可能表现更好。
  • 需要良好不确定性估计时:高斯过程回归(基于核函数)是提供预测不确定性的先进方法。
  • 理论分析:在分析神经网络的理论性质(如神经正切核)时,核方法提供了重要工具。
  • 特定领域:历史上,人们为图结构、蛋白质等特定对象设计过专用核函数。

回顾:基函数扩展

还记得我们之前讨论过,即使模型在参数上是线性的,只要我们对输入特征进行基函数扩展(例如多项式扩展),就能获得任意复杂的函数。

核心思想:给定原始特征 x,我们通过一个映射函数 φ(x) 将其转换到更高维(甚至无限维)的空间。然后,在这个新空间中使用线性模型。

例如,多项式扩展
对于一个二维输入 x = [x1, x2]^T,二阶多项式扩展 φ(x) 可能包含 [1, x1, x2, x1^2, x2^2, x1*x2]^T 等项。

然而,直接进行基函数扩展有两个主要问题:

  1. 计算成本高:扩展后的特征维度 D 可能极高(例如高阶多项式),导致计算(如求逆 D×D 矩阵)变得不可行。
  2. 需要先验知识:我们通常不知道哪种基函数最适合当前问题。

核方法的精妙之处在于,它允许我们隐式地在这个高维空间中操作,而无需显式计算 φ(x)


核技巧初探

核方法的核心是核技巧。其目标是:重写算法,使得所有运算都只依赖于数据点之间的内积

核函数定义:核函数 K(x, z) 是一个函数,它计算了两个数据点 xz 在某个隐式的高维特征空间 φ(·) 中的内积,即:
K(x, z) = φ(x)^T φ(z)

关键洞察:如果我们能找到一种方法,不通过显式计算 φ(x)φ(z),就能直接计算出这个内积结果(一个标量),那么我们就绕过了高维空间的计算难题。

一个具体例子:多项式核

假设我们想计算两个二维点 xz 在二阶多项式扩展空间中的内积。

  • 显式计算:需要将 xz 分别映射为6维向量 φ(x)φ(z),然后计算6维内积。
  • 核技巧:我们可以直接通过原始2维空间中的计算得到相同结果:
    K(x, z) = (x^T z + 1)^2

验证
展开 (x^T z + 1)^2 = (x1*z1 + x2*z2 + 1)^2,结果包含 x1^2*z1^2, x2^2*z2^2, 2*x1*z1, 2*x2*z2, 2*x1*x2*z1*z2 等项。这正好对应了 φ(x)^T φ(z),其中 φ(x) = [1, √2*x1, √2*x2, x1^2, x2^2, √2*x1*x2]^T(包含特定的缩放系数)。

意义:我们仅通过原始空间的内积、加法和平方操作,就得到了在6维扩展空间中的内积结果。对于更高阶 p 的多项式核,公式为 K(x, z) = (x^T z + c)^p,它能隐式对应一个组合数量爆炸的高维空间。


如何验证一个函数是有效的核函数?

并非任意一个关于两个点的函数都是有效的核函数。有效的核函数必须对应某个特征空间中的内积。

** Mercer 定理 (简化版):
一个函数 K(x, z) 是有效核函数的
充要条件是,对于任何有限的数据集 {x_1, ..., x_n},由该函数计算出的 核矩阵 K(其中 K_{ij} = K(x_i, x_j))是半正定**的。

核矩阵:一个 n×n 的对称矩阵,度量了所有数据点对之间的“相似度”。

示例

  • K(x, z) = sin(x)^T cos(z) 不是有效核,因为它不对称。
  • K(x, z) = x^T M z 是有效核,当且仅当矩阵 M 是半正定的。

构建与组合核函数

我们可以像搭积木一样,从简单的有效核函数构建出复杂的核函数。

以下是构建新核函数的有效规则(假设 K1K2 是有效核):

  • 缩放:对于任意常数 c > 0c * K1 是有效核。
  • 加法K1 + K2 是有效核。
  • 乘法K1 * K2 是有效核。
  • 函数变换:将核函数通过具有正系数的多项式函数或指数函数变换后,仍然是有效核。

常见的核函数

以下是一些广泛使用的核函数:

  • 多项式核K(x, z) = (x^T z + c)^d
  • 径向基函数核K(x, z) = exp(-γ * ||x - z||^2)。这对应一个无限维的特征空间。
  • 拉普拉斯核K(x, z) = exp(-γ * ||x - z||_1)

核化算法的一般步骤

要将一个算法(如线性回归、PCA)转化为核化版本,通常遵循以下步骤:

  1. 用内积重写算法:将算法中所有涉及数据点的运算,都表示为数据点之间内积 x_i^T x_j 的形式。
  2. 表示定理:证明或假设待求解的参数(如线性回归的权重 w)可以表示为训练数据点的线性组合,即 w = Σ_i α_i φ(x_i)。这使我们能将问题转化为求解对偶变量 α
  3. 替换为核函数:将所有内积 φ(x_i)^T φ(x_j) 替换为核函数值 K(x_i, x_j)。现在,所有运算都基于核矩阵 K 进行。
  4. 在对偶空间中求解:在新的、只涉及 α 和核矩阵 K 的优化问题中求解。预测时,新样本的预测值也仅通过核函数与训练数据的计算得出。

这样,算法的计算复杂度就从依赖于特征维度 D,转变为依赖于样本数量 n。当隐式特征空间维度很高而样本数相对较少时,这带来了巨大的计算优势。


实例:核化岭回归

让我们将上述步骤应用于岭回归。

1. 原始岭回归问题
损失函数为 L(w) = Σ_i (y_i - w^T φ(x_i))^2 + λ ||w||^2

2. 表示定理的体现
L(w) 关于 w 求导并令其为0,可以得到闭式解:
w = (1/λ) Σ_i (y_i - w^T φ(x_i)) φ(x_i)
α_i = (1/λ)(y_i - w^T φ(x_i)),则 w = Σ_i α_i φ(x_i) = Φ^T α,其中 Φ 是所有 φ(x_i) 组成的矩阵。这证明了 w 确实是训练样本的线性组合。

3. 代入损失函数并核化
w = Φ^T α 代入损失函数,经过代数运算,损失函数可以重写为:
L(α) = ||y - Kα||^2 + λ α^T K α
其中 K = ΦΦ^T 是核矩阵,K_{ij} = K(x_i, x_j)。现在问题变成了关于 α 的优化。

4. 求解对偶变量
L(α) 关于 α 求导并令其为0,得到解:
α = (K + λI)^{-1} y

5. 核化预测
对于新样本 x*,其预测值为:
y* = w^T φ(x*) = (Σ_i α_i φ(x_i))^T φ(x*) = Σ_i α_i K(x_i, x*) = k*^T α
其中 k*x* 与所有训练样本的核函数值向量。

关键对比

  • 原始岭回归:需要求逆 D×D 矩阵(D 为特征维度)。
  • 核化岭回归:需要求逆 n×n 矩阵(n 为样本数)。当 D >> n 时,核化版本更高效。

实例:核化 K-Means 聚类

K-Means 的核心是计算数据点到簇中心的欧氏距离。核化版本旨在隐式地在高维特征空间中进行聚类。

1. 用核函数表示距离
在高维空间中,点 φ(x_i) 和点 φ(x_j) 的平方欧氏距离为:
||φ(x_i) - φ(x_j)||^2 = K(x_i, x_i) + K(x_j, x_j) - 2K(x_i, x_j)

2. 表示簇中心
假设第 k 个簇的中心 μ_k 也可以表示为该簇内样本的线性组合(这符合 K-Means 的性质)。

3. 核化距离计算
利用上述两点,数据点 φ(x) 到簇中心 μ_k 的距离可以完全用核函数 K(·,·) 表示,而无需显式计算 φ(x)μ_k

4. 算法流程
核化 K-Means 的迭代过程与标准 K-Means 类似:

  • 分配步骤:将每个点分配到“核空间距离”最近的簇中心。
  • 更新步骤:更新每个簇的“表示”(即更新定义簇中心的线性组合系数)。
    所有计算都通过核矩阵完成。

总结

本节课中我们一起学习了核方法的核心思想与应用。

  • 核函数 K(x, z) 隐式地计算了数据点在高维特征空间中的内积。
  • 核技巧 允许我们在不显式计算高维特征映射 φ(x) 的情况下,在高维空间中运行线性算法。
  • Mercer 定理 提供了判断一个函数是否为有效核函数的准则。
  • 核化算法 的关键步骤包括:用内积重写原算法、利用表示定理、将内积替换为核函数、在对偶空间中求解。
  • 我们探讨了核化岭回归核化 K-Means 的具体推导,展示了如何将计算复杂度从特征维度转移到样本数量。

核方法是一座连接线性模型与非线性世界的优雅桥梁。尽管深度学习占据主流,但核方法在数据稀缺、需要不确定性估计或进行理论分析的场景中,依然保持着不可替代的价值。理解核技巧,有助于你更深刻地领会机器学习中模型灵活性与计算效率之间的权衡艺术。

27:因果推断

概述

在本节课中,我们将学习因果推断的基本概念。我们将了解为什么相关性不等于因果性,以及在进行因果分析时可能出现的常见陷阱,例如辛普森悖论。我们还将介绍一种用于描述因果关系的正式框架——结构方程模型,并探讨如何从观测数据中估计因果效应。


辛普森悖论与混杂变量

上一节我们概述了因果推断的重要性。本节中,我们来看看一个经典现象——辛普森悖论,它直观地展示了忽视关键变量如何导致完全错误的结论。

假设我们研究两种肾结石治疗方法A和B。总体数据显示,治疗B的成功率(83%)高于治疗A(78%)。我们可能因此认为治疗B更优。

然而,当我们按结石大小(大或小)对数据进行分层分析时,趋势发生了逆转:

  • 对于大结石患者,治疗A的成功率(73%)高于治疗B(69%)。
  • 对于小结石患者,治疗A的成功率(93%)也高于治疗B(87%)。

这个现象就是辛普森悖论:当忽略一个混杂变量(此处为结石大小)时,两个变量(治疗方法和成功率)之间的总体关联趋势与在每个分层内的趋势完全相反。

以下是导致悖论的关键点:

  • 混杂变量:结石大小同时因果影响了治疗的成功率以及医生对治疗方案的选择(例如,医生可能更倾向于对小结石使用治疗B)。
  • 非随机分配:治疗分配不是随机的,而是基于医生的判断,这引入了偏差。
  • 分层分析:要获得真实的因果效应,必须针对混杂变量的每个取值(大结石、小结石)分别进行分析,然后进行适当加权平均。

这个例子表明,仅凭观测数据中的相关性,无法推断因果关系。我们必须考虑并控制那些同时影响原因和结果的变量。


结构方程模型:描述因果机制

上一节我们通过例子看到了混杂变量的影响。本节中,我们引入一个正式的框架——结构方程模型,来描述变量之间的因果机制。

结构方程模型可以看作一段生成数据的伪代码。它明确指定了每个变量如何根据其因果父变量和一些随机噪声被赋值。这赋予了模型因果解释。

例如,考虑变量:运动量 X、体重 W、心脏病 H。一个可能的结构方程模型伪代码如下:

# 随机噪声(外生变量)
U1 ~ Bernoulli(0.5)  # 影响运动
U2 ~ Bernoulli(0.5)  # 影响体重
U3 ~ Bernoulli(1/3)  # 影响心脏病

# 内生变量(我们关心的变量)
X = U1                         # 运动量
W = 0 if X == 1 else U2       # 体重受运动影响
H = 0 if X == 1 else U3       # 心脏病受运动影响

从这个伪代码中,我们可以读出因果图:X -> WX -> HWH 之间没有直接的因果箭头。

结构方程模型的关键在于,它允许我们模拟干预do操作)。例如,干预“设定体重 W=1”,在伪代码中意味着我们删除 W = 0 if X == 1 else U2 这一行,并替换W = 1。然后我们重新运行代码,观察 H 的分布是否改变。如果改变,则说明 WH 有因果效应。


“条件”与“干预”的根本区别

上一节我们介绍了结构方程模型。本节中,我们探讨因果推断中一个核心概念上的区别:条件概率 P(Y | X=x)干预概率 P(Y | do(X=x))

  • 条件概率 P(Y | X=x):表示在观测到 X 取值为 x 的那些数据中,Y 的分布。这纯粹是统计上的关联。
  • 干预概率 P(Y | do(X=x)):表示我们主动强制将系统中每个个体的 X 设置为 x 后(如进行随机对照试验),Y 的分布。这反映了 XY 的因果效应。

在存在混杂变量 Z(即 Z -> XZ -> Y)的情况下,两者通常不相等:P(Y | X=x) ≠ P(Y | do(X=x))

例如,在运动(X)、体重(W)、心脏病(H)的模型中,即使 P(H=1 | W=1) > P(H=1),我们也不能说“体重导致心脏病”。因为 WH 都被运动 X 影响,观测到的关联是通过 X 产生的。当我们干预 do(W=1) 时,会发现 H 的分布并未改变,证实没有直接因果效应。

核心洞见:要从观测数据中估计因果效应,我们需要找到方法将包含 do 操作的表达式(无法直接从数据计算)转化为仅包含条件概率的表达式(可以从数据计算)。


调整公式:从观测数据估计因果效应

上一节我们明确了目标:将 do 操作转化为条件概率。本节中,我们介绍最重要的工具——调整公式

当我们关心处理 X 对结果 Y 的平均因果效应,并且已知一个混杂变量集合 Z 时,调整公式如下:

P(Y | do(X=x)) = Σ_z P(Y | X=x, Z=z) * P(Z=z)

公式解读

  1. Σ_z:对混杂变量 Z 的所有可能取值求和(或积分)。
  2. P(Y | X=x, Z=z):在 Z 固定为某个值 z 的子群体中,计算 X=xY 的条件概率。在 Z 固定的情况下,XY 之间的关联可以解释为因果效应。
  3. P(Z=z):用总体中 Z 取值为 z 的比例进行加权平均。

应用:在肾结石例子中,X 是治疗方法,Y 是治疗成功,Z 是结石大小(大/小)。

  • 要计算 P(成功 | do(治疗=A)),我们分别计算 P(成功 | 治疗=A, 结石=大) * P(结石=大) + P(成功 | 治疗=A, 结石=小) * P(结石=小)
  • 同理计算 do(治疗=B) 的概率。
  • 两者的差异就是平均处理效应,它量化了治疗A相对于治疗B的因果优势。

关键前提:调整公式的有效性完全依赖于我们正确识别了所有相关的混杂变量 Z。如果 Z 集不正确(遗漏混杂变量或包含错误变量),估计的因果效应将是错误的。


其他变量类型:中介与碰撞

上一节我们重点讨论了混杂变量。本节中,我们简要介绍在构建因果图时另外两种重要的变量类型,控制它们会导致错误。

1. 中介变量

中介变量位于从原因 X 到结果 Y因果路径上。例如:吸烟(X) -> 肺部焦油沉积(Z) -> 肺癌(Y)。Z 在这里是中介。

  • 错误做法:如果将中介变量 Z 放入调整公式进行控制,我们会阻断 X 通过 Z 影响 Y 的路径,从而低估XY 的总因果效应。
  • 正确做法:在估计 XY 的总效应时,不应控制中介变量。

2. 碰撞变量

碰撞变量是同时被 XY 因果影响的变量。例如:肺炎(X) -> 住院(Z) <- 骨折(Y)。Z 是一个碰撞点。

  • 错误做法:如果条件于(控制)一个碰撞变量 Z,会在 XY 之间引入一种非因果的统计关联(称为“碰撞偏差”或“伯克森悖论”)。例如,在住院病人中,肺炎和骨折可能表现出负相关,但这并非因为它们在实际人群中存在因果联系,而是因为条件于住院这个共同结果所导致的。
  • 正确做法:不应控制碰撞变量。

总结:在应用调整公式时,只能调整混杂变量。调整中介变量或碰撞变量都会导致有偏的因果估计。


总结与挑战

本节课我们一起学习了因果推断的基础知识。

我们首先通过辛普森悖论认识到,忽略混杂变量会导致对关联关系的完全误解。接着,我们引入了结构方程模型作为描述因果机制的正式语言,它通过伪代码和因果图来明确变量间的生成关系。我们重点区分了条件概率干预概率的根本不同,后者才对应因果效应。为了从观测数据中估计因果效应,我们学习了调整公式,它允许我们在已知混杂变量的情况下,将 do 操作转化为可计算的条件概率。最后,我们指出了除了混杂变量,还有中介变量碰撞变量,错误地控制它们会扭曲因果估计。

然而,整个因果推断面临一个根本性挑战:调整公式以及任何因果结论的有效性,都完全依赖于我们事先已知正确的因果图结构(即知道谁是混杂变量)。 从数据本身无法唯一确定或完全验证这个结构。这正是随机对照试验成为因果推断金标准的原因——它通过随机化处理分配,主动破坏了处理变量与任何潜在混杂变量之间的关联,从而保证了 P(Y | X=x) = P(Y | do(X=x))

因此,虽然因果推断的框架非常强大,但在仅使用观测数据时必须极其谨慎,需要深厚的领域知识来构建合理的因果假设。机器学习中的预测模型,即使非常准确,通常也不代表因果模型,在数据分布发生变化时可能失效。理解这些概念,有助于我们批判性地评估各类数据分析和研究结论。

28:专题 - 计算生物学

在本节课中,我们将探讨机器学习在计算生物学领域,特别是蛋白质结构预测与设计中的应用。我们将了解这一领域的基本问题、核心方法以及当前面临的挑战。

概述:蛋白质与机器学习

蛋白质是生命活动的主要承担者,由氨基酸线性链组成。其功能很大程度上取决于其三维空间结构。几十年来,一个核心的“大挑战”是:能否仅从氨基酸序列预测其三维结构?这个问题被称为蛋白质结构预测。

蛋白质结构预测:从序列到结构

蛋白质结构预测的目标是:给定一个氨基酸序列,描述其所有原子在三维空间中的坐标。这是一个定义清晰、有明确评估标准的监督学习问题。

关键突破:AlphaFold

DeepMind公司的AlphaFold模型在2020年取得了革命性成功,基本解决了单结构预测问题。其成功得益于几个关键因素:

  1. 清晰的问题定义:输入是序列,输出是原子坐标,评估指标明确。
  2. 高质量数据:依赖于一个包含约17万个已知结构的公共数据库,其估算重置成本高达200亿美元。
  3. 领域知识整合:巧妙利用了进化生物学和统计物理学的见解。

以下是AlphaFold2的核心流程简述:

  1. 输入:目标蛋白质的氨基酸序列。
  2. 多序列比对(MSA):在大型序列数据库中搜索与目标序列进化相关的序列。这些相关序列隐含着关于蛋白质结构约束的信息。
  3. 模板搜索:在已知结构的蛋白质中,寻找与目标或MSA中序列结构相似的模板,获取初始距离信息。
  4. Evoformer处理:使用一个创新的Transformer架构(具有行和列注意力机制)同时处理序列信息和成对距离信息,生成丰富的表示。
  5. 结构模块:将Evoformer的输出转换为最终的三维原子坐标。该模块引入了SE(3)等变性(旋转和平移等变性),确保预测结构在物理变换下保持一致。
  6. 循环(Recycling):将初步预测的结构信息反馈回网络进行迭代优化。
  7. 物理精修:使用基于物理的力场对预测结构进行微调,确保其符合物理化学规律。

AlphaFold的成功公式可以概括为:大规模监督数据 + 进化信息(MSA) + 强大的端到端深度学习架构(Transformer)

最新进展与局限:AlphaFold3

AlphaFold3将预测范围扩展到蛋白质与其他分子(如其他蛋白质、DNA、RNA、小分子)的复合物结构。其主要变化包括:

  • 更通用的输入:可以处理蛋白质、核酸等多种分子类型。
  • 扩散模型:在结构模块中使用扩散模型进行采样,旨在生成不同的可能构象。然而,它尚未解决预测蛋白质多构象这一核心挑战。

AlphaFold仍存在局限性:

  • 依赖进化信息:对于在数据库中缺乏同源序列的“孤儿蛋白”,预测效果不佳。
  • 静态单结构:主要预测最稳定的单一构象,难以捕捉蛋白质的动态变化或多构象。
  • 对突变不敏感:难以准确预测单个氨基酸突变对结构的细微影响。

蛋白质工程:从功能到序列

上一节我们介绍了如何从序列预测结构,本节我们来看看更终极的目标:蛋白质工程。其核心是设计具有特定功能的新蛋白质序列。

设计任务的挑战

蛋白质工程可以被视为在一个近乎无限的组合空间中进行搜索。对于一个长度为50的蛋白质,其可能的序列数量(20^50)已接近宇宙中的原子数。我们在这个空间中导航时,对绝大多数虚拟蛋白质的性质(如结合亲和力、稳定性)一无所知。

传统工程方法

主要有两种非机器学习的主流方法:

  1. 定向进化:模拟自然进化过程。从某个亲本蛋白开始,通过引入随机突变创建变异库,筛选出具有改进功能的变体,然后迭代此过程。这本质上是一种局部贪婪随机搜索
  2. 基于物理的设计:使用计算化学中的能量函数来评估和搜索构象空间,寻找低能量(稳定)的结构。这种方法计算成本高,且依赖于对物理定律的近似。

机器学习赋能的设计

现代蛋白质工程日益融合机器学习方法,主要方向包括:

以下是几种核心的机器学习方法:

  • 表示学习:利用大量未标注的蛋白质序列数据,训练自监督模型(如蛋白质语言模型),学习比独热编码更丰富的序列表示,用于下游的监督任务。
  • 序列生成模型:构建生成模型,直接生成新的蛋白质序列。
    • 无条件生成:生成类似天然蛋白的、可能具有稳定结构的序列。
    • 条件生成:根据特定条件(如所需结构、功能属性)生成序列。例如,逆向折叠模型接受蛋白质骨架结构作为输入,生成与之兼容的氨基酸序列。
  • 结构生成模型:使用扩散模型等生成蛋白质的三维结构坐标。通常需要与逆向折叠模型结合,才能得到最终序列。

一个典型的设计流程可能是:结构生成模型 -> 逆向折叠模型 -> 得到候选序列

核心挑战:模型外推与不确定性

在设计超越训练数据范围的新功能时,会面临根本性挑战。如果我们用一个训练好的“序列->功能”模型,通过梯度上升直接优化输入序列以追求超高功能值,模型可能会产生位于输入空间“病理区域”的无效序列(类似于计算机视觉中通过优化输入生成抽象“香蕉”图像的现象)。

这引出了两个关键概念:

  • 认知不确定性:由于缺乏该区域数据而产生的模型不确定性。
  • 偶然不确定性:数据本身的测量噪声。

在蛋白质工程中,量化认知不确定性对于判断模型预测在训练数据分布之外的可靠性至关重要,是决定设计策略(继续计算探索还是返回湿实验验证)的核心依据。

总结与展望

本节课我们一起学习了机器学习在计算生物学,特别是蛋白质科学中的应用。

  1. 蛋白质结构预测(AlphaFold)通过结合进化信息、大规模数据和深度学习,取得了历史性突破,但主要解决静态单结构预测。
  2. 蛋白质工程的目标是设计具有新功能的序列,它融合了定向进化、物理建模和多种机器学习方法(生成模型、表示学习等)。
  3. 当前挑战包括:处理蛋白质动态性与多构象、实现不依赖进化信息的“从头预测”、以及解决模型在外推设计时的可靠性与不确定性量化问题。

该领域正处在一个激动人心的阶段,机器学习正在成为理解和设计生命元件的强大工具,但距离完全可靠地“编程”蛋白质功能,仍有很长的路要走。成功往往需要湿实验(定向进化)、计算工具(机器学习模型)和领域知识的紧密结合。

posted @ 2026-03-26 09:02  布客飞龙I  阅读(15)  评论(0)    收藏  举报