Featured image of post Fundamentals of Machine Learning 2

Fundamentals of Machine Learning 2

本文是笔者的机器学习笔记,学习课程为吴恩达老师的公开课(网上搬运资源很多此处不附链接了),供大家学习参考

此为第二部分,第一部分见Fundamentals of Machine Learning 1

神经网络概述

起源与演变

神经网络(Neural Networks)是一类试图模仿人脑结构和功能的算法。其灵感来源于生物神经元,后者通过树突接收输入信号,在细胞体中处理,并通过轴突将输出信号传递给其他神经元。

  • 历史发展:神经网络在 1980 年代和 1990 年代初曾流行,但在 90 年代末期逐渐失宠。
  • 现代复兴:大约从 2005 年开始,神经网络(尤其是深度学习)强势复兴,但其发展早已偏离了最初“构建模拟大脑软件”的生物启发初衷

为何现在可行?

神经网络的复兴主要得益于两大因素:

  1. 计算能力的提升:特别是 GPU(图形处理器)的发展,使得训练大型神经网络成为可能。
  2. 大数据的出现:海量数据为训练复杂的神经网络模型提供了充足的“燃料”。

核心思想:端到端学习

神经网络的一个关键优势是它能够自动进行特征工程。与传统机器学习方法需要人工设计和提取特征不同,神经网络可以从原始输入(如图像的像素值)开始,通过多层结构自动学习到更高层次、更有意义的特征表示。

  • 示例 - 人脸识别:输入是 1000 像素的图像,网络的第一层可能学习到边缘等简单特征,后续层则组合这些简单特征形成更复杂的模式(如眼睛、鼻子),最终输出层给出属于特定人物的概率。
  • 示例 - 汽车分类:原理类似,网络能自动学习到足以区分汽车与其他物体的特征。

image-20251030104704681

神经网络架构

基本组成单元:神经网络层

一个典型的神经网络由多个层(Layer)堆叠而成:

  • 输入层 (Input Layer):接收原始特征向量 $x$。
  • 隐藏层 (Hidden Layers):位于输入层和输出层之间,负责特征的转换和提取。一个网络可以有多个隐藏层。
  • 输出层 (Output Layer):产生最终的预测结果。

image-20251030104834412

image-20251030105019777

image-20251030105043036

数学模型与符号约定

每一层的计算可以看作是对输入应用一个简化的神经元数学模型。

  • 单个神经元计算: 对于第 $ l$ 层的第 $ j $ 个神经元,其计算过程为:$z=w⋅a+b$ ,$a=g(z) $
  • 其中:
    • $w$ 和 $b$ 是该神经元的参数(权重和偏置)。
    • $a $ 是来自上一层($l-1$ 层)的激活值(即输出)。
    • $g$ 是激活函数(Activation Function)。
    • $a$ 是该神经元的输出,也称为激活值。
  • 向量化表示: 为了高效计算,通常将一层中所有神经元的计算向量化。
    • $W^{[l]}$:第 $l$ 层的权重矩阵。
    • $b^{[l]}$:第 $l$ 层的偏置向量。
    • $a^{[l-1]}$:第$ l-1 $层的激活向量(对于输入层,$a^{[0]} = x$)。
    • 第 $l$ 层的计算为:$z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}$,$a^{[l]} = g\big(z^{[l]}\big)$

前向传播 (Forward Propagation)

前向传播是指从输入层开始,逐层计算直到输出层,得到最终预测值 f(x) 的过程。这是神经网络进行预测(推理)的核心步骤。

  • 手写数字识别示例:
    • 输入:一个 28x28 像素的图像,展平为一个包含 784 个元素的向量 x
    • 网络架构:例如,一个包含 25 个单元的第一隐藏层、15 个单元的第二隐藏层和 1 个单元的输出层。
    • 输出:一个介于 0 和 1 之间的概率值,表示输入图像是数字 ‘1’ 的概率。

image-20251030122205246

image-20251030122221336

激活函数

激活函数是神经网络能够学习和表示复杂非线性关系的关键。如果没有激活函数(即使用线性激活 $g(z) = z$),无论网络有多少层,其整体效果都等同于一个简单的线性回归模型。

常用激活函数

  • Sigmoid: $g(z) = \frac{1}{1 + e^{-z}}$
    • 输出范围在 (0, 1) 之间。
    • 常用于二元分类问题的输出层,因为其输出可以被解释为概率
  • ReLU (Rectified Linear Unit): $g(z) = \max(0, z)$
    • z > 0 时,输出为 z;当 z <= 0 时,输出为 0
    • 隐藏层最常用的激活函数,因为它计算简单且能有效缓解梯度消失问题,加速训练。
  • 线性激活 (Linear): $g(z) = z$
    • 输出可以是任意实数。
    • 通常用于回归问题的输出层

image-20251030124424243

