复旦机器学习与量化投资笔记-全-
复旦机器学习与量化投资笔记(全)
001:课程概述与基础概念 🧠
在本节课中,我们将学习机器学习的基本概念,并通过一系列生动的例子,理解其核心思想。我们将从大家熟悉的模式识别问题入手,逐步深入到数学定义和算法基础,为后续课程打下坚实的基础。

从熟悉的问题开始

我们很早以前就在自觉或不自觉地使用机器学习的思维方式来处理问题。以下是几个典型的例子,它们展示了从数据中寻找规律并用于预测的过程。
寻找确定性规律


以下是几个从数字或图形中寻找确定性规律的例子。

- 数字序列预测:给定数组
(1,2), (2,4), (3,6), (4,8), (5,10), (6,?)。规律是第二个数字是第一个数字的两倍,因此?应为12。 - 复杂数列推理:给定数列
41, 23, 9, 7, 1, 3, -1, ?。规律是相邻两数之和依次减半:41+23=64,23+9=32,9+7=16,7+1=8,1+3=4,3+(-1)=2。因此-1 + ? = 1,得出? = 2。 - 质数序列识别:给定数列
2, 3, 5, 7, 11, 13, 17, 19, 23, ?。规律是这些数字都是质数(素数),即只能被1和自身整除。因此下一个质数是29。 - 图形模式识别:给定一系列镜像对称的图形,其右侧部分依次为数字1、2、3、4。根据规律,下一个图形的右侧应为数字5,因此选择对应图形。

推断概率性规律

并非所有规律都是确定性的,有时我们只能从概率角度进行推断。
- 抽球颜色预测:从一个装有红球和黑球的盒子中,有放回地抽取10次,结果为:
红, 红, 红, 黑, 红, 红, 黑, 红, 黑, 红。观察到红球出现7次,黑球3次。基于此,下一次大概率会抽到红球。 - 出租车数量估计:一个城市出租车按顺序获得牌照(1号,2号,…)。你在街上随机看到一辆出租车,其牌照是200号。问该城市大概有多少辆出租车?这是一个典型的极大似然估计问题。城市出租车总数
N不可能小于200。我们寻找使“看到200号车”这一事件发生概率最大的N。概率为1/N,当N=200时概率最大 (1/200)。因此,最合理的估计是城市约有200辆出租车。
从以上例子可以看出,机器学习的核心是从已知数据(样本内)中发现规律,并将其应用于未知数据(样本外)的预测或推断。


函数拟合:从完美到实用


现在,我们将问题形式化。考虑一个更学术的场景:给定平面上 n 个点 (x1, y1), (x2, y2), ..., (xn, yn),我们希望找到一个函数 h(x) 来描述 x 与 y 之间的关系。

拉格朗日插值:完美的过拟合


一个直观的想法是使用一个 n-1 次多项式 P_{n-1}(x) 来精确穿过所有 n 个点。这可以通过求解线性方程组或直接使用拉格朗日插值公式实现:



P_{n-1}(x) = Σ_{i=1}^{n} y_i * L_i(x)
其中 L_i(x) = Π_{j≠i} (x - x_j) / (x_i - x_j)

虽然这个多项式完美拟合了所有给定点,但其图像往往在点之间剧烈震荡。如果数据本身带有噪声(即 y_i 偏离了真实的简单关系),那么这种高次多项式不仅拟合了潜在规律,也拟合了噪声,导致其泛化能力很差——在样本外的预测表现会非常糟糕。


引入关键概念:假设空间与损失函数


为了解决过拟合问题,我们需要做出妥协,引入两个核心概念。


- 假设空间 (Hypothesis Space)
H:我们限制候选函数的范围。例如,我们只考虑所有次数≤ k的多项式构成的集合H_k。k越小,函数形式越简单,震荡越少,但拟合能力也越弱。 - 损失函数 (Loss Function)
L:由于限制了函数空间,我们可能无法完美拟合所有点。因此需要定义一个函数来度量预测值h(x_i)与真实值y_i之间的差异。常见的损失函数有:- L1损失:
L(h, (x_i, y_i)) = |h(x_i) - y_i| - L2损失(平方损失):
L(h, (x_i, y_i)) = (h(x_i) - y_i)^2 - 0-1损失(用于分类):
L(h, (x_i, y_i)) = 0如果h(x_i) = y_i,否则为1。
- L1损失:


机器学习的目标


综合以上两点,机器学习的目标可以表述为:在给定的假设空间 H 中,寻找一个函数 h*,使得在所有训练数据上的总损失(如所有点损失之和或平均)最小。




h* = argmin_{h ∈ H} Σ_{i=1}^{n} L(h, (x_i, y_i))



这本质上是一个优化问题。不同的损失函数对应不同的优化算法和模型特性。

不同损失函数的例子
上一节我们引入了损失函数的概念,本节中我们来看看两种重要损失函数对应的具体例子。



L2损失与线性回归




当假设空间 H 为线性函数,并使用 L2 损失(平方和)时,该问题就是著名的最小二乘法或线性回归。
考虑更一般的连续形式:在函数空间 H_k (次数≤k的多项式)中,寻找 h(x) 使得与目标函数 f(x) 的 L2 距离最小:
min_{h ∈ H_k} ∫ (h(x) - f(x))^2 dx
这可以转化为一个求解线性方程组的问题,其系数矩阵是柯西矩阵,保证了解的存在唯一性。下图展示了用5次多项式(k=5)进行 L2 最优拟合的结果,它平衡了拟合程度与函数平滑度。
L∞损失与支撑点


L∞损失(最大绝对值损失)定义为:
L(h) = max_i |h(x_i) - y_i|
其优化目标是最小化最大偏差。


一个有趣的结论是:在 H_k(k次多项式)中,使得 L∞ 损失最小的最优函数 h*,会存在至少 k+2 个支撑点。在这些支撑点 {x_s1, x_s2, ..., x_s(k+2)} 上,偏差的绝对值相等且达到最大值,并且偏差的符号正负交替。
|h*(x_s1) - y_s1| = |h*(x_s2) - y_s2| = ... = |h*(x_s(k+2)) - y_s(k+2)| = 最大误差
且 (h*(x_si) - y_si) * (h*(x_s(i+1)) - y_s(i+1)) < 0
证明思路(反证法):假设存在另一个多项式 p(x) 的 L∞ 损失更小。考虑差值多项式 p(x) - h*(x),它在每个支撑点处的符号与 h* 的偏差符号相反。根据多项式性质,这个 k 次差值多项式在 k+2 个点上交替变号,则至少存在 k+1 个根,这意味着 p(x) ≡ h*(x),矛盾。因此 h* 就是最优解。


L∞ 损失下的优化结果有一个重要特性:最终模型仅由少数几个支撑点决定,其他点不影响最优解的形式。这与 L2 损失(每个数据点都贡献于解)形成鲜明对比,也为后续学习支持向量机埋下了伏笔。




课程总结





本节课我们一起学习了机器学习的核心思想与基础框架。





- 机器学习并不陌生:我们通过数字推理、图形识别、概率估计等例子,展示了寻找规律并从样本内泛化到样本外的核心思想,这包括确定性规律和概率性规律。
- 形式化定义:机器学习被形式化为一个优化问题。它涉及三个关键要素:
- 数据:给定的样本点
(x_i, y_i)。 - 假设空间
H:候选函数的集合(如k次多项式)。 - 损失函数
L:衡量预测好坏的函数(如L1、L2、L∞损失)。
- 数据:给定的样本点
- 算法是核心:目标是找到假设空间中能使总损失最小的函数,这需要通过特定算法(如最小二乘法)来实现。
- 不同损失函数的影响:我们重点对比了L2损失(回归基础)和L∞损失。L2损失考虑所有点的平均误差;而L∞损失只关心最坏情况,其解由少数“支撑点”决定,这连接了优化理论与未来的支持向量机模型。



本讲作为概述,揭示了机器学习是从数据中学习模式的强大工具,它平衡模型复杂度与拟合能力,并通过数学优化寻找最佳解。在后续课程中,我们将深入探讨各种具体的算法、模型及其应用。
002:感知机模型 👁️
在本节课中,我们将要学习机器学习中的一个经典模型——感知机。我们将从回顾损失函数的概念开始,逐步引入感知机模型,并详细解释其工作原理、数学证明以及迭代求解算法。

回顾:不同损失函数的影响

上一节我们介绍了假设集合、数据点和损失函数的概念。本节中,我们通过一个简单的一维例子,来直观感受选择不同损失函数如何导致不同的“最优”解。


考虑在实数轴上有 n 个点:x1, x2, ..., xn。我们希望找到一个实数 x*,使其到所有点的某种“距离”之和最小。我们比较三种常见的损失函数:



以下是三种损失函数下的优化问题定义:

- L1损失:寻找
x*,使得 ∑ |x - xi|* 最小。 - L2损失:寻找
x*,使得 ∑ (x - xi)²* 最小。 - L∞损失:寻找
x*,使得 max |x - xi|* 最小。


它们的解具有截然不同的性质:



- L1损失的解是中位数。如果
n为偶数,最优解是中间区间内的任意一点;如果n为奇数,最优解就是最中间的那个点。 - L2损失的解是均值,即
(x1 + x2 + ... + xn) / n。 - L∞损失的解是最大值和最小值的终点,即
(min(xi) + max(xi)) / 2。
这个简单的例子表明,选择不同的损失函数,会得到性质完全不同的最优模型。这为我们后续选择模型和损失函数提供了重要启示。

引入感知机模型 🧠

现在,我们进入今天的主题——感知机。感知机是机器学习中一个先驱性的分类模型,其思想深刻而方法简洁。


问题定义

感知机解决的是一个监督式二分类问题。

- 输入:一组样本
(x1, y1), (x2, y2), ..., (xn, yn)。xi是一个k维向量,代表样本的k个特征。yi是样本标签,仅取两个值,例如 +1 和 -1。
- 目标:找到一个函数
f(x),能够根据输入x预测其类别y。

从几何角度看,在二维平面上,xi 是点,yi 用两种颜色(如红与黑)表示。我们的目标是找到一条直线,将两种颜色的点分开。
损失函数与线性模型
对于分类问题,一个自然的损失函数是“0-1损失”:
loss(f(xi), yi) = 0, 如果 f(xi) = yi
1, 如果 f(xi) ≠ yi
整体损失就是分类错误的样本数。我们希望损失为0,即所有样本都被正确分类。



然而,如果我们允许 f(x) 是任意函数,很容易构造一个在训练样本上损失为0,但在新样本上完全无效的模型(例如,把所有训练样本外的点都预测为同一类)。这被称为过拟合。

因此,我们必须限制函数 f(x) 的形式。感知机选择了一类简单而强大的函数:线性函数。


线性函数与超平面

在 k 维空间中,一个线性函数的形式为:
f(x) = wᵀx + b
其中 w 是一个 k 维向量(权重向量),b 是一个实数(偏置项)。wᵀ 表示 w 的转置(行向量),与列向量 x 做内积。

这个线性函数 f(x) = 0 定义了一个 (k-1) 维的超平面。向量 w 正是这个超平面的法向量。该超平面将整个空间自然分成两部分:
f(x) > 0的区域f(x) < 0的区域

感知机的核心思想就是:寻找一个超平面,使得所有正类样本(yi=+1)落在 f(x)>0 的一侧,所有负类样本(yi=-1)落在 f(x)<0 的一侧。



感知机问题形式化

综合以上,感知机问题可以形式化如下:
给定样本 (xi, yi),其中 yi ∈ {+1, -1},寻找权重向量 w 和偏置 b,使得对于所有 i,满足:
yi * (wᵀxi + b) > 0
这个条件等价于要求每个样本都被正确分类。
为了简化记号,我们可以通过“升维”将 b 并入 w。定义新的向量:
x' = [x; 1] (在x末尾添加一个元素1)
w' = [w; b]
则原条件变为:
yi * (w'ᵀ x'i) > 0
此后,我们将省略撇号,仍用 w 和 x 表示升维后的向量。问题简化为:寻找 w,使得 yi (wᵀxi) > 0 对所有 i 成立。

感知机学习算法 🔄


现在关键问题是:如何找到满足条件的 w?感知机采用了一种直观的迭代更新(学习) 方法。



算法直观
假设我们当前有一个权重向量 w,它未能正确分类所有样本。存在某个样本 (xn, yn) 被错误分类,即 yn (wᵀxn) ≤ 0。

- 情况A:
yn = +1,但wᵀxn < 0。这意味着w与xn的夹角太大。我们应该让w更靠近xn。更新规则:w_new = w_old + xn。 - 情况B:
yn = -1,但wᵀxn > 0。这意味着w与xn的夹角太小。我们应该让w远离xn。更新规则:w_new = w_old - xn。

综合两种情况,更新规则可以统一为:
w_new = w_old + yn * xn
这个更新发生在每一个分类错误的样本上。其几何意义是:将分类错误的样本所对应的向量 yn*xn 加到当前权重向量上,以调整决策超平面的方向。

算法流程与收敛性证明

迭代算法在数学中很常见,例如二分法求根、牛顿迭代法。感知机算法也是一种迭代,并且有一个重要的保证:对于线性可分的数据集,该算法一定在有限步内收敛。


以下是算法的正式描述和收敛性证明要点:


- 前提假设:数据集是线性可分的,即存在某个最优权重向量
w*,使得yi (w*ᵀxi) > 0对所有i成立。 - 算法初始化:随机初始化权重向量
w0(例如全零向量)。 - 迭代过程:
- 遍历所有样本,找到任意一个被当前
wk错误分类的样本(xi, yi)(即yi (wkᵀxi) ≤ 0)。 - 按规则更新权重:
w_{k+1} = wk + yi * xi。 - 重复此过程,直到没有样本被错误分类。
- 遍历所有样本,找到任意一个被当前
收敛性证明思路:
证明的核心在于说明权重向量 w 的模长增长有上界,而其与最优向量 w* 的内积增长有下界,两者矛盾将迫使迭代在有限步内停止。


- 引理1(模长增长上界):由更新公式和错误分类条件可推导出,
||w_{k+1}||² ≤ ||wk||² + R²,其中R = max ||xi||。因此,||wk||²的增长速度不超过O(k)。 - 引理2(与最优向量内积增长下界):由更新公式和线性可分假设可推导出,
w*ᵀ w_{k+1} ≥ w*ᵀ wk + γ,其中γ = min yi(w*ᵀxi) > 0。因此,w*ᵀ wk的增长速度至少是O(k)。 - 矛盾与结论:结合柯西-施瓦茨不等式
w*ᵀ wk ≤ ||w*|| * ||wk||,左边是O(k),右边是O(√k)。当k足够大时,此不等式不可能成立。因此,k不可能无限增大,算法必在有限步K内停止。此时的w_K就是一个能将所有样本正确分类的权重向量。


总结与展望 📚


本节课中我们一起学习了机器学习中的经典模型——感知机。

我们首先回顾了损失函数的选择如何影响模型结果。然后,我们正式定义了感知机模型:它是一个用于解决线性可分二分类问题的线性模型。其目标是找到一个超平面(由权重向量 w 和偏置 b 定义)完美分离两类数据。




核心的学习算法是一种基于错误驱动的迭代更新方法:w_new = w_old + yi * xi,其中 (xi, yi) 是当前被错误分类的样本。我们证明了,对于线性可分的数据,该算法保证在有限步内收敛到一个解。


