AI 学习笔记: 深度学习的训练与评估

[!NOTE] 笔记说明

这篇笔记对应的是《[[关于 AI 的学习路线图]]》一文中所规划的第二个学习阶段。其中记录了我对深度学习训练过程的具体理解:从损失函数到优化器,再到训练诊断与调优策略。同样的,这些内容也将成为我 AI 系列笔记的一部分,被存储在本人 Github 上的计算机学习笔记库中,并予以长期维护。

在《[[AI 研究方法的演变]]》那篇笔记中,我已经基于各种 AI 研究方法中所使用的数学模型,系统性地介绍了 AI 在不同的发展阶段所暴露的能力边界。接下来的任务,是沿着学习路线图所规划好的坐标系继续往下走,把注意力由了解能力边界转向理解工作机制。具体来说,这篇笔记将要讨论的主题如表 1 所示:

主题 要讨论的内容
函数逼近视角下的神经网络 如何用数学视角给出神经网络的基础定义。
损失函数 如何对训练目标进行标准化描述。
优化过程 如何用反向传播与优化器谱系进行 AI 训练。
训练动力学 如何用训练曲线与评估方法进行成果诊断。
调优策略 如何用调优策略解决训练中的问题。
能力边界与判断力 如何用工程视角判断 LLM 的能力边界。

表 1 这篇笔记要讨论的主题及其内容

需要首先说明的是,我们在这里讨论上述主题时并不打算讨论 LLM 训练使用的具体架构、框架以及其他与 LLM 实现细节相关的问题(关于这部分的内容,读者可参考《[[Transformer 架构详解]]》、《[[PyTorch 学习笔记]]》这两篇笔记),因为眼下的侧重点是理解 LLM 的训练过程本身。换言之,这篇笔记的任务是用数学模型解释基于深度学习的训练机制,这其中关心的问题是参数空间的更新机制、损失函数的梯度流向、训练曲线的收敛与发散。虽然这些在 LLM 的训练完成之后就不再可见,但它们决定了 LLM 在被调用时的行为上限。

至于提示词的编写、上下文的管理、LLM 的输出解析,这些都是在使用 LLM 时要学习的内容,如今的大多数 LLM 使用者学习的都是这部分内容。但只有掌握了上述内容,我们才能解释为什么相同的提示词在不同 LLM 上行为差异巨大,而这些才是工程上反复出现的问题。总而言之,我接下来要做的工作是接着《[[AI 研究方法的演变]]》这篇笔记中所做的学习思路,继续尽可能地使用 数学模型 → 典型应用 → 暴露的边界 的论述方式将 LLM 训练成果中的 “内部黑箱” 翻译成可诊断的工程现象。

神经网络:通用函数逼近器

在《[[AI 研究方法的演变]]》那篇笔记中,我们从方法论演变的角度出发,为读者解释了 AI 当前主流的研究方法为什么会走向深度神经网络。简而言之,就是在符号主义方法难以穷尽现实世界的复杂规则,而传统统计学习方法又高度依赖人工特征工程的情况下,深度神经网络在后一问题上为人们提供了一种激进的解决方案:减少对人工设计特征的依赖,让 AI 自己从数据中学习特征表示。现在,让我们来具体了解一下这个解决方案背后所依赖的数学原理。

通用逼近定理

通用逼近定理(Universal Approximation Theorem)是在理解神经网络的函数表示能力方面最重要的基础理论之一。 1989 年,乔治·塞本科(George Cybenko)的研究证明了,对于使用 sigmoid 类激活函数的单隐藏层前馈神经网络,只要隐藏神经元数量足够多,就可以在任意紧集上以任意精度逼近任意连续函数。此后,库尔特·霍尼克(Kurt Hornik)的研究进一步将这一结论推广到了更广泛的激活函数条件。到了 1993 年,摩谢·莱什诺(Moshe Leshno)等人的工作又进一步严格证明,对于单隐藏层前馈神经网络而言,连续的非多项式激活函数是保证通用逼近性质的充要条件。ReLU 作为典型的非多项式激活函数,其通用逼近性质在 Hornik (1991) 的框架中已被涵盖,莱什诺等人的工作则为此提供了更精确的理论刻画。

根据上面这一系列证明的结果,我们大致上可以用数学语言将该定理描述为:对于给定紧集 \(\mathcal{X}\) 上的任意连续目标函数,只要神经网络具有足够的隐藏单元,并采用满足通用逼近条件的激活函数,就能够在任意给定的误差范围内逼近这个函数。换言之就是,对任意连续的目标函数 \(f^* \in C(\mathcal{X}, \mathbb{R})\),以及任意的 \(\epsilon>0\),都存在某个神经网络函数 \(f_\theta\),可使得:

\[\forall f^* \in C(\mathcal{X}, \mathbb{R}),\quad \forall\epsilon>0,\quad \exists\theta\in\Theta,\quad \sup_{x\in\mathcal X} |f_\theta(x)-f^*(x)|<\epsilon \]

其中,\(\mathcal{X}\subseteq\mathbb{R}^n\) 是一个紧集,\(f^*:\mathcal{X}\rightarrow\mathbb{R}\) 是给定的连续目标函数,\(f_\theta\) 则属于神经网络所表示的参数化函数族,它们的关系可被简化如下:

\[\mathcal{F} = \{f_\theta\mid\theta\in\Theta\} \]

在这里,\(\theta\) 代表的是神经网络中的全部可训练参数,包括权重与偏置。这个定理所说明的核心事实是:在满足既定条件的情况下,神经网络具有足够强的函数表示能力,可以对任意连续目标函数进行任意精度的近似。不过,我们在这里需要特别提醒读者一件事:通用逼近定理证明的是神经网络的表示能力,不是可学习性。换言之,该定理只是证明了确实存在一组参数,可以让神经网络在理论上无限逼近目标函数。但它并没有告诉我们应该如何找到这组参数,也无法保证一定存在可以高效找到这组参数的优化算法。

除此之外,通用逼近定理同样也无法直接告诉我们某一具体的训练任务是否容易,它使用的数据是否足够、计算成本是否可接受,以及得到的 LLM 能否很好地泛化到训练数据之外。这些问题属于优化、统计学习和泛化理论需要进一步研究的内容。这一点也呼应了《[[AI 研究方法的演变]]》中关于 “通用逼近能力” 的讨论:函数逼近能力是神经网络能够完成复杂任务的重要前提,但它本身并不是任务成功的充分条件。为了进一步理解这种表示能力在实际工程中的边界,我们可以把神经网络形式化为一个参数化函数:

\[f_\theta:\mathcal{X}\rightarrow\mathcal{Y}, \qquad \theta\in\Theta \]

在上述映射中,\(\mathcal{X}\) 是输入空间,例如 \(28\times28\) 的灰度图像;\(\mathcal{Y}\) 是输出空间,例如 10 个数字类别对应的概率分布;\(\Theta\) 则是参数空间,即所有可能的权重与偏置所构成的高维空间。从这个视角可以看出,基于神经网络的训练,其实就是使用某种优化算法在参数空间 \(\Theta\) 中寻找一组能够使损失函数取得较小值的参数 \(\theta^*\):

\[\theta^*=\arg\min_{\theta\in\Theta}\mathcal L(\theta) \]

请注意,这里的 \(\arg\min\) 是对理想化目标的形式化表达,实际训练过程通常只能通过迭代优化的方式寻找一个表现良好的参数,这并不意味着它一定能够求得全局最优解。因此,我们可以把神经网络的能力问题进一步拆成几个不同的层面:

\[\boxed{\text{表示能力} \neq \text {可学习性} \neq \text{泛化能力} \neq \text{任务成功}} \]

在深度学习的语境中,表示能力解决的是 “理论上能不能表示”,可学习性解决的是 “能不能通过训练找到”,泛化能力解决的是 “对未见数据是否仍然有效”,而任务成功代表的则是 “它是否真正满足了实际问题的要求”。

典型应用:多层感知机

既然神经网络可以被看作是参数化的函数族,那么它具体是如何实现 “输入图像、输出各分类的概率” 的呢?在专业术语中,这一计算过程被称为前向传播(Forward Propagation)。用数学语言来描述就是:对于给定输入 \(x\) 和当前参数 \(\theta\),程序会按计算图(Computational Graph)的拓扑序依次执行矩阵乘法、加偏置、激活等运算,最终得到输出。下面,我们以使用多层感知机(MLP)完成 MNIST 手写数字分类的应用为例,通过演算的形式来直接感受一下神经网络的工作过程。

\[h^{(0)} = x \]

\[h^{(l+1)} = \sigma\!\left(W^{(l)} h^{(l)} + b^{(l)}\right), \quad l = 0, 1, \dots, L-1 \]

\[\hat{y} = \text{softmax}\!\left(W^{(L)} h^{(L)} + b^{(L)}\right) \]

在这里,\(x \in \mathbb{R}^{784}\) 是将 \(28 \times 28\) 灰度图拉平后的向量,\(W^{(l)} \in \mathbb{R}^{d_{l+1} \times d_l}\) 和 \(b^{(l)} \in \mathbb{R}^{d_{l+1}}\) 是第 \(l\) 层的权重矩阵和偏置向量,\(\sigma\) 是非线性激活函数(如 ReLU),\(h^{(l)}\) 是第 \(l\) 层的隐藏表示,\(\hat{y} \in \mathbb{R}^{10}\) 是 10 个数字类别的预测概率分布。下面,让我们再通过图 1 来展示一下上述数学语言所描述的前向传播过程。

多层感知机中的前向传播过程

图 1 多层感知机中的前向传播过程

从上面这张图中,读者可以非常直观地看到这个多层感知机应用的整个计算过程,它的每一层都在做以下两件事:

  1. 把上一层的表示 \(h^{(l)}\) 通过 \(W^{(l)} h^{(l)} + b^{(l)}\) 投影到一个新的空间,这一步被称为仿射变换(Affine Transformation)。
  2. 通过 \(\sigma\) 函数把该线性结果折一下,以便让 AI 模型能表示非线性关系。

这意味着,如果层与层之间只有仿射变换,无论堆叠多少层,最终都仍然等价于一个单层仿射变换。这是因为多个仿射变换的复合仍然是仿射变换。所以在这里,\(\sigma\) 函数才是让神经网络的 “深度” 能够产生超越单层仿射变换的表达能力的关键。最经典的反例是XOR 问题:XOR 仅在两个输入取值不同时输出 1,其四个输入点无法用一条直线分开,因此无隐藏层的线性感知机无法正确分类。Minsky 与 Papert 在 1969 年系统揭示了这类感知机的表示局限。含隐藏层且使用非线性激活的 MLP 可以把 XOR 的输入映射到一个线性可分的表示空间,从而完成分类。对函数逼近能力而言,增加网络深度只有在层间包含非线性变换时才有意义,如图 2 所示。

感知机的局限:线性可分与 XOR 问题

图 2 感知机的局限:线性可分与 XOR 问题

需要特别强调的是:通用逼近定理告诉我们,含一个隐藏层且足够宽的前馈网络就能逼近任意连续函数;而 Eldan & Shamir(2016)、Telgarsky(2016)等关于深度分离(Depth Separation)的研究进一步证明,对某些特定函数类,深网络可以用远少于浅层网络的参数完成表示。不过,这些结论依赖特定的函数类别与网络条件,尚不能构成对所有实际深度网络参数效率的统一解释。至于计算图本身,它不只是教学工具,也是许多自动微分系统的重要基础。框架可以记录或构建计算过程中的依赖关系,并据此在反向阶段计算梯度。关于这一点,我们稍后会详细讨论。读者目前只需要记住:从工程实现角度,可以把神经网络理解为一张主要由可微运算组成的计算图,训练则是在其中调整可训练参数。

暴露的边界