激活函数选择建议

  • 输出层:
    • 二元分类:sigmoid
    • 回归(输出可为任意实数):linear
    • 回归(输出非负):ReLU
  • 隐藏层:
    • 首选 ReLU:梯度更大下降快。
    • sigmoid梯度较缓下降慢
    • 纯线性等于没练肯定不用。

使用 TensorFlow/Keras 构建与训练

现代深度学习框架(如 TensorFlow/Keras)极大地简化了神经网络的构建和训练过程。

构建模型

可以使用 Sequential API 将各层按顺序堆叠起来。

1
2
3
4
5
6
7
8
9
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

# 以手写数字分类为例
model = Sequential([
    Dense(units=25, activation='relu'),  # 第一隐藏层
    Dense(units=15, activation='relu'),  # 第二隐藏层
    Dense(units=1, activation='sigmoid') # 输出层
])

通常不用显示赋值层,而是在不断训练中自行微调

image-20251030122846301

image-20251030122907175

image-20251030122927512

训练模型

训练过程主要包括三个步骤(可以参考前文图片):

  1. 编译 (Compile):指定损失函数和优化器。

    • 对于二元分类,损失函数通常选择 BinaryCrossentropy
    1
    2
    
    from tensorflow.keras.losses import BinaryCrossentropy
    model.compile(loss=BinaryCrossentropy())
    
  2. 拟合 (Fit):使用训练数据 (X, Y) 来训练模型。epochs 参数指定了梯度下降的迭代次数。

    1
    
    model.fit(X, Y, epochs=100)
    
  3. 预测 (Predict):使用训练好的模型对新数据进行预测。

    1
    
    predictions = model.predict(x_new)
    

image-20251030124757217

训练细节

一些训练时的细节

image-20251030124910822

image-20251030124932431

image-20251030124949195

image-20251030125005130

关于数据格式的注意事项

在使用 NumPy 数组作为输入时,即使只有一个样本,也应将其构造成二维数组(即形状为 (1, n_features)),例如 x = np.array([[200.0, 17.0]])。这有助于框架内部进行高效的批量计算。

向量化与高效计算

为了提升计算效率,应尽可能避免在 Python 中使用显式的 for 循环来处理神经网络中的矩阵运算。

  • 向量化 (Vectorization):利用 NumPy 或 TensorFlow 内置的矩阵乘法(如

    1
    2
    3
    
    np.matmul
    # 或者 @
    @
    

    运算符)一次性完成整层的计算。

    • 非向量化:对每个神经元单独计算 z = np.dot(w, x) + b
    • 向量化:对整层计算 Z = np.matmul(A_in, W) + B
  • 另外 A.T代表矩阵A的转置

向量化不仅能显著加快代码运行速度,而且代码也更加简洁清晰。

AGI通用人工智能

人工智能的两个层次

  • 弱人工智能(ANI,Artificial Narrow Intelligence):指专门用于完成特定任务的人工智能,如智能音箱。这是目前已经广泛实现的技术。
  • 通用人工智能(AGI,Artificial General Intelligence):指具备像人类一样全面智能的AI,能够理解和学习任何智力任务。这是AI领域的长期目标。

image-20251030123256271

神经网络的生物学基础

  • PPT展示了生物神经元(包含细胞体、树突、轴突等)的结构。
  • 并给出了一个简化的神经元数学模型,将生物神经元的输入(树突)、处理(细胞体)和输出(轴突)过程用数学函数来模拟。这正是人工神经网络的基础单元。

image-20251030123909104

核心主题:神经网络与大脑

  • 提出的问题:我们能否模仿人脑?但幻灯片也诚实地指出,我们(几乎)不知道大脑的具体工作原理。
  • 关键假说——“单一学习算法”假说假说内容:智能可能来源于一个通用的、单一的学习算法。大脑的不同部分(如处理视觉、听觉、触觉的区域)可能是在运行同一个基本算法,只是处理的数据来源不同。证据支持:幻灯片以人类大脑发育初期的“可塑性”作为证据。例如,大脑中原本负责处理声音的区域,如果被连接到视觉信号,也可以学会“看”。这说明大脑皮层可能具有通用的处理能力。深远意义:如果这个假说成立,那么理论上我们可以利用单一的神经网络算法,通过提供不同的数据,来解决各种各样的问题(视觉、听觉、语言等),而无需为每个问题专门编写复杂的程序。这正是深度学习所追求的“以不变应万变”的策略。

image-20251030123934920

image-20251030123951662

多分类问题

Softmax 回归