感知机是神经网络和支持向量机的基础,其思想至关重要。然而,它也有局限性,最主要的就是只能处理线性可分的数据。在实践中,数据往往不是线性可分的,这就需要我们引入更复杂的模型,例如多层感知机(神经网络)或使用核方法的支持向量机。



在接下来的课程和作业中,你将有机会用 Python 实现感知机算法,并探索其各种变体,以加深理解。
003:线性代数复习与线性规划入门 🧮
在本节课中,我们将学习机器学习中两个重要的优化问题:线性规划和二次规划。优化问题是机器学习的核心,而线性规划与二次规划则是其中最简单和基础的形式。我们将首先复习必要的线性代数知识,然后深入探讨线性规划的定义、几何意义及其在分类问题中的应用。
线性代数核心概念复习 📚

上一节我们介绍了感知机模型,其中用到了向量和矩阵的概念。本节中,我们来系统地复习一下线性代数的基本知识,这些知识是理解后续优化问题的基础。
矩阵的基本定义与运算

矩阵是将数字按行和列排列的矩形阵列。一个 m × n 的矩阵 A 可以表示为:

其中,\(a_{ij}\) 是实数,\(i=1,...,m\), \(j=1,...,n\)。

矩阵可以进行以下基本运算:
- 加法/减法:仅适用于同维度的矩阵,对应元素相加减。
- 数乘:一个实数乘以矩阵的每一个元素。
- 乘法:矩阵 A (m × n) 与矩阵 B (n × k) 可以相乘,结果 C (m × k) 的元素为:\[c_{ij} = \sum_{t=1}^{n} a_{it} b_{tj} \]矩阵乘法不满足交换律,即通常 \(AB \neq BA\)。


向量与矩阵的表示
向量是矩阵的特殊形式。
- 行向量:1 × n 的矩阵,例如 \(\mathbf{a} = [a_1, a_2, ..., a_n]\)。
- 列向量:n × 1 的矩阵,例如 \(\mathbf{b} = [b_1, b_2, ..., b_n]^T\)。
在线性代数中,我们通常默认使用列向量。一个矩阵也可以用其列向量或行向量组表示:\[A = [\mathbf{a}_1, \mathbf{a}_2, ..., \mathbf{a}_n] \]其中每个 \(\mathbf{a}_j\) 是一个 m 维列向量。


矩阵作为线性映射
矩阵更深刻的含义是线性空间之间的线性映射。一个 m × n 的矩阵 A 定义了一个从 \(\mathbb{R}^n\) 到 \(\mathbb{R}^m\) 的线性变换 L:
对于任意向量 \(\mathbf{x} \in \mathbb{R}^n\),有 \(L(\mathbf{x}) = A\mathbf{x} \in \mathbb{R}^m\)。
线性性质满足:\(L(\alpha \mathbf{u} + \beta \mathbf{v}) = \alpha L(\mathbf{u}) + \beta L(\mathbf{v})\)。

方阵的特殊性质


当矩阵的行数等于列数(即 n × n 方阵)时,我们可计算:
- 行列式 (Determinant):记为 \(\det(A)\) 或 \(|A|\)。行列式可以为零、正或负。
- 迹 (Trace):所有主对角线元素之和,记为 \(\text{tr}(A) = \sum_{i=1}^n a_{ii}\)。
行列式和迹都是线性变换的不变量,不依赖于基的选择。对于矩阵乘法,有:\[\det(AB) = \det(A)\det(B) \]\[\text{tr}(AB) = \text{tr}(BA) \]


线性方程组



线性方程组 \(A\mathbf{x} = \mathbf{b}\),其中 \(A\) 是 m × n 矩阵。当 \(m = n\) 且 \(\det(A) \neq 0\) 时,矩阵 A 可逆,方程有唯一解:\(\mathbf{x} = A^{-1}\mathbf{b}\)。

特征值与特征向量
对于 n 阶方阵 A,若存在数 \(\lambda\) 和非零向量 \(\mathbf{v}\),使得 \(A\mathbf{v} = \lambda \mathbf{v}\),则称 \(\lambda\) 为 A 的特征值,\(\mathbf{v}\) 为对应的特征向量。
对于对称矩阵(满足 \(A^T = A\)),其所有特征值都是实数,并且存在一组两两正交的特征向量。



向量的内积与长度




在 \(\mathbb{R}^n\) 中,向量 \(\mathbf{x}\) 和 \(\mathbf{y}\) 的内积(点积)定义为:
向量 \(\mathbf{x}\) 的长度(欧几里得范数)为:
内积的几何意义是描述两个向量的夹角 \(\theta\):\(\cos \theta = \frac{\langle \mathbf{x}, \mathbf{y} \rangle}{\|\mathbf{x}\| \|\mathbf{y}\|}\)。
由此可得重要的柯西-施瓦茨不等式:
二次型

给定对称矩阵 A,函数 \(Q(\mathbf{x}) = \mathbf{x}^T A \mathbf{x}\) 称为关于 \(\mathbf{x}\) 的二次型。这是一个二次函数,在优化问题中非常重要。




优化问题与线性规划 🎯


复习完线性代数后,我们进入今天的核心主题:优化问题,特别是线性规划。



什么是优化问题

优化问题的目标是寻找一个函数在特定区域内的最大值或最小值。
- 无约束优化:在整个定义域(如 \(\mathbb{R}^n\))中求函数 \(f(\mathbf{x})\) 的极值。
- 约束优化:在满足一定条件(约束)的区域 \(\Omega\) 内求函数 \(f(\mathbf{x})\) 的极值。约束通常由等式 \(g(\mathbf{x}) = 0\) 或不等式 \(g(\mathbf{x}) \le 0\) 定义。

线性规划的定义

线性规划是一种特殊的约束优化问题,其目标函数和所有约束条件都是自变量的线性函数。
线性规划的标准形式如下:
其中:
- \(\mathbf{x} \in \mathbb{R}^n\) 是决策变量。
- \(\mathbf{c} \in \mathbb{R}^n\) 是目标函数的系数向量。
- \(A\) 是 m × n 的约束矩阵。
- \(\mathbf{b} \in \mathbb{R}^m\) 是约束条件的右端向量。
- “\(\le\)” 表示对向量的每个分量进行比较。

我们也可以求最大值(maximize),通过改变 \(\mathbf{c}\) 的符号可以相互转化。


线性规划的几何直观




在二维平面(\(\mathbb{R}^2\))上,每个线性不等式 \(a_{i1}x_1 + a_{i2}x_2 \le b_i\) 表示一个半平面。m 个这样的半平面的交集构成一个可行域 \(\Omega\)。




可行域 \(\Omega\) 具有一个关键性质:它是一个凸集。凸集的定义是:集合内任意两点的连线仍然包含在该集合内。即,对任意 \(\mathbf{x}, \mathbf{y} \in \Omega\) 和任意 \(t \in [0, 1]\),有 \(t\mathbf{x} + (1-t)\mathbf{y} \in \Omega\)。
线性不等式约束围成的区域是一种特殊的凸集——凸多边形。
目标函数 \(\mathbf{c}^T \mathbf{x}\) 是线性的,其等高线是平行直线族。寻找最优解的过程,相当于让这条等高线在可行域 \(\Omega\) 内平行移动。
一个重要结论是:线性规划的最优解(如果存在)一定在可行域 \(\Omega\) 的顶点(即凸多边形的角点)上达到。
线性规划的变形与转化

许多看似非线性的问题可以转化为线性规划问题来解决。以下是两个例子:



- 等式约束:约束 \(A\mathbf{x} = \mathbf{b}\) 可以等价地写为两个不等式:\[A\mathbf{x} \le \mathbf{b} \quad \text{且} \quad -A\mathbf{x} \le -\mathbf{b} \]从而并入标准形式。

- 含绝对值的目标函数:问题 \(\text{minimize} |\mathbf{c}^T \mathbf{x}| \ \text{s.t.} \ A\mathbf{x} \le \mathbf{b}\) 可以通过引入辅助变量 \(u, v \ge 0\) 来转化。令:\[\mathbf{c}^T \mathbf{x} = u - v, \quad |\mathbf{c}^T \mathbf{x}| = u + v \]则原问题转化为:\[\begin{aligned} & \text{minimize} \quad u + v \\ & \text{subject to} \quad A\mathbf{x} \le \mathbf{b}, \\ & \quad \quad \quad \quad \ \mathbf{c}^T \mathbf{x} = u - v, \\ & \quad \quad \quad \quad \ u \ge 0, v \ge 0 \end{aligned} \]这是一个关于变量 \((\mathbf{x}, u, v)\) 的线性规划。


线性规划在分类问题中的应用 🤖

现在,我们来看线性规划如何应用于机器学习中的分类问题,这与我们上节课的感知机模型密切相关。
线性可分情况下的感知机

回顾感知机模型:给定数据点 \((\mathbf{x}_i, y_i)\),其中 \(y_i \in \{+1, -1\}\),目标是找到一个权重向量 \(\mathbf{w}\),使得对所有 \(i\) 有 \(y_i (\mathbf{w}^T \mathbf{x}_i) > 0\)。
这等价于寻找 \(\mathbf{w}\),使得 \(y_i (\mathbf{w}^T \mathbf{x}_i) \ge 1\) 对所有 \(i\) 成立(通过缩放 \(\mathbf{w}\) 总可以做到)。
我们可以将其表述为一个可行性线性规划问题(没有目标函数,只有约束):
用矩阵形式可写为:\(A\mathbf{w} \ge \mathbf{1}\),其中矩阵 A 的第 i 行是 \(y_i \mathbf{x}_i^T\),\(\mathbf{1}\) 是全1向量。调用线性规划求解器即可判断是否存在这样的 \(\mathbf{w}\)。



线性不可分情况与软间隔


当数据不是线性可分时,上述约束无法同时满足。我们引入松弛变量 \(\xi_i \ge 0\) 来放松约束:
\(\xi_i\) 衡量了第 i 个样本被错误分类的程度。为了同时尽可能正确分类并控制错误程度,我们构建一个新的优化问题:
这仍然是一个线性规划问题,其决策变量是 \((\mathbf{w}, \xi_1, ..., \xi_n)\)。通过求解这个问题,我们可以在数据线性不可分时,找到一个“最好”的分类超平面,即犯错误最小的那个。这构成了支持向量机(SVM) 思想的雏形。



总结 📝


本节课中我们一起学习了以下内容:
- 线性代数复习:回顾了矩阵、向量、线性映射、特征值、内积和二次型等核心概念,这些是理解机器学习模型的数学基础。
- 优化问题简介:区分了无约束优化和约束优化,并指出机器学习核心是求解优化问题。
- 线性规划:学习了线性规划的标准形式、几何意义(凸集与顶点最优解)以及如何将一些非标准问题(如含等式约束或绝对值)转化为线性规划。
- 应用实例:探讨了线性规划如何用于解决分类问题,包括线性可分情况下的感知机可行性问题,以及线性不可分情况下通过引入松弛变量构建的“软间隔”分类器。

线性规划是优化理论中最基本、应用最广泛的工具之一。掌握其基本思想,为我们后续学习更复杂的优化模型(如二次规划)以及在机器学习中的深入应用打下了坚实的基础。
004:线性回归模型 📈

在本节课中,我们将学习一个传统但应用广泛的机器学习模型——线性回归。我们将从金融市场的直观例子入手,逐步理解线性回归的数学定义、假设、损失函数以及如何通过解析方法求解。

从金融数据看线性关系 📊
上一节我们介绍了机器学习的基本框架。本节中,我们来看看线性回归如何从实际数据中抽象出来。


我们首先观察一组股票收益率的散点图。X轴代表上证综指的日收益率,Y轴代表不同资产的日收益率。
以下是三组不同的散点图示例:

- 上证综指 vs. 沪深300指数:数据点几乎严格落在一条直线上,表明两者关系非常紧密。
![]()

- 上证综指 vs. 华夏银行股票:数据点大致分布在一条直线周围,存在一定偏离。
![]()


- 上证综指 vs. 华谊兄弟股票:数据点分布非常分散,且由于A股涨跌停限制(±10%),在Y轴方向被截断。
![]()


这些图表表明,尽管单个股票与市场指数的关系并非完全精确的直线,但存在一种近似的线性趋势。这种直觉在金融学中被 资本资产定价模型(CAPM) 所形式化。

CAPM模型:金融中的线性关系 💹

上一节我们看到了数据中的线性趋势。本节中,我们来看看CAPM模型如何用公式精确描述这种关系。
CAPM模型描述了单个证券(股票)的超额收益与市场超额收益之间的线性关系。其核心公式如下:

[
R_s - r = \beta (R_m - r) + \epsilon_s
]


其中:
- ( R_s ):股票的收益率。
- ( R_m ):市场组合(如上证综指)的收益率。
- ( r ):无风险收益率。
- ( \beta ):股票收益相对于市场收益的敏感度系数。
- ( \epsilon_s ):误差项(噪音),期望为0,且与市场收益 ( R_m ) 独立。
对公式两边取期望,由于 ( E[\epsilon_s] = 0 ),我们得到:
[
E[R_s] - r = \beta (E[R_m] - r)
]

这解释了为何不同股票与市场的线性关系强度(( \beta ) 值)和偏离程度(噪音 ( \epsilon_s ) 的大小)不同。线性回归的目标,正是从散点数据中找出那条最优的直线(即估计出 ( \beta ) 和截距),来描述变量间的这种关系。

线性回归的机器学习框架 ⚙️

上一节我们通过CAPM模型理解了线性关系的应用。本节中,我们正式在机器学习框架下定义线性回归问题。
一个机器学习模型需要明确四个要素:数据、假设集合、损失函数和优化算法。

1. 数据
给定一个带标签的数据集,包含 ( n ) 个样本:
[
{ (x_1, y_1), (x_2, y_2), ..., (x_n, y_n) }
]
其中,每个 ( x_i ) 是一个 ( \mathbb{R}^k ) 维的特征向量,每个标签 ( y_i ) 是一个连续的实数值(( y_i \in \mathbb{R} ))。这与我们之前学的分类问题(标签是离散的)不同。


2. 假设集合
我们在线性函数中寻找映射关系。假设函数形式为:
[
f_{w,b}(x) = w^T x + b
]
其中,( w \in \mathbb{R}^k ) 是权重向量,( b \in \mathbb{R} ) 是偏置项。我们的目标就是找到最优的 ( w ) 和 ( b )。


3. 损失函数
我们使用平方误差损失函数来衡量预测值与真实值的差距。对于单个数据点,损失为:
[
\ell(f_{w,b}(x_i), y_i) = (f_{w,b}(x_i) - y_i)^2
]
在整个数据集上的总损失(经验风险)为所有样本损失之和:
[
L(w, b) = \sum_{i=1}^{n} (w^T x_i + b - y_i)^2
]
我们的目标是找到 ( (w, b) ) 最小化这个总损失。


4. 优化算法
接下来,我们需要一个方法来求解最小化损失函数的 ( w ) 和 ( b )。




解析解:最小二乘法 📐



上一节我们定义了线性回归的优化目标。本节中,我们来看看如何通过解析方法直接求出最优解。


