神经网络处理分类任务时,最后一层经常只是一个线性层。它接收特征向量,为每个类别输出一个实数,再把分数最大的类别作为结果。这个过程看起来只有一次矩阵乘法,却包含三个需要分开的环节:模型怎样计算类别分数,概率和误判代价怎样决定最终动作,训练数据又怎样确定模型参数。

本文从线性判别函数出发,先推导零一损失和非对称误判代价下的分类规则,再比较生成式分类器与判别式分类器。两类方法采用不同的概率分解和训练目标,最后都可能得到同一个形式的线性边界。读完后应该能够判断一个分类器究竟线性在哪里,Softmax 在决策中做了什么,以及什么时候不能直接使用最大分数作为业务决策。

这里有一组容易混淆的术语:判别函数是分类时用来比较类别的分数,判别式分类器则是一类直接学习后验概率或决策边界的方法。生成式分类器同样需要判别函数。前者描述决策所用的量,后者描述参数怎样从数据中学得。

线性判别函数

设输入已经表示为 DD 维特征向量 xRD\mathbf{x}\in\mathbb{R}^D,类别集合为 {C1,,CK}\{C_1,\ldots,C_K\}。多分类线性模型为每个类别定义一个判别函数(discriminant function):

gk(x)=wkTx+bk.g_k(\mathbf{x}) = \mathbf{w}_k^\mathsf{T}\mathbf{x}+b_k.

gkg_k 是类别 CkC_k 的分数,wk\mathbf{w}_k 决定各维特征怎样参与评分,bkb_k 是偏置。把所有权重按行堆叠,可以写成一次矩阵运算:

g(x)=Wx+b.\mathbf{g}(\mathbf{x})=\mathbf{W}\mathbf{x}+\mathbf{b}.

严格说,这是一项仿射变换,因为它包含偏置;机器学习中仍习惯称它为线性层或线性分类器。最常见的决策规则是选择最高分:

y^=argmaxkgk(x).\widehat{y}=\arg\max_k g_k(\mathbf{x}).

二分类时可将类别记为 C0C_0C1C_1,并只保留一个分数 g(x)=wTx+bg(\mathbf{x})=\mathbf{w}^\mathsf{T}\mathbf{x}+b。令 g(x)=0g(\mathbf{x})=0,得到一个法向量为 w\mathbf{w} 的超平面。平面两侧分别满足 g(x)>0g(\mathbf{x})>0g(x)<0g(\mathbf{x})<0,因此被判为不同类别。在当前坐标度量下,点到边界的带符号距离为

g(x)w2.\frac{g(\mathbf{x})}{\lVert\mathbf{w}\rVert_2}.

w\mathbf{w}bb 同乘一个正数不会移动边界,却会改变原始分数及其经过 sigmoid 后的概率。这说明决策边界、分数尺度和概率解释是三件不同的事。

二维特征平面被一条斜直线分成蓝色与橙色区域,蓝色圆点和橙色三角分别落在边界两侧,一支垂直边界的箭头标出权重向量 w 指向分数增大的方向
二分类线性判别函数的零等值线形成决策边界。权重向量与边界垂直,偏置改变边界位置;边界两侧的符号决定类别。作者绘制

多分类时,类别 CkC_kCjC_j 的分界满足

gk(x)=gj(x),g_k(\mathbf{x})=g_j(\mathbf{x}),

也就是

(wkwj)Tx+(bkbj)=0.(\mathbf{w}_k-\mathbf{w}_j)^\mathsf{T}\mathbf{x} +(b_k-b_j)=0.

每一对类别之间仍是超平面。某个类别的决策区域由 gk(x)gj(x)g_k(\mathbf{x})\ge g_j(\mathbf{x}) 的若干半空间相交而成,所以在线性模型的原始特征空间中,每个非空类别区域都是凸集。若同一类别的数据天然分成彼此隔开的两块,单个线性层往往无法同时包住它们而不纳入其他类别。

分类决策理论

最高分规则默认所有错误的代价相同。实际任务通常还要考虑误报、漏报、人工复核或拒绝预测的成本。分类决策理论把模型输出与最终动作分开处理:概率描述当前信息下各类别有多可信,损失函数描述做错不同动作要付出什么代价。

记真实类别为 CjC_j,动作 αi\alpha_i 表示预测为 CiC_iλij\lambda_{ij} 表示采取动作 αi\alpha_i 而真实类别为 CjC_j 时的损失。观察到 x\mathbf{x} 后,动作的条件风险为