当目标变量 $y$ 可以取两个以上的可能值时(例如 MNIST 手写数字识别,$y \in {0, 1, …, 9}$),需要使用 Softmax 回归(Softmax Regression)。

  • 模型输出:对于 $N$ 个类别,模型会为每个类别 $j$ 计算一个未归一化的分数(logit)$z_j$:

    $$z_j = \mathbf{w}_j \cdot \mathbf{x} + b_j$$

    其中 $\mathbf{w}_j$ 和 $b_j$ 是第 $j$ 个类别的参数。

  • Softmax 函数:将 logits 向量 $\mathbf{z} = [z_1, …, z_N]$ 转换为一个概率分布 $\mathbf{a} = [a_1, …, a_N]$,其中每个 $a_j$ 表示属于类别 $j$ 的概率:

    $$a_j = P(y=j \mid \mathbf{x}) = \frac{e^{z_j}}{\sum_{k=1}^{N} e^{z_k}}$$

    这些概率满足 $\sum_{j=1}^{N} a_j = 1$ 且 $a_j \geq 0$。

  • 损失函数:使用交叉熵损失(Cross-Entropy Loss)。对于真实标签 $y$,损失为:

    $$\text{Loss}(\mathbf{a}, y) = -\log(a_y)$$

    即只关注真实类别对应预测概率的负对数。

  • 逻辑回归的泛化:从公式上我们可以看出Softmax其实是二元的逻辑回归的多元泛化。

    image-20251030184404741

image-20251030184425363

数值稳定性

直接计算 Softmax 可能会因为指数运算导致数值上溢(overflow)或下溢(underflow)。

举个例子,

$$a_j = \frac{e^{z_j }}{\sum_{k=1}^{N} e^{z_k }}$$

中,当分母相对分子过大,即整体趋于0时,损失

$$\text{Loss}(\mathbf{a}, y) = -\log(a_y)$$

,就会趋于无穷大(主要是分母的和取对数时)。反之趋于1时亦然。

一个更数值稳定的实现方式是先从 logits 向量 $\mathbf{z}$ 中减去其最大值 $z_{\text{max}} = \max(\mathbf{z})$,然后再计算:

$$a_j = \frac{e^{z_j - z_{\text{max}}}}{\sum_{k=1}^{N} e^{z_k - z_{\text{max}}}}$$

这不会改变最终的概率结果,但能有效避免数值问题。因为分母的指数项所有指数项 $e^{z_k−z_{max}}≤1$,因此取对数时不会上溢(相比指数级的大小)。

在 TensorFlow/Keras 中,可以通过设置 from_logits=True 来利用框架内部的数值稳定实现。此时,模型的最后一层应使用 activation='linear'(即不加 Softmax),而损失函数 SparseCategoricalCrossentropy 会直接在 logits 上进行稳定计算,即自动进行以上的稳定计算算法(从 logits 向量 $\mathbf{z}$ 中减去其最大值 $z_{\text{max}} = \max(\mathbf{z})$ )。

1
2
3
4
5
6
7
# 数值稳定的 MNIST 模型示例
model = Sequential([
    Dense(units=25, activation='relu'),
    Dense(units=15, activation='relu'),
    Dense(units=10, activation='linear') # 输出 logits
])
model.compile(loss=SparseCategoricalCrossentropy(from_logits=True))

多标签分类

与多分类(每个样本只属于一个类别)不同,多标签分类(Multi-label Classification)允许一个样本同时属于多个类别。

  • 应用场景:例如,一张图片可能同时包含“汽车”、“公交车”和“行人”。

  • 模型架构:可以训练一个具有多个输出的神经网络,每个输出对应一个类别的二元判断。

  • 激活函数与损失:

    • 输出层激活函数:每个输出单元使用 Sigmoid 激活函数,独立地输出属于该类别的概率(范围在 0 到 1 之间)。
  • 损失函数:对每个输出单元分别计算二元交叉熵损失,然后求和或求平均。

对比:

多分类(Multiclasses): 多个输出代表多个可能(概率),输出层使用Softmax激活函数,但每个样本只有一个确定的类别

多标签分类(Multi-label Classification): 同样是多个输出对应多个可能,但每个样本有多个类别,每个类别有是与否的可能,即输出y是多维的

优化算法:Adam

梯度下降法使用一个全局的学习率 $\alpha$ 来更新所有参数。Adam 算法(Adaptive Moment Estimation)是一种更先进的优化器,它能为每个参数自适应地调整学习率。

  • 核心思想:Adam 结合了动量(Momentum)和 RMSprop 的思想,通过计算梯度的一阶矩(均值)和二阶矩(未中心化的方差)的指数移动平均,来动态调整每个参数的学习率。

  • 优势:通常比标准梯度下降收敛更快,且对学习率的初始选择不那么敏感。

  • 在 TensorFlow 中的使用:

    1
    2
    3
    4
    
    model.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),
        loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    )
    

image-20251030195526547

卷积层

