AI 工程基础体系 · 第 2/100 篇。内容覆盖机器学习、深度学习与生成式 AI;模型、数据、评测、权限和成本会作为同一生产系统处理。

AI 数学基础:向量矩阵、概率统计、微积分与优化直觉

机器学习模型可以看成一个函数:

y^=fθ(x)\hat{y}=f_\theta(x)

其中,xx 是输入数据,θ\theta 是模型参数,y^\hat y 是模型输出。训练过程不是“让模型记住答案”,而是定义一个损失函数:

L(θ;x,y)\mathcal L(\theta; x,y)

然后寻找一组参数,使训练数据上的平均损失尽可能小,同时在未见过的数据上仍然有较好表现。

向量和矩阵描述数据与模型结构,概率统计描述不确定性、采样和泛化,微积分描述参数改变时损失如何变化,优化算法则根据这些变化更新参数。四者共同构成机器学习、深度学习和生成式 AI 的数学基础。


一、先建立统一对象:数据、参数、预测与损失

假设有 nn 条样本,每条样本包含 dd 个特征:

X=[x11x12x1dx21x22x2dxn1xn2xnd]Rn×dX= \begin{bmatrix} x_{11} & x_{12} & \cdots & x_{1d}\\ x_{21} & x_{22} & \cdots & x_{2d}\\ \vdots & \vdots & \ddots & \vdots\\ x_{n1} & x_{n2} & \cdots & x_{nd} \end{bmatrix} \in \mathbb R^{n\times d}

ii 条样本是行向量 xix_i,标签记为 yiy_i

模型根据参数 θ\theta 产生预测:

y^i=fθ(xi)\hat y_i=f_\theta(x_i)

单条样本的损失为:

i=(fθ(xi),yi)\ell_i=\ell(f_\theta(x_i),y_i)

训练集平均损失通常写为:

J(θ)=1ni=1niJ(\theta)=\frac{1}{n}\sum_{i=1}^{n}\ell_i

这里的 JJ 是经验风险。它只描述当前数据集上的表现,不自动等于真实业务分布上的表现。若真实数据由分布 P(X,Y)P(X,Y) 产生,真正关心的是期望风险:

R(θ)=E(X,Y)P[(fθ(X),Y)]R(\theta)=\mathbb E_{(X,Y)\sim P}[\ell(f_\theta(X),Y)]

训练集是从 PP 中抽取的有限样本,因此机器学习的核心难题之一是:如何让最小化 J(θ)J(\theta) 的模型,同时具有较小的 R(θ)R(\theta)


二、向量:表示数据、方向和特征组合

2.1 向量的两种角色

向量既可以表示一个对象,也可以表示一组数值特征。

例如,一个用户可以表示为:

x=[35112000]x= \begin{bmatrix} 35\\ 1\\ 12000 \end{bmatrix}

三个分量分别表示年龄、是否会员、月消费。这个向量的每个坐标有明确业务含义。

在神经网络中,向量也可能是经过训练得到的表示。例如文本中的一个词被映射为:

ecatR768e_{\text{cat}}\in\mathbb R^{768}

此时每个坐标通常没有单独可解释的业务意义,整体几何关系才更重要。若两个词的向量内积较大,往往意味着它们在模型表示空间中具有相似方向,但这不是“语义相似”的数学保证,而是训练目标和数据共同形成的结果。

2.2 线性组合与内积

两个同维向量的内积为:

xw=j=1dxjwjx^\top w=\sum_{j=1}^{d}x_jw_j

线性模型:

z=wx+bz=w^\top x+b

可以理解为:每个特征 xjx_j 乘以权重 wjw_j,再求和并加入偏置 bb

x=(2,3)x=(2,3)w=(0.5,1)w=(0.5,-1)b=1b=1 为例:

wx=0.5×2+(1)×3=2w^\top x=0.5\times2+(-1)\times3=-2

因此:

z=2+1=1z=-2+1=-1

如果这是二分类模型的 logit,z<0z<0 表示模型更偏向负类;但是否输出正类,还取决于阈值和概率映射。

内积还可以衡量方向关系。余弦相似度定义为:

cos(x,w)=xwx2w2\cos(x,w)=\frac{x^\top w}{\|x\|_2\|w\|_2}

其中:

x2=jxj2\|x\|_2=\sqrt{\sum_jx_j^2}

