第7章 传统文本学习:朴素贝叶斯、SVM、ELM 与高斯过程
读完你能: 训练一个带平滑的多项式朴素贝叶斯分类器;手算 SVM 的 hinge loss 并理解间隔与正则化参数的作用;用伪逆或岭回归求解 ELM 输出层权重;计算高斯过程回归的预测均值与方差,并为具体文本任务挑选合适的基线模型。
1. 特征表示与分类模型是两个独立选择
前几章介绍了如何把文本转换成数值向量:词频计数、TF-IDF、稠密词向量,或者 SVD/NMF 降维后的低维坐标。一旦文本变成了特征向量,后续接什么学习模型是另一个独立的设计选择:词频计数常配朴素贝叶斯,高维稀疏 TF-IDF 常配线性 SVM,低维稠密特征则可以进一步尝试核方法或高斯过程。
| 方法 | 核心学习目标 | 关键假设与注意点 |
|---|---|---|
| 朴素贝叶斯 | 类别先验 与词的条件概率 | 给定类别时词条件独立;需配合平滑与固定词表 |
| 线性 SVM | 最大间隔分离超平面 | 关注决策边界附近的样本;受特征尺度与惩罚系数 影响 |
| 极限学习机(ELM) | 随机隐藏层之后的线性输出权重 | 输入到隐藏层随机固定;依赖隐藏层宽度与最小二乘求解稳定性 |
| 高斯过程(GP) | 潜在函数的先验与后验分布 | 核函数决定平滑性;精确求解时间复杂度 |
| 线性回归 | 连续目标与特征的线性映射 | 优化平方误差;输出值不限制在 ,不能直接当作类别概率 |
2. 多项式朴素贝叶斯
设文档 中词 的出现次数为 ,候选类别为 。由贝叶斯公式,给定文档时类别的后验概率满足
朴素贝叶斯之所以叫“朴素”,是因为它假设给定类别 后,各个位置的词相互条件独立。于是文档的似然可以拆成各词条件概率的连乘;同一个词 出现 次,就连乘 次。取对数把连乘化为连加,判别规则为:
虽然自然语言里的词并不真正独立,但这个简化能以极低的计算成本给出稳健的分类基线。
若某个词在训练集某类别下从未出现,直接按最大似然估计会得到 ,一旦测试文档包含该词,整个连乘就变成 0。为此,多项式模型通常采用加 平滑( 时即拉普拉斯加一平滑):
这里 是类别 的所有训练文档中词 出现的总词元次数, 是类别 的全部词元总数, 是词表大小。类别先验则用类别文档数除以总训练文档数估计:。
分清多项式模型与 Bernoulli 模型的分母
多项式朴素贝叶斯按词元出现次数建模,平滑分母是 (词元总数加词表大小);Bernoulli 朴素贝叶斯则按“每篇文档是否包含该词”的 0/1 事件建模,分母是类别文档数加 。手算时切勿把两套分母混用。
3. 手算一个朴素贝叶斯分类器
设训练集有 4 篇短评:
- 正面():
good movie、good fun - 负面():
bad movie、bad boring
词表为 ,大小 。正负两类各有 2 篇文档,因此先验 ;两类各自的词元总数都是 。
取拉普拉斯平滑 ,分母均为 ,各词的条件概率如下:
| 词 | 正面计数 | 负面计数 | ||
|---|---|---|---|---|
| good | 2 | 0 | ||
| movie | 1 | 1 | ||
| fun | 1 | 0 | ||
| bad | 0 | 2 | ||
| boring | 0 | 1 |
每一列的条件概率之和都等于 。现在对测试文档 good movie 分类:
因为 ,分类器判定为正面。将两类得分归一化可得后验概率 。需要注意,由于条件独立假设会让重复特征的证据成倍累加,朴素贝叶斯算出的后验往往偏极端(趋近 0 或 1),需要概率校准后才能当作真实置信度使用。
实际工程实现中,文档包含几十上百个词,直接连乘很容易发生浮点数下溢,因此一律在对数域累加:
from collections import Counter
from math import log
train = [("good movie", "+"), ("good fun", "+"),
("bad movie", "-"), ("bad boring", "-")]
vocab = {w for text, _ in train for w in text.split()}
class_docs = Counter(label for _, label in train)
counts = {c: Counter() for c in class_docs}
for text, label in train:
counts[label].update(text.split())
def score(text, label, alpha=1.0):
total = sum(counts[label].values())
result = log(class_docs[label] / len(train))
for w, n in Counter(text.split()).items():
if w in vocab:
result += n * log((counts[label][w] + alpha) / (total + alpha * len(vocab)))
return result
assert score("good movie", "+") > score("good movie", "-")
上面的代码在推断时跳过了词表外的未登录词(OOV);另一种常见做法是在训练时把低频词替换为 <UNK> 并在词表中保留该符号。无论选哪种方案,训练与测试必须保持一致——拉普拉斯平滑解决的是“词表内的词在某个类别中计数为 0”,并不会自动给词表之外的新词分配概率。
4. SVM:不仅要分对,还要留出间隔
设线性判别函数为 ,二分类标签取 。几何上,超平面 把空间一分为二,样本点 到超平面的距离为 。支持向量机(SVM)希望两类样本不仅位于超平面两侧,而且离超平面最近的点也尽可能远。在间隔边界固定为 的规范化约定下,最小化 就对应于最大化两条边界之间的距离 。
现实文本数据往往不是严格线性可分的,软间隔线性 SVM 将间隔最大化与训练误差合写为:
其中 称为合页损失(hinge loss):
- 说明预测符号与真实标签同号,分类结果正确;
- 但只有当 (样本落在间隔边界上或正确一侧的间隔之外)时,hinge loss 才等于 0;
- 若 ,虽然分对了类别,但距离超平面太近、间隔不足,仍会产生 的损失。
例1: 设 ,正例标签 。
- 对样本 :预测分数 ,分类正确,但 ,因此 hinge loss 为 。
- 对样本 :预测分数 ,满足 ,hinge loss 为 。
目标函数里的超参数 控制对间隔违约的惩罚力度:** 越大,越不允许训练样本侵入间隔,边界越贴近训练点; 越小,正则项 占比越重,允许更多训练样本违约以换取更宽的间隔。** 切勿把 的方向记反。
当输入空间确实需要非线性边界时,核方法将内积 替换为 Mercer 核函数 ,隐式映射到高维特征空间:
- 线性核:,适合高维稀疏文本(如 TF-IDF 特征),速度快且强基线效果好;
- 多项式核:, 为多项式阶数;
- RBF(高斯)核:(常简写为 ),带宽参数决定局部影响范围。
在词表维度已经高达数万的文本分类中,特征本身往往接近线性可分,直接用线性 SVM 通常是性价比最高的第一选择。
5. ELM:随机固定隐藏层,输出层解线性最小二乘
极限学习机(Extreme Learning Machine, ELM)是一种单隐藏层前馈网络。与通过反向传播迭代更新全部权重的神经网络不同,ELM 把输入层到隐藏层的权重 和偏置 随机采样后直接固定,只训练隐藏层到输出层的线性权重 。
设有 个训练样本、 个隐藏神经元,激活函数为 ,隐藏层输出矩阵 的第 项为:
由于 已经固定,求输出权重 就化简成一个标准线性最小二乘问题。通常 不是方阵(样本数 与隐藏节点数 不相等),因此用 Moore–Penrose 伪逆写作 ,或者加入 L2 正则化(岭回归)以提高数值稳定性:
例2: 设 2 个样本在 2 个隐藏节点上的激活矩阵与目标值为
解线性方程组 、,直接得 。当样本数 且方程组超定不相容时, 给出的正是使平方误差 最小的最小二乘解。实际计算中应调用 SVD 或 QR 分解求解线性方程组,避免显式计算矩阵求逆。
6. 高斯过程:直接在函数空间建概率分布
参数模型把学习目标写成一组有限维权重 ,而高斯过程(Gaussian Process, GP)直接对未知函数 建立概率分布:任意有限个输入点上的函数值 都联合服从多元高斯分布。
一个高斯过程由均值函数 (常设为 0)和协方差核函数 完全决定。由训练输入构成的 Gram 核矩阵 必须半正定。例如常用的 RBF 核 中,长度尺度 越大,生成的函数越平缓; 越小,函数随输入变化越剧烈。
在高斯过程回归中,设观测目标含独立高斯噪声 ,。给定训练集核矩阵 、训练标签 ,以及新样本 与各训练样本的核向量 ,潜在函数值 的后验均值与方差有闭式解:
若要预测包含观测噪声的新输出 ,只需在 上再加 。
例3: 设两个训练点的核矩阵为 ,噪声方差 ,观测值 ;新点满足 、。
- 先算 ,行列式为 。
- 解线性方程组 :注意到 ,可得 。
- 预测均值:。
- 潜在方差先算二次型:,因此 。
高斯过程不仅给出点预测 ,还自然给出不确定性度量 。对 RBF 这类随距离衰减的核,当新点远离所有训练点时, 趋近于零,后验方差便接近先验方差 。但若用于分类任务,后验不再是高斯分布,需要通过 Laplace 近似或变分推断处理;同时精确求解 需要 时间与 内存,主要受样本数限制;处理大样本时通常需要近似或稀疏方法。
7. 线性回归与传统模型选型
当任务目标是预测连续数值(例如评分数值或可读性分数)时,可以直接用线性回归 最小化均方误差:
并沿负梯度方向迭代更新 。但线性回归的预测值在整个实数轴上取值,不受 约束,不能直接当作分类概率使用。
实际做文本建模时,建议固定同一套训练/验证集划分与评估指标,先跑通多项式朴素贝叶斯和 TF-IDF + 线性 SVM 两个轻量基线,看清错误集中在哪些样本,再决定是否引入非线性核、ELM 或神经模型。
自测
1. 在第 3 节的朴素贝叶斯例子中,测试文档换成 good good movie,归一化后的正面后验概率是多少?
good 出现 2 次,其条件概率平方后计入得分:,。两类得分之比为 ,因此正面后验概率升至 。重复词会成倍放大条件独立模型中的证据。
2. 某样本真实标签 y=-1,SVM 预测值 f(x)=-0.2,分类方向已经正确,它的 hinge loss 是多少?
,因此 。分类符号正确但尚未跨过间隔边界 ,仍然会产生损失。
- 感谢你赐予我前进的力量