卷积层(Convolutional Layer)是卷积神经网络(CNN)的核心组成部分,尤其适用于处理图像、音频等具有网格结构的数据。

  • 与全连接层的区别:

    1. 局部连接:卷积层中的每个神经元只与输入数据的一个局部区域(感受野)相连,而不是与所有输入相连。
    2. 参数共享:用于扫描输入的不同局部区域的是一组相同的权重(称为卷积核或滤波器)。
  • 优势:

    1. 计算更快:由于局部连接和参数共享,参数数量大大减少。
  1. 需要更少的训练数据:参数减少也意味着模型更不容易过拟合。

image-20251030195658287

导数与反向传播

导数的直观理解

导数 $\frac{dJ}{dw}$ 表示当参数 $w$ 增加一个微小量 $\epsilon$ 时,代价函数 $J(w)$ 的变化量(约为 $\frac{dJ}{dw} \cdot \epsilon$)。在梯度下降中,我们沿导数的反方向更新参数以最小化 $J$。

反向传播 (Backpropagation)

反向传播是一种高效计算神经网络中所有参数梯度的算法。

  • 计算图:将前向传播的计算过程表示为一个有向图,节点代表变量(如 $w, b, z, a, J$),边代表计算操作。
  • 链式法则:反向传播从输出(代价 $J$)开始,应用链式法则,从右向左(从输出层到输入层)逐层计算梯度。
  • 高效性:对于一个有 $N$ 个节点和 $P$ 个参数的网络,反向传播可以在大约 $N + P$ 步内计算出所有梯度,而朴素方法需要 $N \times P$ 步。

image-20251030195752030

调试与评估机器学习算法

训练/测试集划分

为了评估模型在未见数据上的泛化能力,需要将数据集划分为:

  • 训练集 (Training Set):用于拟合模型参数(如 70% 或 80% 的数据)。
  • 测试集 (Test Set):用于最终评估模型性能(如 30% 或 20% 的数据)。
  • 训练误差:$J_{\text{train}}(\mathbf{w}, b) = \frac{1}{m_{\text{train}}} \sum_{i=1}^{m_{\text{train}}} L(f_{\mathbf{w},b}(\mathbf{x}^{(i)}), y^{(i)})$
  • 测试误差:$J_{\text{test}}(\mathbf{w}, b) = \frac{1}{m_{\text{test}}} \sum_{i=1}^{m_{\text{test}}} L(f_{\mathbf{w},b}(\mathbf{x}{\text{test}}^{(i)}), y{\text{test}}^{(i)})$

对于分类问题,测试误差也可以直接定义为测试集中被错误分类的样本比例。

交叉验证

当需要在多个模型(或超参数,如多项式次数 $d$、正则化参数 $\lambda$)之间进行选择时,仅使用训练集和测试集会导致对泛化误差过于乐观的估计,因为模型选择过程已经“窥探”了测试集。

  • 解决方案:引入验证集(Validation Set,也称开发集 Dev Set):

    • 训练集:用于训练每个候选模型。
    • 验证集:用于评估和选择表现最好的模型。
    • 测试集:仅用于对最终选定的模型进行一次性的、无偏的性能评估。

标准划分比例可以是 60% / 20% / 20% 或 80% / 10% / 10%。

k折交叉验证:

  1. 基本思想:将数据集划分为k个大小相似的子集,每次使用其中一个子集作为验证集,其余k-1个子集作为训练集,重复k次,最终取平均性能作为评估结果。
  2. 划分方式:数据集被分成k个互不重叠的子集(通常称为“折”),每个样本在整个过程中恰好出现一次在验证集中,其余k-1次在训练集中。
  3. 目的:通过充分利用所有数据(每个样本既参与训练又参与验证),减少因单次划分带来的偏差,尤其适用于小数据集。

偏差与方差 (Bias/Variance)

这是理解模型性能的核心框架。

  • 高偏差 (High Bias / Underfitting):模型过于简单,无法捕捉数据中的基本模式。表现为训练误差高
  • 高方差 (High Variance / Overfitting):模型过于复杂,过度拟合了训练数据中的噪声。表现为训练误差低,但验证误差高

学习曲线

学习曲线是诊断偏差和方差问题的有力工具,它绘制了训练误差和验证误差随训练集大小变化的曲线。

  • 高方差(bias):两条曲线之间存在较大差距,且验证误差远高于训练误差。增加更多训练数据通常能有效改善。
  • 高偏差(variance):两条曲线都处于较高水平,且随着数据量增加,两者都趋于一个较高的平台。增加数据量帮助不大,应考虑增加模型复杂度(如添加特征、使用更高阶多项式)。

image-20251030200622567

image-20251030200834560

image-20251030200958725

调试策略总结

根据偏差/方差分析,可以采取以下措施:

  • 解决高方差(过拟合):

    • 获取更多训练数据。
    • 尝试减少特征数量。
    • 增大正则化参数 $\lambda$。
  • 解决高偏差(欠拟合):

    • 尝试增加特征数量。
    • 尝试添加多项式特征。
    • 减小正则化参数 $\lambda$。
    • 使用更复杂的模型(如更大的神经网络)。

