【生成式人工智慧與機器學習導論 2025】第 6 講:一堂課搞懂訓練類神經網路的各種訣竅


📝 内容概要

本节课程主要介绍了在训练神经网络时会用到的各种实用技巧。课程首先回顾了机器学习的三个核心步骤(定义损失函数、确定函数范围、选择最优函数),并强调了在评估一个新方法时,必须思考两个关键问题:

  1. 该方法改变了机器学习三个步骤中的哪一个?

  2. 该方法带来的好处是改善优化 (Optimization)(即降低训练损失),还是增强泛化 (Generalization)(即避免过拟合)?

课程按照机器学习步骤的倒序(步骤三、步骤二、步骤一)展开,详细讲解了包括 Optimizer、Dropout、初始化、CNN 架构、Cross Entropy 损失函数、数据增强和正则化在内的多种技术,并分析了它们各自的目的和适用场景。


📑 目录

  1. 引言:如何评估一个训练技巧?

    • 机器学习的三个步骤

    • 评估技巧的核心框架:改变了哪一步?为了优化还是泛化?

  2. 步骤三:选择最好的函数 (Optimization)

    • 回顾:梯度下降 (Gradient Descent)

    • 优化器 (Optimizer):应对学习率挑战

      • AdaGrad

      • RMSProp

    • 优化器 (Optimizer):克服平坦区域与局部最小值

      • Momentum (动量)

      • Adam

    • 学习率调度 (Learning Rate Scheduling)

    • Dropout:为泛化而生的优化步骤

    • 初始化 (Initialization):选择好的起点

    • 预训练 (Pre-training):强大的初始化

  3. 步骤二:确定函数选择范围 (Model Architecture)

    • 目标:恰到好处的函数范围

    • 卷积神经网络 (CNN)

      • 感受野 (Receptive Field)

      • 参数共享 (Parameter Sharing)

    • 残差连接 (Residual Connection)

    • 归一化 (Normalization)

  4. 步骤一:定义损失函数 (Loss Function)

    • 分类 (Classification) 任务的损失

      • Accuracy vs. Cross Entropy

    • 数据 (Data) 与损失

      • 搜集更多资料

      • 数据增强 (Data Augmentation)

      • 半监督学习 (Semi-supervised Learning)

    • 正则化 (Regularization):对参数的偏好

      • L2 Regularization 与权重衰减 (Weight Decay)

      • AdamW

  5. 总结


正文

大家好,我们开始上课。今天这堂课要为大家讲解在训练神经网络时会用到的各种小技巧。

1. 引言:如何评估一个训练技巧?

机器学习的三个步骤

在上一堂课我们讲过,机器学习就是三个步骤:

  1. 定义你的损失函数 (Loss Function)。

  2. 决定你的函数选择范围。

  3. 选出一个最好的函数。

当你做完这三步并训练出一个模型后,不能马上进行测试,还需要记得做验证 (Validation)。如果验证的结果足够好,才会进入测试环节;否则,就需要回到之前的三个学习步骤,检查是哪里出了问题。

我们上周也讲了深度学习的基本观念,告诉大家所谓的深度学习、所谓的神经网络,就是划定一个比较大的函数选择范围,它有机会包含更多不同的函数。

评估技巧的核心框架:改变了哪一步?为了优化还是泛化?

今天要介绍一些训练神经网络时常用的技巧。因为时间有限,许多技术也许只会用比较流水账的方式带过。如果过去没有训练神经网络的经验,也许今天这堂课会比较吃力。

但这堂课的重点是:当你听到一个有关训练神经网络的方法或技巧时,你要问自己一个问题,并尝试填补下面这个表格。

首先,这个方法是改了机器学习三个步骤中的哪一个?

  • 它是一个新的损失函数吗?(步骤一)

  • 它是不同的神经网络架构,即划定了不同的选择范围吗?(步骤二)

  • 还是它是一个更好的、更有效的搜索最低 Loss 函数的方式?(步骤三)