R(αix)=j=1Kλijp(Cjx).R(\alpha_i\mid\mathbf{x}) = \sum_{j=1}^{K} \lambda_{ij}p(C_j\mid\mathbf{x}).

贝叶斯决策规则选择条件风险最小的动作:

α(x)=argminαiR(αix).\alpha^*(\mathbf{x}) = \arg\min_{\alpha_i}R(\alpha_i\mid\mathbf{x}).

若采用零一损失,预测正确时损失为 0,预测错误时损失为 1,则

R(αix)=1p(Cix).R(\alpha_i\mid\mathbf{x})=1-p(C_i\mid\mathbf{x}).

最小化风险等价于选择后验概率最大的类别,也就是最大后验(maximum a posteriori,MAP)规则。此时若各类别分数是后验概率经过同一个严格单调变换后的结果,比较分数即可,不必真的把它归一化成概率。

误判代价不对称时,阈值会随之改变。考虑二分类,假阳性的损失为 λ10\lambda_{10},假阴性的损失为 λ01\lambda_{01},正确分类的损失为 0。预测 C1C_1 的风险是 λ10p(C0x)\lambda_{10}p(C_0\mid\mathbf{x}),预测 C0C_0 的风险是 λ01p(C1x)\lambda_{01}p(C_1\mid\mathbf{x})。因此仅当

p(C1x)p(C0x)>λ10λ01\frac{p(C_1\mid\mathbf{x})}{p(C_0\mid\mathbf{x})} > \frac{\lambda_{10}}{\lambda_{01}}

时才预测 C1C_1。等价的概率阈值为

p(C1x)>λ10λ10+λ01.p(C_1\mid\mathbf{x}) > \frac{\lambda_{10}}{\lambda_{10}+\lambda_{01}}.

例如,漏报的损失是误报的 5 倍,即 λ01=5\lambda_{01}=5λ10=1\lambda_{10}=1,阈值便从 0.50.5 降为 1/61/6。这个阈值只在输出能够近似真实后验、代价定义稳定时才有明确含义。Softmax 输出之和为 1 并不自动保证概率已经校准;需要按部署分布在独立验证集上检查可靠性,并把训练时的类别权重、采样策略和部署时的决策阈值分别记录,避免重复修正同一种类别不平衡。

一个三栏决策示意图,左栏显示类别 C0 和 C1 的后验概率分别为百分之七十与百分之三十,中栏的损失矩阵规定漏报损失为五、误报损失为一,右栏计算预测 C0 和 C1 的条件风险分别为一点五和零点七,最终选择风险较低的 C1
非对称损失可以改变同一后验对应的动作。虽然 C₀ 的后验概率更高,直接 argmax 会选择 C₀;当漏报损失是误报的 5 倍时,预测 C₁ 的条件风险更低。作者绘制

决策集合也不必局限于已有类别。若低置信度错误的代价高于人工复核,可以增加“拒绝预测”动作,并为它指定固定或样本相关的损失。最小风险原则本身不变,只是多比较一个动作。

生成式分类器

生成式分类器学习类别先验 p(Ck)p(C_k) 和类条件分布 p(xCk)p(\mathbf{x}\mid C_k),也就是把联合分布写成

p(x,Ck)=p(Ck)p(xCk).p(\mathbf{x},C_k) = p(C_k)p(\mathbf{x}\mid C_k).

得到这两项后,再通过贝叶斯公式计算后验:

p(Ckx)=p(xCk)p(Ck)jp(xCj)p(Cj).p(C_k\mid\mathbf{x}) = \frac{p(\mathbf{x}\mid C_k)p(C_k)} {\sum_j p(\mathbf{x}\mid C_j)p(C_j)}.

对所有类别而言,分母相同。采用零一损失时,可以直接比较未归一化的对数分数

gk(x)=logp(xCk)+logp(Ck).g_k(\mathbf{x}) = \log p(\mathbf{x}\mid C_k)+\log p(C_k).

这里的“生成式”描述模型学习了 x\mathbf{x} 在各类别下怎样分布,并不意味着分类时必须生成新样本。一个生成式模型是否适合采样,还取决于它对数据分布的具体建模方式。

线性判别分析

假设每个类别的特征服从多元高斯分布,均值为 μk\boldsymbol{\mu}_k,所有类别共享协方差矩阵 Σ\boldsymbol{\Sigma},类别先验为 πk\pi_k

p(xCk)=N(x;μk,Σ),p(Ck)=πk.p(\mathbf{x}\mid C_k) = \mathcal{N}(\mathbf{x};\boldsymbol{\mu}_k,\boldsymbol{\Sigma}), \qquad p(C_k)=\pi_k.