为了简化记号,我们将偏置项 ( b ) 并入权重向量 ( w )。具体做法是为每个特征向量 ( x_i ) 添加一个值为1的维度,形成 ( \hat{x}i = [1, x_iT]T \in \mathbb{R}^{k+1} ),同时令 ( \hat{w} = [b, wT]T )。这样,假设函数可简写为:
[
f{\hat{w}}(\hat{x}_i) = \hat{w}^T \hat{x}_i
]
为简洁起见,下文仍使用 ( x_i ) 和 ( w ) 表示升维后的向量和矩阵。

定义设计矩阵 ( X ) 和标签向量 ( Y ):
[
X = \begin{bmatrix} x_1^T \ x_2^T \ \vdots \ x_n^T \end{bmatrix} \in \mathbb{R}^{n \times (k+1)}, \quad Y = \begin{bmatrix} y_1 \ y_2 \ \vdots \ y_n \end{bmatrix} \in \mathbb{R}^{n}
]
那么,损失函数可以写成矩阵形式:
[
L(w) = | X w - Y |^2 = (Xw - Y)^T (Xw - Y)
]
我们的优化问题变为:
[
\min_{w \in \mathbb{R}^{k+1}} | X w - Y |^2
]


这是一个关于 ( w ) 的凸二次函数,存在全局最优解。通过令损失函数对 ( w ) 的梯度为零,可以求得最优解。
计算梯度并令其为零:
[
\nabla_w L(w) = 2X^T X w - 2X^T Y = 0
]
解得:
[
X^T X w = X^T Y
]
如果矩阵 ( X^T X ) 是可逆的(通常要求 ( X ) 是满列秩的,即样本数量 ( n ) 远大于特征维度 ( k+1 ),且特征间线性无关),则得到最小二乘估计的解析解:
[
w^* = (X^T X)^{-1} X^T Y
]
这个解被称为正规方程解。



加权最小二乘法 ⚖️



上一节我们介绍了标准的最小二乘法。本节中,我们来看一个它的变体,用于处理不同数据点重要性不同的情况。

在标准最小二乘中,所有样本的预测误差被平等对待。有时,我们希望给予不同样本不同的权重。这可以通过引入一个正定权重矩阵 ( \Omega ) 来实现。新的损失函数定义为:
[
L_{\Omega}(w) = (Xw - Y)^T \Omega (Xw - Y)
]
其中,( \Omega ) 通常是对角矩阵,对角线上的元素 ( \omega_{ii} ) 表示第 ( i ) 个样本的权重。





采用类似的求导方法,令梯度为零:
[
\nabla_w L_{\Omega}(w) = 2X^T \Omega X w - 2X^T \Omega Y = 0
]
解得加权最小二乘的解为:
[
w^*_{\Omega} = (X^T \Omega X)^{-1} X^T \Omega Y
]
前提同样是 ( X^T \Omega X ) 可逆。
总结 🎯


本节课中我们一起学习了线性回归模型。



- 直观理解:我们从金融市场的散点图和CAPM模型出发,理解了变量间存在近似线性关系的普遍性。
- 模型定义:我们在机器学习框架下定义了线性回归,明确了其数据(连续标签)、假设(线性函数)、损失(平方误差)三要素。
- 求解方法:我们推导了线性回归的解析解——最小二乘估计,其核心公式为 ( w^* = (X^T X)^{-1} X^T Y )。这种方法直接、高效,但要求 ( X^T X ) 可逆。
- 模型变体:我们简要介绍了加权最小二乘法,它通过权重矩阵 ( \Omega ) 为不同样本赋予不同重要性。




线性回归因其简单、可解释性强且有解析解,成为许多机器学习应用的基础。下次课,我们将学习逻辑回归模型,用于处理分类问题。
005:逻辑回归 📈
在本节课中,我们将学习逻辑回归。这是一种专门用于处理分类问题的回归方法。我们将看到如何从线性回归出发,通过引入概率思想和特定的激活函数,构建出能够处理离散输出的模型。

上一节我们介绍了线性回归,它适用于输出为连续变量的情况。本节中我们来看看如何处理分类问题。
从线性回归到分类问题

线性回归的假设函数是线性的,其输出是连续值。然而,分类问题的输出通常是离散的,例如0或1。如果直接用线性回归处理分类问题,其输出值可能远超出0和1的范围,这并不合适。
因此,我们需要修改线性回归的方法,使其能够处理分类问题,这就引出了逻辑回归。

逻辑回归的基本思想
我们的出发点仍然是给定的数据点。假设我们有 n 个点 (x_i, y_i),其中每个 x_i 是 R^k 空间的一个向量,y_i 取离散值0或1。
我们仍然对线性函数感兴趣,因此考虑由参数 w(向量)和 b(截距)构成的线性函数:
f(x) = w^T x + b


这个函数 f(x) 是连续的,其值域是整个实数集。为了将其输出限制在0到1之间,并使其值尽量接近0或1,我们引入一个激活函数 g(z)。

以下是激活函数 g(z) 需要满足的条件:
- 定义在所有实数上。
- 值域在0到1之间。
- 在绝大部分时候,函数值尽量接近0或1。
一个常用的函数是Sigmoid函数:
g(z) = 1 / (1 + e^{-z})
对于任何实数 z,e^{-z} > 0,因此 g(z) 的值严格在0和1之间。当 z 趋向正无穷时,g(z) 趋向于1;当 z 趋向负无穷时,g(z) 趋向于0。

我们将线性函数 f(x) 与激活函数 g(z) 复合,得到我们的假设函数 h(x):
h(x) = g(f(x)) = 1 / (1 + e^{-(w^T x + b)})



这样,h(x) 就是一个定义在 R^k 上、输出值在0到1之间的函数。为了简化记号,我们进行升维处理,将截距 b 并入权重向量 w,将输入 x 增加一个常数维度1。简化后,假设函数可以写为:
h(x) = 1 / (1 + e^{-w^T x})

引入概率解释与损失函数
有了假设函数,下一步是定义损失函数,以衡量模型对数据的拟合程度。我们引入概率论的思想。

我们可以将数据点 (x_i, y_i) 看作是从某个联合分布中独立同分布采样得到的。我们关心的是给定 x 时 y 的条件分布。

很自然地,我们可以用复合函数 h(x) 来模拟 y=1 的条件概率:
P(y=1 | x; w) = h(x) = 1 / (1 + e^{-w^T x})

相应地,y=0 的条件概率为:
P(y=0 | x; w) = 1 - h(x) = e^{-w^T x} / (1 + e^{-w^T x})


从几何上看,参数 w 定义了一个超平面 w^T x = 0。对于数据点 x:
- 如果
w^T x远大于0,则P(y=1 | x; w)接近1。 - 如果
w^T x远小于0,则P(y=1 | x; w)接近0。 - 如果
w^T x接近0,则P(y=1 | x; w)接近0.5,处于分类的模糊地带。


这符合分类问题的直观:离决策边界越远的点,分类越确定;越靠近边界的点,分类越不确定。


接下来,我们利用极大似然估计来构造损失函数。在独立同分布假设下,所有数据出现的联合概率(似然函数)为:
L(w) = ∏_{i=1}^{n} P(y_i | x_i; w)


将条件概率表达式代入,并取对数(将连乘变为连加),我们的目标是找到参数 w 最大化这个似然函数。通常,我们将其转化为最小化负对数似然函数,这就定义了我们的损失函数 J(w):
J(w) = - log L(w) = - ∑_{i=1}^{n} [ y_i log(h(x_i)) + (1 - y_i) log(1 - h(x_i)) ]
这个损失函数称为交叉熵损失函数。逻辑回归的机器学习问题就定义为:在给定的数据上,寻找参数 w 以最小化交叉熵损失函数 J(w)。


优化算法:梯度下降法



对于线性回归,我们可以通过求导得到参数的解析解(闭式解)。但对于逻辑回归的损失函数 J(w),不存在这样的解析解。

因此,我们必须使用数值优化算法来求解。一个常用且有效的方法是梯度下降法。
梯度下降法的核心思想是:函数值下降最快的方向是梯度的反方向。我们从一个初始参数 w^{(0)} 开始,迭代地沿负梯度方向更新参数:
w^{(t+1)} = w^{(t)} - η * ∇J(w^{(t)})


其中,η 是学习率,控制每次更新的步长;∇J(w) 是损失函数在 w 处的梯度。

对于逻辑回归的损失函数,其梯度可以通过求导得到,并具有比较简洁的形式(涉及Sigmoid函数的导数),这使得梯度下降法能够高效实施。


综上所述,逻辑回归模型包含了机器学习的四个基本要素:
- 数据:独立同分布的
(x_i, y_i),y_i ∈ {0, 1}。 - 假设函数:
h(x) = 1 / (1 + e^{-w^T x}),模拟P(y=1 | x; w)。 - 损失函数:交叉熵损失
J(w) = - ∑ [ y_i log(h(x_i)) + (1 - y_i) log(1 - h(x_i)) ]。 - 优化算法:梯度下降法等数值优化方法。
逻辑回归的扩展

逻辑回归可以从两个方面进行扩展,以增强其能力。

扩展一:从二分类到多分类 🎯



逻辑回归最初是为二分类设计的。对于有 K 个类别(标签为 0, 1, ..., K-1)的多分类问题,我们可以将其推广为多项逻辑回归(或Softmax回归)。


我们需要为每个类别 k(除了一个基准类,如类别0)学习一个参数向量 w_k。条件概率定义为:
P(y=k | x; W) = e^{w_k^T x} / (1 + ∑_{j=1}^{K-1} e^{w_j^T x}),对于 k = 1, ..., K-1
P(y=0 | x; W) = 1 / (1 + ∑_{j=1}^{K-1} e^{w_j^T x})


这里 W 代表所有 w_k 参数的集合。这组概率满足总和为1,构成了一个有效的概率分布。损失函数则相应地推广为多类别的交叉熵形式,并同样可以使用梯度下降法进行优化。
扩展二:引入非线性特征 🔄
标准的逻辑回归使用线性决策边界(超平面)。如果数据本身不是线性可分的(例如,一类点分布在中心,另一类点分布在外围),线性模型的效果会很差。
解决方法是引入非线性特征。例如,对于原始特征 x = [x1, x2]^T,我们可以手动添加多项式特征,如 x1^2, x2^2, x1*x2,将数据映射到更高维的空间 φ(x) = [x1, x2, x1^2, x2^2, x1*x2]^T。
在原始空间中非线性可分的问题,在更高维的特征空间中可能变得线性可分。然后,我们在这个高维特征空间上应用逻辑回归,其决策边界在原始空间中就表现为非线性的(如圆形、椭圆形)。


虽然这种方法会增加计算量,并且需要谨慎选择特征以避免过拟合,但它显著提升了模型的表达能力。后续更高级的模型(如支持向量机、神经网络)会系统化地处理非线性问题。




本节课中我们一起学习了逻辑回归。我们从线性回归在处理分类问题时的局限性出发,通过引入Sigmoid激活函数将输出限制在0-1之间,并赋予其概率解释。利用极大似然估计,我们推导出了交叉熵损失函数。由于该损失函数没有解析解,我们介绍了梯度下降法这一数值优化算法。最后,我们探讨了逻辑回归的两个重要扩展:处理多分类问题的Softmax回归,以及通过特征映射引入非线性能力。逻辑回归是分类问题中一个基础而强大的工具,其核心思想在深度学习中也会反复出现。
006:决策树基础与熵的概念 🌳
在本节课中,我们将学习机器学习中的一个经典非线性算法——决策树。我们将从鸢尾花分类的例子出发,理解决策树的基本思想,并深入探讨其核心数学基础:概率论中的熵与信息增益。

决策树的基本概念
上一节我们介绍了线性算法,本节中我们来看看第一个非线性算法:决策树。决策树算法旨在根据数据的特征,构建一个树状模型来进行分类或预测。

我们以一个经典的鸢尾花数据集为例。该数据集包含150个样本,每个样本有四个特征:花瓣长度、花瓣宽度、花萼长度和花萼宽度。目标是将鸢尾花正确分类为三个类别(用0, 1, 2表示)。


决策树的目标是学习从这四个特征到最终分类标签之间的关系。与线性模型寻找全局线性关系不同,决策树采用一种“分而治之”的策略。
决策树的工作原理
决策树的核心思想是:从所有数据(根节点)开始,选择一个对分类最有帮助的特征进行分割,将数据分成不同的子集(子节点),然后在每个子集上重复此过程,直到满足停止条件(叶节点)。
其过程类似于构建一个二叉树:
- 根节点:包含所有待分类数据。
- 内部节点:基于某个特征的取值(例如,花萼宽度是否大于某个值)对数据进行划分。
- 叶节点:代表最终的分类结果。
例如,我们可能发现“花萼宽度”这个特征对区分鸢尾花类别非常有效。决策树就会首先根据花萼宽度将数据分成两组,然后在每个子组内,再寻找其他有效的特征(如花瓣长度)进行进一步细分。


那么,如何量化一个特征对分类的“帮助”有多大呢?这就需要引入“熵”和“信息增益”的概念。
概率论基础:熵与条件熵
为了理解决策树如何选择特征,我们需要学习概率论中“熵”的概念。熵用来度量一个随机变量的不确定性或混乱程度。
熵的定义
对于一个离散随机变量 (X),其取值为 ({x_1, x_2, ..., x_n}),对应的概率为 (P(X=x_i) = p(x_i))。熵 (H(X)) 定义为:
[
H(X) = -\sum_{i=1}^{n} p(x_i) \log p(x_i)
]
熵的性质:
- 非负性:(H(X) \ge 0)。
- 确定性:当随机变量以概率1取某个值时(分布最集中),熵为0,不确定性最低。
- 均匀分布时最大:当所有取值概率相等((p(x_i) = 1/n))时,熵取最大值 (\log n),不确定性最高。
条件熵与信息增益
当我们拥有另一个随机变量 (Y) 的信息时,可以计算在已知 (Y) 的条件下 (X) 的熵,即条件熵 (H(X|Y))。它表示在知道 (Y) 之后,(X) 剩余的不确定性。
信息增益 (IG(X;Y)) 定义为 (X) 自身的熵与已知 (Y) 后 (X) 的条件熵之差:
[
IG(X;Y) = H(X) - H(X|Y)
]
信息增益衡量了特征 (Y) 能为预测 (X) 带来多少“信息”。它具有以下关键性质:
- 对称性:(IG(X;Y) = IG(Y;X))。
- 非负性:(IG(X;Y) \ge 0)。当且仅当 (X) 与 (Y) 相互独立时,信息增益为0(知道 (Y) 对了解 (X) 无帮助)。
- 值越大越好:信息增益越大,说明特征 (Y) 对确定 (X) 的贡献越大,能更大程度地降低不确定性。
决策树的构建算法 🛠️
理解了熵和信息增益后,决策树的构建过程就清晰了。它是一个递归的、贪心的过程。
以下是构建决策树的核心步骤:
- 从根节点开始:计算当前节点(包含所有或部分数据)中目标变量 (Y)(分类标签)的熵 (H(Y))。
- 特征选择:对于每一个候选特征 (X_i),计算其相对于 (Y) 的信息增益 (IG(Y;X_i) = H(Y) - H(Y|X_i))。
- 最佳分割:选择信息增益最大的那个特征作为当前节点的分割标准。这能最有效地降低分类的不确定性。
- 创建子节点:根据所选特征的取值,将当前数据集划分到不同的子节点中。
- 递归建树:将每个子节点视为新的根节点,重复步骤1-4。
- 停止条件:当满足以下任一条件时,当前节点停止分裂,成为叶节点:
- 该节点中所有样本都属于同一类别(熵为0)。
- 没有更多特征可用于分割。
- 达到预设的树深度或节点最小样本数等(用于防止过拟合,下节课详述)。
关键点:在树的不同分支(子节点)上,可以选择不同的特征进行下一步分割。算法始终选择在当前子数据集上能带来最大信息增益的特征。
总结与展望
本节课中我们一起学习了决策树算法的基础。我们从鸢尾花分类问题引入,理解了决策树分而治之的非线性思想。然后,我们深入学习了其数学核心——熵与信息增益,它们量化了特征对分类结果的重要性。最后,我们梳理了决策树的递归构建算法:通过不断选择信息增益最大的特征进行分割,直至数据被完全分类或满足停止条件。