接下来,你要问自己,这个方法到底带来了什么好处?

“好”有很多种不同面向的意思。你需要思考它到底带来了什么样的好处。在接下来的课程中,这些方法带来的好处大致可以分为两个方向:

  1. 更好的优化 (Optimization):这意味着我们可以找到更低的训练损失 (Training Loss)。

  2. 更好的泛化 (Generalization):这可以使训练损失和验证损失 (Validation Loss) 更接近,避免过拟合 (Overfitting) 的发生。

因此,每个方法想要解决的问题是不同的。当有人向你介绍一个技巧时,你要问自己,这个方法带来的好处到底是什么?对于不同的状况,你要选择不同的方法来应对。

情景分析:

  • 情景一:Optimization 问题

    假设你先训练了一个线性模型 (Linear Model),发现它的 Loss 可以降得很低。接着你训练一个神经网络,却发现它的 Loss 降得没有线性模型那么低。

    有些人会说这是过拟合,这是不对的。如果深度学习的 Training Loss 都降不下去,这不叫 Overfitting,这是在 Optimization 的时候就出了问题。

    一个深度网络的参数比线性模型多,线性模型能做到的事情它也能做到。理论上它的 Loss 应该至少和线性模型一样低,甚至更低。如果你发现它在 Training Loss 上还不如线性模型,代表你的 Optimization 有问题。这时,你应该选择一个可以强化 Optimization 的技巧。

  • 情景二:Generalization 问题

    如果你发现 Training Loss 已经降得够低了,但 Validation Loss 没有办法跟着下降,这个才是 Overfitting。这个时候,你才应该选择一个能带来更好 Generalization 的方法。

所以,你要注意一个方法到底是为了强化 Optimization 还是 Generalization 设计的。


2. 步骤三:选择最好的函数 (Optimization)

接下来,我们以流水账的方式介绍一大堆训练方法。我们会按照它是改了哪一个步骤来分类,并告诉大家这个方法是为了 Optimization 还是 Generalization 设计的。

我们先从步骤三开始讲起,看看有哪些技术改进了 Optimization。

回顾:梯度下降 (Gradient Descent)

我们通常用的就是最简单的梯度下降 (Gradient Descent),上周已经介绍过。Vanilla (原味的) 这个词代表这是一个最原版、最简单的梯度下降。

解 Optimization 问题的过程是:你已经有一个 Loss,也定出了 $\theta$(参数)的选择范围,你要找一个 $\theta$ 使得总损失 $L$ 最小。

Gradient Descent 的做法是:

  1. 随机从某一组参数 $\theta^0$ 开始。

  2. 计算在 $\theta^0$ 位置,参数 $\theta$$L$ 的梯度 (Gradient),记作 $g^0$

  3. $g^0$ 乘上学习率 (Learning Rate) $\eta$ 来更新 $\theta^0$,得到 $\theta^1 = \theta^0 - \eta g^0$

  4. $\theta^1$ 位置算出新梯度 $g^1$,更新得到 $\theta^2$

  5. $\theta^2$ 位置算出梯度 $g^2$,更新得到 $\theta^3$

  6. 反复这个步骤,直到收敛(即梯度非常小,无法再更新参数)为止。

优化器 (Optimizer):应对学习率挑战

最原版的 Gradient Descent,只根据当下算出来的梯度来决定更新方向。如果当下梯度是零,就不知道要往哪里走。

有一系列的技术叫做优化器 (Optimizer)。它们不只根据现有的梯度,而是根据过去所有算出来的梯度(从 $g^0$ 一直到 $g^t$),综合起来决定接下来要走的方向。

在 PyTorch 这样的深度学习套件中,这些 Optimizer 通常只是一个英文单词,你只要在代码的合适地方选择你要用的 Optimizer 即可。虽然实作简单,我们还是来看一下背后的原理。

为什么需要 Optimizer?一个理由是 Learning Rate 实在非常难调

  • 上周的例子中,Learning Rate 设 0.001 已经太大了,第一步就飞出去了。

  • 改成 0.0001 又太小了,更新 100 次参数才刚刚走到谷底。

