朴素贝叶斯模型是文本分析领域最为经常使用的模型之一,也是最为经典的模型。文本主要从教学的角度来说解朴素贝叶斯模型以及数学原理。为了让文档具有完备性,必要的前置知识也包含在文章里。 在这里,咱们假设朴素贝叶斯的输入向量是每一个单词出现的次数。若是向量的表示为tf-idf等实数型的,咱们则须要使用高斯朴素贝叶斯模型(不是本文重点)。机器学习
本文章来源于《天然语言处理训练营》,主要以教学为目的,让学员了解最大似然以及如何使用简单的优化技巧来求朴素贝叶斯的最大似然。It is a self-contained draft that everything is included.
做者:李文哲
预备数学知识:函数
人工智能中最核心的数学环节是求出一个目标函数(object function)的最小值/最大值。求出一个函数最小是/最大值的方法不少,在这里咱们介绍一个最经典的方法之一:直接求出极值点。这些极值点的共同特色是在这些点上的梯度为0, 以下图所示。这个图里面,有8个极值点,并且这些极值点中必然会存在最小值或者最大值(除去函数的左右最端点)。因此在这种方式下,咱们一般x先求出函数的导数,而后设置成为0。以后从找出的极值点中选择使得结果为最小值/最大值的极值点。学习
A. 无约束条件的优化优化
例1:求 的最小值人工智能
对于这样的一个问题,其实咱们都知道这个问题的答案是 ,基本上不须要计算就能看出来。接下来咱们经过求导的方式来求一下最小值。首先对
求导并把导数设置成0。3d
从而获得 , 求出来的是惟一的极值点,因此最后得出来的函数的最小值是
cdn
的最小值事件
求导以后 ip
便可以获得 。 把这三个值分别带入到
便可以获得
。因此,
两个点均可以做为函数的最小值点,这时候函数值为
。文档
*请注意:并不必定全部函数的极值均可以经过设置导数为0的方式求出。也就是说,有些问题中当咱们设定导数为0时,未必能直接计算出知足导数为0的点(好比逻辑回归模型),这时候就须要利用数值计算相关的技术(最典型为梯度降低法,牛顿法..)
B. 带约束条件的优化 - 拉格朗日乘法项(Lagrangian Multiplier)
对于某些求极值问题,函数一般带有一些条件。以下面的例子:
例3:求 的最大值,但有个条件是
。那这时候怎么求出最大值呢?
拉格朗日乘法项就是用来解决这类问题。咱们能够把限制条件经过简单的转变加到目标函数中,这时候问题就变成了
剩下的过程就跟上面的相似了。设定导数为0,便可以获得如下三个方程:
解完以后便可以获得 。 针对于每个$\lambda$咱们获得的解为
。把两个解带入到原来函数里并作比较便可以肯定最优解。
2. 最大似然估计(Maximum Likelihood Estimation)
最大似然估计是机器学习领域最为常见的用来构建目标函数的方法。它的核心思想是根据观测到的结果来预测其中的未知参数。咱们举一个投掷硬币的例子。
假设有一枚硬币,它是不均匀的,也就是说出现正面的反面的几率是不一样的。假设咱们设定这枚硬币出现正面的几率为 , 这里
指的是正面(head), 相似的还会有反面(tail)。假设咱们投掷6次以后获得了如下的结果,并且咱们假定每次投掷都是相互独立的事件:
其中D表示所观测到的全部样本。从这个结果其实谁均可以很容易说出 ,也就是出现正面的几率为4/6,其实咱们在无心识中使用了最大似然估计法。接下来,咱们从更严谨的角度来定义最大似然下的目标函数。
基于最大似然估计法,咱们须要最大化观测到样本的几率,即p(D)。进一步能够写成:
咱们的目标是最大化几率值 。那这部分的优化便可以采用上面所提到的方法。
把这个式子整理完以后便可以获得 , 结果跟一开始咱们算出来的是一致的。
假设给定了一批训练数据 ,其中
指的是第
个样本(文章),并且这个样本(文章)包含了
个单词,因此能够
表示成
. 假设$x^i$的全文内容为"今天 很 高兴 来 参加 天然语言处理 训练营", 那这时候
"今天",
="很",
="高兴",
="来"
="参加",
="天然语言处理",
="训练营"。因此这里
。另外,
表明的是$x^i$的标签。好比在垃圾邮件应用上,它表明"垃圾邮件",”正常邮件“。咱们利用K来表明分类的个数。好比在垃圾邮件应用上K=2。但在这里,咱们考虑广泛的状况,颇有可能K>2,也称之为是多分类问题。最后,咱们再定义V为词典库的大小。
朴素贝叶斯是生成模型,它的目标是要最大化几率p(D),也就是p(x,y)。咱们把前几步的推导先写一下:
这里简单说明一下:样本 由不少个单词来构成,这里每个
看做是一个单词。最后一个是利用了朴素贝叶斯的假设,也就是每一个词都是相互独立的。好比给定一个句子"咱们 今天 运动",在给定一个标签y的状况下,几率能够写成
。
咱们看到式子里面都是乘法项,并且多个乘法项很容易引发数据的overflow或则underflow(在这里是underflow)。因此咱们通常不直接最大化p(D),而是最大化 , 其实这两个是等同的。由于
函数是严格递增的函数。加上
,咱们对上面式子作一些变化:
在这里咱们用了一些技巧。举例子,假设一个文章的内容为 ,按照以前的逻辑这句话的几率为
。但另外一方面,咱们也能够利用词典库的全部的词来表明这个几率。
.
这二者是等同的,只不过咱们从词典库的维度把全部的单词都考虑了进来,并数一下每个单词在文档i里出现了多少次,若是没有出现,至关于0次。因此从这个角度咱们能够把 写成
,其中
表明单词j出如今文档$i$的次数。这里
表明词典库里的第j个单词。
另外,咱们也用到了 的性质。好比
。还有一点是,一开始的时候咱们是从文档1到N的顺序来循环,但如今咱们先取出类别为1的文档,而后再取出类别为2的文档,以此类推。因此前面的
被拆分红两个sum, 即
。这里
表明属于类别k的全部文档。另外,咱们引入了两组变量。也就是咱们直接设置
为
,意思就是当文章分类为k的时候出现单词
的几率(
)。
另外,咱们设定 为
,也就是文档属于第k类的几率,这个也是朴素贝叶斯模型的先验(prior)。 好比在垃圾识别应用中,假设总共有100个垃圾邮件和1000个正常邮件,这时候一个邮件为垃圾邮件的几率为
, 正常邮件的几率为10/11,这就是贝叶斯模型的先验,并且全部之和等于1。最后咱们引入了一个新的变量叫作
,也就是属类别k的文件个数(训练数据总统计便可,是已知的)。也就是
。
另外,有两个约束条件须要知足,分别是:
第一个条件表示的是全部类别的几率加在一块儿等于1. 好比 。第二个条件表示的是对于任意一个分类k, 出现全部词典里的单词的总几率合为1. 因此,这个问题是有约束条件的优化问题。把约束条件和目标函数写在一块儿便可以获得:
利用拉格朗日乘法项,咱们能够把目标函数写成:
A: 找出最优解
咱们须要设置导数为0,进而找出最优解。如今求解的是 ,因此只要跟
无关的项咱们均可以不用考虑,由于它们导数为0.
对
的导数为:
解为 。这里有个参数
,但同时咱们有一个约束条件是
, 咱们把刚才的解带入到这里,能够获得:
则 的值为
。把$\lambda$再次带入到
里面,咱们能够获得:
这里面 为k类文档出现的个数,分母为全部文档的个数。
B. 找出最优解
相似的,咱们须要求L对 的导数为:
解为 。这里有个参数是
,但同时咱们有个约束条件是
,把刚才的解带入到这里,能够获得:
把 带入到上面的解便可以获得:
这个式子中分子表明的是在全部类别为k的文档里出现了多少次 也就是词典库里的j个单词。分母表明的是在类别为k的全部文档里包含了总共多少个单词。
到此为止,模型的参数已经获得。If there is any mistake, pls let me know.