然而,严格按照上述算法构建的树可能会非常复杂,完美拟合训练数据,导致过拟合问题(在训练集上表现好,在未知数据上表现差)。为了解决这个问题,我们需要对决策树进行“剪枝”。这部分内容我们将在下一讲中详细介绍。


007:支持向量机 🧠


在本节课中,我们将要学习一个在机器学习中占有特殊地位的经典模型——支持向量机。这个模型起源于线性模型,但巧妙地拓展到了非线性领域,我们将从几何角度出发,系统地学习其核心思想与推导过程。


1. 几何预备知识:超平面与距离 📏

上一节我们介绍了从不同角度看待分类问题,本节中我们来看看支持向量机所依赖的几何基础。


超平面的定义
在 ( R^n ) 欧式空间中,一个 ( n-1 ) 维的超平面可以用一个线性函数定义:
[
f(x) = w^T x + b
]
其中,( w ) 是 ( R^n ) 中的一个向量(法向量),( b ) 是一个实数。超平面由方程 ( f(x) = 0 ) 给出。




- 当点 ( x_0 ) 在超平面上时,( f(x_0) = 0 )。
- 当点 ( x_0 ) 不在超平面上时,( f(x_0) > 0 ) 或 ( f(x_0) < 0 ),空间被超平面分割为两部分。

点到超平面的距离
点 ( x_0 ) 到超平面 ( f(x) = w^T x + b = 0 ) 的带符号距离 ( l ) 计算公式为:
[
l = \frac{w^T x_0 + b}{||w||} = \frac{f(x_0)}{||w||}
]
该距离的绝对值表示几何距离,符号表示该点位于超平面的哪一侧(由法向量 ( w ) 的方向决定)。
2. 最优分类超平面的直观想法 💡



我们已经知道可以用超平面区分两类点,但存在无数个可行的超平面。支持向量机的核心思想是寻找一个“最公正”的超平面。



以下是寻找最优超平面的直观思路:
- 我们希望找到的超平面不仅能正确分类所有点(即 ( y_i (w^T x_i + b) > 0 )),还能让离它最近的那些点(即间隔最小的点)到它的距离尽可能大。
- 这样得到的超平面位于两类数据“正中间”,对局部扰动的容忍度最高,被认为是最鲁棒、泛化能力最好的分类边界。



3. 支持向量机的优化问题形式化 ⚙️






基于上述直观想法,我们可以将寻找最优超平面形式化为一个优化问题。




我们希望最大化所有样本点中,到超平面最小的那个带符号距离。同时,所有点必须被正确分类。这可以写成:
[
\max_{w, b} \ \min_{i=1,...,n} \ \frac{y_i (w^T x_i + b)}{||w||} \quad \text{s.t.} \quad y_i (w^T x_i + b) > 0
]
为了简化求解,我们通过缩放 ( w ) 和 ( b ),可以将距离超平面最近的那些点的函数值固定为 ( y_i (w^T x_i + b) = 1 )。这不会改变超平面本身,但能将问题转化为一个更易处理的形式。



经过推导,上述问题等价于以下二次规划问题:
[
\min_{w, b} \ \frac{1}{2} ||w||^2 \quad \text{s.t.} \quad y_i (w^T x_i + b) \ge 1, \ i = 1, ..., n
]
这里,最小化 ( ||w||^2 ) 等价于最大化间隔(因为间隔为 ( 2 / ||w|| )),约束条件保证了所有点都被正确分类且距离至少为 ( 1 / ||w|| )。



4. 引入对偶问题与核函数 🌀




直接求解上述二次规划是可行的。但通过引入拉格朗日乘子法和对偶问题,我们能获得更深刻的洞察,并引出支持向量机最关键的特性——核技巧。




构建拉格朗日函数
为约束优化问题引入拉格朗日乘子 ( \alpha_i \ge 0 ):
[
L(w, b, \alpha) = \frac{1}{2} ||w||^2 - \sum_{i=1}^{n} \alpha_i [y_i (w^T x_i + b) - 1]
]





转化为对偶问题
原问题等价于 ( \min_{w,b} \max_{\alpha \ge 0} L(w, b, \alpha) )。在满足KKT条件的情况下,我们可以求解其对偶问题 ( \max_{\alpha \ge 0} \min_{w,b} L(w, b, \alpha) )。




- 首先对 ( w ) 和 ( b ) 求偏导并令其为零:
[
\frac{\partial L}{\partial w} = 0 \Rightarrow w = \sum_{i=1}^{n} \alpha_i y_i x_i
]
[
\frac{\partial L}{\partial b} = 0 \Rightarrow \sum_{i=1}^{n} \alpha_i y_i = 0
] - 将结果代回拉格朗日函数,得到关于 ( \alpha ) 的对偶问题:
[
\max_{\alpha} \ \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_i \alpha_j y_i y_j (x_i^T x_j)
]
[
\text{s.t.} \quad \alpha_i \ge 0, \ \sum_{i=1}^{n} \alpha_i y_i = 0
]
这仍然是一个二次规划问题,但约束更简单。




核技巧的引入
观察对偶问题的目标函数和最终模型,训练数据 ( x_i ) 总是以内积 ( x_i^T x_j ) 的形式出现。这是一个关键发现。




如果原始数据线性不可分,我们可以考虑一个映射 ( \phi: R^n \rightarrow R^m ),将数据映射到更高维(甚至无限维)的特征空间,使其在那个空间中线性可分。在对偶问题中,我们只需要计算映射后的内积 ( \phi(x_i)^T \phi(x_j) )。

我们定义核函数 ( K(x_i, x_j) = \phi(x_i)^T \phi(x_j) )。这样,我们无需显式地知道映射 ( \phi ) 的具体形式,也无需在高维空间中进行复杂的计算,只需在原空间计算核函数值即可。这被称为核技巧。




常用的核函数包括:
- 线性核:( K(x_i, x_j) = x_i^T x_j )
- 多项式核:( K(x_i, x_j) = (x_i^T x_j + c)^d )
- 高斯径向基核:( K(x_i, x_j) = \exp(-\gamma ||x_i - x_j||^2) )



引入核函数后,对偶问题和最终的决策函数变为:
- 对偶问题:
[
\max_{\alpha} \ \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_i \alpha_j y_i y_j K(x_i, x_j)
] - 决策函数:
[
f(x) = \text{sign} \left( \sum_{i=1}^{n} \alpha_i y_i K(x_i, x) + b \right)
]




5. 支持向量与模型求解 🎯





求解对偶问题后,我们可以得到一些重要性质。



以下是支持向量机模型的关键特性:
- 支持向量:最终解中,大部分 ( \alpha_i ) 会等于0。只有少数 ( \alpha_i > 0 ) 对应的样本点对最终模型有贡献,这些点被称为支持向量。它们通常位于最大间隔边界上。
- 模型参数:最优的 ( w^* = \sum_{i=1}^{n} \alpha_i y_i x_i ),最优的 ( b^* ) 可以通过任意一个支持向量计算得到:( b^* = y_j - \sum_{i=1}^{n} \alpha_i y_i K(x_i, x_j) ),其中 ( x_j ) 是任意一个支持向量。
- 求解方法:核心是求解一个二次规划问题。在实际应用中,通常使用专门的优化库(如SMO算法)来高效求解。






总结 📝




本节课中我们一起学习了支持向量机的核心原理。
- 我们从几何角度出发,定义了超平面和点到超平面的距离。
- 我们提出了寻找“最大间隔”分类超平面的直观目标,并将其形式化为一个凸二次规划问题。
- 通过引入拉格朗日乘子法,我们推导出原问题的对偶形式,并发现了数据仅以内积形式出现的关键特性。
- 基于此,我们引入了核技巧,通过核函数 ( K(x_i, x_j) ) 隐式地将数据映射到高维空间,从而优雅地处理了非线性分类问题,这是支持向量机强大能力的来源。
- 最后,我们了解了支持向量的概念以及模型求解的基本思路。





支持向量机通过最大化分类间隔来追求模型的鲁棒性,并利用核技巧巧妙地解决了非线性问题,这些思想使其成为机器学习中一个非常重要且经典的模型。
008:贝叶斯估计与线性判别法
在本节课中,我们将学习一种基于概率的分类方法——线性判别法。这种方法源于贝叶斯估计,也称为朴素贝叶斯估计。学习这一讲,一方面是为了补充我们现有的模型库,另一方面是为后续学习更复杂的概率模型(如EM算法和隐马尔可夫模型)打下坚实的概率基础。我们将从极大似然估计开始,逐步过渡到贝叶斯估计,并最终展示如何将其应用于分类问题。
概率空间与随机变量

首先,我们回顾一下概率论的基本概念。一个概率空间通常由三元组 (Ω, F, P) 表示:
- Ω:代表样本空间,包含所有可能的基本结果。
- F:代表一个σ-代数,它定义了我们可以测量概率的事件集合。
- P:代表概率测度,为F中的每个事件分配一个概率值。


在这个概率空间上,我们定义一个随机变量 X。对于连续型随机变量,我们关心它的概率密度函数。我们假设X的密度函数形式已知,但依赖于一个未知参数 θ。其密度函数记为 p(x; θ)。
例如,在高斯分布(正态分布)中,参数 θ 包含了均值 μ 和标准差 σ。在指数分布中,参数是 λ。我们的目标就是根据观测到的数据来估计这个未知参数 θ。


极大似然估计

上一节我们介绍了带有未知参数的随机变量。本节中,我们来看看如何利用观测数据来估计这个参数,这就是极大似然估计。
核心思想
假设我们独立地抽取了 n 个样本:x₁, x₂, ..., xₙ。由于样本独立,观察到这组特定样本的联合概率密度(似然函数)是每个样本密度的乘积:
L(θ) = ∏_{i=1}^{n} p(xᵢ; θ)
极大似然估计的核心思想是:寻找一个参数值 θ̂,使得在当前参数下,观测到眼前这组样本的可能性(似然)最大。数学上表示为:
θ̂ = argmax_{θ} L(θ) = argmax_{θ} ∏_{i=1}^{n} p(xᵢ; θ)
由于对数函数是单调递增的,最大化 L(θ) 等价于最大化其对数似然函数 ℓ(θ),这通常能简化计算(将连乘变为求和):
θ̂ = argmax_{θ} ℓ(θ) = argmax_{θ} ∑_{i=1}^{n} log p(xᵢ; θ)
应用示例:伯努利分布

让我们将极大似然估计应用到一个具体问题:估计伯努利分布的参数。



伯努利分布描述一个二元随机变量 X,它取值为0或1。设 P(X=0) = p,P(X=1) = q = 1-p。参数 p 是未知的。




假设我们观测到 n 个独立样本,其中 k 个为0,n-k 个为1。其似然函数为:
L(p) = pᵏ (1-p)ⁿ⁻ᵏ
取对数似然:
ℓ(p) = k log p + (n-k) log(1-p)
为了找到使 ℓ(p) 最大的 p,我们对其求导并令导数为零:
dℓ/dp = k/p - (n-k)/(1-p) = 0
解这个方程,得到极大似然估计:
p̂ = k / n
这个结果非常直观:参数 p(X=0的概率)的最佳估计就是观测样本中 X=0 出现的频率。


应用示例:高斯分布




现在,我们将极大似然估计应用于高斯分布。一维高斯分布的密度函数为:
p(x; μ, σ) = (1 / √(2πσ²)) * exp(-(x-μ)²/(2σ²))


假设我们观测到独立样本 x₁, x₂, ..., xₙ,对数似然函数为:
ℓ(μ, σ) = ∑_{i=1}^{n} [ -log σ - (1/2)log(2π) - (xᵢ-μ)²/(2σ²) ]


为了估计参数 μ 和 σ,我们分别对 ℓ(μ, σ) 关于 μ 和 σ 求偏导并令其为零。


对 μ 求导:
∂ℓ/∂μ = ∑ (xᵢ - μ)/σ² = 0 => μ̂ = (1/n) ∑ xᵢ
对 σ 求导(通过令 ∂ℓ/∂σ = 0):
σ̂² = (1/n) ∑ (xᵢ - μ̂)²
因此,高斯分布的极大似然估计就是样本均值和样本方差(注意这里是除以 n 而非 n-1)。

贝叶斯估计


上一节我们介绍了参数为固定值的极大似然估计。本节中,我们引入贝叶斯估计,其核心区别在于将参数 θ 本身也视为一个随机变量,它服从某个先验分布 p(θ)。


核心思想



在贝叶斯框架下,我们的目标是根据观测数据 S(即样本集合)来更新对参数 θ 的认识,即求后验分布 p(θ|S)。根据贝叶斯公式:
p(θ|S) = p(S|θ) * p(θ) / p(S)
其中:
p(S|θ):给定参数时观测到数据的似然,即之前的L(θ)。p(θ):参数的先验分布,代表我们在看到数据之前对θ的信念。p(S):证据,是一个与θ无关的归一化常数。
当我们想要一个具体的参数估计值时,一个常见的选择是最大后验估计,即取使后验概率最大的 θ:
θ̂_MAP = argmax_{θ} p(θ|S) = argmax_{θ} p(S|θ) * p(θ)
与极大似然估计 θ̂_MLE = argmax_{θ} p(S|θ) 相比,MAP估计多乘了一个先验项 p(θ)。如果先验分布是均匀分布(即 p(θ) 为常数),那么MAP估计就退化为了MLE。


应用于分类:线性判别法


现在,我们将贝叶斯估计的思想应用于分类问题。给定训练数据 (x₁, y₁), (x₂, y₂), ..., (xₙ, yₙ),其中 yᵢ ∈ {0, 1}。我们想学习一个模型来预测新样本 x 的类别 y。


模型假设



我们从概率角度建模,假设数据由以下联合分布生成:
- 类别先验:
P(Y=0) = π₀,P(Y=1) = π₁ = 1 - π₀。 - 类条件概率:给定类别
Y,特征X服从高斯分布。- 当
Y=0时,X ~ N(μ₀, Σ₀) - 当
Y=1时,X ~ N(μ₁, Σ₁)
- 当

这里 μ₀, μ₁ 是均值向量,Σ₀, Σ₁ 是协方差矩阵(在一维情况下就是方差 σ₀², σ₁²)。
参数估计


我们的目标是利用训练数据估计所有未知参数:π₀, π₁, μ₀, μ₁, Σ₀, Σ₁。