基于上述数学视角,读者应该可以很直观地理解到:基于神经网络的 AI 训练本质上就是基于一个参数化的函数族在寻找它的最佳参数。但同样的,这种视角也同时暴露出神经网络在工程实现上绕不开的三个能力边界。

  1. 表示能力 ≠ 可学习性。通用逼近定理证明的是,在满足一定条件的情况下,网络的函数族中存在能够逼近目标函数的成员;但它并没有告诉我们如何通过有限数据和具体的优化算法找到这样的参数。另外,优化过程本身也存在诸多困难,例如损失函数的非凸性、梯度传播问题以及优化算法的计算效率等。通用逼近定理并不能保证具体的优化算法能够在有限计算资源下找到一组足够好的参数。这就是为什么 “理论可表示” 和 “实际能训出来” 是截然不同的两件事,我们到目前为止只讨论了前者,而后者是优化过程要解决的问题。

  2. 高维空间中的几何直觉变得有限。通常,我们对二维平面上的函数优化会具有比较直观的几何认识,但现代神经网络的参数空间往往具有极高维度,损失函数也通常具有复杂的非凸结构。在这样的空间中,仅凭二维甚至三维空间中的几何直觉,很难直接判断训练过程为什么能够找到一个有效的参数区域。另一方面,为了理解高维输入数据本身的结构,人们提出了包括流形假设(Manifold Hypothesis)在内的各种理论视角。即我们假设在很多真实任务中,尽管输入空间 \(\mathcal{X}\) 维度极高,但有意义的数据其实分布在一个低维流形上。这意味着神经网络实际需要学习的函数,其有效定义域远小于 \(\mathcal{X}\) 的标称维度。当然了,这些理解视角目前的依据依然是一个经验性假设,而非普遍成立的定理,但它提供了一种理解高维数据结构的有用视角,也有助于解释为什么在某些实际任务中,模型并不需要在整个高维输入空间上都学习出复杂的函数关系。

  3. 正确的输出 ≠ 学到了我们认为的规则。这是《[[AI 研究方法的演变]]》在符号主义与联结主义交锋时提出的那个更深层的问题。在满足一定条件的情况下,神经网络可以逼近非常广泛的函数,但这种函数逼近能力本身并不能告诉我们模型究竟学到了什么。一个模型即使能够在未见数据上取得良好的预测结果,我们也不能仅凭这些输入输出行为断定,它究竟形成了我们所理解的“规则”,还是利用了某些训练数据中的统计关联。换言之,模型能够稳定地产生正确输出,并不意味着我们已经理解了它产生这些输出的内部机制。

这也是神经网络与传统符号系统之间一个值得进一步讨论的区别:对于显式编码的规则系统,我们通常可以直接检查规则本身;而对于神经网络,大量知识和行为模式分布在海量参数及其相互作用之中,即使我们完整知道这些参数的数值,也未必能够直接解释某个具体行为究竟是如何产生的。

损失函数:训练目标的标准化

在上一节中,我们用数学语言将神经网络形式化成了一个参数化的函数族 \(f_\theta: \mathcal{X} \to \mathcal{Y}\),并指出用它训练 LLM 的本质就是在 \(\Theta\) 这个高维空间中寻找一组 “足够好” 的参数 \(\theta^*\)。但对于足够好的标准是什么,还是一个亟待解决的问题。毕竟,考虑到算力成本等现实因素,我们在训练 LLM 的过程中不太可能盲目地、反复地去修改 \(\theta\)。

损失函数的定义

如果想要解决上述问题,我们需要定义一个可计算的信号来衡量 LLM 在当前参数下表现的好坏。在深度学习的语境中,我们将这个用于衡量预测误差的函数称为损失函数(Loss Function),它大多数情况下是一个从 “真值-预测值” 的笛卡尔积空间到实数的函数(其中常见损失如 MSE、交叉熵、hinge loss 通常取非负值;但损失函数的一般数学定义并不强制 \(\mathcal{L}\ge 0\),一些对抗性或基于能量的损失函数允许在特定取值下为负),具体数学定义如下。

\[ \mathcal L:\mathcal Y\times\hat{\mathcal Y}\to\mathbb R \]

在这里,\(y\) 是真值标签。需要特别指出的是,LLM 的原始输出 \(\hat{y} = f_\theta(x)\) 在分类与序列建模等概率性任务中通常是未经归一化的分数(例如分类层的线性输出)。在专业术语中,我们称该原始分数为 logits。如果将 \(\mathcal{L}\) 定义为“以概率分布为第二参数”的函数(即 \(\hat{\mathcal Y}\) 理解为概率分布空间,如词表上的概率单纯形 \(\Delta^{|\mathcal V|-1}\),其中 \(|\mathcal V|\) 为词表大小),那么 logits 不能直接代入,需要先经过 softmax(在 LLM 词表预测等多分类任务中常用)或 sigmoid(在二分类任务中常用)映射为概率分布。需要注意的是,这一限制是数学定义层面的约定;工程实现中 PyTorch 等框架的 CrossEntropyLoss 通常直接接收 logits,并在内部合并完成 log_softmax 与 NLL 的计算,数值稳定性更优。

\[p_\theta(y \mid x) = \operatorname{softmax}\bigl(f_\theta(x)\bigr)_y \]

因此我们在涉及描述概率性任务的损失函数时,以交叉熵/NLL 为例,更严谨的写法是采用以概率分布 \(p_\theta(\cdot \mid x)\) 为第二参数的 \(\mathcal{L}\)(需注意概率性任务的损失并不局限于交叉熵;例如 KL 散度在已知目标分布时也可使用——它与交叉熵仅差一个与模型参数无关的常数项,MSE 也可用于某些概率预测场景,但交叉熵/NLL 仍是监督学习中最常见的概率性损失),具体数学定义如下:

\[\mathcal{L}_{\mathrm{NLL/CE}}\bigl(y,\, p_\theta(\cdot \mid x)\bigr) = -\log p_\theta(y \mid x) \]

\(\mathcal{L}\) 返回的是实数值(对于 MSE、交叉熵等常见损失通常为非负),用于描述 LLM 的 “这一次预测偏离真值有多远”。接下来,如果我们对数据集 \(\mathcal{D}\) 中每个样本的预测损失取平均,就会得到如下经验风险(Empirical Risk) 函数:

\[R_{\mathcal{D}}(\theta) = \frac{1}{N} \sum_{i=1}^{N} \mathcal{L}\bigl(y_i,\, p_\theta(\cdot \mid x_i)\bigr) \]

如果想更形式化一点,我们还可以用 \(\hat P_{\mathcal D}\) 来表示有限数据集 \(\mathcal D\) 上的经验分布(即 Empirical Distribution,简单来说,就是把训练集中的每个样本赋予 \(\frac{1}{N}\) 的概率),那么上述函数也可以被具体化为在该经验分布上的期望损失,其数学定义如下:

\[R_{\mathcal{D}}(\theta) = \mathbb{E}_{(x, y) \sim \hat{P}_{\mathcal{D}}}\left[\mathcal{L}\bigl(y,\, p_\theta(\cdot \mid x)\bigr)\right] = \frac{1}{N} \sum_{i=1}^{N} \mathcal{L}\bigl(y_i,\, p_\theta(\cdot \mid x_i)\bigr) \]

需要特别指出的是,经验风险函数只能用来刻画 LLM 在训练集上的平均损失,并不能直接反映它在真实数据分布上的表现。如果用 \(P\) 表示真实的数据分布,那么其期望风险(Expected Risk)函数的数学定义应为:

\[R_{P}(\theta) = \mathbb{E}_{(x, y) \sim P}\left[\mathcal{L}\bigl(y,\, p_\theta(\cdot \mid x)\bigr)\right] \]

由于经验分布 \(\hat{P}_{\mathcal{D}}\) 通常只是对真实分布 \(P\) 的有限样本近似,因此经验风险与期望风险之间通常会存在差异。二者之差通常称为泛化间隙(generalization gap):

\[\boxed{R_P(\theta) - R_{\mathcal{D}}(\theta)} \]

需要区分的是,“泛化间隙” 与 “泛化误差” 两个术语在不同文献中常被混用,含义并不完全统一:

  • 泛化间隙(generalization gap):期望风险与经验风险之差 \(R_P(\theta)-R_{\mathcal{D}}(\theta)\),本节采用此定义;
  • 泛化误差(generalization error):在多数文献中指期望风险 \(R_P(\theta)\) 本身(即模型在真实分布上的风险),但部分作者也用它泛指“未观测数据上的预测误差”。本节按前者理解。需注意它与“测试误差”并不等同——测试误差是测试集上的经验风险,常作为泛化误差的估计,但二者并不严格相等。

另外,泛化间隙在数值上不一定为正,因为经验风险也可能高于期望风险(例如训练数据中存在标注噪声或采样偏差),所以我们在称其为 “差” 时需注意方向性。它衡量真实分布上的期望风险 \(R_P(\theta)\) 与训练集上的经验风险 \(R_{\mathcal{D}}(\theta)\) 之差(如上式所示),也是泛化理论所研究的核心对象。至于这种差异在实际训练过程中如何形成、变化,我们稍后会在后面的 “训练动力学” 一节中做进一步讨论。

从上述函数中,我们可以很直观地看到,在预训练与 SFT 阶段,LLM 的训练目标通常可以近似写成经验风险加正则项的最小化:

\[\boxed{\min_\theta R_{\mathcal{D}}(\theta) + \lambda\,\Omega(\theta)} \]

其中 \(\Omega(\theta)\) 通常指显式参数正则项(如 L2 正则、权重衰减),\(\lambda\) 控制其强度;在标准 SGD 下 L2 正则与权重衰减近似等价,但在 Adam 等自适应优化器中二者并不等价,后来还出现了显式将二者解耦的 AdamW 变体。Dropout、早停等属于隐式正则或训练策略,通常并不直接写入 \(\Omega(\theta)\)。另外,我们在这里还需要特地补充两个重要的工程现实:

  1. 实际优化通常是基于小批量的随机优化(mini-batch SGD / Adam 等),而非对完整经验风险的精确最小化;
  2. 对齐阶段(如 RLHF、DPO 等)并非简单最小化经验风险,而是引入偏好信号与策略约束的更复杂目标。关于这部分的内容,我们稍后会在 “补充路线” 一节中详细讨论。

总而言之,损失函数的作用就是把这些训练目标标准化成可计算的损失信号。即无论我们想让 LLM 做什么,通常都需要先用数学的形式定义出一个可优化的方向,否则优化器就会感到无从下手。

当然了,这个标准化的训练范式背后藏着一个容易被混淆的不对称理解:LLM 训练时的优化目标(由损失函数构造出的经验风险)与它上线时的评估指标(业务指标),通常是两套不同的标准。。比如,在预训练和 SFT 阶段,我们在训练 LLM 时主要优化的确是基于下一个 token 预测的交叉熵(Cross Entropy),而用户关心的则是 LLM 回答的内容是否有用、是否安全;但在 RLHF、DPO、安全对齐等后训练阶段,训练目标则变为奖励最大化、偏好损失、KL 正则等,不再是单纯的下一 token 交叉熵。这种 “训练目标 vs 评估指标” 的脱节,确实是这一训练范式存在的能力边界,二者通常不同,对齐训练会部分缩小这种脱节,但不能完全消除。

典型应用:从回归到序列的损失函数族