在这个例子中,为什么难调?因为在横轴 (X 轴) 和纵轴 (Y 轴) 方向上,地势的变化非常不一样。

  • X 轴方向:地势变化快,梯度大。Learning Rate 需要设小一点,才不会跨到山谷对岸。

  • Y 轴方向:地势变化慢,梯度小。Learning Rate 需要设大一点,才能走得够快。

因此,不同的参数应该要有不同的 Learning Rate。我们应该要因材施教,但怎么估算呢?

我们可以从过去的梯度大小来决定。如果某个方向的梯度通常很大,Learning Rate 就设小一点;反之,梯度通常很小,Learning Rate 就设大一点。


AdaGrad

AdaGrad (Adaptive Gradient) 的运作方式如下:

我们对每一个维度 (dimension) 分开操作。

  1. $\theta^0$ 算出 $g^0$

  2. 计算 $\sigma_i^0$(第 $i$ 个维度在第 0 步的累计梯度平方根):

    $$\sigma_i^0 = \sqrt{(g_i^0)^2} = |g_i^0|$$
  3. 更新第 $i$ 个维度的参数:

    $$\theta_i^1 = \theta_i^0 - \frac{\eta}{\sigma_i^0} g_i^0$$

    这里的 $\sigma_i^0$ 越大,整体的 Learning Rate 就越小。

  4. $\theta^1$ 算出 $g^1$

  5. 计算 $\sigma_i^1$ 时,会考虑 $g^0$$g^1$

    $$\sigma_i^1 = \sqrt{(g_i^0)^2 + (g_i^1)^2}$$
  6. 更新参数:

    $$\theta_i^2 = \theta_i^1 - \frac{\eta}{\sigma_i^1} g_i^1$$
  7. 这个步骤反复进行,到第 $t$ 步时:

    $$\sigma_i^t = \sqrt{\sum_{k=0}^t (g_i^k)^2}$$
    $$\theta_i^{t+1} = \theta_i^t - \frac{\eta}{\sigma_i^t} g_i^t$$

你可能会问为什么不取平均?如果不取平均,$\sigma$ 会越来越大,这正好可以让 Learning Rate 随着时间逐渐缩小,这通常是我们希望的。

演示效果:

在之前的例子中,使用 AdaGrad 时,我们可以把 Learning Rate 设得更大(比如设为 1)。虽然前几步有点不稳定,但它很快就能自动调控,在 100 步之内可以走得比标准 Gradient Descent 远得多。


RMSProp

AdaGrad 做了一个强假设:过去的梯度大小可以估算出未来的梯度大小。但梯度是变化莫测的。

在香蕉形状的损失平面 (Loss Surface) 上,X 轴方向在某些地方梯度很大(需要小 Learning Rate),但在另一些地方梯度又很小(需要大 Learning Rate)。AdaGrad 累加了所有的历史梯度,导致它无法及时调整 $\sigma$

RMSProp (Root Mean Square Prop) 解决了这个问题,它让近期的梯度有更大的影响力

它的 $\sigma$ 计算方式不同(以第 1 步为例):

$$(\sigma_i^1)^2 = \alpha (\sigma_i^0)^2 + (1 - \alpha) (g_i^1)^2$$

这里引入了一个超参数 $\alpha$(例如 0.9),用来调控历史信息和当前信息的权重。$\alpha$ 设得越小,代表历史信息越不重要,最近的梯度信息越重要。

到第 $t$ 步时:

$$(\sigma_i^t)^2 = \alpha (\sigma_i^{t-1})^2 + (1 - \alpha) (g_i^t)^2$$
$$\theta_i^{t+1} = \theta_i^t - \frac{\eta}{\sigma_i^t} g_i^t$$

演示效果:

在香蕉函数 (Rosenbrock Function) 上,AdaGrad 走 1000 步也离终点很远。而 RMSProp 知道在某些地方需要更快的更新 Learning Rate,所以在同样步数下,它可以走得比 AdaGrad 更接近最终结果。