根据贝叶斯公式和我们的模型假设,给定数据后,参数的联合似然(或后验)可以分解。通过最大化这个联合似然(即进行MAP估计,这里通常假设参数先验为均匀分布,故等价于MLE),我们可以得到参数的闭式解:



- 类别先验:
π̂₀ = k / n,π̂₁ = (n-k) / n,其中k是训练集中y=0的样本数。这与伯努利分布的MLE一致。 - 类均值:
μ̂₀是所有y=0样本的x的均值;μ̂₁是所有y=1样本的x的均值。 - 类协方差:
Σ̂₀是所有y=0样本的协方差矩阵(无偏估计需适当调整);Σ̂₁同理。


进行预测

当获得新样本 x 时,我们利用贝叶斯公式计算其后验概率:
P(Y=0 | X=x) = p(x|Y=0) * P(Y=0) / [ p(x|Y=0)P(Y=0) + p(x|Y=1)P(Y=1) ]
P(Y=1 | X=x) = 1 - P(Y=0 | X=x)


其中 p(x|Y=0) 和 p(x|Y=1) 就是我们估计出的高斯密度函数。我们选择后验概率更大的类别作为预测结果:
ŷ = argmax_{y ∈ {0,1}} P(Y=y | X=x)



决策边界




决策边界是使得 P(Y=0 | X=x) = P(Y=1 | X=x) 的 x 的集合。将高斯密度公式代入并化简,我们可以得到决策边界的方程。


一个重要的特例是当两个类别的协方差矩阵相等时,即 Σ₀ = Σ₁ = Σ。此时,决策边界方程化简为关于 x 的线性函数:
wᵀ x + b = 0
其中 w = Σ⁻¹ (μ₁ - μ₀),b 是一个常数项。这就是“线性判别法”名称的由来。

如果协方差矩阵不相等,决策边界将是一个二次曲线(在一维或二维中)或二次曲面(在高维中)。



总结


本节课中我们一起学习了:
- 极大似然估计:通过最大化观测数据的似然函数来估计固定参数。
- 贝叶斯估计:将参数视为随机变量,利用先验分布和贝叶斯公式得到后验分布,进而进行估计(如MAP估计)。
- 线性判别法:一个基于贝叶斯估计的分类器。它假设每个类别的数据服从高斯分布,并通过估计各类别的先验、均值和协方差参数来构建模型。在预测时,它计算新样本属于每个类别的后验概率并取最大值。
- 当各类别的协方差矩阵相同时,线性判别法产生一个线性决策边界;否则,决策边界是二次的。这种方法为分类问题提供了一个坚实且可解释的概率框架。
009:集成学习与提升方法 🚀
在本节课中,我们将学习机器学习中的两种重要方法:集成学习与提升方法。我们将从回顾决策树开始,然后深入探讨基于决策树的提升方法,特别是梯度提升(Gradient Boosting)及其具体实现XGBoost,同时也会介绍AdaBoost的理论基础。课程内容力求简单直白,让初学者能够理解核心概念。
回顾:决策树与回归树 🌳


上一节我们介绍了决策树作为分类模型。实际上,决策树也可以用于回归问题。本节中,我们来看看如何用决策树进行回归。
一维回归树示例



考虑一个简单的监督学习问题:数据特征x是一维的,目标y也是连续的。假设数据分布如下图所示,在某个点c处,y的函数值有明显变化。


我们的目标是找到一个学习函数来逼近从x到y的映射。使用决策树的思想,当只有一个特征x时,我们从根节点开始。由于只有一个特征,我们无需计算信息增益,直接根据x是否小于某个分割点d将数据分为两部分。

- 左分支(
x < d):用常数g来预测y。 - 右分支(
x >= d):用常数w来预测y。
因此,我们需要确定三个参数:分割点d、左分支预测值g和右分支预测值w。为了评估参数的好坏,我们需要定义一个损失函数。例如,使用L2损失函数(均方误差),我们的目标是最小化以下总和:
左分支损失:∑ (g - y_i)^2,对所有满足 x_i < d 的 i 求和。
右分支损失:∑ (w - y_j)^2,对所有满足 x_j >= d 的 j 求和。

在L2损失下,最优的g和w分别是其对应分支中所有y值的平均值:
g = (1/k) * ∑ y_i(k是左分支样本数)w = (1/(n-k)) * ∑ y_j(n-k是右分支样本数)



问题就转化为寻找最佳分割点d,使得总损失最小。

高维回归树
当特征有k维时,思路类似。每个特征i都有一个分割点c_i。根据所有特征是否大于其各自的分割点,整个特征空间被划分为2^k个子区域(立方体)。在每个子区域I_j内,我们用一个常数y_j来逼近目标值。
我们的目标是最小化总损失:∑_{j=1}^{2^k} ∑_{i in I_j} (y_j - y_i)^2。
同样,在L2损失下,每个区域的最优y_j是该区域内所有y_i的平均值。真正的挑战在于如何高效地找到所有k个分割点c_1, c_2, ..., c_k,因为可能的区域数量随特征数指数增长。


回归树的构建算法
为了避免组合爆炸,我们采用递归的决策树算法来构建回归树(Regression Tree),过程如下:
- 从根节点开始:遍历所有特征,对每个特征,寻找一个最佳分割点
c。 - 计算分割后损失:假设按特征
i和分割点c将数据分为左右两部分。计算两部分的预测值(即y的平均值),并计算分割后的总L2损失。 - 选择最佳分割:选择能使分割后总损失最小的那个特征
i和分割点c,作为当前节点的分割规则。 - 递归生长:对生成的左右子节点,重复步骤1-3。
- 停止条件:为了避免过拟合,需要设置停止条件,例如:树达到最大深度、节点样本数少于阈值、或节点损失减少小于某个值等。

通过上述过程建立的树,就是用于回归的决策树。


提升(Boosting)方法的核心思想 📈

上一节我们介绍了回归树,但单个树的拟合能力可能有限。本节中我们来看看如何通过“提升”来组合多个弱模型,形成一个强模型。

提升方法基于一个直观的想法:如果我们的模型(弱学习器)预测结果不够精确,我们可以训练一个新的模型来专门学习当前模型的残差(预测值与真实值的差距),然后将多个模型的预测结果叠加,从而得到更精确的预测。

梯度提升(Gradient Boosting)直观理解

假设我们已有数据(x_i, y_i)。我们先用一个弱学习器(例如一棵回归树)进行学习,得到初始预测函数f_0(x)。计算残差:y_i^1 = y_i - f_0(x_i)。

接下来,我们训练第二个弱学习器f_1(x),但这次的学习目标不是原始y_i,而是上一轮的残差y_i^1。如果f_1能很好地拟合残差,那么组合模型F_1(x) = f_0(x) + f_1(x)应该更接近真实值y_i,因为:
y_i - F_1(x_i) = [y_i - f_0(x_i)] - f_1(x_i) = y_i^1 - f_1(x_i) ≈ 0。


如果残差仍然较大,我们可以继续这个过程,训练f_2(x)去拟合y_i^2 = y_i^1 - f_1(x_i),以此类推。最终,我们将得到一个强学习器:F(x) = f_0(x) + f_1(x) + f_2(x) + ...。
这种方法的核心是用新的模型去拟合之前模型预测的误差。

梯度提升决策树(GBDT)与 XGBoost 🌲➡️🚀



上一节我们了解了提升的框架。本节中,我们具体看看如何将决策树作为弱学习器,并实现梯度提升,最终引出强大的XGBoost算法。


从梯度下降到梯度提升
我们更形式化地定义问题。给定损失函数L(y, F(x))(例如L2损失),我们希望找到函数F(x)最小化总损失 ∑ L(y_i, F(x_i))。


梯度提升模仿了梯度下降,但是是在函数空间进行的。假设我们当前模型为F_{m-1}(x),我们想增加一个新函数f_m(x)(一棵树)来改进模型:F_m(x) = F_{m-1}(x) + f_m(x)。
根据梯度下降思想,f_m(x)应该指向损失函数减少最快的方向,即负梯度方向。对于每个样本i,损失函数L对当前预测值F_{m-1}(x_i)的负梯度为:
r_{mi} = - [∂L(y_i, F(x_i)) / ∂F(x_i)]_{F=F_{m-1}}
对于L2损失:L = (y - F)^2,负梯度 r_{mi} = y_i - F_{m-1}(x_i),正好是残差。这就是之前直观理解中,新树去拟合残差的原因。

对于一般损失函数:我们可以让新树f_m(x)去拟合这些负梯度值r_{mi}。拟合完成后,还需要确定一个步长γ_m(学习率),最终更新模型:F_m(x) = F_{m-1}(x) + γ_m * f_m(x)。


这个过程就称为梯度提升。当弱学习器是决策树时,就是梯度提升决策树(GBDT)。


XGBoost:优化的GBDT


XGBoost(eXtreme Gradient Boosting)是GBDT的一种高效实现,它在速度和性能上做了大量优化。其核心改进在于构建树时,使用了更精确的二阶泰勒展开来近似损失函数,并加入了正则化项来控制模型复杂度。


在构建第m棵树时,XGBoost的目标函数如下:
Obj = ∑ L(y_i, F_{m-1}(x_i) + f_m(x_i)) + Ω(f_m)
其中Ω(f_m)是正则项,惩罚树的复杂度(如叶子节点数、叶子权重)。


将这个目标函数在F_{m-1}处进行二阶泰勒展开:
Obj ≈ ∑ [L(y_i, F_{m-1}) + g_i * f_m(x_i) + 1/2 * h_i * f_m^2(x_i)] + Ω(f_m)
其中,g_i是一阶导数,h_i是二阶导数。
移除常数项L(y_i, F_{m-1})后,问题转化为寻找树结构f_m以最小化:
∑ [g_i * f_m(x_i) + 1/2 * h_i * f_m^2(x_i)] + Ω(f_m)


通过推导(具体过程略),可以得出对于一个确定的树结构,最优的叶子节点权重w_j*以及此时的目标函数值(损失减少量)有简洁的公式。这使得XGBoost在寻找最佳分割点时,可以贪婪地选择能带来最大损失减少的分割方案,计算非常高效。

XGBoost的特点总结:
- 二阶导数:利用损失函数的海森矩阵信息,使优化更准确。
- 正则化:显式控制模型复杂度,有助于防止过拟合。
- 并行处理:在特征排序和分割点查找上可以并行计算。
- 灵活性:支持自定义损失函数(只要一阶、二阶可导)。
- 缺失值处理:自动学习缺失值的处理方向。


在实践中,XGBoost是解决许多表格数据问题的强大工具。



AdaBoost:从理论到算法的提升方法 ⚖️

前面我们主要讨论了用于回归问题的梯度提升。本节中,我们转向分类问题,介绍另一种经典的提升算法——AdaBoost,并从理论上解释它如何将弱分类器提升为强分类器。

问题设定与弱分类器定义


考虑二分类问题,标签y ∈ {-1, +1}。我们有一个弱分类算法,可以产生分类器h(x)。所谓“弱分类器”,是指其分类效果略好于随机猜测。形式化定义:对于一个数据分布D(样本权重d_i),若分类器h的错误率ε = P_{i~D} (h(x_i) ≠ y_i) < 1/2,且存在一个λ > 0使得ε ≤ 1/2 - λ,则h是一个弱分类器。



AdaBoost的目标是:将多个这样的弱分类器组合起来,形成一个错误率任意低的强分类器。
AdaBoost算法步骤

以下是AdaBoost的核心迭代步骤:


- 初始化权重:对于训练集中的
n个样本,初始化权重D_1(i) = 1/n。 - 对于每一轮
t = 1, 2, ..., T:- 训练弱分类器:使用当前样本权重分布
D_t训练一个弱分类器h_t(x)。 - 计算错误率:
ε_t = ∑_{i: h_t(x_i)≠y_i} D_t(i)。 - 计算分类器权重:
α_t = (1/2) * ln((1 - ε_t) / ε_t)。错误率越低,α_t越大,该弱分类器在最终组合中话语权越重。 - 更新样本权重:对于每个样本
i,
D_{t+1}(i) = (D_t(i) * exp(-α_t * y_i * h_t(x_i))) / Z_t
其中Z_t是归一化因子,确保D_{t+1}是一个概率分布。- 核心作用:如果样本
i被h_t正确分类(y_i * h_t(x_i) = +1),其权重乘以e^{-α_t} < 1,权重减小。 - 如果被错误分类(
y_i * h_t(x_i) = -1),其权重乘以e^{α_t} > 1,权重增大。 - 这样,下一轮的分类器
h_{t+1}会更加关注之前被分错的样本。
- 核心作用:如果样本
- 训练弱分类器:使用当前样本权重分布
- 组合最终分类器:经过
T轮后,得到T个弱分类器及其权重。最终的强分类器为:
H(x) = sign( ∑_{t=1}^{T} α_t * h_t(x) )




AdaBoost的理论保证(简述)





AdaBoost的神奇之处有理论支撑。可以证明,最终分类器H(x)在训练集上的错误率上界随着轮数T增加而指数下降。

一个关键的证明思路是考察指数损失函数 exp(-y * F(x)),其中F(x) = ∑ α_t h_t(x)。可以证明,AdaBoost的每一轮迭代实际上是在最小化这个指数损失函数的某种上界。通过推导,最终训练错误率的上界满足:
(1/n) ∑ I(H(x_i) ≠ y_i) ≤ exp(-2 ∑_{t=1}^{T} λ_t^2)
其中λ_t = 1/2 - ε_t。由于每个λ_t > 0,这个上界随着T增大而指数趋近于0。这从理论上解释了AdaBoost的有效性。




总结 🎯



本节课我们一起学习了集成学习中的两种核心提升方法:




- 梯度提升(GBDT/XGBoost):主要用于回归问题,其核心思想是让新的学习器(决策树)去拟合当前模型预测的残差(或更一般地,损失函数的负梯度)。XGBoost是其高效实现,通过二阶泰勒展开和正则化,在精度和效率上表现出色。
- AdaBoost:主要用于分类问题,其核心思想是调整样本权重,让后续的弱分类器重点关注之前分错的样本,最后通过加权投票组合弱分类器。它有坚实的理论保证,证明其能将弱分类器提升为强分类器。



这两种方法都体现了“集腋成裘”的思想,通过巧妙的方式组合多个简单模型,从而获得强大的预测能力。它们是机器学习工具箱中非常重要且实用的算法。
010:EM算法
在本节课中,我们将要学习一种重要的非监督学习算法——期望最大化算法。我们将从一个简单的例子出发,逐步理解其核心思想,并将其推广到更复杂的场景,如高斯混合模型。
从监督学习到非监督学习
上一节我们介绍了贝叶斯估计。EM算法可以看作是贝叶斯估计的一个具体应用。首先,我们需要理解监督式学习与非监督式学习的区别。
监督式学习的主要特点是数据带有标签。我们的目标是寻找数据与标签之间的确定性对应关系,或基于概率的对应关系。
非监督式学习则只有数据,没有给出任何标签。其本质是学习这组数据背后的分布。换句话说,我们想学习这组数据是如何产生的。如果样本很好地体现了背后的分布,理论上我们就可以从样本中学习到这个分布。这是非监督式学习要解决的主要问题。



问题引入:从单袋到双袋



为了引出EM算法,我们先回顾一个简单的参数估计问题:极大似然估计。
假设我们有一个袋子,里面有很多红色和白色的球,但红球的比例 p 未知。我们可以将其视为一个伯努利分布:随机变量 X 取红球的概率是 p,取白球的概率是 1-p。