下面,让我们沿着任务类型的演变,罗列一下在实际工程中最常用的那些损失函数族。

  • 回归任务:这类任务要处理的是连续值预测问题,常用到以下三类损失函数:

    • 均方误差(Mean Squared Error, 简称 MSE):\(\mathcal{L} = (y - \hat{y})^2\)。该函数对大误差惩罚重(平方放大),但对异常值敏感。
    • 平均绝对误差(Mean Absolute Error, 简称 MAE):\(\mathcal{L} = |y - \hat{y}|\)。该函数对异常值更鲁棒,但在零点处不可导,需要次梯度处理。
    • Huber 损失:该函数在小误差时表现为 MSE,在大误差时表现为 MAE,是两者的折中,常用于带噪声的回归场景。
  • 分类任务:这类任务要处理的是概率分布预测问题,常用到的是叫交叉熵的损失函数:

    \[\mathcal{L}_{\mathrm{CE}} = -\sum_{c=1}^{C} y_c \log \hat{y}_c \]

    直觉上,交叉熵衡量的是模型预测分布 \(\hat{y}\) 对真实目标分布 \(y\) 的概率赋值情况:预测越倾向于真实类别,交叉熵通常越小。对于二分类任务,该函数会退化为二元交叉熵(Binary Cross Entropy, 简称 BCE)函数;而对于多分类任务,该函数通常需要与 softmax 配合使用。LLM 的预训练本质上就是一个大规模多分类问题(在词表上预测下一个 token 的分布),因此交叉熵函数构成了当前主流自回归 LLM 预训练的标准训练损失。

  • 序列对齐任务:这类任务要处理的是变长与对齐问题,常用到以下损失函数:

    • CTC(Connectionist Temporal Classification):主要用于语音识别、手写识别等需要把不定长输出对齐到定长标签的场景,例如把音频帧序列映射到文字序列;与当前主流自回归 LLM 的训练链路关系较远,列出仅供参考。CTC 通过引入 “空白” token 来处理对齐不确定性,无需显式标注每一帧对应的字符。
  • 训练正则化策略:下面这一类做法本身并不构成一种独立的损失函数,而是通过修改目标分布、权重或调制因子来间接改变损失函数实际优化的对象。这一区分有助于理解为什么“损失函数”在工程中通常不是单一公式,而是一组围绕优化目标的组合设计。

    • 标签平滑(Label Smoothing):这是一种目标分布的正则化方法,它把原始 one-hot 标签 \(y_c \in \{0, 1\}\) 软化为 \(y' = (1-\epsilon) y + \epsilon / C\),然后仍然使用交叉熵进行优化:

      \[\mathcal{L}_{\mathrm{LS}} = -\sum_{c=1}^{C} y'_c \log \hat{y}_c = -\sum_{c=1}^{C}\!\left[(1-\epsilon)\,y_c + \frac{\epsilon}{C}\right]\log\hat{y}_c \]

      标签平滑的目的是防止模型对训练数据过度自信,从而提升泛化能力。Vaswani et al.(2017)的 Transformer 原始论文在训练中采用了标签平滑。

对于 LLM 而言,词表设计会直接影响预训练的预测空间、输出层规模以及相应的损失计算成本。为此,我们通常需要展开以下两项工程权衡。

  • LLM 训练链路的词表前置:BPE(Byte-Pair Encoding,字节对编码)与 Subword Tokenization 早在前文提到的 “LLM 预训练 = 在词表上预测下一个 token 的分布”,但词表本身从何而来?这是 LLM 训练链路上绕不开的前置工程。BPE、WordPiece 和 Unigram 等方法都可用于构建子词词表;不同模型会根据语料、语言和工程目标选择不同方案。BPE 从字符或字节级表示出发,反复合并语料中频率较高的相邻单元,直到词表规模达到设定阈值。Subword Tokenization是这类方法的统称,介于 “字符级”(词表较小、序列较长)与 “词级”(词表较大、容易产生未登录词)之间。其工程收益有三。

    • 一是把生僻词、专有名词拆成已有单元,显著缓解未登录词问题;
    • 二是词表规模可控,使得 softmax 层的计算与显存占用能够在序列长度和词表容量之间取得平衡;
    • 三是合适的子词设计可以改善多语言共享词表的效率。

    BPE 最早作为 1994 年的无损压缩算法提出,后来被引入神经机器翻译和大语言模型的词表构建。理解这一点后,前述那句话的完整含义才清晰:模型实际是在当前 tokenizer 定义的词表上学习分类分布。

  • 词表规模的工程权衡:词表大小不是越大越好,它会直接影响交叉熵的计算量和序列的长度。

    • 词表越大,softmax 层 \(W \in \mathbb{R}^{d \times |V|}\) 的参数与计算量越大;
    • 词表越小,文本通常需要更多 token 表示,序列变长会抬升 Transformer 自注意力的 \(O(N^2)\) 计算量与显存开销。

    以中文为例,1000 个汉字最终会被切分成多少 token,取决于具体 tokenizer、训练语料和词表规模,不能用一个固定比例代表所有模型。当代模型的词表规模差异也很大,从数万到十万以上都有;工程设计本质上是在 softmax 成本、序列长度、多语言覆盖和模型效果之间权衡。这是“损失函数”一节所暴露的“训练目标与计算成本耦合”在词表层面的具体表现。

任务族 代表损失 数学形式(简记) 适用任务 工程特点
回归 MSE / L2 \(\tfrac{1}{N}\sum(y-\hat{y})^{2}\) 数值预测(房价 / 温度) 对异常值敏感;梯度随误差线性放大
回归 MAE / L1 \(\tfrac{1}{N}\sum\lvert y-\hat{y}\rvert\) 鲁棒回归 对异常值鲁棒;\(0\) 处不可导
回归 Huber 分段:MSE(小误差)/ MAE(大误差) 平衡鲁棒性与可导性 引入 δ 阈值作为额外超参
分类 交叉熵(多类) \(-\sum_{c} y_{c} \log \hat{y}_{c}\) 多类分类(图像分类) 与 softmax 配合使用;梯度形式简洁
分类 二元交叉熵(BCE) \(-[y\log\hat{y} + (1-y)\log(1-\hat{y})]\) 二分类(情感分析) 配合 sigmoid;类别不平衡需加权
分类 Focal Loss \(\boxed{\mathcal{L}_{\mathrm{focal}} = -\sum_c (1-\hat{y}_c)^{\gamma} y_c \log\hat{y}_c}\) 不平衡分类(目标检测) γ 调制因子降低“易样本”权重
序列 交叉熵(per-token) \(-\sum_{t}\log p_{\theta}(x_{t}\mid x_{<t})\) 语言建模 / SFT 与 token 级 perplexity 直接对应
序列 对比损失(InfoNCE) 拉近正样本、拉远负样本 表征学习 / 检索增强 需构造正负样本对
序列 RLHF 目标 KL 约束 + 奖励最大化 对齐训练 训练不稳定;实现复杂

表 2 损失函数族对比

正如读者所见, 从回归到分类再到序列生成,损失函数的选择在形式上是从「逐点度量误差」逐步过渡到「逐 token 度量概率」「逐 response 度量偏好」。这个谱系同时也是模型能力从“拟合数值”到“生成文本”再到“对齐人类意图”的工程缩影——当模型需要学习一种新的能力时,工程上通常需要重新审视现有训练目标是否能够有效刻画这种能力;必要时,则需要引入新的损失函数或优化目标。这也是后续补充路线中 RLHF / DPO 等对齐训练的核心思路:这些对齐方法并不是简单替换预训练阶段的交叉熵,而是在后训练阶段引入新的偏好优化目标。具体地,RLHF 通常形式化为带 KL 约束的期望奖励最大化(先训练奖励模型,再用 PPO 等策略梯度算法优化语言模型策略);DPO 则从同一目标出发,导出直接基于偏好数据的二元分类式损失,不再显式训练奖励模型或执行强化学习。

暴露的边界

基于上述对损失函数的形式化与典型应用的梳理,读者可以直观地看到:损失函数虽然会直接影响 LLM 训练所优化的方向,但也同时暴露出三个在工程实现上绕不开的边界。

  1. 错误损失 → 错误目标。损失函数定义的是 LLM 在预测错误时被惩罚的方式,这种方式的选择不当会让优化方向偏离任务需求。例如,如果在包含大量异常值的回归任务中使用 MSE 函数,可能就会让少数极端样本因平方项而主导梯度;在关心结果次序的排序任务中只使用用于点式分类的损失函数,LLM 虽然可能降低分类误差,但这并没有改善真正重要的排序质量。总而言之,损失函数选错了,再优秀的优化器也只能把 LLM 带到错的地方。

  2. 损失与评估指标的脱节。训练 LLM 时理论上优化的是经验风险,而实际计算通常使用当前 mini-batch 上的损失作为其随机估计(详见§优化过程 一节),上线时看的是回答的有用性、安全性、事实性(后者既不可微又难以直接优化),二者之间通常存在着不小的认知鸿沟。这一脱节催生了 RLHF(基于人类反馈的强化学习)等对齐方法:以 RLHF 为例,先训练奖励模型把偏好转化为可计算的奖励信号,再用 PPO 等策略梯度算法优化 LLM 策略。RLHF 的引入不是因为偏好目标「不可微」(策略梯度本身不要求奖励对行为可微),而是因为偏好难以形式化为标准监督目标,需要奖励建模作为替代。这个问题会在“训练动力学”一节中以 Goodhart 定律揭示的代理指标失真问题再次出现:当一个指标被直接作为优化目标时,它与原本想衡量的真实目标之间的相关性可能被破坏。延伸讨论见“补充路线:从监督训练到对齐训练”一节。

  3. 不平衡数据下的损失加权。当数据分布严重倾斜时(例如欺诈检测中正样本占比 0.1%),标准交叉熵会使分类模型更容易偏向多数类。这方面常见的工程缓解方案包括:

    • 类别加权:在损失函数中对少数类乘以更大的权重 \(w_c\),即 \(\mathcal{L} = -\sum_c w_c \cdot y_c \log \hat{y}_c\),其中 \(w_c\) 与类别频率成反比。
    • Focal Loss:在交叉熵计算的基础上乘以 \((1 - \hat{y}_c)^\gamma\) 调制因子(简化写法,原始论文中还会引入类别平衡因子 \(\alpha_c\)),让 “已经分对的样本” 贡献更小的损失,迫使模型聚焦于难样本。这是目标检测领域处理正负样本不平衡的经典做法。

    但这些加权策略都属于对错误的补救,不是对问题的根治。如果数据本身的标注质量差或采样偏差严重,再精巧的损失设计也只能在错位的数据上学到错位的模式。虽然类别不平衡在传统分类任务中尤其典型,但这一问题同样提醒我们:LLM 的训练数据也并非天然均衡,数据配比、采样策略和损失设计会共同影响模型最终学到的行为分布。

优化过程:寻找足够好的参数

正如我们之前所说,神经网络在具体的工程实现中其实就是一张可微的计算图。这里的 “可微”,指的是计算图上每个节点(矩阵乘法、加法、激活函数)都可以对其输入求偏导。而我们用它训练 LLM 的目标则由最小化损失函数 \(R(\theta)\) 来进行指导,具体方法就是在 \(\Theta\) 这个高维空间中沿负梯度方向进行迭代。这在专业术语中被称为梯度下降(Gradient Descent)方法。同样的,本节接下来会先介绍优化器的数学原理,再沿 SGD 到 AdamW 的演化谱系展示它在工程化方面的应用,最后再将讨论落到梯度不稳定、优化不等于泛化等优化器在工程实现上的能力边界。

整一个训练循环在工程实现上的骨架可以用下面这张流程图来概括(如图 3 所示):

训练循环流程图

图 3 训练循环流程图

正如读者所见,神经网络的训练过程是「前向传播 → 损失计算 → 反向传播 → 参数更新」四步之间的循环迭代,每次循环都让参数 θ 向使损失下降的方向前进一步;直至达到停止条件后,进入评估与诊断阶段,输出训练好的参数 θ*。这张图所展示的骨架,在本节「优化器的数学基础」与「演化谱系」两个小节中将被反复回扣——前两节会逐个击破骨架中的具体节点,最后一节则会回过头来讨论这张骨架本身的能力边界。

优化器的数学基础

之前介绍的损失函数定义的是 LLM 在整批训练数据上的经验风险,但由于每次都直接对全部的训练数据执行梯度估算在工程实现的代价实在太高,我们通常会选择每次只使用一个小批量(mini-batch)的数据来执行梯度估算,并更新 LLM 的参数:

\[\theta_{t+1} = \theta_t - \eta \nabla_\theta \mathcal{L}_{\text{batch}}(\theta_t) \]

其中,\(\eta\) 是学习率,\(\nabla_\theta \mathcal{L}_{\text{batch}}\) 是当前小批量数据上所执行的梯度估算。这条公式尽管看起来并不复杂,但关键在于如何高效算出每个参数的梯度呢? 对于这个问题,目前常用的解决方案是 [[Transformer 架构详解|反向传播(Backpropagation)]] 算法,即沿计算图反向调用链式法则,如图 4 所示。

反向传播算法的执行过程

图 4 反向传播算法的执行过程

具体来说就是,若第 \(l\) 层的输出 \(h^{(l)}\) 取决于第 \(l-1\) 层的输出 \(h^{(l-1)}\),则根据链式法则,我们可以得到:

\[\frac{\partial \mathcal{L}}{\partial h^{(l-1)}} = \frac{\partial \mathcal{L}}{\partial h^{(l)}} \cdot \frac{\partial h^{(l)}}{\partial h^{(l-1)}} \]

如此逐层反推,就能用一次前向 + 一次反向算出所有参数的梯度。这个算法的时间复杂度与执行一次前向传播算法是同量级的,这正是反向传播是否会成为深度学习标配的根本原因:链式法则把它从数学理论上的可计算变成了工程方面的可实现计算。Rumelhart、Hinton、Williams 在 1986 年的工作把这一思想系统化,就此奠定了深度学习的训练机制,关于其历史脉络,参见《[[AI 研究方法的演变]]》的对应章节。

当然,尽管反向传播算法可以解决梯度估算在工程上的实现问题,但它同时也存在着以下两种会导致梯度不稳定的特殊情况:

  • 梯度消失(Vanishing Gradient):在深度神经网络中,靠后的梯度要沿链式法则连乘多遍才能传回靠前的层。若中间激活函数的导数小于 1(如 sigmoid 早期),连乘后会快速衰减到零,靠前的层几乎收不到学习信号。
  • 梯度爆炸(Exploding Gradient):若中间导数大于 1,连乘后会指数增长,参数更新剧烈震荡甚至发散为 NaN。

这两类问题在 RNN 里尤为严重,因为 RNN 沿时间步反向传播,相当于在一条非常长的链上反复连乘。现代深度网络通常会搭配使用一种被称为残差连接(Residual Connection)的技术,利用合适的参数初始化、归一化、梯度裁剪和非饱和激活函数来缓解梯度不稳定的问题。残差连接技术会让 “恒等映射” 成为神经网络的默认行为(He et al. 2016 解决的核心问题是深度网络的 “退化问题”,即深度增加时训练误差反升),同时为梯度提供了绕过部分非线性变换的捷径。而激活函数则用于影响每层导数的分布,常见选择包括:

  • ReLU(Rectified Linear Unit,修正线性单元):\(\sigma(x) = \max(0, x)\)。其导数在正区间恒为 1,能缓解 sigmoid 在饱和区造成的梯度消失,但负区间导数为 0,也可能产生 “死亡 ReLU”。ReLU 曾长期是卷积神经网络的常用选择。

  • GELU(Gaussian Error Linear Unit,高斯误差线性单元):\(\sigma(x) = x \cdot \Phi(x)\),其中 \(\Phi\) 是标准正态分布的累积分布函数。GELU 在零点附近采用平滑过渡而非硬截断,在 Transformer 语言模型中被广泛采用,BERT、GPT-2 和 GPT-3 的公开资料都使用了它。

  • SwiGLU(Swish Gated Linear Unit,Swish 门控线性单元):将输入分两路,一路经过 Swish 激活(即 \(\text{Swish}(W_1 x) = W_1 x \cdot \sigma(\beta W_1 x)\)),另一路保持线性,最终做逐元素乘:\(\text{SwiGLU}(x) = \text{Swish}(W_1 x) \otimes (W_2 x)\),其中 \(\otimes\) 表示逐元素乘。SwiGLU 结合门控机制,是 LLaMA、PaLM 等近年大模型的默认选择。

    需要指出的是,尽管 ReLU、GELU 与 SwiGLU 都在改善深层网络的梯度传播和表示能力,但它们的实现机制并不相同:ReLU 使用分段线性非饱和激活,GELU 提供平滑门控,SwiGLU 则把激活与门控结构结合起来。对于具体的深层非线性网络,目前仍缺乏覆盖所有架构与数据分布的训练稳定性保证,因此激活函数通常需要结合初始化、归一化、残差连接和消融实验共同选择。

典型应用:从 SGD 到 AdamW 的演化谱系

反向传播算法给出的是梯度方向,而能决定沿这个方向走多远、以什么方式累积历史信息的,就是优化器了。下面,让我们从 SGD 出发,沿着 AdamW 的演化谱系,看看优化器在工程实践中是如何一步步发展的。

  • SGD(Stochastic Gradient Descent,随机梯度下降)是最简单的优化器,其更新参数的规则为:

    \[\theta_{t+1} = \theta_t - \eta \nabla_\theta \mathcal{L}(\theta_t) \]

    当然,纯 SGD 优化器在执行梯度估算时通常会存在噪声,尤其在高维非凸损失面上,它会像布朗运动一样来回震荡。使用动量(Momentum)方法引入历史梯度的指数滑动平均:

    \[v_{t+1} = \beta v_t + \nabla_\theta \mathcal{L}(\theta_t), \quad \theta_{t+1} = \theta_t - \eta v_{t+1} \]

    如果说得直观一点,我们可以将动量的作用看作是在增加参数更新的 “惯性”(就像小球滚下坡),以便加速收敛并抑制震荡。Nesterov 动量进一步把 先按动量探一步、再在那个位置算梯度 的修正项引入,是凸优化中收敛速度更快的一个变种。

  • AdaGrad / RMSProp / Adam等自适应优化器:不同参数的梯度量级天然差异巨大,有些权重长期小幅更新,有些则剧烈震荡。固定学习率很难同时照顾两类参数。AdaGrad(Adaptive Gradient,自适应梯度)对每个参数维护一个梯度平方的累积和,按参数的历史活跃度反比地缩小其学习率。其优点是稀疏特征友好,缺点是学习率单调下降、可能过早停止学习。RMSProp(Root Mean Square Propagation,均方根传播)改用指数滑动平均缓解 AdaGrad 的过早衰减,Adam(Adaptive Moment Estimation,自适应矩估计)则把动量(一阶矩)和 RMSProp(二阶矩)合二为一,是当前深度学习的默认起点。其更新规则如下:

    \[m_{t+1} = \beta_1 m_t + (1 - \beta_1) \nabla_\theta \mathcal{L}(\theta_t) \quad \text{(一阶矩)} \]

    \[v_{t+1} = \beta_2 v_t + (1 - \beta_2) (\nabla_\theta \mathcal{L}(\theta_t))^2 \quad \text{(二阶矩)} \]

    \[\hat{m}_{t+1} = \frac{m_{t+1}}{1 - \beta_1^{t+1}}, \quad \hat{v}_{t+1} = \frac{v_{t+1}}{1 - \beta_2^{t+1}} \quad \text{(偏差修正)} \]

    \[\theta_{t+1} = \theta_t - \eta \frac{\hat{m}_{t+1}}{\sqrt{\hat{v}_{t+1}} + \epsilon} \]

    其中 \(\beta_1, \beta_2\) 通常取 0.9 和 0.999。偏差修正步骤用于抵消训练初期 \(m_t\)、\(v_t\) 被初始化为零导致的偏差,是 Adam 工程实践中不可省略的一步。Adam 的工程经验是“几乎不需要调学习率”,\(\eta = 10^{-3}\) 在大量任务上都能起步;具体到不同模型类别,BERT 类小模型常用 \(2 \times 10^{-5}\) 量级,ResNet-50 类视觉模型常用 \(10^{-3}\),GPT 类大模型受限于全局 batch size 较大,峰值学习率常被压到 \(3 \times 10^{-4}\) 上下。具体的扫描范围与判定标准将在“调优策略”一节的训练层面小节展开。

  • AdamW:解耦权重衰减。深度学习里常用的权重衰减(Weight Decay)是一种正则化:每步把参数向零拉一点,抑制过拟合。传统实现是直接把衰减项加到损失函数里,再求梯度。但 Adam 的自适应学习率会让衰减项也被 “自适应缩放”,失去了原本的意图。AdamW(Adam with decoupled Weight Decay)的修正是把衰减项从损失里拿出来,直接作用在参数更新上(其更细致的损失函数对比,参见 [[LLM 的微调实验]]):

    \[\theta_{t+1} = \theta_t - \eta \frac{\hat{m}_{t+1}}{\sqrt{\hat{v}_{t+1}} + \epsilon} - \eta \lambda \theta_t \]

    这样权重衰减就不再受自适应学习率的干扰。AdamW 是当前训练 Transformer 系模型的标配。

  • 学习率调度(Learning Rate Scheduling):把训练比作下山:刚开始要大胆迈步(高学习率),接近谷底时要谨慎(低学习率)。学习率调度就是给 \(\eta\) 画一条随训练步数变化的曲线。

    • Warmup:训练最初几千步把 \(\eta\) 从 0 线性升到峰值,避免初期梯度剧烈震荡把参数推到坏区域。
    • Cosine Decay:训练中后段让 \(\eta\) 沿余弦曲线从峰值平滑降到接近零,比阶跃式下降更稳。
    • Linear Decay:把 \(\eta\) 从峰值线性降到 0,实现简单但尾部下降过快。

    当代大模型训练普遍组合:Warmup + Cosine Decay或Warmup + Linear Decay。这两种不是 “原理上最优”,而是“工程上够用”。

优化器 核心更新思想 关键超参 典型适用场景 工程权衡
SGD 沿当前 batch 负梯度方向更新 η 小模型 / 凸问题基线 简单稳定,但收敛慢
SGD + Momentum 累积历史梯度方向作为更新方向 β(≈0.9),η CV 时代 CNN / ResNet 比 SGD 快,但学习率仍需手动调
AdaGrad 自适应学习率:累积梯度平方 η,ε 稀疏梯度场景(NLP 词向量) 学习率单调递减,后期易过小
RMSProp AdaGrad 的指数加权移动版 α(≈0.9),η RNN / 非平稳目标 解决 AdaGrad 学习率消失问题
Adam 一阶动量 + 二阶动量 β₁,β₂,ε,η Transformer 训练事实标准 自适应 + 动量,但 L2 + Adam 不等价于权重衰减
AdamW 权重衰减与梯度更新解耦 β₁,β₂,ε,η,λ 当代 LLM 预训练 / SFT 修正 Adam 的权重衰减耦合问题

表 3 优化器横向对比:

正如读者所见,以上六种主流优化器在更新思想、关键超参、适用场景与工程权衡上的并列梳理。其中 SGD → SGD+Momentum → AdaGrad → RMSProp → Adam → AdamW 的演化谱系可概括为一条主线——「全局学习率 → 自适应学习率 → 自适应学习率 + 正确解耦的权重衰减」。AdamW 是当代 LLM 训练的事实标准,但其相对 Adam 的修正仅在于权重衰减的解耦;这恰好是前文 §3 中“权重衰减 = L2 正则化”等价性被打破的具体表现。理解这条主线,等于拿到了阅读当代训练代码(PyTorch torch.optim.AdamW、DeepSpeed、Hugging Face Trainer)所需的最简背景知识。

暴露的边界

优化过程决定了“参数怎么动”,但它本身也暴露三个工程上绕不开的边界。

  1. 优化 ≠ 泛化。这是最重要的一条边界:训练损失降得越低,测试表现未必越好。这条边界的根源是经验风险的极小点并不等于真实风险的极小点。优化器把 \(\theta\) 带到训练损失最低的位置,但训练数据只是真实分布的一个有偏样本。在这个位置,模型可能“完美拟合了训练数据中的噪声”,却把未见样本的判别能力丢了,这就是过拟合。深度学习中的过拟合不是单一现象:它可能来自数据不足(特征相对样本数过多)、参数过多(表达能力过强)、训练时间过长(被噪声牵着走)。任何调优手段都只能“延缓”过拟合的发生,不能“消灭”它。一旦把优化与泛化当作一件事来处理,工程上会反复陷入“训练集完美 → 测试集崩盘”的死循环。

  2. 鞍点比局部最优更常见。优化器在 \(\Theta\) 这个高维空间里走的是局部路径,每一步只看自己当前点的梯度。这让人担心会不会卡在局部最优。事实上,Dauphin 等人 2014 年的研究指出:在高维非凸损失面上,绝大多数临界点不是局部最优,而是鞍点,形象地说,损失曲面更像一片有褶皱的山地,每个山坳都是一个 “出口”,真正的局部最优反而稀少。这意味着梯度下降一般能持续走出“看起来平”的地方,找到更好的位置。但这个结论有个前提:梯度必须有效传播。一旦进入 “梯度消失区”,优化器看到的全是接近零的梯度,会误以为已收敛,这其实是“假局部最优”,是前述 “梯度不稳定” 小节中激活函数失效在优化阶段的体现。鞍点丰富这一事实,对深度学习是“半个好消息”,它解释了为什么朴素 SGD 在大多数任务上不至于彻底失败。这一损失曲面的高维几何形态如图 5 所示。

    高维损失曲面的鞍点分布

    图 5 高维损失曲面的鞍点分布

  3. 大模型训练损失不收敛不等于效果差。在小模型时代,不收敛意味着代码 bug 或超参数灾难。但在大模型时代,训练损失的不收敛在某些特定设置下是正常的、甚至是必要的。一个值得注意的现象是:当模型规模逼近数据量约束时(即所谓过训练),继续训练有时会导致验证损失先降后稳甚至回升,而训练损失仍在持续下降——这种训练与验证之间的剪刀差在传统 ML 中是过拟合的典型信号,但在大模型场景下,下游任务的表现仍可能继续改善。这个反直觉的现象说明:训练损失的数值变化,已经不再是模型质量的有效指标:评估必须看下游任务的实际表现。这是评估方法论从看损失曲线转向看评测基准的根本原因,也是接下来的这一节要展开的核心议题。而关于 Chinchilla 与规模化定律的进一步细节,将会在 “调优策略” 这一节中系统讨论(其在 AI 研究方法谱系中的位置,参见 [[AI 研究方法的演变]] 中的相关章节)。

训练动力学:诊断学习成效

在“优化过程”末尾,我们看到:在 LLM 训练中,损失曲线的数值变化已经不再是 LLM 质量的有效信号。这意味着评估 AI 的训练成效不能只看训练损失的下降曲线,而要系统地考察多条曲线、不同数据集上的指标,以及面向任务的评估。这一节要展开的,就是这套诊断体系。接下来,我们将继续沿着 “数学基础 → 典型应用 → 暴露的边界” 的论述方式展开,先用训练集/验证集/测试集的隔离原则与 K 折/时序切分给出评估的工程原则,再用曲线分析、LLM 评测方法与可解释性方法展示典型诊断手段,最后落到 Goodhart 律等绕不开的边界。

诊断的数学基础:评估的工程原则

之前介绍的损失曲线所诊断的问题是:“LLM 在拟合数据这件事上做得怎么样?”,而对于 LLM 的实际可用性,我们则需要另外建立一套评估方法论来解决,这是在 LLM 的训练阶段和上线阶段之间必须建立的桥梁。

对 LLM 进行评估的第一条原则是:训练集、验证集、测试集要执行严格隔离。因为这三者的功能完全不同:

  • 训练集(Train Set):用于更新 LLM 的参数 \(\theta\)。
  • 验证集(Validation Set, Dev Set):用于调超参数(学习率、正则化系数、模型结构选择)。可以反复使用来选最优超参数。
  • 测试集(Test Set):用于评估 LLM 最终的真实泛化能力,只能用一次。换言之,任何根据测试集反馈调整模型的举动,都让测试集退化为验证集,从而失去对真实泛化能力的估计。

违反这条原则的最常见方式是 “测试集泄漏”:在测试集上调过超参数、在测试集上选了 epoch 数、或在测试集上做了模型选择。这等价于把测试集当作验证集使用,导致报告指标虚高。LLM 评估中的 “数据污染” 现象,可以视为测试集泄漏在大规模语料下的变种。

接下来,如果遇到数据稀缺的场景,我们的典型应对策略是K 折交叉验证。这种方法会把数据均分成 K 份,轮流把 1 份当验证集,其余 K-1 份当训练集,重复 K 次,最终用 K 次验证结果的均值评估模型。当训练数据在万级以下时,K 折往往能比单一 train/val 划分给出更稳定的指标。深度学习时代 K 折变得不那么主流(计算成本太高),但在医疗、金融等小数据场景仍是标准做法。

最后,与时间序列相关的数据集需要进行特殊处理。金融、IoT、日志等场景下数据有严格的时间依赖,随机划分会把 “未来” 泄漏到 “过去”,模型会学到用未来预测当前的作弊模式。TimeSeriesSplit的解决方式是按时间顺序切分:训练集用 \([0, t_1]\),验证集用 \([t_1, t_2]\);下一折训练集扩展为 \([0, t_2]\),验证集用 \([t_2, t_3]\);依此类推。每折的验证集只取当前时间窗口之后的紧邻一段,且各折验证集之间互不重叠,严格保证训练时刻早于验证时刻。

这套评估方法论面向的是传统机器学习的中小数据场景。LLM 时代由于数据集规模膨胀到亿级,单一划分加 K 折变得不必要,但 “训练/验证/测试隔离” 的第一原则仍然成立,甚至变得更难保证:因为预训练数据是互联网文本,测试集的内容很可能已经以某种形式混入预训练语料。

典型应用:训练曲线分析、LLM 评测与可解释性方法

训练阶段的曲线诊断主要回答三类问题:模型是否在拟合训练数据?模型是否在过拟合?训练是否已经收敛?围绕这三类问题,工程上有四个最常用的曲线维度。

训练损失曲线刻画 LLM 对训练数据的拟合进度。典型形态是单调下降到接近某个值后趋于平稳。但具体形态会因任务、模型、数据规模差异巨大:小模型在小数据集上常出现陡降后平稳;大模型在大规模预训练上常呈现“线性下降”,既不饱和也不真正稳定,损失沿训练步数持续线性下降,这看似是“没收敛”,其实是模型容量还远未饱和。

验证损失曲线与训练损失曲线对比使用。这是诊断是否过拟合的核心证据。理想情形是两条曲线一起下降并同步平稳;但若训练损失持续下降而验证损失先稳后升,剪刀差出现,便是过拟合的典型信号。训练准确率 vs 验证准确率同样适用于分类任务,本质上是验证损失曲线的离散版本。

学习率曲线通常不是诊断对象而是治疗手段。日志里跟踪学习率,是为了把模型行为的异常归因到学习率的变化上,例如突然的损失尖峰可能正好对应学习率上升,Cosine 调度末端的损失反弹可能对应学习率归零。

梯度/权重统计是更深一层的诊断,包含梯度范数、权重范数、激活分布等。这些曲线在常规训练中不画,但在排查训练不收敛时启用:梯度范数趋向 0 提示梯度消失,权重范数爆炸提示权重在失控增长。

把这几条曲线放在一起看,常见的诊断模式有四种:

  1. 健康收敛:训练损失与验证损失同步下降、同步平稳,差距小。这是理想状态。
  2. 欠拟合:训练损失与验证损失都高位平稳,差距小。模型容量不够或训练时间不足。
  3. 过拟合:训练损失持续下降,验证损失先稳后升,差距扩大。模型容量过大或训练数据不足,详见本文稍后在 “调优策略” 这一节中与正则化与数据增强相关的讨论。
  4. 训练不稳定:训练损失与验证损失都剧烈震荡,没有平稳趋势。学习率过大、批量过小、数据质量差都可能引发。工程师面对这种模式,第一反应不是换模型,而是先检查学习率、数据 shuffle、损失是否出现 NaN。

这四种形态是连续谱上的离散标签。实际项目中大量情况是介于过拟合与欠拟合之间,这时调优决策取决于 “训练损失是否还有下降空间”,若还有下降空间,就加量训练;若已饱和,则需要更大的模型或更好的数据。诊断的本质是把直觉决策系统化,避免工程师在训练-验证之间的剪刀差里反复横跳。

评估 LLM 与评估传统模型有根本差异:传统模型的评估目标是分类/回归的数值指标,LLM 的评估目标是开放式生成的语言质量。前者可对比 ground truth 自动计算,后者要么依赖人工判断,要么借助评估代理。LLM 评测有以下三个层次:

  • 第一层:传统指标仍有意义,但场景受限。分类与回归指标(Accuracy、Precision、Recall、F1、AUC、MSE、MAE、\(R^2\)、MAPE)在 LLM 评测中依然有用,但只适用于封闭选项任务,例如多选题、判断题、定向信息抽取。例如 MMLU 是多选题,用 Accuracy 衡量;GSM8K 是数学应用题,用答案准确率衡量。序列任务的特殊指标则专门服务于生成文本与参考答案的比较:

    • BLEU(Bilingual Evaluation Understudy):用 n-gram 重叠率衡量生成文本与参考答案的相似度,常用于机器翻译。其数学形式为:

      \[\text{BLEU} = \text{BP} \cdot \exp\!\left(\sum_{n=1}^{N} w_n \log p_n\right) \]

      其中 \(p_n\) 是生成文本与参考答案之间 n-gram 的修正精确率(modified n-gram precision),即参考答案中的每个 n-gram 最多被匹配一次(避免重复词刷分),\(w_n\) 通常取 \(1/N\)(默认 \(N=4\)),\(\text{BP}\) 是短句惩罚因子(Brevity Penalty),避免生成过短的翻译骗得高分。BLEU 的工程局限是只算精确率不看召回率,且对同义改写不敏感。

  • ROUGE(Recall-Oriented Understudy for Gisting Evaluation):侧重召回率的 n-gram 重叠率,常用于文本摘要。

    • Perplexity(困惑度):语言模型在给定文本上的“惊讶程度”。对于长度为 \(N\) 的 token 序列 \(x_1, x_2, \dots, x_N\),其数学定义为 \(\text{PPL} = \exp\left(-\frac{1}{N}\sum_{i=1}^N \log p_\theta(x_i \mid x_{<i})\right)\),其中 \(p_\theta(x_i \mid x_{<i})\) 是模型在已知前文 \(x_{<i}\) 条件下对当前 token 的预测概率。Perplexity 越低代表模型对文本越不 “惊讶”。注意 Perplexity 工程上常用测试集/验证集计算,用来衡量模型对未见文本的概率建模能力(即泛化水平),不是直接的下游任务表现:这一点在 LLM 评测中常被误用。

    典型的误用模式有两种:一是把 PPL 当作 “综合语言建模能力” 的全局排序指标,但同一模型在不同领域(代码、法律、对话)上的 PPL 差异巨大,不能跨领域聚合;二是把训练集与测试集 PPL 的差值(generalization gap)当作“泛化能力”的单一代理指标,而忽略了训练集 PPL 本身随训练步数变化的不平稳性。

  • 第二层:LLM 特有基准。开放领域 LLM 评测无法靠分类准确率解决,于是出现了一组针对特定能力的基准数据集:

    • MMLU(Massive Multitask Language Understanding,大规模多任务语言理解):涵盖 57 个学科的选择题,测试世界知识与推理。网上常见的关于 GPT-4、Claude 等模型的综合能力分数主要来源于此。
    • HumanEval:164 个编程问题,测试代码生成能力,常用 pass@k 指标(前 k 个采样中至少有一个通过的比率)。
    • TruthfulQA:测试模型在容易引发 “误解” 的问题上是否能给出真相,评估事实性与抗误导的能力。
    • GSM8K:8500 个小学数学应用题,测试多步算术推理。

    这些基准的核心设计理念是多维度采样:一个基准只测一种能力,多个基准组合才能勾勒模型的全貌。这也是“避免单一基准过度优化”原则的根据:在 MMLU 上刷满分的模型,未必在 HumanEval 上有同样的相对优势。

  • 第三层:自动化评测与人类评测的权衡。当任务从选择题转向开放式问答,前两层指标就不够用了:生成文本的质量涉及逻辑性、连贯性、创造性、安全性,这些都是参考答案难以穷举的维度。LLM 评测由此进入“谁来判断好坏”的方法论选择:

    • 自动化评测(如 BLEU、Exact Match、规则匹配):可复现、成本低、易规模化。但难以捕捉细微质量,且容易受数据污染影响(模型在训练数据里见过测试题)。
    • 人类评测:高质量、能捕捉细微差异,是开放式生成的金标准。但成本高、难以规模化,且标注者一致性难以保证,同一个回答,三个标注员可能给出分歧很大的评分,这部分反映了“质量本身是模糊的”而不只是标注质量问题。
    • LLM-as-a-Judge:用 LLM 评测 LLM(如 GPT-4 评判其他模型)。处于自动化与人类评测之间的折中点:成本可控,可规模化,但继承了 LLM 的偏差(如位置偏差、长度偏差、自我偏好),且评测分数对 judge prompt 的措辞高度敏感:同样的评判模型,仅改一句 prompt 的表述,分数可能波动数个百分点。
    • 评测协议设计:根据任务选协议。
      • Pairwise(两两比较):让评估者比较两个模型的输出哪个更好,适合 Arena 类平台。
      • Single-Eval(绝对评分):让评估者对单一输出打分,适合标准化基准。
      • Likert Scale(李克特量表):让评估者在 1-7 的量表上打分,适合人类标注。
    • 数据污染问题:训练数据可能包含评测集,导致分数虚高。这是 LLM 评测的元层难题:测试集的内容在预训练语料里以某种形式出现过,评测就不再反映真实泛化能力。常见的应对是在评测集上做去污染处理(n-gram 重叠检测、泄漏测试集重制),但没有根治方案。

需要指出的是:上述三个层次其实是并存于实际评测流程中的,它们之间并没有相互替代的关系。例如在 Llama-3、GPT-4 等 LLM 的技术报告里,人们通常会同时列出 MMLU/GSM8K 自动化分数、人类评测 Elo 分数、以及 LLM-as-a-Judge 的细分维度评分。多种评测手段的多角度交叉验证,是当前 LLM 评测的工程妥协。

除此之外,可解释性方法为诊断提供了另一类视角,它不直接给评估分数,而是试图回答“模型为什么这样决策”。这一类方法在 LLM 时代变得越来越重要,因为传统的准确率指标难以捕捉生成质量的细微差异。

特征可视化(Feature Visualization)通过观察中间层的激活回答“网络学到了什么”。早期层通常对应边缘、纹理等低级特征;后期层对应更抽象的语义模式。这是 CNN 时代最经典的可解释性手段,在 LLM 时代也有对应:Transformer 某一层的隐藏表示聚类,能揭示模型“内部概念”的结构。

注意力可视化(Attention Visualization)是 Transformer 时代的对应方法。把注意力权重热力图画出来,观察模型“在生成这个词时关注了输入的哪些位置”。但要谨慎:注意力的强度不等于因果重要性:一个 token 注意力权重大,不代表去掉它就一定影响输出;反之亦然。这种“注意力可解释性的错觉”在 LLM 解释研究里被反复指出(Jain & Wallace, 2019)。

SHAP / LIME 等后验方法是模型无关的归因方法:

  • SHAP(Shapley Additive Explanations):基于博弈论中的 Shapley 值,把每个特征的贡献拆解到公平分配。理论上严谨,但计算开销大。
  • LIME(Local Interpretable Model-agnostic Explanations):在单个预测的局部拟合一个简单线性模型作为解释。计算快,但稳定性受采样影响。

这两类方法适用于表格数据为主的传统机器学习场景,在图像、文本任务上的可解释性效用递减。

关键边界:解释 ≠ 理解。 SHAP 能告诉你 “这个特征贡献了 30%”,但不能告诉你“为什么这个特征在因果上重要”。注意力可视化能告诉你“模型看了这里”,但不能告诉你“模型是否真的用到了这个信息”。可解释性方法给出的是模型行为的描述,不是模型行为的因果解释。把它们当作“理解模型”的工具会导致过度信任,尤其是当解释方法本身有偏差时(如 SHAP 在特征相关时分配不合理,注意力可视化在多头 Transformer 上不一致)。对模型行为的真正理解,仍然来自对训练过程、损失设计、数据分布的系统性诊断:可解释性方法只是辅助手段,不能替代对模型机制的扎实理解。这一边界与前述“评估方法的元层不可靠性”一脉相承:可解释性方法的元层不可靠,正是评估方法元层不可靠的另一种体现。

暴露的边界

训练动力学看似中立,曲线就是曲线,评测就是评测。但这条“诊断-评估”链路也暴露三个工程边界。

  1. 指标变成目标后就不再是好指标。这是经济学里的Goodhart 定律在 LLM 评测中的直接投射:当 MMLU 分数成为衡量模型能力的代理指标之后,所有研究者都会围绕 MMLU 调优,模型在该基准上的进步将不再反映真实能力的进步。极端情况下,模型可能在基准上刷到 95%,但在该基准测的能力之外严重失败。基准饱和现象(第一阶段的笔记《[[AI 研究方法的演变]]》中 SuperGLUE 被刷满的案例,正是这个机制的早期版本)就是这条定律的工程后果。唯一缓解方式是持续更换基准,但任何新基准最终都会遭遇同样的命运,这是 Goodhart 定律本身的不可消除性,这条定律没有工程上的根治方案。

  2. 指标越复合,越偏离真实目标。 LLM-as-a-Judge 等自动评估代理表面上“自动化、可规模化”,但它们本身就是用 LLM 评判 LLM,评判模型的偏差会沿着评估链路传递到评分结论上。位置偏差(更喜欢先出现的回答)、长度偏差(更喜欢长回答)、自我偏好(更喜欢自己生成的文本)都会让评估分数出现系统性偏移。当多个偏差叠加时,“自动化评测”反而可能比人类评测更不准确。这条边界暴露的是评估方法的元层不可靠性:评估这件事本身需要被评估。

  3. 答对了不等于答对了真问题。一个模型在 MMLU 上拿高分、在 HumanEval 上 pass@1 拿高分、在 TruthfulQA 上拿高分,这是它在这些评测题集上的表现。但用户在意的常常是“我具体那个问题能否被回答好”,这不在任何聚合指标里。聚合指标让个体经验隐形,这是评测方法本身的几何性质造成的边界。当一个模型的综合能力分上升 5%、但某个用户的关键任务处理能力下降 30%,指标总体上说它 “更好了”,但用户的体验说它 “更差了”。真实能力的分布是异质的,而聚合指标把它压成一个数字,这条边界没有工程上的解决方案,只能靠 “明确能力评估的样本范围” 来弥补。从几何角度看,这种异质性正是我们在 “神经网络:通用函数逼近器” 一节中讨论的流形假设(Manifold Hypothesis)在评测侧的投影:即便 \(\mathcal{X}\) 的标称维度极高,真实能力有意义的部分也只分布在某个低维流形上。聚合指标本质上是用一个单一数字去概括这个流形的全局性质,必然会在流形的高曲率区域失效。

调优策略:当效果不理想时

在前述“训练动力学”一节中,我们看到过拟合与欠拟合是训练曲线上剪刀差或高台的不同形态。本节沿“数学框架 → 典型应用 → 暴露的边界”展开:先用偏差-方差分解给出调优的理论坐标,再沿数据、模型、训练三个层面展示工程上的调优手段,最后落到收益递减、调优无法跨越目标缝隙、调优 vs 重设计等绕不开的边界。

当模型效果不理想时,从哪个环节入手调优,是这一节要回答的核心工程问题,下面的决策树把这一判断路径可视化(如图 6 所示):

图 6 调优决策树

图 6 调优决策树

正如读者所见,当模型效果不理想时,先按训练集 / 验证集 / 测试集的表现把问题分到偏差、方差、分布偏移、指标偏差四类,再回到数据、模型、训练三个层面选取具体的调优手段。这一决策树将作为本节「理论坐标 → 三层面调优手段 → 暴露的边界」三段式论述的全局索引。

偏差 vs 方差:调优的理论坐标

偏差-方差分解(Bias-Variance Decomposition)为前述诊断中观察到的剪刀差或高台提供了统计框架。

设真实函数为 \(f^*\),观测到的标签为 \(y = f^*(x) + \varepsilon\),其中 \(\varepsilon\) 是均值为 0、方差为 \(\sigma^2\) 的噪声。模型在不同训练集上学到的参数 \(\theta\) 会不同,预测的期望 \(\mathbb{E}_\theta[f_\theta(x)]\) 与真值 \(f^*(x)\) 的偏离是偏差(Bias),反映模型系统性偏离真实关系的程度;单个模型预测围绕期望的方差是方差(Variance),反映模型对训练数据波动的敏感程度。经典的分解:

\[\mathbb{E}\left[(f_\theta(x) - y)^2\right] = \underbrace{(\mathbb{E}_\theta[f_\theta(x)] - f^*(x))^2}_{\text{Bias}^2} + \underbrace{\mathbb{V}_\theta[f_\theta(x)]}_{\text{Variance}} + \underbrace{\sigma^2}_{\text{Irreducible Error}} \]

其中左侧的期望同时对训练集的随机性(决定 \(\theta\))和标签噪声 \(\varepsilon\)(决定 \(y\))取。

最后一项是数据本身的噪声,不可消除。调优的核心工作是在偏差与方差之间走钢丝:

  • 高偏差(欠拟合):模型容量不足以捕捉数据中的模式。表现为训练损失与验证损失都高,差距小。解决方案:增大模型容量、增加特征、延长训练时间。
  • 高方差(过拟合):模型对训练数据中的噪声学得太细。表现为训练损失低、验证损失高,剪刀差大。解决方案:增加数据、增强正则化、降低模型容量、早停。

需要强调的是:偏差与方差不是非此即彼的二元分类,而是连续谱上的两端。现实中多数项目处于“两边都有一点”的状态,训练损失不是特别低(轻微高偏差),验证损失比训练损失高一些(轻微高方差)。这时的调优决策,取决于“如果再加大模型容量,验证损失会不会先降后升”。学习曲线诊断法正是为此设计的:把训练集大小作为横轴,观察验证误差随数据量的变化,若仍在快速下降,说明加数据有效;若已平稳,加大数据无意义。

典型应用:数据、模型、训练三个层面的调优手段

工程上把调优手段按作用层面分三类。

数据层面。数据是上限,模型是逼近上限的工具。这是一条工程上的强经验法则:在大多数任务上,调数据的收益大于调模型的收益。下面是数据层面最常用的几类调优。

数据增强(Data Augmentation)通过在训练样本上施加“保持语义不变”的变换,人工扩大数据规模:

  • 图像:随机裁剪、水平翻转、颜色抖动、Mixup(两张图按比例线性混合)等。
  • 文本:同义词替换、回译(中文翻英文再翻回中文)、随机插入/删除/调换(EDA)等。
  • 序列:时序数据的窗口滑动、时间扭曲、加噪声等。

数据增强的关键是变换不破坏监督信号:增强后的样本应仍对应同一个标签。错位的增强(如把猫图增强后标签还是“狗”)等于人为注入噪声,会损害训练。

数据清洗与去重是大规模预训练中被严重低估的环节。GPT-3、Llama 等技术报告都把“清洗与去重”列为训练流程的关键步骤,不是为了“数据干净好看”,而是因为重复样本会显著放大模型对某些模式的记忆权重,导致下游生成内容变得机械化、丧失多样性。这是去重背后的工程动机。

数据平衡与采样策略针对不平衡场景。直接重采样(过采样少数类 / 欠采样多数类)会让训练分布更接近工程目标分布,但可能丢失多数类中的有用信息。更稳健的做法是保留原始分布,但在损失函数层加权,即“损失函数”一节中讨论过的 Focal Loss 或类别加权方案。

合成数据(Synthetic Data)在高质量真实数据耗尽后成为重要补充:

  • Self-Play:让模型与自身副本对弈或对话,从交互中生成新训练数据。AlphaGo 的早期迭代就靠这条路。
  • Self-Instruct:让强模型生成指令-响应对,作为弱模型的训练数据。Alpaca、Vicuna 等开源模型的训练数据多由 GPT-3.5/4 生成。

合成数据的根本风险是模型坍缩(Model Collapse):当合成数据进入训练集,再生出来的合成数据会强化上一代的偏差,几代之后模式坍缩到一个退化分布。这个机制与“训练-评测循环”中的反馈环相似,是 Goodhart 定律的另一个表现。

模型层面。正则化(Regularization)通过在损失函数上加约束,抑制模型对训练数据的过度拟合:

\[\mathcal{L}_{\text{reg}}(\theta) = \mathcal{L}(\theta) + \lambda R(\theta) \]

其中 \(R(\theta)\) 是正则化项,\(\lambda\) 控制强度。

  • L1 正则化:\(R(\theta) = \|\theta\|_1\),鼓励稀疏参数(部分权重归零),常用于特征选择。
  • L2 正则化:\(R(\theta) = \|\theta\|_2^2\),鼓励权重均匀小,避免任何单一权重过大。
  • Dropout:训练时随机将部分神经元输出置零,迫使网络不依赖任何单一通路。推理时关闭,所有神经元参与计算。
  • BatchNorm(批归一化, Batch Normalization):对每层的激活做标准化(减均值除标准差),让损失曲面更平滑,允许更大学习率。同时具有轻微正则化效果。

注意 L2 正则化与 AdamW 中的权重衰减并不完全等价:前者把衰减加到损失上、自适应学习率会干扰其强度;后者直接把衰减作用在参数更新上(详见“优化过程”一节的 AdamW 段落)。当代 Transformer 训练普遍用 AdamW 而不是 L2 + Adam,原因正是这个差异。

模型规模选择:Chinchilla 与规模化定律(Scaling Laws)是 LLM 时代最重要的工程经验法则。早期研究者相信“模型越大越好”,但 2022 年 DeepMind 的 Chinchilla 工作指出:给定固定计算预算,存在一个最优的模型规模与训练数据量配比:经验上每个模型参数约对应 20 个训练 token(tokens-per-parameter ≈ 20:1)。Chinchilla 工作重新训练了一个 70B 模型(Chinchilla)用 1.4 万亿 token,发现它在相同算力下性能显著优于参数更大的 Gopher-280B,这直接挑战了“参数越大越好”的工程直觉,意味着很多“大模型”实际上欠训练于数据:给同样多的算力,更小但训练更充分的模型会更好。Scaling Laws(规模化定律)描述模型能力如何随参数、数据、计算量增长,经验上服从幂律。

这条发现改变了 LLM 训练的算力分配方式:设计新模型时,先用 Scaling Laws 估算“这个规模的模型在合理数据量下能达到什么能力”,再决定是否值得投入。这一幂律关系在算力-性能平面上的形态如图 7 所示。

需要指出的是:20:1 比例是 Hoffmann et al.(2022)在算力最优条件下得出的结论——固定算力下,让模型规模与数据规模同步增长最优。但在推理成本主导的实际场景中,业界普遍采用“过度训练”(over-train)策略:Llama-2 7B 用了约 2T tokens(约 286 tokens/param),Llama-3 8B 用了约 15.6T tokens(约 1950 tokens/param),用更大的数据量“喂饱”较小模型以降低推理成本。这意味着 20:1 的工程经验要在具体场景下重新校准。

规模化定律:模型能力随算力的幂律关系

图 7 规模化定律:模型能力随算力的幂律关系

预训练 + 微调范式是 LLM 时代的主导流程。先在大规模通用数据上预训练一个基础模型,再用特定任务的少量数据微调。这种范式把 “通用能力” 和 “任务专精” 分离开来,基础模型承担数据密集的学习成本,下游用户承担任务专精的少量成本。这是 LLM 能够被广泛部署的关键工程创新,也是《[[AI 研究方法的演变]]》中 “基础模型” 这个概念得以成立的具体技术基础。

训练层面。学习率扫描是许多训练项目的起点。学习率对模型行为的影响通常具有高度非线性:太大会震荡不收敛,太小会训练过慢或难以摆脱不理想区域。经验上可以先跨数量级扫描候选值,再结合训练初期的损失、梯度范数和验证指标观察稳定性,之后在有效区间内精调。具体的扫描范围和判定标准取决于模型规模、优化器、有效 batch size、数据分布与学习率调度,不能用“若干步降到某个固定比例”作为通用规则。Llama-3 的技术报告公开了部分训练配置;GPT-4 未完整公开训练细节,外界对其峰值学习率的估算不能替代官方数据。

Batch size 影响两件事:梯度估计的噪声与训练吞吐量。小批量梯度噪声大但更新频繁;大批量梯度稳定但每步计算开销大。梯度累积(Gradient Accumulation)是一种折中:把多个小批量累积成一次参数更新,等价于虚拟大批量,但内存占用与小批量相同。LLM 训练普遍使用大批量 + 梯度累积,因为大批量在分布式训练中能更好地利用硬件。

早停(Early Stopping)是最简单的正则化手段之一:在验证损失连续若干轮不再下降时停止训练,避免模型在训练后期被噪声牵着走。早停与权重衰减、Dropout 等有功能重叠,它通过限制训练步数间接限制模型复杂度。

混合精度训练(AMP, Automatic Mixed Precision)主要是性能与显存调优手段。前向和反向传播中的部分计算可以使用 FP16 或 BF16,从而加速训练并减少显存占用;具体的参数副本、累积精度和算子精度由框架与训练配置决定。使用 FP16 时常需要loss scaling:将损失乘以缩放因子 \(S\),以降低梯度在低精度下发生下溢的概率:

\[\mathcal{L}_{\text{scaled}} = S \cdot \mathcal{L}, \quad \nabla \theta_{\text{scaled}} = \nabla \theta_{\text{raw}} \cdot S \]

反向传播后、参数更新前,再把梯度除以 \(S\);实际训练通常使用动态 loss scaling。BF16 的动态范围接近 FP32,通常无需 loss scaling,但仍需根据硬件和算子支持进行验证。PyTorch、TensorFlow 都内置了 AMP 接口,是否启用以及采用何种精度取决于模型、硬件和稳定性要求。

暴露的边界

调优策略是工程上最有“实操感”的部分,但它也暴露三个工程上绕不开的边界。

  1. 调优收益递减。这是经典的收益递减规律在机器学习中的体现:在一个已有充分调优的项目上,继续投入相同时间,得到的提升通常小于初始调优阶段的提升。具体曲线形状取决于模型、数据、评价指标和搜索空间,不能用统一的函数形式或固定百分比描述。判断调优是否值得继续的标准不是“还能不能再降一点”,而是“继续调优的预期收益是否覆盖机会成本”,这个判断本质上是产品决策,不是技术决策。工程师容易陷入“再调一个 epoch 试试”的局部最优,但项目视角下应该问“这个时间花在新模型还是新数据上”。

  2. 调优无法跨越目标定义本身的缝隙。在 LLM 时代,指标接近当前上限后,剩余差距不一定能靠继续调参解决。当损失曲线已经平稳、模型容量和数据质量都已充分评估,剩余差距可能来自任务定义本身的问题。例如:要求模型生成“既安全又有用”的回复,但这两个目标在某些 prompt 上存在矛盾;要求模型“读懂上下文”,但上下文信息本身有歧义。这些不是“模型不够好”,而是“目标本身没有足够清晰的 ground truth”。这一边界暴露的不是模型能力不足,而是目标的形式化不完备。这一论断呼应了“损失函数”一节“暴露的边界”中“错误损失 → 错误目标”的判断:当损失函数不能完全捕捉任务目标时,调优无法跨越这个缝隙。这正是接下来“能力边界与判断力”那一节要展开的核心议题:何时停止调优,回到目标定义本身去诊断。

  3. 何时停止调优 vs 何时重新设计。调优与重新设计是两条不同的成本曲线:调优是沿已有模型架构的局部搜索,重新设计是重新选择模型类、数据流、训练范式。前者单位成本低但收益有上限,后者单位成本高但有可能跳出当前局部最优。判断何时切换的关键证据是:诊断结果是否指向现有模型、数据或训练范式的结构性局限。欠拟合、过拟合、数据分布偏移、资源约束和目标定义问题可能需要不同的处理,不能仅凭“调不动了”判断为模型类错误。重新设计的触发条件不是“调不动了”,而是“调不动的根因已经诊断清楚”:盲目的重新设计只是把同样的问题换个形式重新遇到。

能力边界与判断力

模型能力不足 vs 目标定义不合理

前文依次走完了“函数逼近 → 损失 → 优化 → 诊断 → 调优”的完整链路。这一节要讨论一个比调优更上游的问题:当模型表现不理想时,到底是模型不行,还是目标本身就不合理?这条判断决定了工程师是把剩余时间花在调参上,还是应该回到第一步重新定义问题。

诊断清单给出几条可操作的判断标准。它们是定位瓶颈的证据线索,不是单独成立的二元判定:

  • 换一个规模明显更大的模型,效果是否显著提升?若提升,说明容量可能是瓶颈;若不提升,还需要继续检查数据、优化过程和目标定义。

  • 换一个完全不同的模型类(如从 ResNet 换成 ViT),效果是否显著提升?若提升,说明当前架构可能不适合任务;若不提升,不能直接推出任务本身有问题。

  • 人类专家能否完成这个任务?若不能,任务定义或信息条件可能存在问题;若能且专家间一致性高,模型通常仍有提升空间;若专家间一致性低,则应优先检查 ground truth 的歧义。

  • 数据中的标注是否一致?让两个标注员独立标同一批样本,计算 Cohen's Kappa 等一致性指标:

    \[\kappa = \frac{p_o - p_e}{1 - p_e} \]

    其中 \(p_o\) 是观察一致率,\(p_e\) 是随机一致率(由各类别边际概率算出)。常见文献会把 Cohen's Kappa 划分为若干参考区间,但这些阈值会因领域、类别分布和标注任务而变化,不能脱离上下文直接判定目标是否清晰。低一致性通常提示需要重新检查标注规范、任务定义和数据质量。

重新设计 vs 继续优化的成本对比是另一条工程取舍线:

  • 继续优化:单位成本低(用现有架构继续实验),但有上限。
  • 重新设计:单位成本高(重写数据流、重选模型类、可能重训),但有机会跳出当前局部最优。

是否重设计,应由多轮可复现实验和诊断结果共同决定:当证据持续指向现有模型、数据或训练范式的结构性局限时,重设计的预期收益才可能高于继续优化。盲目继续调优只会把同样的根因换个形式重新遇到。

基线与 SOTA:理性预期的两个坐标

LLM 时代,模型的惊艳能力和明显失败并存。工程师面对一个项目时,建立合理的预期比追求极致指标更关键。

基线(Baseline)是预期的起点。任何模型表现必须先与最简单的基线对比,例如随机预测、规则启发式、上一版本的简单模型。若新模型的指标与基线只差 2%,那这 2% 的提升可能不值得上线的复杂度成本;若差距是 50%,则值得深入。

期望值 vs 最优值的差距是另一条分析维度。SOTA(State-of-the-Art, 当前最优)是研究领域的指标,反映“在已知任务上达到的最高水平”。但项目落地时,工程师关心的不是“接近 SOTA”,而是“达到用户可接受的水平”,这两者之间的差距可能非常大。例如:

  • SOTA 在 MMLU 上是 90%,但项目只需模型达到 70% 就能解决用户的实际问题。
  • SOTA 在 GSM8K 上是 95%,但项目关心的是“是否能正确回答客户的常见问题”,需要的能力远低于 SOTA 覆盖的范围。

SOTA 参考价值的有限性有三层:第一,SOTA 通常是在精心准备的数据集上达到的,迁移到生产数据未必能复现;第二,SOTA 反映的是“群体最优”,不是“个体最优”,某个用户的关键任务可能严重失败;第三,SOTA 追逐本身会诱导过度优化(参见“训练动力学”一节中 Goodhart 定律的边界)。理性的工程判断不应该是“我的模型离 SOTA 还差多少”,而是“我的模型相对基线提升了多少,相对用户可接受水平还差多少”。

暴露的边界

“能力边界与判断力”是整篇笔记最接近“工程哲学”的章节。它讨论的不是技术机制,而是面对技术时的判断框架。这一节暴露的三个边界,比前几节更接近决策者视角。

  1. 能力判断依赖于评估样本的分布。任何“模型能做什么”的判断都基于样本,你测试了哪些 prompt、哪些任务、哪些用户场景。一旦样本改变,结论也会变。MMLU 上拿 90% 的模型,在长文档推理、代码调试、数学证明上可能表现迥异。把聚合指标当作“模型能力”的全局估计,是工程师最容易犯的过度抽象错误。真实的模型能力是一个关于样本空间的分布,不是单一数字。这条边界没有工程上的解决方案,只能靠“明确能力评估的样本范围”来管理。

  2. 基线的相对性陷阱。 “相对基线提升 30%”听起来令人印象深刻,但若基线本身只有 20%,那 30% 提升后的 26% 仍然低于用户可接受的水平。基线的“绝对值”与“相对提升”必须同时报告。LLM 时代尤其要警惕:用 Llama-3-8B(强基线)作为对比时,再大的提升幅度也意义有限;用 GPT-4 作为对比时,即使有提升也接近技术天花板。判断模型价值的不是“提升了多少”,而是“绝对水平是否够用”。

  3. 可解释性方法的元层不可靠。与前述“指标越复合,越偏离真实目标”那条边界同源,可解释性方法本身也是模型,SHAP 的归因、LIME 的局部拟合、注意力可视化都是用某种“代理方法”去描述“模型”,而代理方法的偏差会被误当作“模型的偏差”。当可解释性工具给出“这个特征不重要”的结论时,可能是真不重要,也可能是工具的采样偏差或拟合误差造成的。信任任何可解释性结论前,必须先验证该结论在不同工具、不同采样、不同实现下是否稳定。这条边界呼应《神经网络:通用函数逼近器》一节“暴露的边界”中的核心论断——函数逼近无法区分“学到了规则”与“做对了模式”:可解释性方法可能正是把这个区分形式化的尝试,但目前还没有任何方法真正做到。可解释性的具体内容已在“训练动力学”一节的可解释性方法小节中展开,本节不再重复。

阶段总结

三段式结构回扣

让我们把这篇笔记走过的链路做一次闭环回顾,看看各个主题如何对应到 数学模型 → 典型应用 → 暴露的边界 这个三段式骨架:

  • 神经网络:通用函数逼近器:从“神经网络是什么”的数学基础(通用逼近定理 + 参数化函数族 \(f_\theta: \mathcal{X} \to \mathcal{Y}\))出发,给出 MLP 的典型前向传播计算图,并暴露逼近能力 ≠ 拟合能力、高维几何失效、拟合 ≠ 规则这三条边界。
  • 损失函数:从“用什么标准判断够好”的数学形式化(\(\mathcal{L}: \mathcal{Y} \times \mathcal{Y} \to \mathbb{R}_{\geq 0}\)、经验风险)出发,展开回归/分类/序列任务的损失族,并暴露错误损失、损失-指标脱节、不平衡数据加权这三条边界。
  • 优化过程:从“梯度下降 + 链式法则”的数学原理出发,沿 SGD → 动量 → Adam → AdamW → 学习率调度的演化谱系展开,并暴露优化 ≠ 泛化、鞍点丰富、大模型不收敛这三条边界。
  • 训练动力学:从“训练曲线 + 评估方法 + LLM 评测”的诊断体系出发,展开曲线分析、K 折/时序切分、MMLU/HumanEval/TruthfulQA 评测与自动化/人类评测权衡,并暴露 Goodhart 定律、评估元层不可靠、聚合指标异质性这三条边界。
  • 调优策略:从“偏差-方差分解”的统计框架出发,展开数据/模型/训练三类调优手段,并暴露收益递减、最后一公里、调优 vs 重设计这三条边界。
  • 能力边界与判断力:从“调优的终点之后该怎么办”的工程哲学出发,给出诊断清单与基线/ SOTA 的理性预期坐标,并暴露样本依赖性、基线相对性陷阱、可解释性元层不可靠这三条边界。

这些主题共同构成了“机制 → 工程 → 边界”的递进链路:每一部分先讲数学原理,再讲工程实现,最后落到“这件事绕不开的边界是什么”。这种结构本身就是三段式分析框架的应用样本:读者读完整篇笔记后,应当具备用同样的方法论去分析其他训练环节的能力。

对路线图三个核心问题的回答

笔记开篇的表 1 列出了本笔记要讨论的六个主题,但写作过程中我们对路线图隐含的三个核心问题做了系统性回答:

  • LLM 在训练过程中“学”到了什么? → 参数化函数族中的一个具体函数。模型通过训练得到一组使经验风险 \(R(\theta)\) 近似最小的参数 \(\theta^*\),从而确定函数 \(f_{\theta^*}\)。它在高维损失曲面上走过的优化路径、训练曲线呈现的形态,以及调优策略对这条路径的修正,共同影响 LLM 被调用时的行为上限。
  • 机器学习优化的是什么? → 损失函数的最小化。这个答案看似平凡,但它的工程后果是巨大的:训练目标 \(\mathcal{L}\) 与上线指标之间的鸿沟是整个 AI 工程的核心张力。RLHF 等对齐方法正是为了用可优化的奖励信号去逼近人类偏好。
  • 模型行为与损失函数如何关联? → 通过训练动力学进行诊断。模型行为由架构、数据、损失函数、优化路径和推理策略共同塑造;训练动力学把其中可观察的损失、梯度和评估指标连接起来。欠拟合、过拟合、训练不稳定、Goodhart 漂移等模式,每一种都对应训练阶段可识别的诊断信号。

留下的追问

走完这条链路,我们识别了深度学习训练中可被工程化的部分,但也识别了不能被工程化的部分。这些不能被工程化的边界,正是后续阶段要展开的:

  • 从函数近似到“智能行为”的距离:通用逼近定理告诉我们神经网络理论上能拟合任意函数,但“任意函数的拟合”与“智能行为”之间还隔着什么?“神经网络:通用函数逼近器”所暴露的边界指出,函数逼近无法区分“学到了规则”与“做对了模式”。这是路线图中“理解智能本质”那一阶段的命题。
  • 训练目标与人类意图的对齐:损失函数是目标的形式化,但形式化本身不完备。“损失函数”所暴露的“错误损失 → 错误目标”边界,以及补充路线中 RLHF、DPO、RLAIF 的尝试(其实验细节,参见 [[LLM 的微调实验]]),共同指向一个问题:如何让训练时优化的 \(\mathcal{L}\) 更接近上线时被期待的智能行为?《[[AI 研究方法的演变]]》中“价值对齐的根本困难”对此有进一步讨论。
  • 个体经验与聚合指标的鸿沟:评测体系本身的边界不只是技术问题。“能力边界与判断力”揭示了能力判断的样本依赖性与基线相对性,“训练动力学”则指出“答对了不等于答对了真问题”。这条追问不是技术问题,而是关于“我们如何与一个不透明的系统共处”的工程哲学问题。

补充路线:从监督训练到对齐训练

前文主线建立了从函数逼近、损失与优化到诊断、调优和能力判断的训练框架;放到 LLM 语境中,它主要对应以 token 级交叉熵为损失、以海量文本为数据、以下一 token 预测为目标的预训练过程。这种训练范式让模型获得了语言建模能力,但模型还远不是一个能“按人类意图行事”的助手:它可能自信地说错事实,可能拒绝无害请求,也可能顺从有害指令。如何从“能续写文本的语言模型”过渡到“按用户意图工作的助手”,是 LLM 训练的第二阶段工程问题。

需要特别指出的是,本节是主线的平行分支,而不是顺承章节。主线建立的“损失 → 优化 → 诊断 → 调优”链路在 SFT、RM、RLHF 三个阶段中反复出现,只是损失函数的具体形式与数据分布不同。这一节勾勒这条过渡路径的三个关键节点。

第一节点:监督微调(Supervised Fine-Tuning, SFT)。在预训练模型的基础上,用人工编写的“指令-回复”对做一轮监督训练,让模型学会“按指令生成回复”的格式。这是从“续写”到“对话”的关键一跳。SFT 的数据规模通常在万到十万级别(远小于预训练),但对回复质量的要求远高于预训练语料。前述“损失函数”、“训练动力学”、“调优策略”三个主线的诊断-调优链路都直接适用于 SFT 阶段。

在算力与显存受限的场景中,SFT 常采用PEFT(Parameter-Efficient Fine-Tuning,参数高效微调)方法。

LoRA(Low-Rank Adaptation,低秩适配)是其中最主流的选择:冻结预训练权重 \(\theta\) 不变,在每一层旁边注入两个低秩矩阵 \(A \in \mathbb{R}^{r \times d}\) 与 \(B \in \mathbb{R}^{d \times r}\)(\(r \ll d\),典型为 8 或 16),仅训练这两个小矩阵。其数学形式为 \(\Delta W = BA\),可训练参数数量从 \(|\theta|\) 降到 \(|A| + |B|\),通常只有全参数的 0.1%-1%。

LoRA 的工程收益有三:一是显存占用大幅下降,配合 4-bit 量化的QLoRA,可以进一步降低大模型微调的硬件门槛;二是训练后的 LoRA 权重可以按任务保存为独立小文件,便于多任务分发与切换;三是推理时可与原权重合并,不引入额外延迟。

Adapter、Prefix Tuning是 LoRA 的替代方案,分别通过在 Transformer 块内插入模块、在输入前注入可训练前缀实现参数高效微调。全参数 SFT 仍用于算力充足或需要更大参数更新自由度的场景,而 PEFT 更适合资源受限的应用层微调。

LoRA rank 的工程经验是 PEFT 的一个常见调优点:较小的 \(r\) 参数更少、成本更低,较大的 \(r\) 提供更强的表示能力,但收益取决于任务复杂度、目标模块和数据质量,并不存在跨任务通用的最佳取值。LoRA 的缩放通常写为 \(\alpha / r\);例如 \(r=8, \alpha=16\) 时缩放系数为 2,其作用是控制低秩更新相对原权重的强度。

第二节点:偏好对齐(Preference Alignment)。 SFT 让模型“能回答”,但还不能保证“回答得好”。偏好对齐的核心是用人类对模型回复的偏好数据训练一个奖励模型(Reward Model),再用强化学习(RLHF)或直接偏好优化(DPO)去调整 SFT 模型。这条路径的关键转变是:训练目标从“模仿人类写过的回复”变成“让回复符合人类偏好”。前者只能学到表面模式,后者能学到更深层的价值判断。

  • RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习):训练流程分三阶段(SFT → RM → PPO),是 ChatGPT 最初的对齐方法。三阶段流程综述见《[[AI 研究方法的演变]]》中关于 RLHF 的讨论,本节聚焦于训练机制与工程参数。RLHF 阶段的核心算法是PPO(Proximal Policy Optimization,近端策略优化),其剪切代理目标可写为:

    \[\mathcal{J}_{\text{PPO}}(\theta) = \mathbb{E}_{\tau \sim \pi_{\theta_{\text{old}}}}\!\left[\min\!\left(r_t(\theta) \hat{A}_t,\; \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t\right)\right] \]

    其中 \(r_t(\theta) = \pi_\theta(a_t \mid q) / \pi_{\theta_{\text{old}}}(a_t \mid q)\) 是新旧策略的比率,\(\hat{A}_t\) 是根据奖励信号和价值估计计算出的优势估计,\(\epsilon\) 通常取 0.2。训练时最大化该代理目标,Clip 机制限制单步策略更新幅度,降低因奖励信号噪声造成的剧烈漂移。但 PPO 在 LLM 场景下对奖励模型的过拟合问题(reward hacking)始终是工程难题:模型学会“骗过奖励模型”而非真正对齐人类偏好。这正是“训练动力学”一节中 Goodhart 律在偏好对齐阶段的直接体现。

  • DPO(Direct Preference Optimization,直接偏好优化):跳过奖励模型,直接从偏好对学习。简化了流程,且经验上效果接近 RLHF,是 2023 年后的主流替代。

  • RLAIF(Reinforcement Learning from AI Feedback,基于 AI 反馈的强化学习):用 LLM 替代人类标注偏好,进一步降低成本,但引入了“用 AI 训练 AI”的循环依赖风险。

除了上述基于人类/AI 偏好的对齐路径,还有一条与 SFT/RLHF 并列而非顺承的应用层主线:知识蒸馏(Knowledge Distillation)。其核心是让一个小模型(“学生”)去拟合一个大模型(“教师”)的输出分布,而非直接拟合真实标签:

\[\mathcal{L}_{\text{KD}} = (1 - \alpha) \cdot \mathcal{L}\!\left(y, \hat{y}_{\text{student}}\right) + \alpha \cdot T^2 \cdot \text{KL}\!\left(p_{\text{teacher}/T} \,\|\, p_{\text{student}/T}\right) \]

其中 \(T\) 是温度系数(典型为 2-10),高 \(T\) 让教师分布的“软信息”暴露得更彻底,学生据此学到类别间的相似度结构(这也是 Hinton 2015 蒸馏工作的关键洞察)。当代 LLM 应用层已经把蒸馏做成了“用大模型造数据 + 训练小模型”的标准流程(DeepSeek-R1 → 蒸馏 7B/32B、Llama 蒸馏小模型系列都是这条路径)。这条路径与 SFT/RLHF 的关键差异:它不直接对齐人类意图,而是把意图的蒸馏形式固化为小模型的模仿目标,因此训练目标的形式化更简单,但继承了教师模型的偏差(包括 Goodhart 律那一节讨论的所有“指标即目标”问题)。

第三节点:价值对齐问题。偏好对齐让模型学会了“在训练数据分布内的偏好”,但人类的真实价值远比训练数据能捕捉的更复杂、更分歧、更随情境变化。模型可能学会了“在大多数情况下不冒犯人”,但仍可能在某些边缘场景下失败;模型可能学会了“礼貌地拒绝”,但仍可能在用户绕过约束时让步。这些不是单靠扩大训练规模就能解决的问题,而是价值对齐的根本困难,参见《[[AI 研究方法的演变]]》中“价值对齐的根本困难”部分。

这条补充路线的整体目标,是把“语言模型”升级为“助手模型”。本节只是勾勒三个节点的工程概貌,详细内容留给路线图后续阶段专门讨论。对当前笔记而言,关键认知是:前述主线建立的“损失 → 优化 → 诊断 → 调优”机制在 SFT、RM、RLHF 三个阶段中反复出现,只是损失函数的具体形式与数据分布不同。掌握本笔记建立的诊断-调优链路,对后续阶段的对齐训练同样适用。

参考资料

posted on 2026-07-19 14:28  凌杰  阅读(287)  评论(1)    收藏  举报

导航