注意:算法本身导致的高偏差,获得更多数据也没有帮助

神经网络与正则化

网络大小与偏差/方差

  • 大型神经网络通常是“低偏差”的机器,因为它们有足够的容量去拟合复杂的函数。
  • 只要配合合适的正则化(如 L2 正则化、Dropout),大型网络的性能通常等于或优于小型网络。
  • 如果存在高方差问题,优先考虑增大网络增加数据量,而不是使用一个先天受限的小型网络。

L2 正则化

L2 正则化(也称权重衰减)通过在损失函数中添加一个惩罚项来限制权重的大小,从而防止过拟合。

$$J_{\text{regularized}}(\mathbf{W}, \mathbf{b}) = J(\mathbf{W}, \mathbf{b}) + \frac{\lambda}{2m} \sum_{l} \sum_{i,j} (W_{ij}^{[l]})^2$$

其中 $\lambda$ 是正则化参数,控制正则化的强度。

因为参数和$\sum_{l} \sum_{i,j} (W_{ij}^{[l]})^2$ 与 $\lambda$ 是乘积关系, $\lambda$ 制约了参数的增大,避免模型结构过深,陷入过拟合。

在 Keras 中,可以通过 kernel_regularizer=L2(lambda_value) 为层添加 L2 正则化。

1
2
3
from tensorflow.keras.regularizers import L2

layer_1 = Dense(units=25, activation="relu", kernel_regularizer=L2(0.01))

迭代式机器学习开发

构建一个成功的机器学习系统(如垃圾邮件分类器)通常是一个迭代过程

  1. 选择整体架构:确定模型、数据和评估指标的初步方案。
  2. 训练模型
  3. 诊断:通过偏差/方差分析、误差分析等手段,找出模型的主要瓶颈。
  4. 改进:根据诊断结果,有针对性地改进模型或数据(如收集更多数据、设计新特征、调整超参数等)。
  5. 重复:回到步骤 2,直到达到满意的性能。

这种基于诊断的迭代方法比盲目尝试各种技巧要高效得多。

image-20251030203325395

误差分析

构建垃圾邮件分类器

在开发机器学习系统(如垃圾邮件分类器)时,当模型在交叉验证集上的表现不佳时,需要决定下一步如何改进。

  • 问题:假设你的分类器在包含 $m_c=500$ 个样本的交叉验证集上错误分类了 100 个样本(20% 错误率)。有哪些可能的改进方向?
    • 收集更多数据(例如,“蜜罐”项目)。
    • 开发更复杂的特征(基于邮件路由头、邮件正文)。
    • 设计算法检测故意拼错的单词(如 w4tches, med1cine)。
    • 处理嵌入图片中的垃圾邮件。

手动检查与分类

为了高效地确定改进方向,应进行手动误差分析

  1. 收集错误样本:从交叉验证集中收集被算法错误分类的 100 个样本。
  2. 人工分类:仔细检查这些错误样本,并根据它们的共同特征或错误类型进行分类(例如,药品广告、钓鱼邮件、故意拼写错误等)。
  3. 统计比例:计算每种错误类型在总错误中所占的比例。

决策依据

误差分析的结果可以指导资源分配:

  • 如果某种错误类型(如“药品广告”)占比很高(例如 40%),那么投入精力解决这个问题很可能显著降低整体错误率。
  • 如果某种错误类型(如“嵌入图片中的垃圾邮件”)占比很低(例如 5%),即使你完全解决了它,整体性能提升也有限(最多降低 5% 的绝对错误率),因此可能不值得优先投入大量时间。

偏差/方差分析的作用

回到前面列出的改进列表,偏差/方差分析可以帮助判断“收集更多数据”是否是一个有效的策略。

  • 高方差(过拟合):如果模型在训练集上表现很好(低训练误差),但在验证集上表现很差(高验证误差),这表明存在高方差问题。此时,收集更多数据通常是有效的,因为它可以帮助模型更好地泛化。
  • 高偏差(欠拟合):如果模型在训练集和验证集上都表现不佳(训练误差和验证误差都很高),这表明存在高偏差问题。此时,增加数据量帮助不大,应该优先考虑增加模型复杂度(如添加特征、使用更大的网络)。

因此,在决定是否要投入巨大成本去收集更多数据之前,先通过偏差/方差分析诊断问题是至关重要的。

扩充数据