如果我们不知道比例 p,但可以进行随机抽样,得到样本 X1, X2, ..., Xn(每个值为0或1)。根据极大似然估计,p 的最佳估计是 p_hat = k / n,其中 k 是红球出现的次数。
现在,我们将问题扩展。假设有两个袋子,每个袋子都有红球和白球。
以下是抽样过程:
- 每次抽样时,首先以概率
w选择第一个袋子,以概率1-w选择第二个袋子。 - 选定袋子后,从该袋子中随机抽取一个球。
- 第一个袋子中红球比例为
p,第二个袋子中红球比例为q。



根据这三个参数 (w, p, q),我们可以计算各种概率。例如,抽到红球的概率为:
P(红) = w * p + (1-w) * q
已知抽到红球时,它来自第一个袋子的条件概率为:
P(袋1 | 红) = (w * p) / (w * p + (1-w) * q)
参数估计的困境

现在回到参数估计问题:如果我们不知道参数 (w, p, q),但通过上述抽样过程得到了 n 个样本 X1, X2, ..., Xn,我们的目标是从样本中估计这些参数。



从极大似然估计出发,我们希望最大化样本的联合概率(似然函数):
L(w,p,q) = ∏_{i=1}^{n} [ w * p^{X_i} * (1-p)^{1-X_i} + (1-w) * q^{X_i} * (1-q)^{1-X_i} ]



这个式子非常复杂,即使取对数后,由于 log 内部是求和,直接求解其最大值(即对参数求导令其为零)非常困难。然而,通过观察,我们可以发现一个特殊的性质:最优解必须满足方程 w * p + (1-w) * q = k / n。




这个方程只有一个等式,却有三个未知数 (w, p, q),因此有无穷多组解。只要参数满足这个方程,就是一个合理的估计。虽然这个特殊观察解决了当前问题,但不具备一般性。我们需要一种更具推广性的方法。



EM算法的直观引入

我们从另一个角度重新审视双袋取球问题。假设我们先给出一组初始的参数估计 (w0, p0, q0)。


对于每一个观察到的样本 Xi(红或白),我们可以利用当前参数计算它来自第一个或第二个袋子的条件概率。例如,对于红球样本:
- 来自袋1的条件概率:
a_i = (w0 * p0) / (w0 * p0 + (1-w0) * q0) - 来自袋2的条件概率:
b_i = ((1-w0) * q0) / (w0 * p0 + (1-w0) * q0)


对于白球样本,我们也能计算出类似的条件概率 c_i 和 d_i。我们可以将这些条件概率整理成一个表格。

基于这个表格,我们可以根据“经验”重新估计参数:
- 估计新的
w1:它应该是所有样本中“来自袋1”的权重总和。即w1 = (所有样本的 a_i 或 c_i 之和) / n。 - 估计新的
p1:它应该是所有红球样本中,来自袋1的加权比例。即p1 = (所有红球样本的 a_i 之和) / (所有样本中“来自袋1”的权重总和)。 - 估计新的
q1:它应该是所有红球样本中,来自袋2的加权比例。即q1 = (所有红球样本的 b_i 之和) / (所有样本中“来自袋2”的权重总和)。
这样,我们就从初始参数 (w0, p0, q0),得到了一组更新的参数 (w1, p1, q1)。神奇的是,在这个具体问题中,更新后的参数 (w1, p1, q1) 恰好满足最优方程 w1 * p1 + (1-w1) * q1 = k / n,即一步迭代就达到了最优解。
我们将这个过程抽象出来:
- E步(期望步):基于当前参数,计算每个样本属于各个隐藏状态(如来自哪个袋子)的条件概率(即“责任”
responsibility)。 - M步(最大化步):基于E步计算出的“责任”,重新估计模型参数,使得似然函数的期望最大。
重复E步和M步,直到参数收敛。这就是EM算法的核心思想。虽然在这个简单例子中一步就收敛了,但这个过程揭示了一般EM算法的迭代框架。
推广:高斯混合模型
现在,我们将EM算法推广到一个真正在机器学习中广泛应用的场景——高斯混合模型。



假设数据由 K 个高斯分布混合生成。每次生成一个数据点时:
- 首先以概率
w1, w2, ..., wK(满足∑wj = 1)随机选择一个高斯分布。 - 然后从被选中的高斯分布
N(μj, σj²)中采样出一个数据点x。



那么,单个数据点 x 的概率密度函数是所有高斯分布的加权和:
P(x) = ∑_{j=1}^{K} w_j * N(x | μ_j, σ_j²)



我们的问题是:给出一组样本 {x1, x2, ..., xn},如何估计所有参数 {wj, μj, σj²}?

直接使用极大似然估计,需要最大化:
L = ∏_{i=1}^{n} [ ∑_{j=1}^{K} w_j * N(x_i | μ_j, σ_j²) ]
同样,由于 log 内部有求和,直接求解极其困难。


此时,EM算法派上用场。我们假设每个样本 xi 都有一个隐藏变量 zi,表示它来自哪个高斯分布。
以下是EM算法的步骤:
- 初始化:随机设定一组初始参数
{wj0, μj0, σj0²}。 - E步:基于当前参数,计算每个样本
xi来自第j个高斯分布的条件概率(责任)γij:
γij = (w_j * N(x_i | μ_j, σ_j²)) / (∑_{k=1}^{K} w_k * N(x_i | μ_k, σ_k²)) - M步:利用计算出的责任
γij重新估计所有参数:- 更新混合权重:
w_j_new = (∑_{i=1}^{n} γij) / n - 更新均值:
μ_j_new = (∑_{i=1}^{n} γij * x_i) / (∑_{i=1}^{n} γij) - 更新方差:
σ_j²_new = (∑_{i=1}^{n} γij * (x_i - μ_j_new)²) / (∑_{i=1}^{n} γij)
- 更新混合权重:
- 重复:将新的参数
{wj_new, μj_new, σj_new²}作为当前参数,回到第2步(E步),直到参数变化很小或似然函数收敛。


这个过程可以自然地推广到多维高斯分布,此时 μj 是均值向量,σj² 替换为协方差矩阵 Σj。通过EM算法,我们不仅估计了每个高斯分布的参数,还得到了每个样本属于各个分布的“软”分类概率。
总结


本节课中我们一起学习了EM算法。
- 我们从监督与非监督学习的区别入手,明确了从数据中学习分布的目标。
- 通过双袋取球的例子,揭示了直接极大似然估计的困难,并直观地引出了通过迭代(E步和M步)逼近最优解的思想。
- 最后,我们将EM算法框架应用于高斯混合模型这一强大工具,展示了如何从一堆未标记的数据中,自动发现其潜在的多个子类结构。



EM算法的核心在于通过引入隐藏变量,将复杂的优化问题分解为两个交替进行的、相对简单的步骤,从而找到模型参数的一个局部最优解。它是非监督学习,特别是聚类和密度估计领域的一个基石算法。
011:隐马尔可夫模型(HMM)第一部分
在本节课中,我们将要学习隐马尔可夫模型(Hidden Markov Model, HMM)。这是一种强大的统计模型,用于描述含有隐含未知参数的马尔可夫过程。我们将从回顾EM算法的局限性开始,逐步引入马尔可夫过程的概念,并最终定义HMM及其需要解决的核心问题。

从EM算法到HMM的动机
上一节我们介绍了EM算法,本节中我们来看看它在处理序列数据时的局限性。
在EM算法的例子中,我们有两个袋子(A和B),每个袋子装有红球和白球。我们每次独立地随机选择一个袋子,然后从该袋子中取球。我们估计的参数包括:从A袋取球的概率 w,A袋中红球的比例 p,以及B袋中红球的比例 q。
根据模型,我们最终计算红色球出现的总概率应为 w * p + (1-w) * q。这意味着,无论我们观察到的球序列是“红红红红红白白白”(连续的红球和白球),还是“红白红白红白红白红白”(红白交替),只要红球的总数相同,EM算法估计出的参数 w、p、q 就会完全相同。因为EM算法只关心频率,而不关心次序。
然而,直觉上,第一组序列(连续的红球和白球)更像是从某个“倾向于保持当前状态”的过程中产生的,而第二组序列(红白交替)则更像是独立随机抽取的结果。这说明,当数据的次序包含重要信息时,简单的EM模型(假设每次选择独立同分布)就不再适用了。这驱使我们设计一个能够捕捉状态间依赖关系的新模型——隐马尔可夫模型。
马尔可夫过程简介
为了理解HMM,我们首先需要了解什么是马尔可夫过程。
在之前的例子中,我们每次选择袋子是独立的。现在,我们改变规则:下一次选择哪个袋子,依赖于上一次选择的袋子。例如:
- 如果上一次从A袋取球,那么下一次有90%的概率仍从A袋取,10%的概率跳到B袋取。
- 如果上一次从B袋取球,那么下一次有10%的概率跳到A袋取,90%的概率仍从B袋取。
这个过程就是一个马尔可夫过程。它的核心特点是:系统下一时刻的状态仅依赖于当前时刻的状态,而与更早的历史状态无关。

马尔可夫过程的数学表示
一个离散时间的马尔可夫过程由一组随机变量 {X1, X2, ..., Xt, ...} 表示,每个 Xt 可以取 n 个离散值(例如,1 到 n,代表 n 个不同的袋子)。马尔可夫性可以表示为:
P(X_{t+1} = j | X_t = i, X_{t-1}, ..., X_1) = P(X_{t+1} = j | X_t = i)

这个条件概率与时间 t 无关,我们将其记作 a_{ij}。所有 a_{ij} 构成的矩阵称为状态转移矩阵 A。

以下是状态转移矩阵 A 的特点:
- 它是一个
n x n的方阵。 - 每个元素
a_{ij}代表从状态i转移到状态j的概率。 - 矩阵的每一行之和为1,即 ∑_{j=1}^{n} a_{ij} = 1,因为从状态
i出发,下一时刻必然转移到某个状态。
A = [[a_{11}, a_{12}, ..., a_{1n}], [a_{21}, a_{22}, ..., a_{2n}], ..., [a_{n1}, a_{n2}, ..., a_{nn}]]
隐马尔可夫模型(HMM)的定义
现在,我们将马尔可夫过程与观察数据结合起来,就得到了隐马尔可夫模型。

在HMM中,我们有一个隐含的状态序列(例如,选择袋子的序列),这个序列遵循一个马尔可夫过程。但是,我们无法直接观察到这个状态序列。我们能观察到的,是在每个状态下产生的观测值(例如,取出的球的颜色)。观测值的生成概率仅依赖于当前时刻的隐含状态。
HMM的组成部分
一个HMM由以下参数定义:
- 隐含状态集合:
Q = {q1, q2, ..., qN},共有N个可能的状态。 - 观测值集合:
V = {v1, v2, ..., vM},共有M个可能的观测值。 - 状态转移概率矩阵:
A = [a_{ij}],其中 a_{ij} = P(下一时刻状态为 qj | 当前时刻状态为 qi)。 - 观测概率矩阵:
B = [b_j(k)],其中 b_j(k) = P(在状态 qj 下观测到 vk)。 - 初始状态概率分布:
π = [π_i],其中 π_i = P(初始时刻状态为 qi)。


HMM的假设


HMM基于两个主要假设:
- 齐次马尔可夫性假设:隐含状态序列构成一个马尔可夫链,即
P(Q_t | Q_{t-1}, Q_{t-2}, ..., Q_1) = P(Q_t | Q_{t-1})。 - 观测独立性假设:任意时刻的观测值只依赖于该时刻的隐含状态,即
P(O_t | Q_t, Q_{t-1}, ..., Q_1, O_{t-1}, ..., O_1) = P(O_t | Q_t)。
HMM的三个基本问题
定义了模型之后,HMM通常用于解决三类基本问题。本节课我们先关注第一个问题。
问题一:评估问题(Evaluation Problem)
已知模型参数 λ = (A, B, π) 和一组特定的观测序列 O = (o1, o2, ..., o_T),计算该观测序列出现的概率 P(O | λ)。
这个问题之所以重要,是因为它允许我们比较不同模型产生同一观测序列的“似然”,是进行模型选择或参数估计的基础。
暴力计算法及其缺陷

最直接的想法是列举所有可能的隐含状态序列。对于长度为 T 的观测序列,每个位置有 N 种可能的状态,共有 N^T 条可能的路径。对于每条路径,计算其产生观测序列 O 的概率,然后对所有路径求和。

设一条路径为 Q = (q_1, q_2, ..., q_T),其概率为:
P(O, Q | λ) = π_{q1} * b_{q1}(o1) * a_{q1q2} * b_{q2}(o2) * ... * a_{q_{T-1}q_T} * b_{q_T}(o_T)



我们需要计算:
P(O | λ) = ∑_{所有Q} P(O, Q | λ)


这种方法的计算复杂度是 O(T * N^T),当 N 和 T 较大时完全不可行。


前向算法(Forward Algorithm)

为了解决计算复杂度问题,我们引入了前向算法。它通过动态规划高效地计算 P(O | λ)。

我们定义前向概率 α_t(i):
α_t(i) = P(o1, o2, ..., o_t, q_t = i | λ)
它表示在时刻 t,观测到前 t 个观测值 并且 此时隐含状态为 i 的概率。



以下是前向算法的步骤:
- 初始化(
t=1):
α_1(i) = π_i * b_i(o1), for i = 1, 2, ..., N


- 递推(对
t = 1, 2, ..., T-1):
α_{t+1}(j) = [∑_{i=1}^{N} α_t(i) * a_{ij}] * b_j(o_{t+1}), for j = 1, 2, ..., N
这个公式的意思是:为了在t+1时刻处于状态j并观测到o_{t+1},我们需要在t时刻处于某个状态i(概率为α_t(i)),然后从i转移到j(概率为a_{ij}),最后在状态j下观测到o_{t+1}(概率为b_j(o_{t+1}))。对所有可能的i求和即可。


- 终止:
P(O | λ) = ∑_{i=1}^{N} α_T(i)
在最终时刻T,观测序列O出现的概率就是所有可能最终状态i对应的前向概率之和。
前向算法的计算复杂度降为 O(N^2 * T),变得可行。


后向算法(Backward Algorithm)简介



类似地,我们还可以定义后向概率 β_t(i):
β_t(i) = P(o_{t+1}, o_{t+2}, ..., o_T | q_t = i, λ)
它表示在时刻 t 隐含状态为 i 的条件下,从 t+1 到 T 的观测序列出现的概率。

后向算法从后往前递推:
- 初始化:β_T(i) = 1, for i = 1, 2, ..., N (定义)
- 递推:β_t(i) = ∑_{j=1}^{N} a_{ij} * b_j(o_{t+1}) * β_{t+1}(j)
- 终止:P(O | λ) = ∑_{i=1}^{N} π_i * b_i(o1) * β_1(i)
前向概率和后向概率可以结合使用,它们的关系是:
P(O | λ) = ∑_{i=1}^{N} ∑_{j=1}^{N} α_t(i) * a_{ij} * b_j(o_{t+1}) * β_{t+1}(j),对于任何 t 都成立。

总结