优化器 (Optimizer):克服平坦区域与局部最小值

Gradient Descent 不只有 Learning Rate 的问题。当梯度很小(如 Local Minima、Saddle Point,甚至只是很平坦的区域)时,Optimization 就会停止。

很多人误以为 Optimization 失败都是因为走到了 Local Minima,这不一定是真的。多数时候,训练可能停在梯度很小但并非 Local Minima 的地方。

在物理世界中,物体因为有动量 (Momentum),并不会在梯度为零的地方(如平地)马上停下来。我们可以把这个概念加到 Optimization 中。


Momentum (动量)

Momentum 的做法是把过去算出来的梯度都累加起来。

(注:这里的表述方式是为了后续和 Adam 统一,与原始论文略有不同)

  1. $\theta^0$ 算出 $g^0$。定义 $m^0 = g^0$

  2. 更新参数不再按照梯度 $g$ 的方向,而是按照动量 $m$ 的方向:

    $$\theta^1 = \theta^0 - \eta m^0$$
  3. $\theta^1$ 算出 $g^1$。我们同样引入一个类似 RMSProp 的概念,让近期的梯度影响更大。

    $$m^1 = \beta m^0 + (1 - \beta) g^1$$
  4. 更新参数:

    $$\theta^2 = \theta^1 - \eta m^1$$
  5. 这个步骤反复进行,到第 $t$ 步时:

    $$m^t = \beta m^{t-1} + (1 - \beta) g^t$$
    $$\theta^{t+1} = \theta^t - \eta m^t$$

演示效果:

在一个充满 Local Minima 的损失平面上,RMSProp 会在第一个 Local Minima 处卡住(因为梯度为零)。

而 Momentum 从高处滑下,走到 Local Minima 时,因为它累积的动量,它会继续往前冲,翻过山丘,继续寻找更低的点。


Adam

我们刚刚介绍了 RMSProp 和 Momentum。

  • Momentum ($m$):累积过去的梯度(有方向性),用来取代当前的梯度,决定更新方向

  • RMSProp ($\sigma$):累积过去的梯度的平方(无方向性),用来控制每个参数的学习率

这两个方法可以同时使用吗?当然可以,它们结合起来就是 Adam (Adaptive Moment Estimation)。这是今天默认会使用的一个 Optimizer。

Adam 的更新步骤(简化版):

  1. 计算 Momentum:$m^t = \beta_1 m^{t-1} + (1 - \beta_1) g^t$

  2. 计算 RMSProp (这里用 $v^t$ 表示 $\sigma^t$ 的平方):$v^t = \beta_2 v^{t-1} + (1 - \beta_2) (g^t)^2$

  3. 更新参数:

    $$\theta^{t+1} = \theta^t - \frac{\eta}{\sqrt{v^t}} m^t$$

(注:完整的 Adam 还有 Bias Correction 步骤,这里省略了。)

演示效果:

在香蕉函数上,RMSProp 无法走到最低点。但 Adam 结合了动量的优势,在同样 1000 次更新内,可以成功走到地图上的最低点。


学习率调度 (Learning Rate Scheduling)

除了 $\sigma$$m$,我们还可以改变 $\eta$ 本身。我们可以让 $\eta$ 在每次更新时都不同,即 $\eta^t$

一个常见的策略叫 Warm up (预热) + Decay (衰减)

  • Warm up:在训练刚开始时,Learning Rate 逐渐增大。这可以被想成是给 Optimizer 一个机会探索地形,收集 $\sigma$$m$ 的信息。

  • Decay:在 Warm up 结束后,Learning Rate 逐渐减小。这是为了让参数更新的步伐变小,最终能稳定“着陆”在峡谷的最低点,而不是在两侧来回震荡。

