Skip to content

4.3 拉普拉斯平滑

拉普拉斯平滑

在朴素贝叶斯算法中,我们以邮件分类器为例介绍了文本分类问题。当时我们将整个字典储存起来作为词汇表。但实际上这种做法效率不高。更高效的做法是设定一个常用词汇表,只存储一定量的常用单词。但若遇到词汇表之外的生词,该怎么办呢?

首先,我们分析一下遇到生词会导致什么问题。回顾垃圾邮件分类过程:假设你完成了 CS229 课程并做了出色的研究项目,决定在 20xx 年 6 月将作品投稿到 NeurIPS 会议(机器学习领域的顶级会议,投稿截止日期通常在六月底至七月初你通过邮件讨论了该会议,随后开始收到包含 "neurips" 单词的邮件。然而,这是你的第一篇 NeurIPS 投稿,此前从未收到过包含 "neurips" 的邮件;更重要的是,"neurips" 这个词从未出现在你的垃圾邮件 / 正常邮件训练集中。假设 "neurips" 是词汇表中的第 35000 个词,那么朴素贝叶斯分类器对该参数 ϕ35000|y 的最大似然估计结果如下:

ϕ35000|y=1=i=1m1{x35000(i)=1y(i)=1}i=1m1{y(i)=1}=0ϕ35000|y=0=i=1m1{x35000(i)=1y(i)=0}i=1m1{y(i)=0}=0

由于分类器从未在垃圾邮件或正常邮件的训练样本中见过 "neurips" 这个词,它认为该词出现在两类邮件中的概率均为 0。因此,当需要判断一封包含 "neurips" 的邮件是否为垃圾邮件时,算法计算后验概率得到:

p(y=1|x)=i=1np(xi|y=1)p(y=1)i=1np(xi|y=1)p(y=1)+i=1np(xi|y=0)p(y=0)=00

问题在于 i=1np(xi|y) 中包含了 p(x35000|y)=0,导致整个乘积为 0。因此算法得到 00,无法做出预测。

根本原因在于统计学中常将未观测到的事件的概率估计为 0,从而导致了 00 的情况。为避免此问题,我们引入拉普拉斯平滑 (Laplace smoothing),用一个小概率值替代零概率。具体来说,假设要估计一个在 {1,...,k} 范围内取值的多项式随机变量 z 的参数 ϕi=p(z=i)。给定 m 个独立观测样本 {z(1),...,z(m)},最大似然估计经拉普拉斯平滑后变为:

ϕj=i=1m1{z(i)=j}+1m+k

此处,分子加 1,分母加 k。需注意 j=1kϕj=1 仍然成立(这是概率估计的必要性质同时,所有 ϕj 都不为零,从而解决了零概率问题。在某些条件下,拉普拉斯平滑可被证明能给出参数 ϕj 的良好估计。

回到朴素贝叶斯分类器,应用拉普拉斯平滑后,参数估计公式修正如下:

ϕj|y=1=i=1m1{xj(i)=1y(i)=1}+1i=1m1{y(i)=1}+2ϕj|y=0=i=1m1{xj(i)=1y(i)=0}+1i=1m1{y(i)=0}+2

(实践中,通常无需对 ϕy 进行拉普拉斯平滑,因为垃圾邮件与非垃圾邮件的比例通常是合理可估计的,ϕy 作为 p(y=1) 的估计值通常不会接近零

文本分类的事件模型(Event Models for Text Classification)

接下来介绍文本分类的另一种模型。朴素贝叶斯算法已能解决许多分类问题,但还有一种相关算法在文本分类上表现更优。

在之前针对文本分类的朴素贝叶斯方法中,我们使用的是多元伯努利事件模型(Multi-Variate Bernoulli Event Model)。在该模型中,假设邮件是否发送由随机过程决定(先验概率 p(y)然后,发件人(无论是否垃圾邮件发送者)独立地遍历词汇表,依据概率分布 p(xi=1|y)=ϕi|y 决定是否将每个词 i 包含在邮件中。因此,收到一封垃圾邮件的概率为:p(y)i=1np(xi|y)

另一种模型称为多项式事件模型(Multinomial Event Model)。为描述此模型,需使用不同的特征表示方法:令 xi 表示邮件中的第 i 个单词。因此,xi 是一个整数,取值范围为 {1,...,|V|},其中 |V| 是词汇表的大小。一封包含 n 个单词的邮件可表示为一个长度为 n 的向量 (x1,x2,...,xn);注意,不同邮件的 n 值可以不同。例如,邮件开头是 "A NIPS ...",则 x1=1 ("a" 是词汇表第一个词),x2=35000 (假设 "nips" 是词汇表第 35000 个词)。

在多项式事件模型中,假设邮件生成过程如下:首先确定是否为垃圾邮件(依据 p(y),与前模型相同接着,发件人依据多项式分布 p(x1|y) 生成第一个词 x1。然后,独立于 x1 地依据相同的多项式分布生成 x2,再生成 x3x4,依此类推,直至生成邮件所有词。因此,邮件的整体概率为 p(y)i=1np(xi|y)。虽然此公式形式与多元伯努利模型相似,但含义截然不同:此处的 xi|y 服从多项式分布,而非伯努利分布。

新模型的参数仍然是 ϕy=p(y)(与前相同以及 ϕk|y=1=p(xj=k|y=1)ϕk|y=0=p(xj=k|y=0)(对任意位置 j注意,我们假设 p(xj|y) 的值与位置 j 无关,即单词的生成分布不依赖于其在邮件中的位置(词袋模型假设的一种体现

给定训练集 {(x(i),y(i));i=1,...,m},其中 x(i)=(x1(i),x2(i),...,xni(i))ni 是第 i 个样本的单词数数据的似然函数为:

L(ϕy,ϕk|y=0,ϕk|y=1)=i=1mp(x(i),y(i))=i=1m(j=1nip(xj(i)|y(i);ϕk|y=0,ϕk|y=1))p(y(i);ϕy)

最大化该似然函数得到参数的最大似然估计:

ϕk|y=1=i=1mj=1ni1{xj(i)=ky(i)=1}i=1m1{y(i)=1}niϕk|y=0=i=1mj=1ni1{xj(i)=ky(i)=0}i=1m1{y(i)=0}niϕy=i=1m1{y(i)=1}m

若应用拉普拉斯平滑(实践中用于提升性能)估计 ϕk|y=0ϕk|y=1,在分子加 1,分母加 |V|,得到:

ϕk|y=1=i=1mj=1ni1{xj(i)=ky(i)=1}+1i=1m1{y(i)=1}ni+|V|ϕk|y=0=i=1mj=1ni1{xj(i)=ky(i)=0}+1i=1m1{y(i)=0}ni+|V|

当然,这未必是最优的分类算法,但朴素贝叶斯分类器在实践中往往表现优异。因此,它因其简单、易于实现而成为一个很好的首选方案