余弦相似度只关注方向,不关注长度。向量 x=(1,1)x=(1,1)2x=(2,2)2x=(2,2) 的余弦相似度为 1,但它们的欧氏距离并不为 0。这说明“相似”的定义依赖任务:搜索系统可能关注方向,距离敏感的聚类可能同时关注长度。

2.3 范数与正则化

L1L_1L2L_2 范数分别为:

w1=jwj\|w\|_1=\sum_j|w_j|

w22=jwj2\|w\|_2^2=\sum_jw_j^2

将它们加入目标函数:

Jreg(w)=J(w)+λw1J_{\text{reg}}(w)=J(w)+\lambda\|w\|_1

或:

Jreg(w)=J(w)+λw22J_{\text{reg}}(w)=J(w)+\lambda\|w\|_2^2

其中 λ0\lambda\ge 0 控制正则化强度。

L1L_1 的几何约束更容易让部分权重精确变成 0,因此常被解释为稀疏性;L2L_2 更倾向于让所有权重变小。它们都不能保证因果解释,也不能保证删除的特征业务上不重要。


三、矩阵:批量计算和神经网络的基本语言

3.1 矩阵乘法不是逐元素相乘

若:

ARm×k,BRk×nA\in\mathbb R^{m\times k},\quad B\in\mathbb R^{k\times n}

则:

ABRm×nAB\in\mathbb R^{m\times n}

结果的第 i,ji,j 个元素为:

(AB)ij=r=1kAirBrj(AB)_{ij}=\sum_{r=1}^{k}A_{ir}B_{rj}

中间维度 kk 必须相等。这个条件不是形式主义,它表示前一个矩阵的输出坐标数必须与后一个矩阵的输入坐标数一致。

批量线性模型可以写成:

Z=XW+1bZ=XW+\mathbf 1b^\top

其中:

  • XRn×dX\in\mathbb R^{n\times d}nn 条样本、每条 dd 个特征;
  • WRd×cW\in\mathbb R^{d\times c}:映射到 cc 个输出;
  • bRcb\in\mathbb R^c:每个输出通道一个偏置;
  • ZRn×cZ\in\mathbb R^{n\times c}:每条样本的 cc 个输出。

例如,若 XX32×76832\times 768,权重矩阵是 768×10768\times 10,则输出是 32×1032\times10。这表示一个批次有 32 条样本,每条样本得到 10 个类别分数。

3.2 转置和形状错误

若将样本按列存储,数据可能是 XRd×nX^\top\in\mathbb R^{d\times n}。此时同一个线性变换必须使用不同的乘法方向。机器学习代码中大量“维度不匹配”错误,本质上不是算法错误,而是没有明确每个轴代表什么。

工程中应同时记录:

  • batch 轴;
  • sequence 轴;
  • feature 或 hidden 轴;
  • class 或 vocabulary 轴;
  • 训练、验证、测试的样本轴。

例如语言模型常见形状为:

(B,T,D)(B,T,D)

分别表示批次大小、序列长度和隐藏维度。注意力中的 QKQK^\top 需要把最后两个轴安排为可乘的形状;如果错误地交换 batch 轴和 sequence 轴,代码可能运行但语义已经改变,这比直接报错更危险。

3.3 神经网络是矩阵变换的复合

一个简单的多层感知机可以写为:

h=σ(XW1+b1)h=\sigma(XW_1+b_1)

Z=hW2+b2Z=hW_2+b_2

y^=softmax(Z)\hat y=\operatorname{softmax}(Z)

其中 σ\sigma 是非线性激活函数。如果没有非线性:

XW1W2XW_1W_2

仍然只是一个线性变换,多个线性层可以合并为一个矩阵。因此,激活函数不是装饰,而是让模型能够表示非线性关系的关键。

在 Transformer 中,注意力分数常写为:

S=QKdkS=\frac{QK^\top}{\sqrt{d_k}}

A=softmax(S)A=\operatorname{softmax}(S)

Attention(Q,K,V)=AV\operatorname{Attention}(Q,K,V)=AV

QQKKVV 是查询、键和值的矩阵;QKQK^\top 计算位置之间的匹配分数,softmax 将每一行分数转成权重,最后对 VV 加权求和。这里的矩阵乘法直接表达了“每个位置从其他位置读取信息”的过程。


四、概率:把不确定性写进模型

4.1 随机变量、分布与条件概率

随机变量是将随机结果映射为数值的对象。离散随机变量用概率质量函数描述,例如:

