在《[[AI 研究方法的演变]]》那篇笔记中我们沿着研究方法的演变脉络理解了 AI 当前主流的研究为什么会走向深度神经网络。具体来说就是在逻辑符号无法对所有规则进行编码而概率方法又卡在了特征工程的情况下。深度神经网络提供了一种激进的方式回答了后一个难题即放弃人工设计特征让模型自己从数据中学。现在我们需要进一步解释的是这个回答背后的数学基础究竟是什么。通用逼近定理神经网络能成为 AI 主流研究方法所依赖的第一个数学基础是 通用逼近定理Universal Approximation Theorem。根据该定理的陈述任一仅含 单个隐藏层 的前馈神经网络只要隐藏神经元数量足够多并且使用某种非线性激活函数就能在任意精度上逼近 任意紧集 上的任意连续函数。它在 1989 年由乔治·塞本科George Cybenko首次证明对 sigmoid 类激活函数成立同年由库尔特·霍尼克Kurt Hornik等人放宽到任意非常数有界连续激活函数挤压类函数并由摩谢·莱什诺Moshe Leshno等人在 1993 年进一步扩展到包括 ReLU 在内的非多项式激活函数。这换用数学语言来描述就是∀ϵ0,∃fθ∈F,supx∈X|fθ(x)−f∗(x)|ϵ其中f∗:X→Y就是任意紧集上的连续函数fθ是神经网络所表示的参数化函数族F{fθ∣θ∈Θ}中的某个成员θ是网络中所有的权重与偏置。这个定理证明了神经网络 理论上能学会 任意输入到输出的映射。需要特别指出的是通用逼近定理证明的是神经网络的 存在性而不是 可学习性。换言之只要参数调得够好神经网络就能逼近到任意精度但这并不保证我们手中的优化算法能找到那个 “够好” 的参数。这一点呼应了《[[AI 研究方法的演变]]》中关于 “通用逼近能力” 那一节的论断网络表达能力只是必要条件不是充分条件。接下来我们要用工程视角把 “神经网络是什么” 这件看似抽象的事情形式化然后再看这种形式化在实际工作中会暴露什么边界。从数学形式上看神经网络最简洁的定义可以写作一个映射fθ:X→Y,θ∈Θ其中X是输入空间例如28×28的灰度图像Y是输出空间例如 10 个数字类别的概率分布θ∈Θ是参数空间所有权重与偏置的集合。训练这件事的本质就是在Θ这个高维空间中找到一组参数θ∗使得fθ∗在某种意义下最接近我们想要的函数f∗。基于上面这种把神经网络看作 “参数化函数族” 的视角我们就不难看出神经网络的能力边界。它首先由Θ的几何结构决定然后才由F在Θ上的具体形态决定。关于这一点读者接下来将会在我们讨论损失函数和优化过程时看到更为具体的例子。典型应用多层感知机既然神经网络是一个映射那么在 “输入一张图、输出一个分类概率” 这个过程中究竟发生了什么呢这就需要用到一个被称为 前向传播Forward Propagation 的工程实现方法了。在该方法中整个计算被组织成了一张 计算图Computational Graph这个数据结构中的每个节点都是一次具体的数学运算矩阵乘法、加法、激活而边则表示数据的流向。下面让我们来看看人们是如何用最常见的多层感知机MLP来做 MNIST 手写数字分类的并基于这个典型应用来直观感受一下神经网络是怎么工作的。h(0)xh(l1)σ(W(l)h(l)b(l)),l0,1,…,L−1^ysoftmax(W(L)h(L)b(L))其中x∈R784是把28×28灰度图拉平后的向量W(l)∈Rdl1×dl和b(l)∈Rdl1是第l层的权重矩阵和偏置向量σ是非线性激活函数如 ReLUh(l)是第l层的隐藏表示^y∈R10是 10 个数字类别的预测概率。下面让我们通过图 1 来展示一下这个多层感知机的前向传播过程。多层感知机的前向传播图 1 多层感知机的前向传播从上面这张图中读者可以看到整个计算过程非常直观感知机的每一层都在做以下两件事把上一层的表示h(l)通过W(l)h(l)b(l)投影到一个新的空间这个投影本身是线性的通过σ把线性结果折一下让模型能表示非线性关系。如果只有线性投影无论堆多少层最终等价于一个单层线性变换这是矩阵乘法的结合律决定的。所以σ不是装饰而是让 “深” 有意义的关键。这一点的最经典反例就是 Minsky 与 Papert 在 1969 年指出的 XOR 问题单层线性感知机连最简单的非线性可分函数都无法表示必须引入非线性激活或加深网络结构才能打破这一限制如图 2 所示。感知机的局限线性可分与 XOR 问题图 2 感知机的局限线性可分与 XOR 问题需要特别强调的是通用逼近定理告诉我们足够宽的单层网络就能逼近任意连续函数但 深网络比宽网络更能实现参数的高效化。这个经验性事实至今没有严格的数学证明但在实践中已被反复验证也直接催生了 “深度学习” 这个名字。至于计算图本身它不只是教学工具同时也是执行反向传播的基础数据结构。PyTorch 和 JAX 这类框架之所以能做到自动微分本质上就是维护了这一数据结构之后在反向阶段只需沿着图结构进行反向计算梯度即可。关于这一点我们稍后会详细讨论目前读者只需要记住神经网络 一张可微的计算图训练 调整图中的参数。暴露的边界基于上述数学视角读者可以直观地理解到基于神经网络的 AI 训练本质上就是基于一个参数化的函数族在寻找它的最佳参数。但同样的这种视角也同时暴露出该方法在工程实现上绕不开的三个能力边界。逼近能力 ≠ 拟合能力。 通用逼近定理归根结底只是在数学方法上指导 AI 去寻找 “存在够好的参数”但是不是真的能在具体工程实现中找到这些参数这其实是另一个问题。优化过程中的局部最优、鞍点、梯度消失都会让训练停在某个远未逼近f∗的位置。这就是为什么 “理论可学” 和 “实际能训出来” 是截然不同的两件事后者是优化算法要解决的问题。高维空间中的几何直觉失效。 我们对二维平面上的函数拟合有很好的几何直觉但Θ的维度往往是百万级甚至十亿级。在这个量级的空间里局部最优和全局最优的概念本身就变得微妙。毕竟绝大多数临界点不是局部最优而是鞍点。这导致训练过程的几何性质远不如低维情形那么直观。好在流形假设Manifold Hypothesis 提供了一种部分补救在很多真实任务中尽管输入空间X维度极高但有意义的数据其实分布在一个低维流形上。这意味着神经网络实际需要学习的函数其有效定义域远小于X的标称维度。这个假设目前仍是经验性的而非严格证明的但它是理解 为什么深度学习在图像、文本上有效 的认知桥梁。形式化讨论见 Fefferman, Mitter Narayanan (2016) 关于深度学习能工作吗的综述。函数逼近无法区分 “学到了规则” 与 “做对了模式”。 这是《[[AI 研究方法的演变]]》在符号主义与联结主义交锋时提出的那个追问。神经网络能拟合任何函数但拟合成功的内部权重配置到底是在编码某种 “规则”还是仅仅在做高维插值我们从训练曲线和参数值上读不出来。损失函数学习目标的标准化在神经网络通用函数逼近器那一节中我们用数学语言将神经网络形式化成了一个参数化的函数族fθ:X→Y并指出用它训练 AI 的本质就是在Θ这个高维空间中寻找一组参数θ∗。但对于用什么标准来判断够好还是一个亟待解决的问题。换言之我们在 AI 的训练过程中不能盲目地反复修改θ这就需要一个可计算的信号来指引当前神经网络的优化方向。损失函数的定义这个信号的生成器在专业术语中被称为 损失函数Loss Function它的作用是在单样本上定义下面这样一个实值函数L:Y×Y→R≥0,L(y,^y)≥0其中y是真值标签^yfθ(x)是模型预测L返回的是一个非负实数用来刻画 “这一次预测偏离真值多远”。把它对数据集D取期望就会得到如下 经验风险Empirical Risk 函数R(θ)E(x,y)∼D[L(y,fθ(x))]≈1NN∑i1L(yi,fθ(xi))从上述函数中我们可以理解到 AI 训练的目标就是在最小化这个R(θ)的解集损失函数是在解决 “学习目标的标准化” 问题。换言之人们想要模型做什么必须先用L这个数学对象把它写出来否则优化器无从下手。当然了这个标准化的方式背后藏着一个容易被混淆的不对称理解训练时优化的目标L和上线时评估的目标业务指标往往是两件不同的事。比如分类任务训练时用交叉熵但业务上关心的是召回率、转化率LLM 训练时用下一个 token 的交叉熵但用户关心的是回答是否有用、是否安全。这种 “训练目标 vs 评估目标” 的脱节正是损失函数所暴露的核心能力边界。典型应用从回归到序列的损失族下面我们沿着任务类型的演变列出工程中最常用的损失函数族。回归任务这类任务关心的是连续值预测它常用以下三类损失函数均方误差Mean Squared Error, MSEL(y−^y)2。对大误差惩罚重平方放大但对异常值敏感。平均绝对误差Mean Absolute Error, MAEL|y−^y|。对异常值更鲁棒但在零点处不可导需要次梯度处理。Huber 损失在小误差时表现为 MSE在大误差时表现为 MAE是两者的折中常用于带噪声的回归场景。分类任务这类任务关心的是概率分布预测常用的损失函数是 交叉熵Cross EntropyLCE−C∑c1yclog^yc直觉上交叉熵衡量的模型预测分布^y与真值分布y之间的信息距离。对于二分类任务交叉熵退化为二元交叉熵Binary Cross Entropy, BCE对于多分类任务常与 softmax 配合使用。LLM 的预训练本质上就是一个大规模多分类问题在词表上预测下一个 token 的分布因此交叉熵是 LLM 训练的事实标准损失。序列任务这类任务则需要处理变长与对齐问题常用以下两类损失函数CTCConnectionist Temporal Classification用于语音识别等需要把不定长输出对齐到定长标签的场景例如把音频帧序列映射到文字序列。CTC 通过引入 “空白” token 来处理对齐不确定性无需显式标注每一帧对应的字符。标签平滑Label Smoothing把硬标签y∈{0,1}软化为y′(1−ϵ)yϵ/C目的是防止模型对训练数据过度自信从而提升泛化能力。GPT-3 训练时就用到了标签平滑见 Brown et al. 2020 附录。LLM 训练链路的词表前置BPE 与 Subword Tokenization。 上一段提到 LLM 预训练是在词表上预测下一个 token 的分布但词表本身从何而来这是 LLM 训练链路上绕不开的前置工程BPEByte-Pair Encoding字节对编码 是当前大模型词表的事实标准。它从字符级出发反复合并训练语料中出现频率最高的相邻字节对直到词表规模达到设定阈值GPT 系常用约 5 万BERT 用约 3 万。Subword Tokenization 是这类方法的统称介于字符级词表太小、序列太长与词级词表太大、未登录词灾难之间。其工程收益有三一是把生僻词、专有名词拆成常见子词组合从根本上解决未登录词问题二是词表规模可控5 万量级使得 softmax 层的计算与显存占用可接受三是子词粒度天然支持多语言共享词表是 LLM 跨语言能力的基础。BPE 本身不是一个深度学习概念它最早是 1994 年的无损压缩算法但与 Transformer 的结合让它成为 LLM 工程的隐形支柱。理解这一点后前述LLM 预训练是词表上预测下一个 token 的分布这句话的完整含义才完整模型实际是在学习一个 5 万维的分类分布。词表规模的工程权衡。 词表大小不是越大越好它直接影响前述交叉熵损失的计算成本。词表越大softmax 层W∈Rd×|V|的参数与计算量越大且在分布式训练中跨设备同步 token 频率统计的通信开销也增加。词表越小平均每个 token 编码的语义信息越少导致序列变长一段 1000 个汉字的文本词表 5 万时大约切成 500 个 token词表 1 万时要切成 1000 个 token序列长度翻倍直接抬升 Transformer 自注意力的O(N2)计算量与位置编码压力。当代 LLM 普遍把词表设在 3-10 万之间本质上是在 softmax 计算成本与序列长度成本之间走钢丝。这是损失函数一节所暴露边界训练目标 vs 计算成本的耦合在词表层面的具体表现。暴露的边界基于上述对损失函数的形式化与典型应用的梳理读者可以直观地看到损失函数决定了 AI 训练的方向但也同时暴露出三个工程上绕不开的边界。错误损失 → 错误目标。 损失函数是在定义学习目标的标准但这种标准化定义的本身也可能会出错。其中的一种典型情况被称为 标签泄漏Label Leakage即训练数据中包含了本不应被 LLM 看到的目标信息导致损失看似下降但泛化崩溃。另一种情况被称为 目标错配即业务上关心的是召回率但训练时用了精度相关的损失。损失函数选错了再优秀的优化器也只能把模型带到错的地方。损失与评估指标的脱节。 训练时优化的是L可微、可求梯度上线时评估的是业务指标往往不可微、不可直接优化。这两者之间存在天然的鸿沟。LLM 训练用 token 级交叉熵但用户关心的是回答的有用性、安全性、事实性这些指标既不可微又难以在训练中直接使用。这种脱节催生了后续 RLHF基于人类反馈的强化学习等对齐方法用一个可微的奖励模型去逼近人类偏好再回头指导语言模型训练。这条边界在训练动力学一节中会以 Goodhart 定律的形式再次出现当指标变成目标后就不再是好指标。关于这一点的延伸讨论读者可参考本笔记在 “补充路线从监督训练到对齐训练” 这一节中所介绍的内容。不平衡数据下的损失加权。 当数据分布严重倾斜时例如欺诈检测中正样本占比 0.1%标准的交叉熵会让模型倾向于预测多数类。常见的工程缓解包括类别加权在损失中对少数类乘以更大的权重wc即L−∑cwc⋅yclog^yc其中wc与类别频率成反比。Focal Loss在交叉熵基础上乘以(1−^yc)γ调制因子让已经分对的样本贡献更小的损失迫使模型聚焦于难样本。这是目标检测领域处理正负样本不平衡的经典做法。但这些加权策略都属于对错误的补救不是对问题的根治。如果数据本身的标注质量差或采样偏差严重再精巧的损失设计也只能在错位的数据上学到错位的模式。优化过程寻找足够好的参数正如我们之前所说神经网络在具体的工程实现中其实就是一张 可微的计算图。这里的 “可微”指的是计算图上每个节点矩阵乘法、加法、激活函数都可以对其输入求偏导。而它训练的目标则由最小化损失函数R(θ)来进行指导具体方法是在Θ这个高维空间中沿负梯度方向迭代在专业术语中被称为 梯度下降Gradient Descent 方法。同样的本节接下来会先介绍优化器的数学原理再沿 SGD 到 AdamW 的演化谱系展示工程实现最后落到梯度不稳定与优化不等于泛化等绕不开的边界。优化器的数学基础损失函数只是定义了我们在整批训练数据上的期望直接对全量数据求梯度在工程上代价过高因此实践中几乎都使用 随机梯度下降Stochastic Gradient Descent, SGD每次只用一个 mini-batch 估计梯度更新参数θt1θt−η∇θLbatch(θt)其中η是学习率∇θLbatch是当前 mini-batch 上的梯度估计。这条公式看似平凡但 如何高效算出每个参数的梯度呢 这才是关键问题所在人们目前所能想到的解决方案就是反向传播Backpropagation即沿计算图反向调用链式法则如图 3 所示。反向传播示意图图 3 反向传播示意图具体来说若第l层的输出h(l)取决于第l−1层的输出h(l−1)则根据链式法则我们可以得到∂L∂h(l−1)∂L∂h(l)⋅∂h(l)∂h(l−1)如此逐层反推就能用一次前向 一次反向算出所有参数的梯度。这个过程的时间复杂度与一次前向传播同量级这正是反向传播成为深度学习标配的根本原因链式法则把它从数学理论上的可计算变成了工程方面的可实现计算。Rumelhart、Hinton、Williams 在 1986 年的工作把这一思想系统化奠定了深度学习的训练机制关于其历史脉络参见《[[AI 研究方法的演变]]》的对应章节。当然尽管反向传播解决了梯度计算的实现问题但它在工程上也存在着 梯度不稳定 的能力边界其具体表现为梯度消失Vanishing Gradient深层网络中靠后的梯度要沿链式法则连乘多遍才能传回靠前的层。若中间激活函数的导数小于 1如 sigmoid 早期连乘后会快速衰减到零靠前的层几乎收不到学习信号。梯度爆炸Exploding Gradient若中间导数大于 1连乘后会指数增长参数更新剧烈震荡甚至发散为 NaN。这两类问题在 RNN 里尤为严重因为 RNN 沿时间步反向传播相当于在一条非常长的链上反复连乘。起初人们在深度前馈网络里依靠一种被称为 残差连接Residual Connection 的方法对这两类问题做了局部的缓解。该方法的核心价值是让 “恒等映射” 成为网络的默认行为He et al. 2016 解决的核心问题是深度网络的 “退化问题”即深度增加时训练误差反升同时也为梯度提供了绕过容易饱和激活的捷径。而最终真正让问题在工程上收敛的是用 现代化激活函数Modern Activation Functions 取代传统的 sigmoid/tanh 函数ReLU修正线性单元, Rectified Linear Unitσ(x)max(0,x)。其导数在正区间恒为 1从根本上避免了 sigmoid 类的梯度消失。这是 ResNet、GPT 等大多数当代模型的标配。GELU高斯误差线性单元, Gaussian Error Linear Unitσ(x)≈x⋅Φ(x)其中Φ是标准正态分布的累积分布函数。GELU 在零点附近是平滑过渡而非硬截断经验上比 ReLU 收敛更快。BERT、GPT-2 及之后的 OpenAI 系列模型都用它。SwiGLUSwish 门控线性单元, Swish Gated Linear Unit将输入分两路一路经过 Swish 激活即Swish(W1x)W1x⋅σ(βW1x)另一路保持线性最终做逐元素乘SwiGLU(x)Swish(W1x)⊗(W2x)其中⊗表示逐元素乘。SwiGLU 结合门控机制是 LLaMA、PaLM 等近年大模型的默认选择。需要指出的是这些激活函数在数学上都是 “软化” 的 ReLU而不是某种原理性突破。它们的引入反映的是一个工程真相反向传播的稳定性不是一个能被理论定理证明的事它要靠经验性的损失曲面与一阶导数统计去验证。这就是为什么激活函数的选择在大模型时代反而成为一项需要消融实验确认的工程决策。典型应用从 SGD 到 AdamW 的演化谱系反向传播给出的是梯度方向但决定沿这个方向走多远、以什么方式累积历史信息的是优化器。下面让我们从 SGD 出发沿着 AdamW 的演化谱系看看优化器在工程实践中是如何一步步发展的。SGD 及其动量变种SGD随机梯度下降Stochastic Gradient Descent 是最简单的优化器其更新规则为θt1θt−η∇θL(θt)纯 SGD 的问题在于梯度估计有噪声尤其在高维非凸损失面上像布朗运动一样来回震荡。动量Momentum 引入历史梯度的指数滑动平均vt1βvt∇θL(θt),θt1θt−ηvt1如果想直观点理解动量的作用就是增加参数更新的 “惯性”就像小球滚下坡以便加速收敛并抑制震荡。Nesterov 动量进一步把 先按动量探一步、再在那个位置算梯度 的修正项引入是凸优化中收敛速度更快的一个变种。自适应学习率AdaGrad / RMSProp / Adam不同参数的梯度量级天然差异巨大有些权重长期小幅更新有些则剧烈震荡。固定学习率很难同时照顾两类参数。AdaGradAdaptive Gradient自适应梯度 对每个参数维护一个梯度平方的累积和按参数的历史活跃度反比地缩小其学习率。其优点是稀疏特征友好缺点是学习率单调下降、可能过早停止学习。RMSPropRoot Mean Square Propagation均方根传播 改用指数滑动平均缓解 AdaGrad 的过早衰减AdamAdaptive Moment Estimation自适应矩估 则把动量一阶矩和 RMSProp二阶矩合二为一是当前深度学习的默认起点。其更新规则如下mt1β1mt(1−β1)∇θL(θt)一阶矩vt1β2vt(1−β2)(∇θL(θt))2二阶矩^mt1mt11−βt11,^vt1vt11−βt12偏差修正θt1θt−η^mt1√^vt1ϵ其中β1,β2通常取 0.9 和 0.999。偏差修正步骤用于抵消训练初期mt、vt被初始化为零导致的偏差是 Adam 工程实践中不可省略的一步。Adam 的工程经验是几乎不需要调学习率η10−3在大量任务上都能起步具体到不同模型类别BERT 类小模型常用2×10−5量级ResNet-50 类视觉模型常用10−3GPT 类大模型受限于全局 batch size 较大峰值学习率常被压到3×10−4上下。具体的扫描范围与判定标准将在调优策略一节的训练层面小节展开。AdamW解耦权重衰减深度学习里常用的 权重衰减Weight Decay 是一种正则化每步把参数向零拉一点抑制过拟合。传统实现是直接把衰减项加到损失函数里再求梯度。但 Adam 的自适应学习率会让衰减项也被 “自适应缩放”失去了原本的意图。AdamWAdam with decoupled Weight Decay 的修正是把衰减项从损失里拿出来直接作用在参数更新上θt1θt−η^mt1√^vt1ϵ−ηλθt这样权重衰减就不再受自适应学习率的干扰。AdamW 是当前训练 Transformer 系模型的标配。学习率调度Learning Rate Scheduling把训练比作下山刚开始要大胆迈步高学习率接近谷底时要谨慎低学习率。学习率调度 就是给η画一条随训练步数变化的曲线。Warmup训练最初几千步把η从 0 线性升到峰值避免初期梯度剧烈震荡把参数推到坏区域。Cosine Decay训练中后段让η沿余弦曲线从峰值平滑降到接近零比阶跃式下降更稳。Linear Decay把η从峰值线性降到 0实现简单但尾部下降过快。当代大模型训练普遍组合Warmup Cosine Decay 或 Warmup Linear Decay。这两种不是原理上最优而是工程上够用。暴露的边界优化过程决定了参数怎么动但它本身也暴露三个工程上绕不开的边界。优化 ≠ 泛化。 这是最重要的一条边界训练损失降得越低测试表现未必越好。这条边界的根源是经验风险的极小点并不等于真实风险的极小点。优化器把θ带到训练损失最低的位置但训练数据只是真实分布的一个有偏样本。在这个位置模型可能完美拟合了训练数据中的噪声却把未见样本的判别能力丢了这就是过拟合。深度学习中的过拟合不是单一现象它可能来自数据不足特征相对样本数过多、参数过多表达能力过强、训练时间过长被噪声牵着走。任何调优手段都只能延缓过拟合的发生不能消灭它。一旦把优化与泛化当作一件事来处理工程上会反复陷入训练集完美 → 测试集崩盘的死循环。鞍点比局部最优更常见。 优化器在Θ这个高维空间里走的是局部路径每一步只看自己当前点的梯度。这让人担心会不会卡在局部最优。事实上Dauphin 等人 2014 年的研究指出在高维非凸损失面上绝大多数临界点不是局部最优而是鞍点形象地说损失曲面更像一片有褶皱的山地每个山坳都是一个 “出口”真正的局部最优反而稀少。这意味着梯度下降一般能持续走出看起来平的地方找到更好的位置。但这个结论有个前提梯度必须有效传播。一旦进入 “梯度消失区”优化器看到的全是接近零的梯度会误以为已收敛这其实是假局部最优是前述 “梯度不稳定” 小节中激活函数失效在优化阶段的体现。鞍点丰富这一事实对深度学习是半个好消息它解释了为什么朴素 SGD 在大多数任务上不至于彻底失败。这一损失曲面的高维几何形态如图 4 所示。高维损失曲面的鞍点分布图 4 高维损失曲面的鞍点分布大模型训练损失不收敛不等于效果差。 在小模型时代不收敛意味着代码 bug 或超参数灾难。但在大模型时代训练损失的不收敛在某些特定设置下是正常的、甚至是必要的。一个值得注意的现象是当模型规模逼近数据量约束时即所谓过训练继续训练有时会导致验证损失先降后稳甚至回升而训练损失仍在持续下降——这种训练与验证之间的剪刀差在传统 ML 中是过拟合的典型信号但在大模型场景下下游任务的表现仍可能继续改善。这个反直觉的现象说明训练损失的数值变化已经不再是模型质量的有效指标评估必须看下游任务的实际表现。这是评估方法论从看损失曲线转向看评测基准的根本原因也是接下来的这一节要展开的核心议题。而关于 Chinchilla 与规模化定律的进一步细节将会在 “调优策略” 这一节中系统讨论。
神经网络:通用函数逼近器
在《[[AI 研究方法的演变]]》那篇笔记中我们沿着研究方法的演变脉络理解了 AI 当前主流的研究为什么会走向深度神经网络。具体来说就是在逻辑符号无法对所有规则进行编码而概率方法又卡在了特征工程的情况下。深度神经网络提供了一种激进的方式回答了后一个难题即放弃人工设计特征让模型自己从数据中学。现在我们需要进一步解释的是这个回答背后的数学基础究竟是什么。通用逼近定理神经网络能成为 AI 主流研究方法所依赖的第一个数学基础是 通用逼近定理Universal Approximation Theorem。根据该定理的陈述任一仅含 单个隐藏层 的前馈神经网络只要隐藏神经元数量足够多并且使用某种非线性激活函数就能在任意精度上逼近 任意紧集 上的任意连续函数。它在 1989 年由乔治·塞本科George Cybenko首次证明对 sigmoid 类激活函数成立同年由库尔特·霍尼克Kurt Hornik等人放宽到任意非常数有界连续激活函数挤压类函数并由摩谢·莱什诺Moshe Leshno等人在 1993 年进一步扩展到包括 ReLU 在内的非多项式激活函数。这换用数学语言来描述就是∀ϵ0,∃fθ∈F,supx∈X|fθ(x)−f∗(x)|ϵ其中f∗:X→Y就是任意紧集上的连续函数fθ是神经网络所表示的参数化函数族F{fθ∣θ∈Θ}中的某个成员θ是网络中所有的权重与偏置。这个定理证明了神经网络 理论上能学会 任意输入到输出的映射。需要特别指出的是通用逼近定理证明的是神经网络的 存在性而不是 可学习性。换言之只要参数调得够好神经网络就能逼近到任意精度但这并不保证我们手中的优化算法能找到那个 “够好” 的参数。这一点呼应了《[[AI 研究方法的演变]]》中关于 “通用逼近能力” 那一节的论断网络表达能力只是必要条件不是充分条件。接下来我们要用工程视角把 “神经网络是什么” 这件看似抽象的事情形式化然后再看这种形式化在实际工作中会暴露什么边界。从数学形式上看神经网络最简洁的定义可以写作一个映射fθ:X→Y,θ∈Θ其中X是输入空间例如28×28的灰度图像Y是输出空间例如 10 个数字类别的概率分布θ∈Θ是参数空间所有权重与偏置的集合。训练这件事的本质就是在Θ这个高维空间中找到一组参数θ∗使得fθ∗在某种意义下最接近我们想要的函数f∗。基于上面这种把神经网络看作 “参数化函数族” 的视角我们就不难看出神经网络的能力边界。它首先由Θ的几何结构决定然后才由F在Θ上的具体形态决定。关于这一点读者接下来将会在我们讨论损失函数和优化过程时看到更为具体的例子。典型应用多层感知机既然神经网络是一个映射那么在 “输入一张图、输出一个分类概率” 这个过程中究竟发生了什么呢这就需要用到一个被称为 前向传播Forward Propagation 的工程实现方法了。在该方法中整个计算被组织成了一张 计算图Computational Graph这个数据结构中的每个节点都是一次具体的数学运算矩阵乘法、加法、激活而边则表示数据的流向。下面让我们来看看人们是如何用最常见的多层感知机MLP来做 MNIST 手写数字分类的并基于这个典型应用来直观感受一下神经网络是怎么工作的。h(0)xh(l1)σ(W(l)h(l)b(l)),l0,1,…,L−1^ysoftmax(W(L)h(L)b(L))其中x∈R784是把28×28灰度图拉平后的向量W(l)∈Rdl1×dl和b(l)∈Rdl1是第l层的权重矩阵和偏置向量σ是非线性激活函数如 ReLUh(l)是第l层的隐藏表示^y∈R10是 10 个数字类别的预测概率。下面让我们通过图 1 来展示一下这个多层感知机的前向传播过程。多层感知机的前向传播图 1 多层感知机的前向传播从上面这张图中读者可以看到整个计算过程非常直观感知机的每一层都在做以下两件事把上一层的表示h(l)通过W(l)h(l)b(l)投影到一个新的空间这个投影本身是线性的通过σ把线性结果折一下让模型能表示非线性关系。如果只有线性投影无论堆多少层最终等价于一个单层线性变换这是矩阵乘法的结合律决定的。所以σ不是装饰而是让 “深” 有意义的关键。这一点的最经典反例就是 Minsky 与 Papert 在 1969 年指出的 XOR 问题单层线性感知机连最简单的非线性可分函数都无法表示必须引入非线性激活或加深网络结构才能打破这一限制如图 2 所示。感知机的局限线性可分与 XOR 问题图 2 感知机的局限线性可分与 XOR 问题需要特别强调的是通用逼近定理告诉我们足够宽的单层网络就能逼近任意连续函数但 深网络比宽网络更能实现参数的高效化。这个经验性事实至今没有严格的数学证明但在实践中已被反复验证也直接催生了 “深度学习” 这个名字。至于计算图本身它不只是教学工具同时也是执行反向传播的基础数据结构。PyTorch 和 JAX 这类框架之所以能做到自动微分本质上就是维护了这一数据结构之后在反向阶段只需沿着图结构进行反向计算梯度即可。关于这一点我们稍后会详细讨论目前读者只需要记住神经网络 一张可微的计算图训练 调整图中的参数。暴露的边界基于上述数学视角读者可以直观地理解到基于神经网络的 AI 训练本质上就是基于一个参数化的函数族在寻找它的最佳参数。但同样的这种视角也同时暴露出该方法在工程实现上绕不开的三个能力边界。逼近能力 ≠ 拟合能力。 通用逼近定理归根结底只是在数学方法上指导 AI 去寻找 “存在够好的参数”但是不是真的能在具体工程实现中找到这些参数这其实是另一个问题。优化过程中的局部最优、鞍点、梯度消失都会让训练停在某个远未逼近f∗的位置。这就是为什么 “理论可学” 和 “实际能训出来” 是截然不同的两件事后者是优化算法要解决的问题。高维空间中的几何直觉失效。 我们对二维平面上的函数拟合有很好的几何直觉但Θ的维度往往是百万级甚至十亿级。在这个量级的空间里局部最优和全局最优的概念本身就变得微妙。毕竟绝大多数临界点不是局部最优而是鞍点。这导致训练过程的几何性质远不如低维情形那么直观。好在流形假设Manifold Hypothesis 提供了一种部分补救在很多真实任务中尽管输入空间X维度极高但有意义的数据其实分布在一个低维流形上。这意味着神经网络实际需要学习的函数其有效定义域远小于X的标称维度。这个假设目前仍是经验性的而非严格证明的但它是理解 为什么深度学习在图像、文本上有效 的认知桥梁。形式化讨论见 Fefferman, Mitter Narayanan (2016) 关于深度学习能工作吗的综述。函数逼近无法区分 “学到了规则” 与 “做对了模式”。 这是《[[AI 研究方法的演变]]》在符号主义与联结主义交锋时提出的那个追问。神经网络能拟合任何函数但拟合成功的内部权重配置到底是在编码某种 “规则”还是仅仅在做高维插值我们从训练曲线和参数值上读不出来。损失函数学习目标的标准化在神经网络通用函数逼近器那一节中我们用数学语言将神经网络形式化成了一个参数化的函数族fθ:X→Y并指出用它训练 AI 的本质就是在Θ这个高维空间中寻找一组参数θ∗。但对于用什么标准来判断够好还是一个亟待解决的问题。换言之我们在 AI 的训练过程中不能盲目地反复修改θ这就需要一个可计算的信号来指引当前神经网络的优化方向。损失函数的定义这个信号的生成器在专业术语中被称为 损失函数Loss Function它的作用是在单样本上定义下面这样一个实值函数L:Y×Y→R≥0,L(y,^y)≥0其中y是真值标签^yfθ(x)是模型预测L返回的是一个非负实数用来刻画 “这一次预测偏离真值多远”。把它对数据集D取期望就会得到如下 经验风险Empirical Risk 函数R(θ)E(x,y)∼D[L(y,fθ(x))]≈1NN∑i1L(yi,fθ(xi))从上述函数中我们可以理解到 AI 训练的目标就是在最小化这个R(θ)的解集损失函数是在解决 “学习目标的标准化” 问题。换言之人们想要模型做什么必须先用L这个数学对象把它写出来否则优化器无从下手。当然了这个标准化的方式背后藏着一个容易被混淆的不对称理解训练时优化的目标L和上线时评估的目标业务指标往往是两件不同的事。比如分类任务训练时用交叉熵但业务上关心的是召回率、转化率LLM 训练时用下一个 token 的交叉熵但用户关心的是回答是否有用、是否安全。这种 “训练目标 vs 评估目标” 的脱节正是损失函数所暴露的核心能力边界。典型应用从回归到序列的损失族下面我们沿着任务类型的演变列出工程中最常用的损失函数族。回归任务这类任务关心的是连续值预测它常用以下三类损失函数均方误差Mean Squared Error, MSEL(y−^y)2。对大误差惩罚重平方放大但对异常值敏感。平均绝对误差Mean Absolute Error, MAEL|y−^y|。对异常值更鲁棒但在零点处不可导需要次梯度处理。Huber 损失在小误差时表现为 MSE在大误差时表现为 MAE是两者的折中常用于带噪声的回归场景。分类任务这类任务关心的是概率分布预测常用的损失函数是 交叉熵Cross EntropyLCE−C∑c1yclog^yc直觉上交叉熵衡量的模型预测分布^y与真值分布y之间的信息距离。对于二分类任务交叉熵退化为二元交叉熵Binary Cross Entropy, BCE对于多分类任务常与 softmax 配合使用。LLM 的预训练本质上就是一个大规模多分类问题在词表上预测下一个 token 的分布因此交叉熵是 LLM 训练的事实标准损失。序列任务这类任务则需要处理变长与对齐问题常用以下两类损失函数CTCConnectionist Temporal Classification用于语音识别等需要把不定长输出对齐到定长标签的场景例如把音频帧序列映射到文字序列。CTC 通过引入 “空白” token 来处理对齐不确定性无需显式标注每一帧对应的字符。标签平滑Label Smoothing把硬标签y∈{0,1}软化为y′(1−ϵ)yϵ/C目的是防止模型对训练数据过度自信从而提升泛化能力。GPT-3 训练时就用到了标签平滑见 Brown et al. 2020 附录。LLM 训练链路的词表前置BPE 与 Subword Tokenization。 上一段提到 LLM 预训练是在词表上预测下一个 token 的分布但词表本身从何而来这是 LLM 训练链路上绕不开的前置工程BPEByte-Pair Encoding字节对编码 是当前大模型词表的事实标准。它从字符级出发反复合并训练语料中出现频率最高的相邻字节对直到词表规模达到设定阈值GPT 系常用约 5 万BERT 用约 3 万。Subword Tokenization 是这类方法的统称介于字符级词表太小、序列太长与词级词表太大、未登录词灾难之间。其工程收益有三一是把生僻词、专有名词拆成常见子词组合从根本上解决未登录词问题二是词表规模可控5 万量级使得 softmax 层的计算与显存占用可接受三是子词粒度天然支持多语言共享词表是 LLM 跨语言能力的基础。BPE 本身不是一个深度学习概念它最早是 1994 年的无损压缩算法但与 Transformer 的结合让它成为 LLM 工程的隐形支柱。理解这一点后前述LLM 预训练是词表上预测下一个 token 的分布这句话的完整含义才完整模型实际是在学习一个 5 万维的分类分布。词表规模的工程权衡。 词表大小不是越大越好它直接影响前述交叉熵损失的计算成本。词表越大softmax 层W∈Rd×|V|的参数与计算量越大且在分布式训练中跨设备同步 token 频率统计的通信开销也增加。词表越小平均每个 token 编码的语义信息越少导致序列变长一段 1000 个汉字的文本词表 5 万时大约切成 500 个 token词表 1 万时要切成 1000 个 token序列长度翻倍直接抬升 Transformer 自注意力的O(N2)计算量与位置编码压力。当代 LLM 普遍把词表设在 3-10 万之间本质上是在 softmax 计算成本与序列长度成本之间走钢丝。这是损失函数一节所暴露边界训练目标 vs 计算成本的耦合在词表层面的具体表现。暴露的边界基于上述对损失函数的形式化与典型应用的梳理读者可以直观地看到损失函数决定了 AI 训练的方向但也同时暴露出三个工程上绕不开的边界。错误损失 → 错误目标。 损失函数是在定义学习目标的标准但这种标准化定义的本身也可能会出错。其中的一种典型情况被称为 标签泄漏Label Leakage即训练数据中包含了本不应被 LLM 看到的目标信息导致损失看似下降但泛化崩溃。另一种情况被称为 目标错配即业务上关心的是召回率但训练时用了精度相关的损失。损失函数选错了再优秀的优化器也只能把模型带到错的地方。损失与评估指标的脱节。 训练时优化的是L可微、可求梯度上线时评估的是业务指标往往不可微、不可直接优化。这两者之间存在天然的鸿沟。LLM 训练用 token 级交叉熵但用户关心的是回答的有用性、安全性、事实性这些指标既不可微又难以在训练中直接使用。这种脱节催生了后续 RLHF基于人类反馈的强化学习等对齐方法用一个可微的奖励模型去逼近人类偏好再回头指导语言模型训练。这条边界在训练动力学一节中会以 Goodhart 定律的形式再次出现当指标变成目标后就不再是好指标。关于这一点的延伸讨论读者可参考本笔记在 “补充路线从监督训练到对齐训练” 这一节中所介绍的内容。不平衡数据下的损失加权。 当数据分布严重倾斜时例如欺诈检测中正样本占比 0.1%标准的交叉熵会让模型倾向于预测多数类。常见的工程缓解包括类别加权在损失中对少数类乘以更大的权重wc即L−∑cwc⋅yclog^yc其中wc与类别频率成反比。Focal Loss在交叉熵基础上乘以(1−^yc)γ调制因子让已经分对的样本贡献更小的损失迫使模型聚焦于难样本。这是目标检测领域处理正负样本不平衡的经典做法。但这些加权策略都属于对错误的补救不是对问题的根治。如果数据本身的标注质量差或采样偏差严重再精巧的损失设计也只能在错位的数据上学到错位的模式。优化过程寻找足够好的参数正如我们之前所说神经网络在具体的工程实现中其实就是一张 可微的计算图。这里的 “可微”指的是计算图上每个节点矩阵乘法、加法、激活函数都可以对其输入求偏导。而它训练的目标则由最小化损失函数R(θ)来进行指导具体方法是在Θ这个高维空间中沿负梯度方向迭代在专业术语中被称为 梯度下降Gradient Descent 方法。同样的本节接下来会先介绍优化器的数学原理再沿 SGD 到 AdamW 的演化谱系展示工程实现最后落到梯度不稳定与优化不等于泛化等绕不开的边界。优化器的数学基础损失函数只是定义了我们在整批训练数据上的期望直接对全量数据求梯度在工程上代价过高因此实践中几乎都使用 随机梯度下降Stochastic Gradient Descent, SGD每次只用一个 mini-batch 估计梯度更新参数θt1θt−η∇θLbatch(θt)其中η是学习率∇θLbatch是当前 mini-batch 上的梯度估计。这条公式看似平凡但 如何高效算出每个参数的梯度呢 这才是关键问题所在人们目前所能想到的解决方案就是反向传播Backpropagation即沿计算图反向调用链式法则如图 3 所示。反向传播示意图图 3 反向传播示意图具体来说若第l层的输出h(l)取决于第l−1层的输出h(l−1)则根据链式法则我们可以得到∂L∂h(l−1)∂L∂h(l)⋅∂h(l)∂h(l−1)如此逐层反推就能用一次前向 一次反向算出所有参数的梯度。这个过程的时间复杂度与一次前向传播同量级这正是反向传播成为深度学习标配的根本原因链式法则把它从数学理论上的可计算变成了工程方面的可实现计算。Rumelhart、Hinton、Williams 在 1986 年的工作把这一思想系统化奠定了深度学习的训练机制关于其历史脉络参见《[[AI 研究方法的演变]]》的对应章节。当然尽管反向传播解决了梯度计算的实现问题但它在工程上也存在着 梯度不稳定 的能力边界其具体表现为梯度消失Vanishing Gradient深层网络中靠后的梯度要沿链式法则连乘多遍才能传回靠前的层。若中间激活函数的导数小于 1如 sigmoid 早期连乘后会快速衰减到零靠前的层几乎收不到学习信号。梯度爆炸Exploding Gradient若中间导数大于 1连乘后会指数增长参数更新剧烈震荡甚至发散为 NaN。这两类问题在 RNN 里尤为严重因为 RNN 沿时间步反向传播相当于在一条非常长的链上反复连乘。起初人们在深度前馈网络里依靠一种被称为 残差连接Residual Connection 的方法对这两类问题做了局部的缓解。该方法的核心价值是让 “恒等映射” 成为网络的默认行为He et al. 2016 解决的核心问题是深度网络的 “退化问题”即深度增加时训练误差反升同时也为梯度提供了绕过容易饱和激活的捷径。而最终真正让问题在工程上收敛的是用 现代化激活函数Modern Activation Functions 取代传统的 sigmoid/tanh 函数ReLU修正线性单元, Rectified Linear Unitσ(x)max(0,x)。其导数在正区间恒为 1从根本上避免了 sigmoid 类的梯度消失。这是 ResNet、GPT 等大多数当代模型的标配。GELU高斯误差线性单元, Gaussian Error Linear Unitσ(x)≈x⋅Φ(x)其中Φ是标准正态分布的累积分布函数。GELU 在零点附近是平滑过渡而非硬截断经验上比 ReLU 收敛更快。BERT、GPT-2 及之后的 OpenAI 系列模型都用它。SwiGLUSwish 门控线性单元, Swish Gated Linear Unit将输入分两路一路经过 Swish 激活即Swish(W1x)W1x⋅σ(βW1x)另一路保持线性最终做逐元素乘SwiGLU(x)Swish(W1x)⊗(W2x)其中⊗表示逐元素乘。SwiGLU 结合门控机制是 LLaMA、PaLM 等近年大模型的默认选择。需要指出的是这些激活函数在数学上都是 “软化” 的 ReLU而不是某种原理性突破。它们的引入反映的是一个工程真相反向传播的稳定性不是一个能被理论定理证明的事它要靠经验性的损失曲面与一阶导数统计去验证。这就是为什么激活函数的选择在大模型时代反而成为一项需要消融实验确认的工程决策。典型应用从 SGD 到 AdamW 的演化谱系反向传播给出的是梯度方向但决定沿这个方向走多远、以什么方式累积历史信息的是优化器。下面让我们从 SGD 出发沿着 AdamW 的演化谱系看看优化器在工程实践中是如何一步步发展的。SGD 及其动量变种SGD随机梯度下降Stochastic Gradient Descent 是最简单的优化器其更新规则为θt1θt−η∇θL(θt)纯 SGD 的问题在于梯度估计有噪声尤其在高维非凸损失面上像布朗运动一样来回震荡。动量Momentum 引入历史梯度的指数滑动平均vt1βvt∇θL(θt),θt1θt−ηvt1如果想直观点理解动量的作用就是增加参数更新的 “惯性”就像小球滚下坡以便加速收敛并抑制震荡。Nesterov 动量进一步把 先按动量探一步、再在那个位置算梯度 的修正项引入是凸优化中收敛速度更快的一个变种。自适应学习率AdaGrad / RMSProp / Adam不同参数的梯度量级天然差异巨大有些权重长期小幅更新有些则剧烈震荡。固定学习率很难同时照顾两类参数。AdaGradAdaptive Gradient自适应梯度 对每个参数维护一个梯度平方的累积和按参数的历史活跃度反比地缩小其学习率。其优点是稀疏特征友好缺点是学习率单调下降、可能过早停止学习。RMSPropRoot Mean Square Propagation均方根传播 改用指数滑动平均缓解 AdaGrad 的过早衰减AdamAdaptive Moment Estimation自适应矩估 则把动量一阶矩和 RMSProp二阶矩合二为一是当前深度学习的默认起点。其更新规则如下mt1β1mt(1−β1)∇θL(θt)一阶矩vt1β2vt(1−β2)(∇θL(θt))2二阶矩^mt1mt11−βt11,^vt1vt11−βt12偏差修正θt1θt−η^mt1√^vt1ϵ其中β1,β2通常取 0.9 和 0.999。偏差修正步骤用于抵消训练初期mt、vt被初始化为零导致的偏差是 Adam 工程实践中不可省略的一步。Adam 的工程经验是几乎不需要调学习率η10−3在大量任务上都能起步具体到不同模型类别BERT 类小模型常用2×10−5量级ResNet-50 类视觉模型常用10−3GPT 类大模型受限于全局 batch size 较大峰值学习率常被压到3×10−4上下。具体的扫描范围与判定标准将在调优策略一节的训练层面小节展开。AdamW解耦权重衰减深度学习里常用的 权重衰减Weight Decay 是一种正则化每步把参数向零拉一点抑制过拟合。传统实现是直接把衰减项加到损失函数里再求梯度。但 Adam 的自适应学习率会让衰减项也被 “自适应缩放”失去了原本的意图。AdamWAdam with decoupled Weight Decay 的修正是把衰减项从损失里拿出来直接作用在参数更新上θt1θt−η^mt1√^vt1ϵ−ηλθt这样权重衰减就不再受自适应学习率的干扰。AdamW 是当前训练 Transformer 系模型的标配。学习率调度Learning Rate Scheduling把训练比作下山刚开始要大胆迈步高学习率接近谷底时要谨慎低学习率。学习率调度 就是给η画一条随训练步数变化的曲线。Warmup训练最初几千步把η从 0 线性升到峰值避免初期梯度剧烈震荡把参数推到坏区域。Cosine Decay训练中后段让η沿余弦曲线从峰值平滑降到接近零比阶跃式下降更稳。Linear Decay把η从峰值线性降到 0实现简单但尾部下降过快。当代大模型训练普遍组合Warmup Cosine Decay 或 Warmup Linear Decay。这两种不是原理上最优而是工程上够用。暴露的边界优化过程决定了参数怎么动但它本身也暴露三个工程上绕不开的边界。优化 ≠ 泛化。 这是最重要的一条边界训练损失降得越低测试表现未必越好。这条边界的根源是经验风险的极小点并不等于真实风险的极小点。优化器把θ带到训练损失最低的位置但训练数据只是真实分布的一个有偏样本。在这个位置模型可能完美拟合了训练数据中的噪声却把未见样本的判别能力丢了这就是过拟合。深度学习中的过拟合不是单一现象它可能来自数据不足特征相对样本数过多、参数过多表达能力过强、训练时间过长被噪声牵着走。任何调优手段都只能延缓过拟合的发生不能消灭它。一旦把优化与泛化当作一件事来处理工程上会反复陷入训练集完美 → 测试集崩盘的死循环。鞍点比局部最优更常见。 优化器在Θ这个高维空间里走的是局部路径每一步只看自己当前点的梯度。这让人担心会不会卡在局部最优。事实上Dauphin 等人 2014 年的研究指出在高维非凸损失面上绝大多数临界点不是局部最优而是鞍点形象地说损失曲面更像一片有褶皱的山地每个山坳都是一个 “出口”真正的局部最优反而稀少。这意味着梯度下降一般能持续走出看起来平的地方找到更好的位置。但这个结论有个前提梯度必须有效传播。一旦进入 “梯度消失区”优化器看到的全是接近零的梯度会误以为已收敛这其实是假局部最优是前述 “梯度不稳定” 小节中激活函数失效在优化阶段的体现。鞍点丰富这一事实对深度学习是半个好消息它解释了为什么朴素 SGD 在大多数任务上不至于彻底失败。这一损失曲面的高维几何形态如图 4 所示。高维损失曲面的鞍点分布图 4 高维损失曲面的鞍点分布大模型训练损失不收敛不等于效果差。 在小模型时代不收敛意味着代码 bug 或超参数灾难。但在大模型时代训练损失的不收敛在某些特定设置下是正常的、甚至是必要的。一个值得注意的现象是当模型规模逼近数据量约束时即所谓过训练继续训练有时会导致验证损失先降后稳甚至回升而训练损失仍在持续下降——这种训练与验证之间的剪刀差在传统 ML 中是过拟合的典型信号但在大模型场景下下游任务的表现仍可能继续改善。这个反直觉的现象说明训练损失的数值变化已经不再是模型质量的有效指标评估必须看下游任务的实际表现。这是评估方法论从看损失曲线转向看评测基准的根本原因也是接下来的这一节要展开的核心议题。而关于 Chinchilla 与规模化定律的进一步细节将会在 “调优策略” 这一节中系统讨论。