将高斯密度取对数并展开二次项,可得

gk(x)=12xTΣ1x+xTΣ1μk12μkTΣ1μk+logπk+const.\begin{aligned} g_k(\mathbf{x}) ={}& -\frac{1}{2} \mathbf{x}^\mathsf{T}\boldsymbol{\Sigma}^{-1}\mathbf{x} +\mathbf{x}^\mathsf{T}\boldsymbol{\Sigma}^{-1}\boldsymbol{\mu}_k\\ & -\frac{1}{2} \boldsymbol{\mu}_k^\mathsf{T} \boldsymbol{\Sigma}^{-1} \boldsymbol{\mu}_k +\log\pi_k +\text{const}. \end{aligned}

第一项和最后的常数对所有类别都相同,在类别比较时可以消去。剩余部分正是线性判别函数:

gk(x)=wkTx+bk,g_k(\mathbf{x}) = \mathbf{w}_k^\mathsf{T}\mathbf{x}+b_k,

其中

wk=Σ1μk,bk=12μkTΣ1μk+logπk.\mathbf{w}_k = \boldsymbol{\Sigma}^{-1}\boldsymbol{\mu}_k, \qquad b_k = -\frac{1}{2} \boldsymbol{\mu}_k^\mathsf{T} \boldsymbol{\Sigma}^{-1} \boldsymbol{\mu}_k +\log\pi_k.

这就是线性判别分析(Linear Discriminant Analysis,LDA)的概率模型。共享协方差使各类别共同拥有的二次项被抵消;类别均值决定权重方向,协方差按照特征的联合尺度调整方向,先验则通过偏置移动边界。若每个类别使用不同的协方差 Σk\boldsymbol{\Sigma}_k,含 xTΣk1x\mathbf{x}^\mathsf{T}\boldsymbol{\Sigma}_k^{-1}\mathbf{x} 的项无法消去,边界一般变成二次曲面,对应二次判别分析(QDA)。

这段推导是 LDA 的高斯生成式表述。标准分布与信息论初步从类间散度与类内散度之比推导了 Fisher 的原始线性判别。二分类且类内散度矩阵可逆时,Fisher 方向满足 wSW1(μ1μ0)\mathbf{w}\propto\mathbf{S}_W^{-1}(\boldsymbol{\mu}_1-\boldsymbol{\mu}_0)。当合并类内散度 SW\mathbf{S}_W 用来估计共享协方差时,这个方向与高斯模型的边界法向量一致;两者的推导目标和概率解释仍需区分。

多项式朴素贝叶斯

朴素贝叶斯假设给定类别后各特征条件独立。以适合词频等非负计数的多项式朴素贝叶斯为例,xdx_d 表示第 dd 个词的计数,θkd\theta_{kd} 表示类别 CkC_k 下该词的概率。忽略只依赖样本总计数的项后,判别函数为

gk(x)=logπk+d=1Dxdlogθkd.g_k(\mathbf{x}) = \log\pi_k +\sum_{d=1}^{D}x_d\log\theta_{kd}.

它对计数向量 x\mathbf{x} 仍是线性的。参数来自类条件分布的计数估计,所以它依然是生成式分类器。相反,高斯朴素贝叶斯若允许每个类别、每个特征拥有不同方差,展开后通常包含 xd2x_d^2,边界一般不是线性的。是否线性取决于分布假设消去了哪些高阶项,不能只看“朴素贝叶斯”这个名称。

生成式方法的优势来自可用的结构假设:当类条件分布与数据相符时,可以分别估计先验、均值、协方差或词频,并解释它们怎样形成分数。代价也来自同一处。高维小样本下协方差可能不可逆,条件独立假设可能与实际特征依赖冲突,错误的密度模型还会把无需用于分类的分布细节带进估计过程。实际使用 LDA 时通常需要检查特征尺度、协方差估计和必要的收缩正则化。

判别式分类器

判别式分类器不先拟合 p(xCk)p(\mathbf{x}\mid C_k)。概率型方法直接建模 p(Ckx)p(C_k\mid\mathbf{x}),另一些方法则直接学习足以作出决策的分数或边界。

二分类逻辑回归把线性分数送入 sigmoid:

p(C1x)=σ(wTx+b)=11+exp[(wTx+b)].p(C_1\mid\mathbf{x}) = \sigma(\mathbf{w}^\mathsf{T}\mathbf{x}+b) = \frac{1}{1+\exp[-(\mathbf{w}^\mathsf{T}\mathbf{x}+b)]}.