数据增强

  • 定义:数据增强(Data Augmentation)是指通过对现有的训练样本进行一系列有意义的变换(或“畸变”),来创建新的、略微不同的训练样本。这相当于在不收集新数据的情况下,“制造”更多的数据。
  • 目的:增加训练数据的数量多样性,使模型能够学习到更鲁棒的特征,提高泛化能力,减少过拟合。
  • 举例:
    1. 计算机视觉:
      • 对图像进行几何变换:旋转、翻转(水平/垂直)、缩放、裁剪、平移。
      • 对图像进行色彩/光照变换:调整亮度、对比度。
      • 添加噪声:模拟真实世界中的图像缺陷。
    2. 语音识别:
      • 在原始音频中加入背景噪音(如人群、交通、办公室噪音)。
      • 模拟较差的通信环境(如模拟手机信号差的效果)。
  • 核心原则
    • 变换必须具有代表性:引入的畸变应该模拟真实世界中可能出现的情况。例如,给语音助手的训练数据加背景噪音是合理的,因为用户确实会在嘈杂环境中使用它。
    • 避免无意义的噪音:添加纯粹随机、与实际场景无关的噪音(如椒盐噪声、纯白噪声)通常对模型性能没有帮助,甚至可能损害模型。重点是“有意义的畸变”

image-20251030205228921

数据合成

  • 定义:“数据合成”(Data Synthesis),这是数据增强的一个更高级形式。它不是对现有数据进行微调,而是从零开始人工创建全新的样本(如用计算机图形生成图像,或用语音合成技术生成音频)。这在真实数据极难获取时非常有用。
  • 应用场景:当真实数据极难获取时,可以使用计算机图形学(CG)生成逼真的图像,或使用语音合成技术生成音频。
  • 优势:有时,关注数据(Data-centric)而非模型(Model-centric)是提升学习算法性能更高效的方式。

现在的深度学习领域,数据比模型更重要

image-20251030205248459

迁移学习

基本概念

迁移学习(Transfer Learning)是指将在一个任务(源任务)上学到的知识,应用到另一个不同但相关的任务(目标任务)上。

  • 核心思想:利用预训练模型(通常在大规模数据集如 ImageNet 上训练)的底层特征提取能力(如边缘、角点、基本形状),作为目标任务的起点。
  • 典型流程:
    1. 预训练:在一个大型数据集(如包含 100 万张图像、1000 个类别的 ImageNet)上训练一个深度神经网络。
    2. 微调(Fine-tuning):
      • 移除预训练模型的最后一层(或几层)。
      • 添加新的、适合目标任务的输出层。
      • 用目标任务的数据集重新训练整个模型或仅训练新添加的层。

为什么有效?

  • 深度神经网络的前几层学习到的是通用的低级特征(如边缘、纹理、形状),这些特征在许多视觉任务中都是有用的。
  • 后几层则学习到更高级、更特定于原始任务的特征。
  • 通过迁移学习,我们避免了从零开始学习这些通用特征,从而节省了大量计算资源和时间,并且在目标任务数据量有限时也能取得很好的效果。

image-20251030205401748

评估分类模型

精确率与召回率

对于不平衡数据集,即正反数据比例相差过大(如罕见疾病的预测),仅看准确率(Accuracy)可能会产生误导。精确率(Precision)和召回率(Recall)提供了更细致的评估视角。

  • 混淆矩阵

    • 真正例 (True Positive, TP):模型正确预测为正类的样本数。
    • 假正例 (False Positive, FP):模型错误地将负类预测为正类的样本数。
    • 真反例 (True Negative, TN):模型正确预测为负类的样本数。
    • 假反例 (False Negative, FN):模型错误地将正类预测为负类的样本数。
  • 精确率 (Precision):在所有被模型预测为正类的样本中,有多少是真正的正类。

    $$\mathrm{Precision} = \frac{TP}{TP + FP}$$
  • 召回率 (Recall):在所有真正的正类样本中,有多少被模型成功找出。

    $$\mathrm{Recall} = \frac{TP}{TP + FN}$$

image-20251030210114075

F1 分数

F1 分数是精确率和召回率的调和平均数,提供了一个单一的评估指标来平衡两者。

$$\mathrm{F1\,Score} = \frac{2\,\mathrm{Precision}\cdot\mathrm{Recall}}{\mathrm{Precision}+\mathrm{Recall}} = \frac{2TP}{2TP + FP + FN}$$

调和平均数的特点是更强调较小的值。因此,一个高的 F1 分数要求精确率和召回率都不能太低。

阈值选择

在逻辑回归等输出概率的模型中,通常通过设置一个阈值来决定最终的分类(例如,当 $f_{w,b}(x) \ge \text{threshold}$ 时预测为正类)。

  • 权衡:

    • 高阈值:模型只在非常有把握时才预测为正类,导致高精确率、低召回率(漏诊多)。
    • 低阈值:模型倾向于将更多样本预测为正类,导致低精确率、高召回率(误诊多)。
  • 策略:根据具体应用需求手动选择阈值。例如,对于罕见疾病的筛查,宁愿误报也不愿漏报,因此会选择较低的阈值以最大化召回率。

image-20251030220345711

决策树

基本原理

