机器学习概览 (Machine Learning)
基本概念
机器学习的过程被概括为一个循环流程,包含三个关键环节 :
- 数据 (Data):这是机器学习的基础 。我们假设数据集中隐藏着某种未知的模式或规律。在量化上,它被认为由输入特征和标签 $(s_i,y_i)$ 组成。
- 模型 (Model):模型是对数据中隐藏模式的一种简化或数学抽象。它可以是线性的,也可以是非线性的,由一个参数化函数 $h_{x}(s)$ 表示。
- 优化 (Optimization):寻找最佳模型的过程,通常被构建为一个优化问题,其被表示成损失函数 + 正则化项 $\min_x\frac{1}{m}\sum_{i=1}^m\ell(y_i,h_x(s_i))+\lambda r(x)$
监督学习 (Supervised Learning)
想象一下你正在教一个孩子识别动物。你会指着一张猫的图片告诉他“这是猫”,然后指着一张狗的图片告诉他“这是狗”。你提供了一个“问题”(图片)和一个“正确答案”(标签)。
监督机器学习做的就是类似的事情。我们给算法提供大量带有“正确答案”的数据,让它学习如何从“问题”映射到“答案”。
- “问题” 就是我们后面要讲的 输入 (Input)。
- “正确答案” 就是 输出 (Output) 或 标签 (Label)。
- 带有“正确答案”的数据集 就是 训练数据集 (Training Dataset)。
监督学习始于一个包含 m 个样本的训练数据集 。每个样本都是一个“输入-输出”对(sⁱ, yⁱ),其中 s 是输入特征,y 是对应的标签或输出。
任务类型
- 分类:目标是预测一个离散的类别标签。 $y\in{-1,+1}$ ,分别代表负样本和正样本(正例/负例)。
- 回归:$y\in\mathbb{R}$。
监督学习的目的是找到一个函数(或称为模型)h,它可以将输入空间 S 映射到输出空间 Y 。这个函数 h 应该能够很好地近似真实的输入-输出关系,即 y ≈ h(s) 。
这个函数 h 在机器学习中通常被称为假设 (Hypothesis) 或模型 (Model)。
- 假设空间 (Hypothesis Space):在开始学习之前,我们会先确定一个模型的类别,例如,我们决定使用线性模型。那么,所有可能的线性函数就构成了我们的“假设空间”。
- 学习过程:算法的学习(训练)过程,实际上就是在假设空间中,根据训练数据,搜索出一个“最佳”的函数
h的过程。这个“最佳”通常是通过最小化损失函数来定义的。
一旦学习到了函数 h,就可以用它来对全新的、未见过的输入 s 进行预测 。例如,根据房屋的面积 s 来预测其价格 y 。最终的目标是在新样本上最大化预测的准确性,也就是最小化测试误差 (test error)。
监督学习的记号(notation)
参数化模型 (Parametric Model):
- 假设我们要学习的函数
h是由一个参数向量x控制的,记作hₓ(s)。这个参数向量x存在于一个n维的实数空间ℝⁿ中 。以线性模型举例,有$h_x(s)=x^\top s$。 - 全部向量按列向量处理(便于矩阵化推导):$$x=\begin{pmatrix}x_1\\vdots\x_n\end{pmatrix},\quad y=\begin{pmatrix}y^1\\vdots\y^m\end{pmatrix},\quad s^i=\begin{pmatrix}s_1^i\\vdots\s_n^i\end{pmatrix}$$
xⱼ:表示参数向量x中的第 j 个分量(或称为权重) 。
yⁱ:表示第 i 个样本的标签(目前假设为标量) 。sⁱ ∈ ℝⁿ:表示第 i 个样本的特征列表,它是一个长度为 n 的列向量 。sⱼⁱ:表示第 i 个训练样本中的第 j 个特征的值 。sⱼ ∈ ℝᵐ:表示一个包含所有 m 个样本的第 j 个特征的向量 。
参数化模型,将一个抽象的“函数寻找”问题,转化为一个具体的“参数寻找”问题,是机器学习能够被计算和求解的关键。
- 从无限到有限:函数空间是无限大的,我们不可能搜索所有可能的函数。但一旦我们选择了模型形式(例如,线性模型),问题就简化为在 n 维空间中寻找一个最优的参数向量
x。这使得问题变得明确且可用优化算法解决。 - 模型即假设:选择一个参数化模型,实际上是做出了一个强假设。例如,选择线性模型
hₓ(s) = xᵀs,就是假设输入特征和输出之间存在线性关系。如果这个假设与数据的真实模式相符,模型效果会很好;如果不符,则可能出现欠拟合。
数据矩阵
在实际计算中,我们通常会将整个训练数据集表示为一个数据矩阵 S(或常记为X)。
- 结构:这个矩阵通常是一个
m × n的矩阵,其中有m行(代表m个样本)和n列(代表nunleashing 个特征)。矩阵的第i行就是第i个样本的特征向量的转置(sⁱ)ᵀ。 - 高效计算:使用数据矩阵,我们可以非常高效地一次性计算出所有样本的预测值。$$S=\begin{pmatrix}(s^1)^\top\\vdots\(s^m)^\top\end{pmatrix}\in\mathbb{R}^{m\times n},\quad S_{ij}=s_j^i$$ 则一次性预测为 $\hat{y}=Sx$,其中第 i 个分量 $\hat{y}^i=x^\top s^i$。若需要截距/偏置,可把输入扩展为$\tilde{s}=(1,s^\top)^\top$,参数扩展为$\tilde{x}=(b,x^\top)^\top$,仍写作$\hat{y}=\tilde{x}^\top\tilde{s}$。此时预测向量
ŷ(一个包含所有m个预测值的列向量)可以简单地表示为:$$\hat{y}=Sx$$
损失函数 (Loss Function)
- 损失函数的定义:损失函数
l(y, ŷ)是一个用于衡量模型预测输出 (predicted output)ŷ与真实输出 (true output)y之间差距的函数 。它的值通常是非负的,值越大代表模型的预测越不准确 。 - 示例1:平方损失 (Squares Loss)
l(y, ŷ) = ½(y - ŷ)²。- 主要用于回归 (regression) 任务,其中
y是一个连续的实数 。 - 平方损失就是画到二维平面上距离的平方(乘以1/2是为了后续求导方便),距离越大,损失就越大。
- 示例2:0-1损失 (Zero-one Loss)
- 如果预测错误
(y ≠ ŷ),损失为1;如果预测正确,损失为0 。 - 元分类 (binary classification)** 任务,其中
y的取值在一个有限集合内,例如{-1, +1}。 - 它直接衡量了分类任务中“对”或“错”的次数,是最直接的性能指标。
- 如果预测错误
- 成本函数 (Cost Function)通常指衡量模型在整个训练数据集上平均表现的函数。它是所有单个样本损失的平均值(有时是总和):$$J(x)=\frac{1}{m}\sum_{i=1}^ml(y^i,h_x(s^i))$$ 我们进行优化时,真正要最小化的是这个成本函数
J(x)。
代理损失函数
虽然0-1损失最直观地反映了分类的准确率,但在实际优化中却很少直接使用。主要原因是它的数学性质非常差:
- 不连续、非凸:它的函数图像是阶梯状的。
- 梯度几乎处处为零:除了在
y=ŷ的点上不可导外,其他地方的导数(梯度)都为0。 - 对优化算法不友好:像梯度下降这类依赖梯度的优化算法,无法从一个梯度为0的函数中获取“应该朝哪个方向更新参数”的信息。
因此,在实践中,我们通常会选择一个更“平滑”的函数来替代0-1损失,这些函数被称为代理损失函数 (Surrogate Loss Functions)。
- 用于分类的代理损失函数:
- Hinge Loss (合页损失):
l(y, ŷ) = max(0, 1 - y·ŷ)- 来源:主要用于支持向量机 (SVM)。
- 特点:它不仅惩罚错分的点 (
y·ŷ < 0),也惩罚那些虽然分类正确但“不够自信”(即0 < y·ŷ < 1,离决策边界太近)的点。它的目标是最大化分类间隔,鲁棒性更好。
- Log Loss (对数损失 / 交叉熵损失):
l(y, ŷ) = log(1 + exp(-y·ŷ))- 来源:主要用于逻辑回归 (Logistic Regression) 和神经网络。
- 特点:它不仅给出一个分类结果,还能给出一个概率。当预测的概率偏离真实标签时,它会施加一个很大的惩罚。这是目前分类任务中最主流的损失函数之一。
- Hinge Loss (合页损失):
- 用于回归的其他损失函数:
- 绝对损失 (Absolute Loss / L1 Loss):
l(y, ŷ) = |y - ŷ|- 特点:相比于平方损失,绝对损失对异常值 (outliers) 不那么敏感。因为平方损失会把大误差的惩罚放大,一个异常点可能会严重影响模型训练的结果。如果你怀疑数据中有较多异常值,使用绝对损失是更稳健的选择。
- 绝对损失 (Absolute Loss / L1 Loss):
优化
机器学习是一个优化性问题。在机器学习中,所谓的“训练模型”其实就是寻找一组最佳的模型参数 x,来最小化一个被称为“目标函数 (Objective Function)” f(x) 的过程。
这个 f(x) 由两部分构成:$$\min_{\mathbf{x}\in\Omega}f(\mathbf{x})=\underbrace{\frac{1}{m}\sum_{i=1}^m\ell(y^i,h_\mathbf{x}(s^i))}{\text{data-fitting term}}+\underbrace{\lambda\cdot r(\mathbf{x})}{\text{regularizer}}$$ a) 数据拟合项 (Data-fitting term)
- 作用:衡量模型的预测结果与真实数据之间的差距。这一项越小,说明模型对训练数据的拟合程度越好。
- $\frac{1}{m}\sum_{i=1}^m\ldots$: 表示计算所有
m个训练样本的平均损失。 - $\ell(y^i,h_\mathbf{x}(s^i))$: 这就是我们之前讨论的损失函数 (Loss function)。
- $y^i$: 第
i个样本的真实输出。 - $h_\mathbf{x}(s^i)$: 模型 (用
h表示) 使用参数 x 对第i个样本的输入 $s_i$ 做出的预测输出。
- $y^i$: 第
简而言之,第一项的目标是让模型尽可能地准确预测训练数据。
b) 正则化项 (Regularizer)
- 作用:对模型的复杂度进行惩罚。这一项是为了防止模型变得过于复杂而产生过拟合 (Overfitting)。过拟合是指模型在训练数据上表现完美,但在新的、未见过的数据上表现很差。
- $r(x)$: 这是一个正则化函数,它会衡量模型参数 x 的“大小”或“复杂度”。例如,它可以是所有参数的平方和(L2正则化)。
- $λ$: 这是一个超参数 (hyperparameter),用来控制正则化惩罚的强度。$λ$ 越大,我们对模型复杂度的惩罚就越重,模型就会越简单。
线性回归 (Linear Regression)
线性模型
$$h_x(s)=x^\top s$$
这是机器学习中最基础也最重要的模型。
- 内涵解读:
xᵀs实际上是点积x₁s₁ + x₂s₂ + ... + xₙsₙ。每个参数xⱼ可以被理解为第 j 个特征sⱼ的权重或重要性。- 如果
xⱼ是一个较大的正数,说明特征sⱼ对结果有很强的正向影响。 - 如果
xⱼ是一个较大的负数,说明特征sⱼ对结果有很强的负向影响。 - 如果
xⱼ接近于0,说明该特征对结果影响不大。 - 因此,学习的过程,就是寻找最佳权重组合的过程。
- 如果
- 关于偏置项 (Bias Term):在实践中,线性模型通常写成
hₓ(s) = xᵀs + b,其中b是一个偏置项或截距项。一个常见的技巧是在所有特征向量sⁱ中增加一个恒为1的维度(例如s₀ⁱ = 1),这样偏置项b就可以被吸收到参数向量x中(作为x₀),从而统一为hₓ(s) = xᵀs的简洁形式。
最小二乘法
对于第 $i$ 个样本,我们定义数据的残差:$$e_i=y^i-x^\top s^i$$ 表示真实值与预测值之间的差距。我们希望它尽量接近 0。为了让所有残差“整体上”尽量小,定义平方损失函数:$$\ell(y,\hat{y})=\frac{1}{2}(y-\hat{y})^2$$ 对所有样本求和/平均,就得到经验风险最小化的目标函数。把所有样本求平均得到训练目标:$$f(x)=\frac{1}{2m}\sum_{i=1}^m\left(y^i-x^\top s^i\right)^2$$ 把样本行堆成设计矩阵 $S\in\mathbb{R}^{m\times n}$,标签向量 $y\in\mathbb{R}^m$,就有:$$f(x)=\frac{1}{2m}|Sx-y|_2^2$$ 将此二次型展开,得到:$$f(x)=\frac{1}{2m}(x^\top S^\top Sx-2x^\top S^\top y+y^\top y)$$ 可以清晰地看到它由三部分组成:一个关于 x 的二次项 (xᵀSᵀSx),一个关于 x 的一次项 (-2xᵀSᵀy),和一个常数项 (yᵀy) 。由于成本函数是 x 的二次函数,因此线性回归问题被归结为一个二次优化问题 (quadratic optimization problem) 。优化的目标是找到能使 f(x) 最小的参数向量,记为 x* 。一旦找到x*,就可以用它来对所有数据进行预测,预测结果为 ŷ = Sx*。
过拟合与正则化 (Overfitting and Regularization)
数据集的划分
为了客观地评估模型的性能,必须将原始数据集划分为独立的训练集和测试集。一个常见的做法是使用80%的数据作为训练集,剩余的20%作为测试集 。在专业的机器学习实践中,我们通常会将数据划分为三部分:
- 训练集 (Training Set):用于训练模型的参数(例如,线性回归中的权重
x)。 - 验证集 (Validation Set):用于选择模型和调整超参数。
- 超参数 它们是需要我们在训练开始前就设定好的参数,例如学习率、正则化强度
λ、神经网络的层数等。 - 我们会用训练集训练出多个不同超参数配置的模型,然后在验证集上比较它们的性能,选择表现最好的那个配置。
- 超参数 它们是需要我们在训练开始前就设定好的参数,例如学习率、正则化强度
- 测试集 (Test Set):在所有模型选择和超参数调整都完成后,我们才拿出的测试集,对最终选定的模型进行一次性的最终评估,得出最终成绩。这个成绩将被用来报告模型的性能。
常见的划分策略
- 交叉验证 (Cross-Validation):当数据量较少时,单独划分出一个验证集会很“奢侈”。这时通常采用k-折交叉验证。它将训练数据分成k份,轮流将其中的k-1份作为训练集,1份作为验证集,重复k次。这样可以更充分地利用数据,得到更稳健的模型性能评估。
- 分层抽样 (Stratified Sampling):在处理分类问题时,特别是当某些类别样本很少(类别不均衡)时,简单的随机划分可能导致某个数据集中该类别的样本过少甚至没有。分层抽样可以保证在划分后的各个集合中,不同类别的样本比例与原始数据集中保持一致。
训练误差与测试误差
误差的数学定义:
- 训练误差
f(x):被定义为模型在训练集上损失函数的平均值。 - 测试误差
f_te(x):被定义为模型在测试集上损失函数的平均值。
$$f(x)=\frac{1}{m}\sum_{i=1}^m\ell(y^i,h_x(s^i)),$$ $$f_{\mathrm{te}}(x)=\frac{1}{m_{\mathrm{te}}}\sum_{i=1}^{m_{\mathrm{te}}}\ell(y_{\mathrm{te}}^i,h_x(s_{\mathrm{te}}^i)),$$
- 我们在训练集上训练模型
hₓ,其直接目标是最小化训练误差f(x)。 - 但我们真正关心和最终衡量的是模型在测试数据上的表现,即测试误差
f_te(x)。
误差分解 (Error decomposition):$$f_{\mathrm{te}}(x)=f(x)+\left(f_{\mathrm{te}}(x)-f(x)\right)$$ 这里的泛化差距 (generalization gap) 就是测试误差与训练误差之间的差值 (f_te(x) - f(x))。一个理想的模型应该同时具有良好的训练表现(即低的训练误差)和小的泛化差距。
- 如果模型过于复杂,泛化差距通常会很大(即过拟合)。
- 如果模型过于简单,训练误差通常会很大(即欠拟合)。
欠拟合与过拟合
一个模型的预期测试误差可以被理论上分解为三个部分:
- 偏差 (Bias)²:
- 含义:由模型自身的根本性局限或错误假设所导致的系统性误差。高偏差意味着模型无法捕捉数据中真正的潜在规律。
- 对应幻灯片:高偏差通常导致高训练误差。如果模型过于简单(例如,用直线去拟合复杂的曲线数据),它连训练数据都学不好,这就是欠拟合 (Underfitting)。
- 方差 (Variance):
- 含义:表示模型对训练数据中微小变化的敏感度。高方差意味着模型过多地学习了训练数据中的噪声。如果换一组新的训练数据,训练出的模型将会大不相同。
- 对应幻灯片:高方差通常导致巨大的泛化差距。模型因为过于复杂,完美地拟合了训练数据(低训练误差),但由于它学到的是噪声而非规律,因此在测试数据上表现极差(高测试误差)。这就是过拟合 (Overfitting)。
- 不可约误差 (Irreducible Error):
- 含义:数据本身固有的噪声所带来的误差。这是任何模型都无法消除的误差下限。
模型的复杂度是调节偏差和方差的旋钮:
- 简单模型(如线性回归):偏差高,方差低。不容易过拟合,但可能欠拟合。常见成因:
- 模型选择不当:试图用线性模型去解决一个高度非线性的问题。
- 特征不足:提供给模型的信息太少。例如,预测房价只用了“房间面积”这一个特征,却忽略了“地理位置”和“楼层”。
- 训练不充分:优化算法还没有来得及收敛到最佳状态,训练就被提前终止了。
- 复杂模型(如深度神经网络):偏差低,方差高。拟合能力强,但容易过拟合。常见成因:
- 模型过于复杂:相对于数据量和数据复杂度而言,模型的能力“过剩”了。
- 数据量不足:训练数据太少,使得模型很容易“记住”所有数据点的特征,而不是学习其背后的普适规律。
- 特征维度过高:“维度灾难”的一种体现,当特征数量远大于样本数量时,模型更容易找到一些虚假的关联
正则化 (Regularization)
正则化可以用来来避免过拟合,以最经典的 L2 正则化最小二乘(Ridge) 为例。训练目标是这个公式:$$f(x)=\frac{1}{2m}\sum_{i=1}^m\left(x^\top s^i-y^i\right)^2+\frac{\lambda}{2}|x|_2^2$$ $λ>0$ 控制正则强度:$λ$ 越大,越不容易过拟合(但也更容易欠拟合)。$λ$ 的最佳值通常是通过在验证集 (validation set) 上的优化误差来确定的。
这个模型在统计学中被称为岭回归 (Ridge Regression),是解决过拟合问题的基石方法之一。另一种非常重要的正则化方法是L1正则化,它对应的模型被称为Lasso回归。
- L1正则化项:$r(x) = λ * ||x||₁ = λ * Σ |xⱼ|$。
- 核心区别:
- L2 (岭回归):倾向于让所有参数的权重都变小,但很少会变为精确的0。它会保留所有特征,但减弱它们的影响力。
- L1 (Lasso回归):倾向于让许多不那么重要的特征的权重直接变为0。
- L1的优势:由于L1正则化能产生稀疏解(即很多参数为0),它在实践中可以被用作一种自动的特征选择 (feature selection) 工具,帮助我们识别哪些特征是真正重要的,从而得到一个更简单、更易于解释的模型。
决定系数 (Coefficient of Determination)
R²,也称为决定系数 (Coefficient of Determination),衡量的是的模型能在多大程度上“解释”数据的变异性。
我们先想象一个没有模型的“基准”情况:
- 总变异 (Total Variation):假设我们不知道任何输入特征
s,让我们预测输出y,最好的策略就是猜所有y的平均值ȳ。数据真实值yᵢ与这个平均值ȳ之间的总误差,就代表了数据本身的“总变异程度”。 - 模型未解释的变异 (Unexplained Variation):现在我们有了模型,模型给出了预测值
ŷᵢ。真实值yᵢ和预测值ŷᵢ之间仍然存在误差(即残差),这部分误差是我们的模型没能解释的。 - 模型已解释的变异 (Explained Variation):那么,总变异减去模型没能解释的变异,剩下的就是模型成功解释的部分。
R² 就是“模型成功解释的变异”占“总变异”的比例。这个直观理解可以直接转化为数学公式:$$R^2=\frac{\text{Explained Variation}}{\text{Total Variation}}=1-\frac{\text{Unexplained Variation}}{\text{Total Variation}}$$ 将其写成统计学的标准形式就是:$$R^2=1-\frac{\sum_{i=1}^m(y_i-\hat{y}i)^2}{\sum{i=1}^m(y_i-\bar{y})^2}=1-\frac{\mathrm{SSE}}{\mathrm{SST}}$$
yᵢ是第i个样本的真实值。ŷᵢ是模型对第i个样本的预测值。ȳ是所有样本真实值的平均值。- SSE (Sum of Squared Errors):
Σ(yᵢ - ŷᵢ)²,残差平方和,代表模型未解释的变异。 - SST (Total Sum of Squares):
Σ(yᵢ - ȳ)²,总平方和,代表数据的总变异。
R² 的值通常在0到1之间,其含义如下:
- R² = 1:
- 含义:模型完美地拟合了数据。SSE为0,意味着模型解释了100%的数据变异。
- 警惕:在训练集上出现
R² = 1是一个强烈的过拟合信号。
- 0 < R² < 1:
- 含义:这是最常见的情况。例如
R² = 0.88意味着你的模型解释了数据中88%的变异性,剩下的12%是模型无法解释的。通常来说,R² 越高,模型的拟合效果越好。
- 含义:这是最常见的情况。例如
- R² = 0:
- 含义:你的模型和“瞎猜平均值”的效果一样差。模型没有解释任何数据的变异性。
- R² < 0:
- 含义:这种情况是可能发生的!它意味着你的模型比“瞎猜平均值”还要糟糕。这通常说明你的模型选择非常不恰当。
R²的局限性
虽然R²很有用,但它也有一个重要的局限性:
- 特征越多,R²越高:向模型中添加任何新的特征,即使这个特征毫无用处,R²的值也几乎总是会上升或保持不变。这可能会误导我们选择一个包含了许多无关特征的复杂模型。模型(比如线性回归)的任务是尽其所能地去拟合训练数据,目标是让残差平方和(SSE)尽可能地小。对于模型来说,它现在有了更多的“自由”或“工具”来拟合数据。在最坏的情况下,如果这个新特征真的与目标毫无关系,优化算法可以简单地将这个新特征的权重设置为0,并保持原先
k个特征的权重不变。在这种情况下,模型的预测结果和之前完全一样,SSE不变,R²也不变。但是,在实际情况中,由于数据的偶然性,这个完全无用的“噪声”特征,在你的特定训练集上,几乎总会与目标值存在一些微小的、纯属巧合的虚假相关性。优化算法的目标是不惜一切代价降低训练误差SSE。它会敏锐地发现并利用这种虚假相关性,给这个新特征分配一个微小的、非零的权重,从而使SSE比之前再降低一点点。- 初始状态:你给了模型一组特征(比如
k个特征),模型会找到这k个特征的最佳权重组合,以最小化SSE。 - 添加新特征:现在,你给了模型一个新的、额外的特征(第
k+1个),即使这个新特征是完全随机生成的、毫无用处的“噪声”。
- 初始状态:你给了模型一组特征(比如
- 解决方案:为了解决这个问题,统计学家提出了调整后的R² (Adjusted R²)。它在R²的基础上,对模型中特征的数量进行了惩罚。当比较包含不同数量特征的模型时,使用调整后的R²会更加公平。$$R_\mathrm{adj}^2=1-(1-R^2)\frac{m-1}{m-n-1}$$
m是样本数量。n是特征数量。
当一个无用的特征被加入模型时,虽然 R² 会有微小的上升,但 (m-1)/(m-n-1) 这个惩罚项也会因为 n 的增加而变大。如果 R² 的微小增益不足以抵消这个惩罚,调整后的R²反而会下降。