sigmoid 单调递增,所以使用 0.50.5 概率阈值时,边界仍是 wTx+b=0\mathbf{w}^\mathsf{T}\mathbf{x}+b=0。训练通常最小化条件负对数似然,也就是二元交叉熵:

L=i=1N[yilogpi+(1yi)log(1pi)].\mathcal{L} = -\sum_{i=1}^{N} \left[ y_i\log p_i+(1-y_i)\log(1-p_i) \right].

多分类逻辑回归为每类生成一个未归一化分数(logit)zk=gk(x)z_k=g_k(\mathbf{x}),再用 Softmax 归一化:

p(Ckx)=exp(zk)jexp(zj).p(C_k\mid\mathbf{x}) = \frac{\exp(z_k)}{\sum_j\exp(z_j)}.

Softmax 保持 logit 的大小次序,因此在零一损失下,argmaxkzk\arg\max_k z_kargmaxkp(Ckx)\arg\max_k p(C_k\mid\mathbf{x}) 完全相同。它提供的是一个条件概率模型,不会为线性层增加弯曲的决策边界。交叉熵最小化真实类别的负对数概率:

L=i=1Nlogp(yixi).\mathcal{L} = -\sum_{i=1}^{N} \log p(y_i\mid\mathbf{x}_i).

在 PyTorch 中,一个多分类线性网络可以直接写成 nn.LinearCrossEntropyLoss 接收原始 logits,并在数值稳定的实现中完成 LogSoftmax 与负对数似然;训练时不要预先调用 Softmax。

import torch
from torch import nn

torch.manual_seed(7)

features = torch.tensor(
    [
        [-2.0, -1.0],
        [-1.5, -2.0],
        [2.0, -1.0],
        [1.5, -2.0],
        [0.0, 2.0],
        [0.5, 1.5],
    ]
)
targets = torch.tensor([0, 0, 1, 1, 2, 2])

model = nn.Linear(in_features=2, out_features=3)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
loss_fn = nn.CrossEntropyLoss()

for _ in range(200):
    optimizer.zero_grad(set_to_none=True)
    logits = model(features)
    loss = loss_fn(logits, targets)
    loss.backward()
    optimizer.step()

with torch.no_grad():
    logits = model(features)
    probabilities = logits.softmax(dim=1)
    predictions = logits.argmax(dim=1)

print(predictions.tolist())

这段代码只学习 W\mathbf{W}b\mathbf{b},所以三类之间的边界都是直线。若在线性层前加入非线性特征提取器 ϕ(x)\boldsymbol{\phi}(\mathbf{x}),末端仍可写成

z=Wϕ(x)+b,\mathbf{z}=\mathbf{W}\boldsymbol{\phi}(\mathbf{x})+\mathbf{b},

但它只对特征 ϕ(x)\boldsymbol{\phi}(\mathbf{x}) 线性,整个网络对原始输入 x\mathbf{x} 通常是非线性的。现代神经网络中的“线性分类头”指的正是这个局部结构。

感知机和线性支持向量机也属于判别式方法。感知机在样本被分错时更新参数;支持向量机用合页损失约束类别间隔。它们学习可比较的分数或边界,却不直接给出后验概率。若下游决策必须使用成本矩阵,通常还需要在独立数据上做概率校准,或者直接根据目标指标选择工作阈值。

生成式学习与判别式学习

生成式与判别式的区别在于训练时学习什么,不在于最后有没有判别函数。任何分类器在作出决策前都需要某种可比较的量;生成式模型也会计算 gk(x)g_k(\mathbf{x}),而判别式模型也可以输出概率。

标注样本在图中分成上下两条训练路径,上方生成式路径分别估计类别先验与类条件分布,再通过贝叶斯公式得到后验;下方判别式路径直接拟合条件概率或分类分数;两条路径最终进入共同的损失与决策层并输出动作
生成式与判别式学习在参数估计阶段分叉,在决策阶段重新汇合。生成式方法先拟合先验与类条件分布;判别式方法直接拟合后验或分类分数,随后再按概率风险、argmax 或工作阈值选择动作。作者绘制
方法训练时估计的对象得到线性边界的条件原始输出的含义
LDAp(xCk)p(\mathbf{x}\mid C_k)p(Ck)p(C_k)各类高斯分布共享协方差联合对数密度的可比较部分
多项式朴素贝叶斯类别先验与各类特征概率输入是计数,使用多项式类条件模型对数联合概率的可比较部分
逻辑回归与 Softmax 回归p(Ckx)p(C_k\mid\mathbf{x})logit 是输入特征的仿射函数条件概率模型的 logit
感知机与线性 SVM分类分数或间隔直接限制分数为仿射函数无默认概率解释的分数