决策树是一种直观且强大的机器学习模型,它通过一系列“是/否”问题(基于特征)对数据进行递归划分,最终将样本分配到不同的叶节点(类别或值)。

预测过程:对于一个新的输入样本,从根节点开始,根据其特征值沿着树的分支向下移动,直到到达一个叶节点,该叶节点的值即为预测结果。

构建过程

  • 选择分裂特征: 在每个节点,算法会评估所有可能的特征及其分裂点,选择能够最大化纯度(或最小化不纯度)的特征进行分裂。常用的不纯度度量包括基尼不纯度(Gini Impurity)和信息增益(Information Gain)。
  • 停止分裂: 当一个节点中的所有样本都属于同一类别(纯节点)时,停止分裂。实践中,也可能设置其他停止条件,如树的最大深度、节点的最小样本数等。

image-20251030220545338

决策树学习:如何构建

构建一棵决策树的核心在于回答两个关键问题。

如何选择分裂特征?

在每个内部节点,算法需要决定使用哪个特征来进行分裂。其目标是最大化子节点的纯度(或等价地,最小化不纯度)。

  • 纯度:指一个节点中样本属于同一类别的程度。纯度越高,该节点的预测就越可靠。
  • 示例:假设我们有 7 个样本,其中 4 个是猫。如果按“耳朵形状”分裂:
    • 尖耳子节点:3 个样本,全是猫(纯度 100%)。
    • 非尖耳子节点:4 个样本,1 个是猫(纯度 25%)。 这种分裂显著提高了子节点的纯度,因此是一个好的选择。

image-20251030221640573

何时停止分裂?

为了防止模型过度复杂(过拟合),需要设定停止分裂的标准。常见的停止条件包括:

  • 当前节点中的所有样本都属于同一类别(即节点是“纯的”)。
  • 继续分裂会导致树的深度超过预设的最大深度。
  • 分裂所带来的信息增益(或纯度提升)小于一个给定的阈值。
  • 当前节点包含的样本数量少于一个预设的最小值。

image-20251030221703841

纯度测量

以熵来衡量不纯度,类似二分类。

不纯度度量:通常使用(Entropy)来量化一个节点的不纯度。对于一个包含正负样本的节点,其熵 $H(p_1)$ 定义为:

$$H(p_1) = -p_1\log_2 p_1 - (1-p_1)\log_2 (1-p_1)$$

其中 $p_1$ 是该节点中正类样本的比例。当 $p_1=0$ 或 $p_1=1$(纯节点)时,熵为 0;当 $p_1=0.5$ 时,熵达到最大值 1。

image-20251030221837588

信息增益计算

假设在当前节点,使用特征 FF 进行分裂,会产生左子节点(left)和右子节点(right)。

  1. 计算当前节点的熵 $H_{\text{parent}}$。

  2. 计算分裂后两个子节点的加权平均熵:

    $$H_{\text{children}} = w_{\text{left}}\,H_{\text{left}} + w_{\text{right}}\,H_{\text{right}}$$

    其中权重 $w_{\text{left}}$ 和 $w_{\text{right}}$ 分别是左右子节点样本数占总样本数的比例。

  3. 信息增益为:$ Information Gain=H_{parent}−H_{children} $算法会选择使信息增益最大的特征进行分裂。

信息增益和熵是两个相对的量,信息增益越大,熵越小,分类效果越好,子集纯度越高。

决策树学习流程整理

综上,决策树的学习是一个递归的过程,从根节点开始,不断将数据集划分为更纯的子集。

  1. 初始化:将所有训练样本作为根节点。
  2. 递归分裂
    • 对于当前节点,计算所有可用特征的信息增益(Information Gain)。
    • 选择信息增益最大的特征作为分裂标准。
    • 根据该特征的不同取值,将当前节点的数据集划分为两个或多个子集,并创建相应的子节点。
  3. 停止条件:当满足以下任一条件时,停止对该节点的分裂:
    • 当前节点中的所有样本都属于同一个类别(即节点是“纯”的)。
    • 当前节点中没有剩余的特征可用于分裂。
    • 达到了预设的最大深度。
    • 当前节点包含的样本数量少于一个阈值。
  4. 重复:对每个新生成的非叶节点,重复步骤 2 和 3。

递归分裂过程示例

  • 初始状态:根节点包含所有样本(例如,猫和非猫的混合图像)。
  • 第一次分裂:根据某个特征(如“耳朵形状”),将样本分为两组。一组是“尖耳”,另一组是“非尖耳”。这形成了两个子节点。
  • 后续分裂:对每个子节点继续应用相同的过程。例如,在“尖耳”子节点中,可能根据“脸型”进一步分裂;在“非尖耳”子节点中,可能根据“胡须”进行分裂。
  • 最终结果:通过一系列这样的分裂,最终得到一棵完整的决策树,其中每个叶节点都对应一个类别(如“猫”或“非猫”)。