总结 Optimizer (步骤三):

  • 改了哪一步? 步骤三,是更有效的搜索函数的方法。

  • 带来什么好处? 更好的 Optimization。它能让你在 Training Data 上找到更低的 Loss。

  • 注意事项: 它通常对 Generalization 没有帮助。你完全可能用了 Adam 之后,Training Loss 下降了,但 Validation Loss 反而上升了(Overfitting 更严重)。只有当你发现 Training Loss 压不下去时,换 Optimizer 才会有帮助。


Dropout:为泛化而生的优化步骤

Dropout 是一个神奇的方法。它在训练时会随机丢掉一些神经元,但在验证和测试时会用上所有的神经元。

这就像练轻功时在脚上绑重物,增加训练难度;在真正测试时把重物拿掉,表现就会更好。

  • 改了哪一步? 步骤三,改变了优化过程。

  • 带来什么好处? 更好的 Generalization。它让 Training Loss 和 Validation Loss 更接近。

  • 注意事项: Dropout 对 Optimization没有好处的。加上 Dropout 后,你的 Training Loss 看起来会比较高。所以,不要在 Optimization 不好(Training Loss 降不下去)的时候使用 Dropout,它只适用于 Overfitting 的情况。


初始化 (Initialization):选择好的起点

在做 Gradient Descent 时,初始位置 $\theta^0$ 的选择也会导致非常不同的训练结果。从不同的山坡滚下来,可能会停在不同的 Local Minima。

演示效果:

在预测讲课时长的例子上,使用 Adam 和随机初始化,每次训练结果不稳定(Loss 可能在 7.0 到 9.0 之间)。

但是,如果换用 Kaiming (何凯明) 初始化(一种根据层输入维度来缩放随机值的初始化方法),其他设置完全不变,Loss 可以稳定地降到 1.0 甚至 0.x。

这说明,即便有了好的 Optimizer,好的 Initialization 依然能带来显著差异。

  • 初始化的另一作用:Flat Minima

    有时候,Error Surface 上可能有很多个最低点 (Global Minimum)。

    • 峡谷型 (Sharp) Minima:这种最低点非常狭窄。如果 Training Loss 和 Validation Loss 的地形有轻微的偏移 (Shift),会导致 Validation Loss 剧增,造成严重的 Overfitting。

    • 盆地型 (Flat) Minima:这种最低点非常平坦。即使地形有轻微偏移,Validation Loss 也不会差太多。

    好的 Initialization 有可能引导我们走到这种更“平坦”的、Generalization 更好的最低点。


预训练 (Pre-training):强大的初始化

2025 年一个通用的大绝招叫做预训练 (Pre-train)

假设我们的目标任务(Downstream Task)是分类图片中的动物。

在做这个任务之前,我们先让模型做另一个任务,称为 Pretext Task。例如,给模型一张图片,让它预测这张图片被旋转了多少度(如 180 度)。

这个 Pretext Task 的好处是,我们可以轻易地自动生成海量的训练数据(把图片随机旋转即可)。

我们先在 Pretext Task 上训练模型,然后把训练好的参数,当作目标任务的 Initialization,再进行训练(这个过程也叫 Fine-tuning)。

  • 改了哪一步? 步骤三,是一种 Initialization 方法。

  • 带来什么好处? Pre-train 的神奇之处在于,它对 OptimizationGeneralization 同时都有帮助


3. 步骤二:确定函数选择范围 (Model Architecture)

现在我们来讲第二步,改变函数的选择范围,这通常指的是改变网络架构。

目标:恰到好处的函数范围

我们希望的函数范围是“刚刚好”的,不大不小。

  • 范围太小 (Model Bias):可能没有包含好的函数。

  • 范围太大:容易 Overfitting。

我们希望划定一个范围不大,但又正好包含好的函数的集合。这需要凭借我们的领域知识 (Domain Knowledge)

卷积神经网络 (CNN)

CNN (Convolutional Neural Network) 就是利用 Domain Knowledge 设计网络架构的经典例子,它通常用于处理影像。

一张 1000x1000 像素的彩色图片,对神经网络来说,是 3 (RGB) * 1000 * 1000 = 300 万维的输入向量。