两条路线也没有脱离数据假设的固定胜负。Ng 和 Jordan 对朴素贝叶斯与逻辑回归的分析表明,在他们研究的条件和数据中,生成式模型可能更快接近自己的渐近误差,而判别式模型在样本增加后达到更低的渐近误差。这个结果解释了小样本阶段可能出现的差异,却不是“生成式模型总是更省样本”或“判别式模型最终总是更准”的普遍定律。模型假设是否贴合数据、正则化、特征表示和评价方式都会改变结论。

选择方法时可以先看任务中哪些量可信。若类条件分布有合理的领域模型,先验和各类参数又需要单独解释,LDA 或朴素贝叶斯是清楚的基线。若主要目标是在给定特征上预测标签,且不需要描述输入怎样生成,逻辑回归或线性 SVM 通常减少了不必要的分布假设。它们仍然带有结构限制:线性逻辑回归假定类别对数几率是特征的仿射函数,线性 SVM 则把可用边界限制为超平面。两边都应与简单基线比较,而不能只按方法所属类别判断。

特征表示与线性边界

线性模型只能用超平面划分当前特征空间。经典的异或(XOR)数据把 (0,0)(0,0)(1,1)(1,1) 放在一类,把 (0,1)(0,1)(1,0)(1,0) 放在另一类;任意一条直线都会同时切错至少一个点。增加训练轮数或更换优化器无法改变这个几何限制。

一种处理方式是显式构造新特征。例如加入 x1x2x_1x_2 后,模型仍对新特征向量线性,却可以在原空间形成非线性边界。核方法隐式完成类似映射,深度网络则用多层非线性变换学习 ϕ(x)\boldsymbol{\phi}(\mathbf{x})。判断模型能力时,应始终说明“相对于哪一组特征线性”。

即便边界形状足够,部署决策仍可能因数据变化而失效。类别先验变化会移动贝叶斯最优阈值,特征分布漂移会破坏训练时估计的概率,未标准化的不同量纲还会影响正则化对各权重的约束。上线前至少应固定特征处理流程,在贴近部署分布的验证集上检查分类指标与概率可靠性,并根据明确的错误成本确定阈值。训练损失、概率校准和业务动作分别回答不同问题,合在一个默认的 argmax 中会掩盖这些假设。

分类评分、概率与决策

线性分类网络先用 Wx+b\mathbf{W}\mathbf{x}+\mathbf{b} 生成类别分数,分数相等的位置构成超平面边界。分类决策理论再把后验概率和错误成本组合成条件风险;只有在零一损失下,最大后验和最高分规则才自然重合。

生成式分类器通过 p(Ck)p(xCk)p(C_k)p(\mathbf{x}\mid C_k) 得到后验,共享协方差高斯模型和多项式朴素贝叶斯都能导出线性判别函数。判别式分类器直接学习后验、分数或间隔,逻辑回归、Softmax 回归、感知机和线性 SVM 采用不同目标拟合同一种几何形式。模型属于哪条路线,不能单凭边界形状判断。

因此,使用线性分类器时需要依次回答三个问题:当前特征是否能被超平面合理分开,训练目标产生的分数能否解释为所需的概率,部署时的损失与类别分布是否支持当前阈值。三个条件都明确后,一层简单的线性网络才构成完整的分类方案。

参考文献

  1. R. A. Fisher. The Use of Multiple Measurements in Taxonomic Problems. Annals of Eugenics, 1936. DOI: 10.1111/j.1469-1809.1936.tb02137.x
  2. C. M. Bishop. Pattern Recognition and Machine Learning. Springer, 2006. DOI: 10.1007/978-0-387-45528-0
  3. I. Goodfellow, Y. Bengio, and A. Courville. Deep Learning, Chapter 5: Machine Learning Basics. MIT Press, 2016
  4. A. Y. Ng and M. I. Jordan. On Discriminative vs. Generative Classifiers: A comparison of logistic regression and naive Bayes. NIPS, 2001
  5. C. Guo, G. Pleiss, Y. Sun, and K. Q. Weinberger. On Calibration of Modern Neural Networks. ICML, 2017
  6. PyTorch Contributors. CrossEntropyLoss Documentation. PyTorch Documentation