image-20251031101349930

处理分类特征:独热编码

决策树(以及许多其他算法)在处理具有多个可能取值的分类特征时,通常需要进行预处理。

  • 问题:一个特征如果有 k 个可能的取值(例如,耳朵形状:尖耳、圆耳、垂耳),直接将其作为单一特征输入模型可能会丢失信息或引入不合理的序数关系。
  • **解决方案:独热编码 **(One-Hot Encoding)
    • 为原始分类特征的每一个可能取值创建一个新的二元(0/1)特征。
    • 对于一个样本,只有与其实际取值对应的二元特征为 1,其余均为 0。

例如,原始特征“耳朵形状”有三个取值:Pointy, Oval, Floppy。经过独热编码后,会生成三个新特征:

  • is_pointy_ear: 1 if Pointy, else 0.
  • is_oval_ear: 1 if Oval, else 0.
  • is_floppy_ear: 1 if Floppy, else 0.

这种方法清晰地表示了分类信息,并且适用于包括神经网络在内的各种机器学习模型。

image-20251031102053667

处理连续特征

对于连续值特征(如房屋面积、价格),决策树通过选择一个阈值来进行二元分裂。

  • 分裂方式:算法会尝试不同的阈值 $t$,将样本划分为两组:${\mathbf{x}\mid x_i\le t}$ 和 ${\mathbf{x}\mid x_i>t}$。
  • 选择标准:选择能使分裂后子节点纯度提升最大的那个阈值 tt

这点和多分类的处理是一样的。

image-20251031102147748

回归树

类似监督学习中的回归问题,回归树的分类结果也不是孤立的的1/0,而是多个连续值。

下面这个回归树示例,就是根据三个输入特征,把小动物分类到尽量体重相近的分类中。

image-20251031102843963

image-20251031103256843

集成树(tree ensembles)

单一决策树对数据变化高度敏感,所以我们可以构建多个决策树集成学习,再通过投票,综合多棵树的预测结果来做出最终预测。

image-20251031103740469

放回抽样 (Sampling with replacement)

放回抽样(Sampling with replacement)是一种从原始数据集中抽取样本的方法。其核心特点是:在每次抽取一个样本后,将该样本重新放回原始数据集,因此它有可能在后续的抽取中被再次选中。它使得树能很好地适应微小变化。

区别:

  • 放回抽样:允许同一个样本在新的训练集中出现多次。
  • 不放回抽样:一旦一个样本被抽出,它就不再存在于原始数据集中,因此不可能被重复选中。

随机森林 (Random Forest)

随机森林是一种基于决策树的集成学习方法,通过引入随机性来构建一组多样化的决策树,并通过投票或平均来得到最终预测。

  • Bagging (Bootstrap Aggregating):为森林中的每棵树,从原始训练集中有放回地抽取一个与原始集大小相同的样本集(称为 bootstrap 样本)。这意味着每棵树都在略有不同的数据上训练。

  • 随机特征选择:在构建每棵树的每个节点时,不是在所有特征中选择最佳分裂特征,而是在一个随机选取的特征子集中进行选择。这进一步增加了树之间的多样性。

  • 最终预测:

    • 分类任务:所有树进行投票,得票最多的类别获胜。
  • 回归任务:取所有树预测值的平均。

随机森林因其高准确性、鲁棒性和对过拟合的良好抵抗力而被广泛应用。

image-20251031104418543

提升树 (Boosted Trees)

与随机森林并行训练多棵树不同,提升树采用顺序训练的方式。

  • 核心思想:每棵新树都专注于学习前序所有树的组合预测所产生的残差(即错误),即刻意选择使树分类错误的样例。通过这种方式,模型逐步修正其预测,整体性能得到“提升”(Boosting)。
  • 代表算法XGBoost(eXtreme Gradient Boosting)是提升树算法中最著名和高效的实现之一,在许多机器学习竞赛和工业应用中取得了巨大成功。

image-20251031104656040

image-20251031104733968

image-20251031104752291

决策树与神经网络的对比

决策树的优势

  • 适用于结构化数据:在处理表格数据(Tabular Data)时表现良好。
  • 易于理解和解释:其决策过程是透明的,可以被人类轻松解读。
  • 快速训练和预测:通常比神经网络更快。
  • 支持迁移学习:可以将预训练模型的知识迁移到新任务上。

神经网络的优势

  • 适用于各种类型的数据:不仅限于结构化数据,还能有效处理图像、音频、文本等非结构化数据。
  • 强大的表示能力:能够学习到非常复杂的非线性关系。
  • 可组合性:多个模块化的神经网络可以很容易地连接在一起,构建更复杂的系统。

image-20251031105213918

© 2023-2025 Ch0ser. All Rights Reserved.
使用 Hugo 构建
主题 StackJimmy 设计