如果使用一个标准的全连接网络 (Fully Connected, or MLP),第一层的每一个神经元都需要连接到这 300 万个输入。

假设第一层有 1000 个神经元,光是第一层就会有 30 亿个参数,这太大了。

真的有必要让每个神经元都看整张图片吗?

凭借人类的智慧,我们知道也许是不需要的。

CNN 的改进 1:感受野 (Receptive Field)

我们对影像处理的 Domain Knowledge 是:

  1. 第一层的神经元通常扮演“基础特征检测器” (Basic Detector) 的角色,比如检测鸟嘴、眼睛、爪子。

  2. 这些基础特征(如鸟嘴)通常只占图片的一小部分。我们不需要看整张图片就能识别出它是一个鸟嘴。

因此,我们帮每个神经元划定一个守备范围,称为感受野 (Receptive Field)。这个神经元只管 Receptive Field 里面的事情,而 Receptive Field 以外的连接,参数强制设为零

在影像处理中,这个 Receptive Field(也叫 Kernel Size)通常很小,比如 3x3。这会大幅减少参数量。

这相当于,我们选择了一个比 Fully Connected Layer 更小的函数搜寻范围

CNN 的改进 2:参数共享 (Parameter Sharing)

我们还有第二个 Domain Knowledge:同一个 Pattern(如鸟嘴),可能会出现在影像中的不同地方(左上角或中间)。

在原来的设计中,侦测左上角鸟嘴的蓝色神经元,和侦测中间鸟嘴的红色神经元,它们各自学习一套参数。但它们做的事情其实是一模一样的。

因此,我们可以让这两个神经元共用 (Share) 同一组参数。

在 CNN 中,所有守备不同区域、但功能相同(比如都是第 1 个检测器)的神经元,它们的参数被强制设定成一模一样。这组共享的参数被称为过滤器 (Filter)。

这相当于,我们又进一步限制了函数的搜寻范围

总结 CNN (步骤二):

  • 改了哪一步? 步骤二,通过 Receptive Field 和 Parameter Sharing,划定了更小的函数范围。

  • 带来什么好处? 更好的 Generalization。CNN 是 Fully Connected 的简化版,它的函数范围更小,因此更不容易 Overfitting。


残差连接 (Residual Connection)

在很深的网络中,靠近输入的参数(低层参数)如果发生一点小小的变化 ($\Delta W$),可能要经过非常多层才能影响到最终的输出和 Loss ($\Delta L$)。

这会导致低层参数的梯度非常小,即梯度消失 (Gradient Vanishing)。

但有时,这个 $\Delta W$ 又可能因为层层累积,在特定情况下导致 $\Delta L$ 发生剧变,即梯度爆炸 (Gradient Explode)。

这种梯度忽大忽小的现象,导致深度网络很难训练。

残差连接 (Residual Connection) 或跳跃连接 (Skip Connection) 就是为了缓解这个问题。

它的做法是在层与层之间加一个“高速公路”。

  • 没有 Skip Connection:输出 $a' = W \times a$

  • 有 Skip Connection:输出 $a' = (W \times a) + a$

输入 $a$ 的改变,可以通过这条高速公路,直接传递到很深的层,从而对最后的输出产生足够的影响,让训练变得更容易。

  • 改了哪一步? 步骤二,改变了网络架构。

  • 带来什么好处? 更好的 Optimization。它让 Loss Surface 变得更平坦,更容易训练。


归一化 (Normalization)

还有一系列 Normalization 的方法,如 Batch Normalization、Layer Normalization 等。它们在层与层之间插入一个操作,将该层的输出(或输入)限制在某个范围内(例如,强制要求均值为 0,方差为 1)。

  • 改了哪一步? 步骤二,改变了网络架构(增加了 Normalization Layer)。

  • 带来什么好处? 主要是更好的 Optimization。因为每一层输出的数值范围都差不多,所以更容易调整 Learning Rate。同时,因为它给函数增加了额外的限制(缩小了范围),所以对 Generalization 也有一些帮助。