P(Y=k)P(Y=k)

连续随机变量用概率密度函数 p(y)p(y) 描述。密度在某一点的值不是该点的概率,连续区间的概率需要积分:

P(aYb)=abp(y)dyP(a\le Y\le b)=\int_a^b p(y)\,dy

联合概率 P(X,Y)P(X,Y) 描述两个变量同时出现的可能性,条件概率定义为:

P(YX)=P(X,Y)P(X)P(Y\mid X)=\frac{P(X,Y)}{P(X)}

贝叶斯公式为:

P(YX)=P(XY)P(Y)P(X)P(Y\mid X)=\frac{P(X\mid Y)P(Y)}{P(X)}

在分类中,P(YX)P(Y\mid X) 是给定输入后的类别后验概率;P(Y)P(Y) 是先验;P(XY)P(X\mid Y) 是类别条件下生成输入的可能性。

4.2 期望、方差和协方差

随机变量的期望是长期平均:

E[X]\mathbb E[X]

离散情形:

E[X]=xxP(X=x)\mathbb E[X]=\sum_xxP(X=x)

连续情形:

E[X]=xp(x)dx\mathbb E[X]=\int xp(x)\,dx

方差衡量围绕均值的波动:

Var(X)=E[(XE[X])2]\operatorname{Var}(X)=\mathbb E[(X-\mathbb E[X])^2]

协方差衡量两个变量是否共同变化:

Cov(X,Y)=E[(XE[X])(YE[Y])]\operatorname{Cov}(X,Y)=\mathbb E[(X-\mathbb E[X])(Y-\mathbb E[Y])]

协方差为正,表示一个变量偏大时另一个变量通常也偏大;为负则相反。但协方差为 0 不一定意味着独立,只有在特定分布条件下,例如联合高斯分布中,不相关才等价于独立。

4.3 生成式 AI 中的概率分解

语言模型不是直接输出一整段文本的概率,而是按 token 分解:

P(x1,x2,,xT)=t=1TP(xtx1,,xt1)P(x_1,x_2,\ldots,x_T) = \prod_{t=1}^{T}P(x_t\mid x_1,\ldots,x_{t-1})

取对数后:

logP(x1:T)=t=1TlogP(xtx<t)\log P(x_{1:T}) = \sum_{t=1}^{T}\log P(x_t\mid x_{<t})

训练时通常最小化负对数似然:

L=t=1TlogPθ(xtx<t)\mathcal L = -\sum_{t=1}^{T}\log P_\theta(x_t\mid x_{<t})

这解释了为什么语言模型的交叉熵训练目标与“预测下一个 token”直接相关。推理时,模型根据 logits 计算下一个 token 的概率,再按照贪心、采样或其他解码策略选择 token。解码策略改变的是输出过程,不等于改变模型参数。


五、统计:从有限样本推断真实规律

5.1 总体、样本与经验风险

总体是我们想研究的真实数据分布,样本是实际收集到的数据。训练集平均损失:

R^(θ)=1ni=1n(fθ(xi),yi)\hat R(\theta)=\frac1n\sum_{i=1}^n\ell(f_\theta(x_i),y_i)

是对真实风险 R(θ)R(\theta) 的估计。

若训练集和线上数据来自不同分布,例如训练数据主要来自老用户,线上流量大量来自新地区,那么即使样本量很大,训练风险也可能无法代表线上风险。这是分布偏移,不是简单的“模型容量不够”。

5.2 最大似然与交叉熵的关系

假设分类模型输出:

pθ(yx)p_\theta(y\mid x)

给定独立同分布样本,条件似然为:

L(θ)=i=1npθ(yixi)L(\theta)=\prod_{i=1}^{n}p_\theta(y_i\mid x_i)

最大似然估计希望最大化 L(θ)L(\theta)。由于乘积可能非常小,通常最大化对数似然:

logL(θ)=i=1nlogpθ(yixi)\log L(\theta)=\sum_{i=1}^{n}\log p_\theta(y_i\mid x_i)

等价地,最小化负对数似然:

1ni=1nlogpθ(yixi)-\frac1n\sum_{i=1}^{n}\log p_\theta(y_i\mid x_i)

这就是多分类交叉熵在 one-hot 标签下的形式。交叉熵不是凭经验选出的神秘指标,而是最大似然估计的一个直接结果。

5.3 采样误差和置信区间