本节课中我们一起学习了隐马尔可夫模型的基础知识。
- 我们从EM算法在处理序列次序信息上的不足,引出了对更复杂模型的需求。
- 我们介绍了马尔可夫过程,其特点是下一状态仅依赖于当前状态。
- 我们正式定义了隐马尔可夫模型(HMM),它包含隐含状态序列和观测序列,由参数
λ = (A, B, π)描述。 - 我们重点讨论了HMM的第一个基本问题——评估问题,即计算给定观测序列的概率。
- 我们分析了暴力求解法的缺陷,并介绍了高效的前向算法和后向算法,它们利用动态规划将计算复杂度从指数级降低到多项式级。





在下一讲中,我们将继续探讨HMM的另外两个基本问题:解码问题(如何找到最可能的隐含状态序列)和学习问题(如何从观测数据中估计模型参数)。
012:HMM Part 2
在本节课中,我们将继续学习隐马尔可夫模型。我们将重点解决HMM的三个核心问题中的后两个:参数估计问题和预测问题。我们将学习如何使用前向-后向算法进行参数估计,以及如何使用维特比算法进行状态序列预测。

模型回顾 🧠
上一节我们介绍了隐马尔可夫模型的基本框架,本节中我们来看看如何应用这个框架解决问题。
一个隐马尔可夫模型包含以下要素:
- 隐状态:用
q1, q2, ..., qT表示,每个状态取值于{1, 2, ..., N}。 - 观察值:用
o1, o2, ..., oT表示,每个观察值取值于{v1, v2, ..., vK}。 - 模型参数:
- 状态转移矩阵 A:
aij = P(qt+1 = j | qt = i),表示从状态i转移到状态j的概率。 - 观测概率矩阵 B:
bj(k) = P(ot = vk | qt = j),表示在状态j下观测到符号vk的概率。 - 初始状态分布 π:
πi = P(q1 = i),表示初始时刻处于状态i的概率。
- 状态转移矩阵 A:
给定参数 λ = (A, B, π) 和观测序列 O = (o1, o2, ..., oT),我们上次解决了评估问题,即计算 P(O | λ)。我们引入了前向概率 α 和后向概率 β 来高效计算。
前向概率 α 的递推公式为:
α1(i) = πi * bi(o1)
αt+1(i) = [ Σ (j=1 to N) αt(j) * aji ] * bi(ot+1)

最终观测序列的概率为:
P(O | λ) = Σ (i=1 to N) αT(i)

问题二:参数估计(学习问题)🔍

上一节我们解决了如何计算给定模型下观测序列的概率,本节中我们来看看更核心的问题:如何从观测序列中学习出模型参数。
问题定义

给定观测序列 O = (o1, o2, ..., oT),我们希望找到一组模型参数 λ = (A, B, π),使得该观测序列出现的概率 P(O | λ) 最大。这就是极大似然估计。


理论上,我们可以直接对似然函数 P(O | λ) 进行优化。但由于隐状态序列未知,直接优化计算上不可行。因此,我们需要借助 EM算法 的思想来解决。
EM算法思路
EM算法通过迭代方式逼近最优参数。在HMM的语境下,这个特化的EM算法被称为 Baum-Welch算法。
其核心思想是:如果我们能知道在给定当前参数和观测序列的条件下,每个时刻处于某个状态的概率,以及状态之间转移的概率,我们就可以用这些“期望”来更新我们的参数估计,从而得到一组更好的参数。

以下是实现这一思路所需的关键概率计算。

关键概率计算

首先,我们定义两个在E步中至关重要的概率:
-
在时刻 t 处于状态 i 的概率:
γt(i) = P(qt = i | O, λ)
这个概率表示,给定整个观测序列和当前模型,我们在时刻t处于状态i的可能性。
利用前向和后向概率,它可以高效计算:
γt(i) = (αt(i) * βt(i)) / P(O | λ)
其中P(O | λ) = Σ (i=1 to N) αT(i)。 -
在时刻 t 处于状态 i 且在时刻 t+1 处于状态 j 的概率:
ξt(i, j) = P(qt = i, qt+1 = j | O, λ)
这个概率表示状态转移的期望。
它也可以通过前向和后向概率计算:
ξt(i, j) = [αt(i) * aij * bj(ot+1) * βt+1(j)] / P(O | λ)

参数更新公式(M步)
有了 γt(i) 和 ξt(i, j),我们就可以更新模型参数 λ。以下是更新公式:
-
更新初始状态分布 π:
新的初始状态概率πi_new就是在时刻t=1处于状态i的期望。
πi_new = γ1(i) -
更新状态转移矩阵 A:
新的转移概率aij_new是从状态i转移到状态j的期望次数,除以从状态i转移出去的总期望次数。
aij_new = Σ (t=1 to T-1) ξt(i, j) / Σ (t=1 to T-1) γt(i)

- 更新观测概率矩阵 B:
新的观测概率bj(k)_new是在状态j下观测到符号vk的期望次数,除以处于状态j的总期望次数。
bj(k)_new = Σ (t=1 to T, 且 ot = vk) γt(j) / Σ (t=1 to T) γt(j)

Baum-Welch算法流程


基于以上公式,Baum-Welch算法的流程可以概括如下:
- 初始化:随机或根据先验知识设定一组初始模型参数
λ(0) = (A, B, π)。 - 迭代:对于第
n次迭代 (n=0,1,2,...):- E步:基于当前参数
λ(n)和观测序列O,计算所有的γt(i)和ξt(i, j)。 - M步:利用E步计算出的期望值,根据上述更新公式,计算出一组新的参数
λ(n+1)。
- E步:基于当前参数
- 终止:重复步骤2,直到参数
λ的变化小于某个阈值,或者似然函数P(O | λ)的增长变得非常缓慢。此时得到的λ即为估计出的最优参数。

通过这个方法,我们就解决了HMM的第二个核心问题——如何从观测序列中学习出模型参数。


问题三:预测(解码问题)🔮

在估计出模型参数之后,我们自然希望利用模型进行预测。本节中我们来看看最后一个问题:如何根据观测序列推测最可能的隐状态序列。


问题定义



给定模型参数 λ = (A, B, π) 和观测序列 O = (o1, o2, ..., oT),我们希望找到最有可能产生该观测序列的隐状态序列 Q* = (q1*, q2*, ..., qT*)。
即:Q* = argmax_Q P(Q | O, λ)



维特比算法
解决这个预测问题的最优算法是维特比算法。它是一种动态规划算法,其思想与计算前向概率 α 类似,但将求和操作替换为取最大值操作。
以下是维特比算法的核心步骤:
-
初始化:
- 定义在时刻
t,所有路径中到达状态i的最大概率为δt(i)。 - 定义记录该最大概率路径的前一个状态为
ψt(i)。 - 初始化 (
t=1):
δ1(i) = πi * bi(o1)
ψ1(i) = 0
- 定义在时刻
-
递推:对每个时刻
t = 2, 3, ..., T,对每个状态j = 1, 2, ..., N:- 计算到达状态
j的最大概率:
δt(j) = max (i=1 to N) [δt-1(i) * aij] * bj(ot) - 记录产生该最大概率的前一个状态:
ψt(j) = argmax (i=1 to N) [δt-1(i) * aij]
- 计算到达状态
-
终止:
- 找到最终时刻
T的最大概率路径终点:
P* = max (i=1 to N) δT(i)
qT* = argmax (i=1 to N) δT(i)
- 找到最终时刻
-
路径回溯:从
t = T开始,回溯到t = 1,得到最优状态序列:
qt* = ψt+1(qt+1*), 其中t = T-1, T-2, ..., 1
通过维特比算法,我们就能高效地找到最有可能的隐状态序列 Q*。知道了当前时刻 t 最可能的状态 qt*,我们就可以利用转移矩阵 A 预测 t+1 时刻最可能的状态,进而利用观测矩阵 B 预测 t+1 时刻最可能的观测值,从而完成预测任务。


总结 📝
本节课中我们一起学习了隐马尔可夫模型的后两个核心问题及其解决方案:


- 参数估计问题(学习):我们学习了如何使用 Baum-Welch算法(一种EM算法)从观测序列中迭代估计出最优的模型参数
λ = (A, B, π)。其核心是利用前向-后向算法计算期望(E步),然后用这些期望更新参数(M步)。


- 预测问题(解码):我们学习了如何使用 维特比算法 来寻找最有可能产生给定观测序列的隐状态序列。这是一种动态规划算法,通过递推计算最大概率路径并回溯得到最优解。


结合上一讲的内容,我们已经完整掌握了隐马尔可夫模型的三个基本问题:
- 评估问题:计算
P(O | λ)-> 前向-后向算法。 - 学习问题:估计
λ使得P(O | λ)最大 -> Baum-Welch算法。 - 解码问题:寻找
argmax_Q P(Q | O, λ)-> 维特比算法。

这三个问题及其解法构成了HMM理论及应用的基础。
013:从泰勒展开到网络构建 🧠
在本节课中,我们将学习神经网络的基本原理。我们将从一个独特的视角——泰勒展开出发,逐步理解神经网络如何通过组合简单的函数来逼近复杂的函数,并最终构建出全连接神经网络模型。课程将涵盖其数学基础、结构设计、激活函数的作用以及训练的基本思想。
从泰勒展开到函数逼近 📈


我们之前学习了许多模型,但著名的深度学习神经网络尚未涉及。今天我们将补上这一课。我们的讲解风格偏向于理解算法背后的实质,而不仅仅是调用软件包。在之前的作业中,我们不仅要求调用软件包,还要求根据算法自行编写机器学习程序。神经网络的学习也应如此,只有充分理解其原理,才能更好地使用它。

我们首先探讨神经网络的出发点:泰勒展开。你可能会疑惑神经网络如何与泰勒展开联系起来。这里将展示泰勒展开为何是神经网络的一个自然出发点。

在大学阶段,大家学过泰勒展开。对于一个可微函数,其在零点附近的微分形式泰勒展开可能更为熟悉。例如,一个函数在零点展开,其函数值等于 f(0),加上 f'(0) 乘以 x。如果仅展开到一阶项,可以写作 f(0) + f'(ξ) * x,其中 ξ 在 0 和 x 之间。如果进行二阶展开,则加上 (1/2) * f''(0) * x^2。对于解析函数,可以进行无穷阶展开,形成泰勒级数,例如 e^x 的展开。
但除了微分形式,还有一个更重要的积分形式。我们可以从以下积分开始:
∫_0^x f''(t) * (x - t) dt
计算这个定积分,可以利用分部积分法。最终推导可得:
f(x) = f(0) + f'(0)*x + ∫_0^x f''(t)*(x-t) dt
这就是泰勒展开的积分形式。同样,可以推导出更高阶的积分形式。如果对这个积分使用中值定理,就可以得到微分形式的泰勒展开。


这个公式为我们提供了重要启示。它表明,一个连续可微的函数 f(x) 可以被常数项、线性项以及一系列特定形式的函数组合来逼近。具体来说,通过对积分区间进行分段处理(考虑 x 的正负),我们可以将公式重写为:
f(x) = f(0) + f'(0)*x + ∫_0^∞ f''(t)*(x-t)_+ dt + ∫_{-∞}^0 f''(t)*(t-x)_+ dt
其中 (a)_+ 表示 max(a, 0)。
这个公式告诉我们,任何光滑函数都可以用以下四类基本组件来逼近:
- 常数项:
f(0) - 线性项:
f'(0)*x - 看涨期权型函数:
(x - t)_+(在t点后斜率为1的折线) - 看跌期权型函数:
(t - x)_+(在t点前斜率为-1的折线)
从几何角度看,任何弯曲的曲线都可以用分段线性函数(即折线)来逼近。而任何分段线性函数,都可以由上述四种基本组件组合而成。这就说明了,虽然这些函数形式简单,但它们能够构造出非常复杂的函数形式。





从感知机到神经网络 🧩
上一节我们从函数逼近的角度看到了简单组件组合的威力。现在回到机器学习,看看这给我们什么启发。
我们之前讲过感知机等一系列线性模型。其核心形式是 y = sign(w^T * x + b),它用一个超平面将空间分为两类。但这是一种线性分类,能力有限。
假设我们希望分类的边界更复杂,例如用两条直线将平面分成四个区域,并指定中心区域为正类。这无法用单个线性分类器完成,但差别并不大。


从几何直观出发,假设这两条线分别由权重向量 w1 和 w2 决定。我们需要的正类区域是这两条线所划定区域的交集。而其他区域(并集)为负类。这提示我们,可以将集合运算(交、并)引入机器学习。


以下是实现方法:
- 输入
x,分别通过两个感知机得到中间输出:y1 = sign(w1^T * x)y2 = sign(w2^T * x)
(这里为了简化,假设b=0,或通过升维处理)
- 为了得到“交集”(AND 操作),我们可以定义最终输出:
y_final = sign(y1 + y2 - 1.5)
当且仅当y1和y2均为+1时,y_final为+1。 - 为了得到“并集”(OR 操作),可以定义:
y_final = sign(y1 + y2 - 0.5)
当y1或y2至少一个为+1时,y_final为+1。

这个过程可以看作:原始输入 x 经过第一层感知机变换后,其输出 (y1, y2) 作为新的特征向量,再经过第二层感知机(即另一个 sign 函数)得到最终结果。我们成功通过两层结构的组合,实现了更复杂的分类边界。
再看一个更复杂的例子:圆形分类(圆内为正,圆外为负)。单个感知机无法实现。在支持向量机中,我们通过升维到二次空间解决。如果不升维,我们可以用许多条直线(即许多个感知机)来逼近这个圆。具体来说,我们用 N 条直线围成一个凸多边形来近似圆的内侧。要使这个多边形内部为正,就需要这 N 条线所对应感知机输出全部为 +1(即交集)。这可以通过一个类似的第二层结构实现:
y_final = sign(y1 + y2 + ... + yN - (N - 0.5))
这样,我们就用两层结构解决了圆形分类问题。



构建全连接神经网络 🏗️
上一节我们看到,通过将多个感知机(线性分类器)的输出进行组合,可以解决复杂的非线性分类问题。这自然引出了神经网络的结构。


我们可以画出如下结构图:
- 输入层:原始特征
x(假设为k维向量)。 - 隐藏层:第一层有
d1个节点。每个节点都是一个感知机,计算sign(w_i^T * x),其中w_i是k维向量。这一层的输出是一个d1维向量y^(1)。 - 输出层:将
y^(1)作为输入,通过另一个感知机(权重向量z为d1维)计算最终输出f(x) = sign(z^T * y^(1))。

这就是一个最简单的单隐藏层神经网络。其中,第一层称为隐藏层或隐含层。




我们可以构造更深的网络,即多个隐藏层。例如:
- 输入
x。 - 第一隐藏层(2个节点)产生输出
y^(1)。 - 第二隐藏层(3个节点)以
y^(1)为输入,产生输出y^(2)。 - 输出层(1个节点)以
y^(2)为输入,产生最终输出f(x)。
这种每个下层节点都连接到上层所有节点的结构,称为全连接神经网络。



用矩阵语言描述更为简洁。设第 l 层的权重矩阵为 W^(l),其维度为 (d_l × d_{l-1}),其中 d_0 = k(输入维度),d_L 为输出维度(例如1)。第 l 层的计算分为两步:
- 线性变换:
z^(l) = W^(l) * a^(l-1)(a^(0) = x) - 非线性激活:
a^(l) = g(z^(l))