4. 步骤一:定义损失函数 (Loss Function)

最后我们来看步骤一,定义 Loss。

分类 (Classification) 任务的损失

生成式 AI(如大型语言模型)的核心任务——预测下一个词,本质上就是一个分类问题。所以分类任务非常关键。

在分类任务中,我们的评估指标 (Evaluation Metric) 通常是正确率 (Accuracy)。

我们能直接把 Accuracy 当作 Loss 来优化吗?

不能。

Accuracy 的问题在于它无法微分。

假设模型输出类别一的分数是 2.0,类别二是 1.0,模型选择类别一。

如果我们稍微改变一个参数,让类别二的分数变成 1.01。此时,模型的输出仍然是类别一,Accuracy 不变,Loss 的变化为零,梯度也为零。

只有当参数变化大到足以让 1.01 超过 2.0,导致输出类别改变时,Loss 才会发生跳变。

这样的 Loss Surface 到处都是平台(梯度为零),根本无法使用 Gradient Descent。


Accuracy vs. Cross Entropy

因此,在分类问题中,我们不直接优化 Accuracy,而是使用一个可微分的替代品 (Proxy),最常用的就是交叉熵 (Cross Entropy)

计算 Cross Entropy 的步骤:

  1. Softmax:将模型输出的原始分数(如 [2.0, 1.0])通过 Softmax 函数,转换成一个概率分布(如 [0.73, 0.27]),确保所有值都在 0 到 1 之间,且总和为 1。

  2. One-hot Label:将正确答案(如类别二)也转换成一个概率分布,即 [0, 1]。

  3. Cross Entropy:计算这两个概率分布([0.73, 0.27] 和 [0, 1])之间的交叉熵。

这两个分布越接近,Cross Entropy Loss 就越小。这个 Loss 是平滑且可微的,因此我们可以用它来进行 Gradient Descent。

  • 改了哪一步? 步骤一,改变了 Loss 的定义。

  • 带来什么好处? 更好的 Optimization (或者说,使 Optimization 成为可能)。

  • 注意事项: 这对 Generalization 可能是有害的。因为我们训练时优化的目标 (Cross Entropy) 和我们最终在验证/测试时关心的目标 (Accuracy) 不一致,这凭空制造了一个额外的误差 (Gap)。


数据 (Data) 与损失

我们定义的总损失 $L$ 是所有训练资料损失的总和,所以资料也是 Loss 定义的一部分。

搜集更多资料

克服 Overfitting 最直接粗暴的方式就是搜集更多的资料。

  • 改了哪一步? 步骤一,改变了 Loss 定义(Summation 范围变了)。

  • 带来什么好处? 更好的 Generalization

  • 注意事项: 它对 Optimization没有帮助的。资料越多,你要找到一个能满足所有资料的函数就越困难,Optimization 只会变得更难。


数据增强 (Data Augmentation)

如果不能搜集更多资料,我们可以自己创造,即 Data Augmentation

  • 影像:将鸟的图片左右翻转(它仍然是鸟),或者变模糊(它仍然是鸟)。

  • 语音:将男声转为女声,或改变音量。

  • Mixup:一个神奇的方法。把一张猫的图片和一张狗的图片按 0.5:0.5 的比例叠加,那么它的正确答案也变成了 50% 的猫和 50% 的狗。

注意:Augmentation 必须符合常理。如果你的任务是判断鸟头的朝向(向左/向右),你就不能做左右翻转。

  • 改了哪一步? 步骤一,改变了 Loss 定义(增加了新的数据点)。

  • 带来什么好处? 更好的 Generalization

  • 注意事项: 同样,它对 Optimization 没有帮助,只会让优化更困难。


半监督学习 (Semi-supervised Learning)

我们也可以利用未标注 (Unlabeled) 的资料来改变 Loss。这称为半监督学习 (Semi-supervised Learning)。