若模型在独立测试集上正确了 kk 次,共 nn 次,则准确率估计为:

p^=kn\hat p=\frac{k}{n}

它只是总体准确率的估计。即使模型不变,换一批测试样本,准确率也会波动。

nn 较大且条件适合时,二项比例估计的标准误差近似为:

SE(p^)=p^(1p^)n\operatorname{SE}(\hat p)=\sqrt{\frac{\hat p(1-\hat p)}{n}}

例如准确率为 0.90、测试样本数为 100,则标准误差约为:

0.9×0.11000.03\sqrt{\frac{0.9\times0.1}{100}}\approx0.03

因此只提升 0.01 个百分点,可能完全落在抽样波动内,不能据此断言模型变好。类别不平衡时,准确率还可能掩盖少数类完全失败,应结合混淆矩阵、召回率、精确率、F1、PR-AUC 或校准误差分析。

5.4 相关性不等于因果性

若使用“是否参加促销”预测购买行为,模型可能发现促销与购买高度相关,但这不证明促销导致购买。高购买意愿用户可能本来就更容易领取促销,这是选择偏差。

机器学习预测问题通常只要求:

P(YX)P(Y\mid X)

而因果问题还需要定义干预,例如:

P(Ydo(X=x))P(Y\mid do(X=x))

二者不能仅凭相关数据互换。若模型用于自动审批、定价或权限决策,必须进一步检查特征是否是结果产生后的信息、是否包含敏感属性代理,以及评测指标是否与实际决策损失一致。


六、微积分:参数变化如何影响损失

6.1 导数是局部变化率

单变量函数 f(x)f(x)xx 处的导数为:

f(x)=limΔx0f(x+Δx)f(x)Δxf'(x)=\lim_{\Delta x\to0} \frac{f(x+\Delta x)-f(x)}{\Delta x}

它表示输入增加一个极小量时,输出的一阶近似变化:

f(x+Δx)f(x)+f(x)Δxf(x+\Delta x)\approx f(x)+f'(x)\Delta x

如果 f(x)>0f'(x)>0,在足够小的范围内增大 xx 会增大函数;如果 f(x)<0f'(x)<0,则会减小函数。

例如:

f(w)=(w3)2f(w)=(w-3)^2

则:

f(w)=2(w3)f'(w)=2(w-3)

w=1w=1 时,导数为 4-4。这意味着在 w=1w=1 附近,增大 ww 会降低损失,因此优化应沿正方向移动。

6.2 梯度是多变量导数的集合

若损失依赖多个参数:

J(w1,w2,,wd)J(w_1,w_2,\ldots,w_d)

梯度为:

J=[Jw1Jw2Jwd]\nabla J= \begin{bmatrix} \frac{\partial J}{\partial w_1}\\ \frac{\partial J}{\partial w_2}\\ \vdots\\ \frac{\partial J}{\partial w_d} \end{bmatrix}

梯度指向函数局部增长最快的方向,因此下降最快的局部方向是:

J-\nabla J

这只是一阶局部结论。学习率过大时,线性近似在一步内失效,更新可能跨过低点甚至发散。

6.3 链式法则和反向传播

若:

z=g(x),y=f(z)z=g(x),\quad y=f(z)

则:

dydx=dydzdzdx\frac{dy}{dx} = \frac{dy}{dz}\frac{dz}{dx}

神经网络由多层复合函数组成,反向传播就是按照链式法则从损失向输入方向逐层计算梯度。

考虑:

z=wx+bz=wx+b

y^=z\hat y=z

L=12(y^y)2L=\frac12(\hat y-y)^2

x=2,w=3,b=1,y=10x=2,w=3,b=1,y=10,则:

z=3×2+1=7,y^=7z=3\times2+1=7,\quad \hat y=7

L=12(710)2=4.5L=\frac12(7-10)^2=4.5

逐步求导:

Ly^=y^y=3\frac{\partial L}{\partial \hat y}=\hat y-y=-3

y^w=x=2\frac{\partial \hat y}{\partial w}=x=2

所以:

Lw=Ly^y^w=3×2=6\frac{\partial L}{\partial w} = \frac{\partial L}{\partial\hat y} \frac{\partial\hat y}{\partial w} =-3\times2=-6

同理:

Lb=3\frac{\partial L}{\partial b}=-3

若学习率 η=0.1\eta=0.1,梯度下降更新为:

wnew=30.1(6)=3.6w_{\text{new}}=3-0.1(-6)=3.6

bnew=10.1(3)=1.3b_{\text{new}}=1-0.1(-3)=1.3

新预测为:

3.6×2+1.3=8.53.6\times2+1.3=8.5

损失变为:

12(8.510)2=1.125\frac12(8.5-10)^2=1.125

在这个简单例子中,一步更新就显著降低了损失。实际网络中,参数数量可能达到数百万或更多,但局部导数的计算规则没有改变。

6.4 ReLU 的不可导点

ReLU 定义为:

ReLU(x)=max(0,x)\operatorname{ReLU}(x)=\max(0,x)

其导数为:

ReLU(x)={0,x<01,x>0\operatorname{ReLU}'(x)= \begin{cases} 0,&x<0\\ 1,&x>0 \end{cases}

x=0x=0 处不可导。实际框架通常为该点选取一个约定的次梯度,因此可以继续计算。若某个神经元长期处于负区间,其梯度为 0,可能出现“死亡 ReLU”;这不是浮点错误,而是激活函数和参数状态共同导致的梯度路径消失。


七、优化:从梯度到参数更新

7.1 梯度下降

最基本的更新规则为:

θt+1=θtηJ(θt)\theta_{t+1}=\theta_t-\eta\nabla J(\theta_t)

其中 η\eta 是学习率。

以一维函数:

J(w)=(w3)2J(w)=(w-3)^2

为例,初始 w0=0w_0=0,学习率 η=0.25\eta=0.25

因为:

J(w)=2(w3)J'(w)=2(w-3)

第一次:

J(0)=6J'(0)=-6

w1=00.25(6)=1.5w_1=0-0.25(-6)=1.5

第二次:

J(1.5)=3J'(1.5)=-3

w2=1.50.25(3)=2.25w_2=1.5-0.25(-3)=2.25

第三次:

w3=2.250.25(1.5)=2.625w_3=2.25-0.25(-1.5)=2.625

参数逐渐接近最优点 w=3w=3

若学习率为 1.1,则:

w1=01.1(6)=6.6w_1=0-1.1(-6)=6.6

下一步会跳到最优点另一侧,可能持续振荡;对曲率差异较大的多维问题,甚至会发散。若学习率过小,则训练可能看似稳定但收敛极慢。

7.2 批量梯度、随机梯度和小批次

完整批量梯度使用所有 nn 条样本:

J(θ)=1ni=1ni(θ)\nabla J(\theta)=\frac1n\sum_{i=1}^{n}\nabla\ell_i(\theta)

随机梯度只用一条样本,小批量梯度使用 BB 条:

gt=1BiBti(θt)g_t=\frac1B\sum_{i\in\mathcal B_t}\nabla\ell_i(\theta_t)

当样本是独立同分布抽取时,小批量梯度通常是完整梯度的无偏估计:

E[gtθt]=J(θt)\mathbb E[g_t\mid\theta_t]=\nabla J(\theta_t)

但它具有方差。批次越小,梯度噪声通常越大;这会增加更新抖动,也可能帮助模型离开某些不良区域。批次增大则计算更规整,但会消耗更多显存,并不自动带来更好的泛化。

7.3 动量与自适应优化器

动量方法维护历史梯度:

vt=βvt1+(1β)gtv_t=\beta v_{t-1}+(1-\beta)g_t

θt+1=θtηvt\theta_{t+1}=\theta_t-\eta v_t

它会在持续同向的方向上积累速度,在来回摆动的方向上减弱震荡。

Adam 进一步维护一阶和二阶移动平均:

mt=β1mt1+(1β1)gtm_t=\beta_1m_{t-1}+(1-\beta_1)g_t

vt=β2vt1+(1β2)gt2v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2

并使用偏差修正后的量调整各参数步长。具体默认值和行为取决于所使用框架与版本,不能把某个库的默认配置当成优化理论的必然要求。优化器改变的是参数更新轨迹,不会修复标签错误、数据泄漏或训练目标与业务目标不一致的问题。

7.4 凸与非凸

若函数满足:

J(λx+(1λ)y)λJ(x)+(1λ)J(y)J(\lambda x+(1-\lambda)y) \le \lambda J(x)+(1-\lambda)J(y)

对任意 x,yx,yλ[0,1]\lambda\in[0,1] 成立,则称其为凸函数。凸优化中,局部最小点也是全局最小点;线性回归的平方损失在固定特征下具有这类良好性质。

深度网络的损失通常是非凸的。参数之间存在层间耦合、对称性和大量鞍点,梯度下降不保证找到全局最优解。不过工程上关注的通常不是训练损失的绝对全局最小,而是验证集和线上分布下的泛化表现。


八、损失函数中的关键推导:Sigmoid 与 Softmax

8.1 二分类交叉熵

Sigmoid 函数为:

σ(z)=11+ez\sigma(z)=\frac1{1+e^{-z}}

它把任意实数映射到 (0,1)(0,1),可解释为正类概率:

p=σ(z)p=\sigma(z)

二分类交叉熵为:

L=[ylogp+(1y)log(1p)]L=-\left[y\log p+(1-y)\log(1-p)\right]

其中 y{0,1}y\in\{0,1\}

zz 求导:

Lz=py\frac{\partial L}{\partial z}=p-y

推导关键在于:

dpdz=p(1p)\frac{dp}{dz}=p(1-p)

以及:

Lp=yp+1y1p\frac{\partial L}{\partial p} = -\frac{y}{p}+\frac{1-y}{1-p}

相乘后可化简为 pyp-y。这个结果直观地表示:预测概率减去真实标签就是 logit 层的误差信号。若真实标签为 1,而模型只预测 p=0.2p=0.2,梯度为 0.8-0.8,更新会推动 zz 增大。

8.2 多分类 Softmax

给定 logits z1,,zKz_1,\ldots,z_K,softmax 定义为:

pk=ezkj=1Kezjp_k=\frac{e^{z_k}}{\sum_{j=1}^{K}e^{z_j}}

所有 pkp_k 非负且总和为 1。对真实类别 yy 的交叉熵为:

L=logpyL=-\log p_y

若用 one-hot 标签 qkq_k,也可写成:

L=k=1KqklogpkL=-\sum_{k=1}^{K}q_k\log p_k

其对 logits 的导数为:

Lzk=pkqk\frac{\partial L}{\partial z_k}=p_k-q_k

这与二分类形式一致:预测分布减去目标分布。

直接计算 ezke^{z_k} 可能溢出。例如 logits 为 (1000,999)(1000,999),指数在有限精度中可能超出范围。利用平移不变性:

softmax(z)=softmax(zc1)\operatorname{softmax}(z) = \operatorname{softmax}(z-c\mathbf1)

通常取 c=maxkzkc=\max_kz_k,先减去最大值。生产实现一般使用稳定的 logsumexp 或框架提供的融合交叉熵算子,而不是手工先计算 softmax 再取对数。


九、一个可运行的最小梯度下降实验

下面的 NumPy 示例训练一元线性回归。目标关系人为设为:

y=2x+1y=2x+1

损失采用均方误差:

J(w,b)=1ni(wxi+byi)2J(w,b)=\frac1n\sum_i(wx_i+b-y_i)^2

import numpy as np

# 输入数据:4 条样本
x = np.array([0., 1., 2., 3.])
y = np.array([1., 3., 5., 7.])

w = 0.0
b = 0.0
lr = 0.1

for step in range(1000):
    pred = w * x + b
    error = pred - y

    # 对平均平方误差的梯度
    grad_w = 2.0 * np.mean(error * x)
    grad_b = 2.0 * np.mean(error)

    w -= lr * grad_w
    b -= lr * grad_b

    if step in (0, 1, 9, 99, 999):
        loss = np.mean((pred - y) ** 2)
        print(step, loss, w, b)

print("final:", w, b)

在该数据和学习率下,最终参数应接近:

final: 2.0 1.0

每一步的因果关系是:

  1. pred 根据当前参数计算预测;
  2. error 衡量预测与标签的差异;
  3. grad_w 汇总所有样本对权重的影响;
  4. grad_b 汇总所有样本对偏置的影响;
  5. 沿负梯度方向更新参数;
  6. 重新计算损失,观察是否下降。

这个例子成立的前提是样本关系简单、损失可微且学习率合适。若把 lr 改成很大的值,损失可能变成 infnan;若输入特征数量级差异巨大,梯度的尺度也会改变,训练会变得更难控制。


十、标准化、条件数与训练稳定性

若某个特征范围是 0011,另一个特征范围是 001,000,0001,000,000,线性模型中的梯度可能被第二个特征主导。常见标准化为:

xj=xjμjsjx'_j=\frac{x_j-\mu_j}{s_j}

其中 μj\mu_jsjs_j 必须只用训练集估计,然后固定用于验证集、测试集和线上数据。若把全量数据的均值和方差用于训练,验证信息会泄漏到训练过程。

几何上,未缩放的损失等高线可能是狭长椭圆。梯度下降会在陡峭方向来回摆动,在平坦方向缓慢前进。特征缩放可以改善问题的条件数,使不同方向的曲率更均衡,但它不会解决标签噪声或模型结构错误。

深度学习中还会出现:

  • 梯度爆炸:梯度范数异常增大,参数或损失变为 inf
  • 梯度消失:梯度接近 0,参数几乎不更新;
  • 数值下溢:概率或指数太小,在低精度下变成 0;
  • 数值上溢:指数、激活值或损失超过表示范围;
  • 非有限值传播:一个 nan 进入后续层,最终污染整个训练状态。

梯度裁剪常用形式是,当 g2>c\|g\|_2>c 时:

ggcg2g\leftarrow g\frac{c}{\|g\|_2}

它限制单次更新的范数,但不会从根本上解释梯度为何爆炸。诊断时应同时检查输入、标签、损失、学习率、混合精度缩放、权重初始化和异常 batch。

混合精度使用较低精度表示部分张量,以降低内存和计算成本,同时通常保留更高精度的主参数或累积结果。低精度不是“免费加速”:小梯度可能下溢,softmax 和归一化操作对数值范围敏感,因此需要框架提供的自动混合精度和 loss scaling 机制,并通过损失曲线、梯度范数和非有限值检测验证训练稳定性。


十一、泛化:为什么训练集表现好还不够

11.1 欠拟合与过拟合

欠拟合表示模型无法表达数据规律,通常表现为训练损失和验证损失都较高。

过拟合表示模型过度适应训练样本中的偶然性,常见表现为:

  • 训练损失持续下降;
  • 验证损失先下降后上升;
  • 训练指标和线上指标差距扩大。

高容量模型并不必然过拟合,低容量模型也不必然泛化好。数据规模、噪声、正则化、训练时长和分布差异共同决定泛化。

11.2 数据泄漏的数学本质

如果特征 XX 包含标签 YY 产生之后才可获得的信息,那么训练时模型学习到的条件分布:

Ptrain(YX)P_{\text{train}}(Y\mid X)

与实际预测时可用的信息不一致。随机划分数据可能让同一用户、同一文档或同一时间窗口的信息同时出现在训练和验证中,导致验证结果虚高。

例如预测订单是否退款,却把“退款完成时间”作为特征。离线指标可能接近完美,但线上预测时这个字段尚不存在。这里不是优化失败,而是特征定义违反了预测时序。

11.3 评测指标必须对应损失和决策

均方误差强调大误差:

MSE=1ni(y^iyi)2\operatorname{MSE}=\frac1n\sum_i(\hat y_i-y_i)^2

平均绝对误差为:

MAE=1niy^iyi\operatorname{MAE}=\frac1n\sum_i|\hat y_i-y_i|

若业务对极端错误特别敏感,MSE 可能更合适;若异常值很多,MAE 可能更稳健。分类中的交叉熵关注概率质量,准确率只关注最终分类是否正确。一个模型可能准确率相同,但概率校准完全不同:预测为 0.9 的样本是否真的约有 90% 为正类,会影响风控阈值和人工审核资源分配。

生产评测还应把模型、数据、评测、权限和成本放在同一系统中:

系统结果=f(模型,数据,评测规则,权限边界,资源预算)\text{系统结果} = f(\text{模型},\text{数据},\text{评测规则},\text{权限边界},\text{资源预算})

例如,一个离线准确率更高的模型,如果需要访问不应暴露给它的个人数据,或者推理成本超出预算,就不能直接视为更优方案。


十二、从训练到生成式系统的数据流

一个实际系统通常包含以下路径:

flowchart LR
    A[原始数据] --> B[清洗与切分]
    B --> C[特征或 Token 化]
    C --> D[训练批次]
    D --> E[前向计算]
    E --> F[损失]
    F --> G[反向传播]
    G --> H[优化器更新参数]
    H --> E
    E --> I[验证与评测]
    I --> J[模型注册]
    J --> K[在线推理]
    K --> L[日志与监控]
    L --> M[数据漂移和故障诊断]

训练批次通常是并发处理的,但参数更新存在同步边界:在同步数据并行中,各设备先计算局部梯度,再聚合梯度,之后共同更新参数。如果某个 worker 失败、通信超时或读取到损坏 batch,训练状态可能停在半个 step。检查点不仅要保存模型参数,还应根据恢复要求保存优化器状态、学习率调度器状态、随机数状态、数据迭代位置和混合精度 scaler 状态。

在线推理的故障路径也有数学后果:

  • 特征缺失可能改变输入向量的分布;
  • token 化版本变化可能改变序列长度和词表索引;
  • 权限过滤可能使模型看到训练时不存在的空值;
  • 超时降级到旧模型后,指标需要按模型版本拆分;
  • 成本限制导致截断上下文,实际条件分布变为 P(YXtruncated)P(Y\mid X_{\text{truncated}})

因此,不能只记录最终答案或平均延迟,还应记录模型版本、特征版本、输入长度、输出长度、错误率、资源使用和权限决策结果。涉及敏感数据时,日志本身也必须遵守最小权限和保留期限约束。


十三、常见误解与可验证的诊断方法

误解一:损失下降就代表模型变好

损失下降只能证明当前训练目标在当前数据上的数值变小。若验证损失上升,说明泛化恶化;若训练标签错误,模型可能只是更好地拟合错误;若训练和线上分布不同,离线下降也可能与线上无关。

诊断时同时画训练、验证损失,按时间、用户群体、地区和标签来源分层评测,并检查切分是否符合预测时序。

误解二:概率输出就是可信概率

softmax 输出总和为 1,但归一化不等于校准。模型可能对错误类别给出极高置信度。应使用独立验证集检查可靠性图、分箱准确率和校准误差;若业务使用阈值决策,还要评估不同阈值下的成本,而不是只看 Top-1 准确率。

误解三:正则化一定提升验证集

正则化改变了优化目标:

Jtrain+λΩ(θ)J_{\text{train}}+\lambda\Omega(\theta)

它可能减少过拟合,也可能造成欠拟合。真正有效的 λ\lambda 依赖数据规模、噪声和模型结构,必须通过严格的验证流程选择,不能从理论上断言固定值一定更好。

误解四:更大 batch 一定更快或更好

更大 batch 可能提高硬件利用率,但会增加显存使用,减少每个 epoch 的更新次数,并改变梯度噪声。若简单放大学习率而不验证,可能导致训练不稳定。比较 batch 时应同时观察每步耗时、每个样本吞吐、验证指标、显存峰值和最终成本。

误解五:相关特征重要就可以用于自动决策

特征重要性只说明模型在当前数据和目标下使用了该特征,不能证明它具有因果作用,也不说明使用它符合权限、合规和公平要求。对于高影响决策,应保留人工复核、拒绝原因解释、访问审计和回滚路径。


十四、把数学直觉落到实验流程

一次可解释的机器学习实验至少需要明确以下关系:

  1. 输入是什么:每个向量坐标的含义、单位、缺失规则和可用时点;
  2. 模型做什么变换:矩阵形状、激活函数和输出语义;
  3. 损失衡量什么:预测误差、概率质量还是业务成本;
  4. 梯度如何产生:损失对每个参数的偏导及链式传播路径;
  5. 参数如何更新:优化器、学习率、batch 和数值精度;
  6. 泛化如何验证:数据切分、置信区间、分层指标和分布差异;
  7. 系统能否运行:模型版本、数据版本、权限边界、资源成本和故障恢复。

可以使用 scikit-learn 的 User Guide 对监督学习、模型选择、预处理和评测进行实验验证,也可以参考 Google Machine Learning Crash Course 对线性模型、损失、梯度下降、泛化和生产指标的组织方式。但文档中的 API 用法不能替代对输入形状、统计假设、损失含义和数据时序的检查。

当向量和矩阵让模型能够表达数据,概率和统计让模型能够处理不确定性,微积分让我们知道参数该往哪里移动,优化算法才真正有了可执行的更新方向。理解这条链路后,调学习率、查过拟合、分析交叉熵、解释 softmax 或诊断训练发散,都不再只是背参数,而是可以回到变量、假设、导数和数据流逐步定位。


系列导航与关联阅读

官方资料

本文依据研究论文、标准组织与主流框架官方文档重新梳理;正文、示例与工程清单由 WR BLOG 编写。