其中,g(·) 是激活函数。最终输出 f(x) = a^(L)。
为什么需要激活函数?
如果没有激活函数 g,那么每一层都只是线性变换,整个网络堆叠起来依然等价于一个线性变换:f(x) = W^(L) * ... * W^(1) * x。这就失去了多层网络的意义。激活函数引入了非线性,使得网络能够逼近复杂的非线性函数。
常见的激活函数包括:
sign(x):阶跃函数(早期感知机使用)。ReLU(x) = max(0, x):修正线性单元,目前最常用。sigmoid(x) = 1 / (1 + e^{-x}):S型函数,将输出压缩到(0,1)。tanh(x):双曲正切函数,输出在(-1,1)。


神经网络的训练与反向传播 🔄

上一节我们定义了神经网络的结构。现在,我们需要确定网络中的参数(所有权重矩阵 W^(l))。这是通过训练完成的。


给定训练数据 {(x_i, y_i)},神经网络定义了从 x 到预测值 f(x; W) 的映射。我们定义一个损失函数来衡量预测值与真实值的差距,例如均方误差:
L(W) = Σ_i (f(x_i; W) - y_i)^2
神经网络的训练目标就是找到一组参数 W,使得损失函数 L(W) 最小化。这通常通过梯度下降法及其变种来实现。
梯度下降法的核心步骤是:
W_new = W_old - η * ∇_W L(W_old)
其中 η 是学习率。关键问题在于如何高效计算梯度 ∇_W L,即损失函数对海量网络参数的偏导数。这正是反向传播算法解决的问题。


反向传播的思想源于微积分的链式法则。神经网络的前向计算是多个函数的复合:f(x) = g_L(... g_2(g_1(x))...)。根据链式法则,损失函数 L 对某一层参数 W^(l) 的梯度,可以表示为:
∂L/∂W^(l)} = (∂L/∂a^(L)}) * (∂a^(L)/∂z^(L)}) * ... * (∂z^(l+1)/∂a^(l)}) * (∂a^(l)/∂z^(l)}) * (∂z^(l)/∂W^(l)})
这看起来复杂,但可以分两步高效计算:
- 前向传播:从输入到输出,计算并存储每一层的线性输出
z^(l)和激活输出a^(l)。 - 反向传播:从输出到输入,反向计算误差项
δ^(l) = ∂L/∂z^(l)。- 首先计算输出层的误差
δ^(L)。 - 然后利用公式
δ^(l) = (W^(l+1)})^T * δ^(l+1) ⊙ g'(z^(l)})(⊙表示逐元素相乘)逐层反向递推。 - 最终,参数梯度为
∂L/∂W^(l)} = δ^(l) * (a^(l-1)})^T。
- 首先计算输出层的误差


通过前向传播计算损失,再通过反向传播计算所有参数的梯度,然后用梯度下降法更新参数,如此循环迭代,直至模型收敛。这就是训练神经网络的基本框架。
总结 📝

本节课我们一起学习了神经网络的核心思想与构建方法。
- 数学基础:我们从泰勒展开的积分形式出发,理解了任何光滑函数都可以由常数、线性函数以及一系列“折线”函数(如ReLU)组合逼近。这揭示了神经网络强大的函数逼近能力来源。
- 结构演化:我们回顾了感知机的局限性,并通过引入“层”的概念和集合运算(AND/OR),自然推导出多层神经网络结构。隐藏层的每个节点相当于一个特征变换器。
- 网络构建:我们定义了全连接神经网络,包括输入层、隐藏层和输出层。重点强调了激活函数的必要性,它赋予了网络非线性能力。并用矩阵形式简洁描述了前向计算过程。
- 训练原理:神经网络的训练目标是最小化损失函数。反向传播算法是高效计算损失函数对网络所有参数梯度的关键,它结合了前向计算和基于链式法则的反向误差传播。




神经网络并非新概念,其近年来的兴起得益于计算能力(如GPU)的提升和训练算法(如反向传播)的成熟。理解这些基本原理,是后续深入学习和应用深度学习模型的重要基石。
014:学习理论概述
在本节课中,我们将学习机器学习的基础理论,即学习理论。我们将探讨机器学习能解决什么问题,以及如何从理论上描述和保证学习过程的有效性。我们将从监督学习的基本模式出发,逐步引入损失函数、假设集合、概率空间等核心概念,并最终阐述机器学习目标的数学表述及其成立条件。
机器学习理论:1:监督学习的基本模式
上一节我们介绍了课程概述,本节中我们来看看监督学习的基本模式。机器学习,特别是监督学习,通常遵循一种特定的模式。
我们有两个集合,它们之间存在一个未知的映射或函数关系。我们无法直接知道这个函数的具体形式,只能获得一个有限的样本集。这个样本集包含一系列输入-输出对,例如 (x1, y1), (x2, y2), ..., (xn, yn)。
我们的目标是,通过一个算法,利用这个有限的样本集 S,来找到一个函数 f_S。这个函数 f_S 依赖于样本 S,我们希望它能尽可能地逼近或接近那个未知的真实函数 f。
机器学习理论:2:函数逼近与损失函数
上一节我们介绍了监督学习的目标是寻找逼近函数,本节中我们来看看如何衡量逼近的好坏。如果抛开所有限制,我们可以轻易构造一个在样本点上完全匹配但在其他点上表现很差的函数(例如,样本点外统一输出0)。这显然不是一个好函数。
因此,我们需要定义一个假设集合 H,例如所有多项式函数或所有线性函数的集合。我们的算法就是在这个集合中寻找最佳逼近的函数。为了量化“最佳”,我们引入了损失函数 l。
损失函数衡量单个预测的误差。常见的定义包括:
- 0-1损失:如果预测
h(x)等于真实值y,损失为0;否则为1。公式为:l(h(x), y) = I(h(x) != y),其中I是指示函数。 - 平方损失:损失为
(h(x) - y)^2。 - 绝对损失:损失为
|h(x) - y|。
有了单个点的损失,我们可以定义在整个样本集 S 上的经验风险(或训练误差)L_S(h),通常定义为所有样本点损失的平均值:L_S(h) = (1/|S|) * Σ_{(x,y)∈S} l(h(x), y)。
更重要的是,我们关心函数在整个数据分布(总体)上的表现,即期望风险(或泛化误差)L_D(h)。由于总体可能包含无限多个点,我们无法求和,因此通常定义为损失函数在数据分布 D 上的期望值:L_D(h) = E_{(x,y)~D}[l(h(x), y)]。
机器学习理论:3:机器学习的目标表述
上一节我们引入了损失函数来衡量性能,本节中我们来看看如何用数学语言精确表述机器学习的目标。我们拥有假设集合 H、损失函数 l 和一个算法 A。算法 A 接收样本集 S,并从 H 中选出一个函数 h_S,使得经验风险 L_S(h_S) 最小(或足够小)。
然而,我们真正关心的是期望风险 L_D(h_S) 是否也小。一个理想但过于严格的目标是:对于任意小的正数 ε,算法都能保证 L_D(h_S) ≤ ε。但这通常无法实现,因为如果样本 S 不具有代表性,学到的函数 h_S 在总体上的表现就可能很差。




因此,我们必须引入概率论的语言。数据点是从某个概率分布 D 中独立同分布(i.i.d.)地采样得到的。机器学习更合理的目标是:以高概率,使得学到的函数 h_S 的期望风险 L_D(h_S) 很小。
形式化表述为:对于任意给定的 ε > 0(精度参数)和 δ > 0(置信参数),存在一个样本数量 m(依赖于 ε 和 δ),使得当样本大小 |S| = m 时,有:
P_{S~D^m}[ L_D(h_S) > L_S(h_S) + ε ] ≤ δ
这意味着,“学到的函数在总体上的表现比在样本上的表现差很多(超过 ε)” 这种糟糕情况发生的概率非常小(不超过 δ)。
机器学习理论:4:有限假设集合的可行性(0经验风险情形)
上一节我们给出了机器学习目标的概率化表述,本节中我们来看一个在特定条件下可证明成立的定理。首先考虑一个简化情形:假设集合 H 是有限的,并且算法总能找到在训练集上经验风险为0的假设(即完美拟合训练数据)。
定理:设 H 为有限假设集合,且对于任意样本集 S,算法能找到 h_S ∈ H 使得 L_S(h_S) = 0(使用0-1损失)。那么,对于任意 ε > 0, δ > 0,存在整数 m,使得当样本数 |S| = m 时,有:
P_{S~D^m}[ L_D(h_S) > ε ] ≤ δ
证明思路:
- 考虑那些在总体上表现不好的“坏”假设
h,即满足L_D(h) > ε的h。 - 对于这样一个“坏”假设,由于它在总体上的错误率超过
ε,那么随机采样的一个数据点不被它犯错的概率小于(1 - ε)。 - 如果这个“坏”假设在样本
S上恰好表现完美(错误率为0),那么样本S中的所有m个点都必须恰好是它不犯错的点。这种情况发生的概率小于(1 - ε)^m。 - 但是,我们不知道算法最终会输出哪个“坏”假设。由于
H是有限的,我们可以使用联合界。算法输出任何一个“坏”假设的概率,小于所有“坏”假设对应概率之和,即不超过|H| * (1 - ε)^m。 - 令
|H| * (1 - ε)^m ≤ δ,即可解出所需的样本量m。当m足够大时,就能以高概率(1-δ)保证学到的函数在总体上的错误率不超过ε。
这个定理表明,在假设集合有限且能完美拟合训练数据的理想条件下,机器学习的目标是可以理论保证的。
机器学习理论:5:有限假设集合的可行性(一般情形)
上一节的定理要求经验风险为0,这在实际中往往不成立。本节中我们将其推广到更一般的情形。我们不再要求 L_S(h_S) = 0,而是希望期望风险不要比经验风险差太多。
定理(有限假设集合泛化界):设 H 为有限假设集合。对于任意 ε > 0, δ > 0,存在整数 m,使得当样本数 |S| = m 时,有:
P_{S~D^m}[ ∃ h ∈ H, L_D(h) > L_S(h) + ε ] ≤ δ
或者等价地,以至少 (1-δ) 的概率,对于所有 h ∈ H,有:
L_D(h) ≤ L_S(h) + ε
证明思路与关联:
这个定理的证明更复杂,但其核心思想与概率论中的集中不等式密切相关,特别是霍夫丁不等式。
- 考虑一个固定的假设
h。经验风险L_S(h)是m个独立随机变量(每个数据点的损失)的平均值,而期望风险L_D(h)是它们的期望。 - 霍夫丁不等式指出,对于有界损失(如0-1损失),样本均值偏离其期望超过
ε的概率存在一个指数级的上界:P[ |L_S(h) - L_D(h)| > ε ] ≤ 2 * exp(-2ε^2 m)。 - 同样,我们不知道算法会固定输出哪个
h。由于H有限,我们再次使用联合界,将所有h ∈ H上“偏离超过ε”事件的概率加起来:P[ ∃ h ∈ H, |L_S(h) - L_D(h)| > ε ] ≤ 2 * |H| * exp(-2ε^2 m)。 - 令
2 * |H| * exp(-2ε^2 m) ≤ δ,即可解出m。当m足够大时,就能以高概率保证,所有假设h的经验风险都是其期望风险的良好估计(误差不超过ε)。既然算法输出的h_S是H中的一个,该结论自然对其成立。


这个定理是学习理论的核心结论之一,它揭示了泛化能力(L_D)与训练误差(L_S)、假设集合复杂度(|H|)以及样本量(m)之间的权衡关系。
机器学习理论:6:无限假设集合与VC维
上一节的结论依赖于假设集合 H 有限,但实践中如线性函数、多项式函数等集合都是无限的。本节中我们探讨如何将理论推广到无限假设集合。关键在于,虽然 H 可能包含无限个函数,但其“表达能力”或“有效复杂度”可能是有限的。
我们引入 VC维 来衡量一个假设集合的复杂度,特别是针对分类问题(如0-1损失)。VC维直观上描述了假设集合能够“打散”的最大点集的大小。
定义:对于一个假设集合 H,其 VC维 是最大的整数 d,使得存在大小为 d 的样本集 S,能够被 H “打散”。即,H 能实现 S 上所有可能的 2^d 种标记方式。如果对于任意大的 n,都存在能被 H 打散的 n 个点,则 VC 维为无穷大。
例子:
- 实数轴上的区间分类:
H是所有形如h(x) = sign(x - a)的函数集合。它能打散2个点(例如,通过选择不同的a可以实现(+, -)和(-, +)),但无法打散任意3个点(例如,对于标记(+, -, +)就无法实现)。因此,其 VC 维为 2。 - 二维平面上平行于坐标轴的矩形分类:
H是内部为正、外部为负(或反之)的所有轴对齐矩形。可以验证,它能打散4个点,但无法打散任意5个点。因此,其 VC 维为 4。 - 二维平面上的凸多边形分类:
H是内部为正、外部为负的所有凸图形。这个集合的 VC 维是无穷大,因为对于任意n个点,只要它们处于一般位置(如圆上),我们总可以构造一个凸多边形精确地包围住那些标记为正的点,从而实现任意一种标记。
关键定理:对于 VC 维为 d(有限)的假设集合 H,即使它是无限的,也存在类似的泛化界。以高概率 (1-δ),对于所有 h ∈ H,有:
L_D(h) ≤ L_S(h) + O( sqrt( (d + log(1/δ)) / m ) )
这表明,泛化误差的上界与 sqrt(d/m) 相关。假设集合的 VC 维 d 取代了之前的有限大小 |H|,成为衡量模型复杂度的关键指标。当 d 有限时,随着样本量 m 增加,我们仍能保证泛化能力。
机器学习理论:7:总结与核心启示
本节课中我们一起学习了机器学习理论的基础内容。我们从监督学习的模式出发,逐步构建了机器学习问题的数学框架。
我们首先明确了目标:通过有限样本学得的函数,在未知数据上也要表现良好。通过引入损失函数来量化性能,并借助概率空间来描述数据生成过程,我们将目标严谨地表述为:以高概率保证期望风险(泛化误差)不超过经验风险(训练误差)加上一个小的余项。
我们证明了在假设集合有限的情况下,这一目标是可实现的,其样本复杂度与 log|H| 有关。为了处理更常见的无限假设集合(如线性函数),我们引入了 VC维 作为衡量假设集合复杂度的工具。理论表明,只要假设集合的 VC 维是有限的,机器学习就具有理论保证,其样本复杂度与 VC 维 d 有关。
核心启示:
- 偏差-方差权衡(复杂度控制):假设集合的复杂度(如 VC 维)至关重要。过于简单的集合(高偏差)可能无法拟合数据;过于复杂的集合(高方差/高 VC 维)虽然能完美拟合训练数据,但会导致过拟合,泛化能力差。我们需要选择复杂度适中的模型。
- 数据的重要性:泛化误差的上界随着样本量
m的增加而减小(通常按1/sqrt(m)速率)。更多的数据有助于控制过拟合,提升泛化能力。 - 理论指导实践:学习理论为我们理解模型选择、正则化、以及为什么需要验证集/测试集提供了理论基础。它解释了追求在训练集上“完美”性能可能是有害的,并强调了在未见数据上评估模型的根本重要性。

通过学习这些理论,我们能够更深刻地理解本学期所学的各种机器学习模型背后的统一逻辑和核心挑战。

浙公网安备 33010602011771号