这需要基于一些假设。例如:

  1. 假设一 (非黑即白):我们希望模型对 Unlabeled 资料的输出是“确定”的,即它的概率分布应该很“尖”(例如 [0.99, 0.01]),而不是“模糊”的(例如 [0.5, 0.5])。我们可以通过最小化输出分布的 Entropy (熵) 来实现这一点。

  2. 假设二 (物以类聚):相似的输入(如两张很像的狗的图片)应该有相似的输出。

  • 改了哪一步? 步骤一,改变了 Loss 定义(加入了 Unlabeled Data 的损失项)。

  • 带来什么好处? 更好的 Generalization

  • 注意事项: 它对 Optimization 没有帮助。


正则化 (Regularization):对参数的偏好

我们也可以定义一些与资料无关的 Loss,它单纯反映我们人类对于参数的偏好。

假设有两个函数,它们在三笔训练资料上的 Loss 都为零。

  • 函数 A:比较平滑。

  • 函数 B:振荡非常剧烈。

我们通常更偏好那个更平滑、更简单的函数 (函数 A)。

在实作上,“简单”通常被定义为:希望参数 $\theta$ 的数值越接近零越好。

这通过 L2 Regularization 实现。我们往 Loss 里增加一项 $\lambda \sum (\theta_i)^2$,即所有参数的平方和,并希望它越小越好。

  • L2 Regularization 与权重衰减 (Weight Decay)

    当我们把 L2 Regularization 这一项加到 Loss ( $L' = L + \lambda R$ ) 中,并计算它的梯度时,会发现它等价于在每一步更新参数时:

    $$ \theta^{t+1} = (1 - \eta' \lambda) \theta^t - \eta g^t$$

    (其中 $g^t$ 是原先 $L$ 的梯度)

    这相当于,在用梯度更新参数之前,先给 $\theta^t$ 乘上一个小于 1 的系数(如 0.999),让它“衰减” (Decay) 一点。这个操作就叫做权重衰减 (Weight Decay)

  • 改了哪一步? 步骤一 (L2 Regularization) 或 步骤三 (Weight Decay)。

  • 带来什么好处? 更好的 Generalization

  • 注意事项: 它对 Optimization有害的,因为它让优化变得更难。


AdamW

AdamW 就是把 Weight Decay (W) 的思想正确地加入到 Adam 中。

  • 改了哪一步? 步骤三,改进了 Optimizer。

  • 带来什么好处? 结合了 Adam 强大的 Optimization 能力和 Weight Decay 带来的 Generalization 好处。


5. 总结

今天讲了非常多的技巧。如果你没听进去太多细节,请至少记住这个表格(或这个思考框架):

技巧 改变了哪一步? 主要好处 (Optimization / Generalization)
Adam / RMSProp 步骤三 (Optimization) Optimization (更快找到低 Training Loss)
Dropout 步骤三 (Optimization) Generalization (缓解 Overfitting)
Pre-training 步骤三 (Initialization) Optimization + Generalization
CNN 步骤二 (Architecture) Generalization (利用 Domain Knowledge 缩小范围)
Skip Connection 步骤二 (Architecture) Optimization (缓解梯度消失)
Normalization 步骤二 (Architecture) Optimization (平滑 Loss) + Generalization (轻微)
Cross Entropy 步骤一 (Loss) Optimization (使其可微分)
Data Augmentation 步骤一 (Loss / Data) Generalization (增加数据多样性)
L2 / Weight Decay 步骤一 / 步骤三 Generalization (偏好简单模型)

当你听到一个新方法时,一定要想想看,这个方法到底是改了机器学习三步骤的哪一个?它到底是为了 Optimization 设计的,还是为了 Generalization 设计的?如果你能理解这件事,那么今天这堂课你就不虚此行。


好的,今天的课就上到这边。

AI 前线

只靠国产算力与开源数据,端侧模型预训练行不行?我们做到了全流程开源

2025-12-23 22:49:59

AI 前线

对话余凯:世界不止刀光剑影,是一部人来人往的江湖故事

2025-12-23 22:50:49

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索