「NLP」朴素贝叶斯
Topic: Naive Bayes
- 求最优解 (closed-form)
- MLE (最大似然)
- Lagrange Multiplier Method (拉格朗日乘数法)
- Solve for Naive Bayes
讲解朴素贝叶斯模型的数学原理。
求极值
例题:\(f(x)=x^2-2x-3\)
1.公式计算
2.求导数
3.Gradient Descent (first order)
\(t=0\)时,随机初始化 \(x^0\)
\(t=1, 2,\cdots\)
\(x^t=x^{t-1}-\eta_t \nabla_t f(x)\)
4.Newton's method (second order)
有限制条件的优化 (constrained optimization)
例题:求解 \(f(x)=x+y\) 的最大值,限制条件为 \(s.t. \, x^2+y^2=1\).
s.t.: such that.
通过拉格朗日乘数法,把上面的问题转化为求解下面式子的最大值:
Note:很多有条件限制的优化问题都可以考虑使用拉格朗日乘数法。
接着通过计算偏导数,得到下面3个等式:
根据上面的3个等式,可以求出:
最大似然估计 (Maximum Likelihood Estimation, MLE)
最大似然估计是机器学习领域最为常见的用来构建目标函数的方法。它的核心思想是根据观测学习到的结果来预测其中的未知参数。
构建目标函数的方法:
- MLE (最大似然估计)
- MAP (最大后验概率估计)
- Bayesian Estimation (贝叶斯估计)
扔硬币问题
例子:对于一个不均匀的硬币,H(正面),T(反面),\(\theta\) 表示出现正面的概率,如何估计 \(\theta\) ?
假如我们扔了6次,统计到的数据为 \(D = \{H,T,T,H,H,H \}\),这是一个典型的古典概型问题,我们可以估算 \(\theta=\frac{4}{6}=\frac{2}{3}\),这其实就用到了MLE的思想。
Step1: 构建目标函数
我们的目标函数可以定义为最大化观测值出现的概率:
令 \(L(\theta) = \theta^{4} \cdot (1-\theta)^2\) ,我们的目标就是求解使得 \(L(\theta)\) 最大对应的参数 \(\theta\) 。
Step2: 优化
目标函数定义好之后,就需要通过各种方法进行优化,这里采用求导的方法。
计算等式,求得:\(\theta=\frac{2}{3}\) .
样本量少的时候,通常采用MAP;样本量大的时候,可以使用MLE。样本量越大的时候,MAP越趋近于MLE。
如何理解目标函数?
模型是抽象程度较高的东西,模型实例化就变成了具体的目标函数。可以类比为面向对象中创建对象和实例化对象的关系。
朴素贝叶斯 (Naive Bayes)
给定一批训练数据 \(D= \{\ (x^1,y^1), \cdots , (x^N,y^N)\}\)
\(x^i\) : 指第 \(i\) 个样本(文章),而且该样本包含了 \(m_i\) 个单词,\(x^i=(x^i_1,x^i_2, \cdots , x^i_{m_i})\) 。
\(y^i\) : 代表 \(x^i\) 的标签,比如在垃圾邮件分类应用上,代表”垃圾邮件“,”正常邮件“。
\(V\) : 词典库的大小,即词典中单词的数量。
假设 \(x^i =“今天很高兴来参加NLP训练营”\),那这时候 \(x^i_1="今天", x^i_2="很", x^i_3="高兴", x^i_4="来", x^i_5="参加", x^i_6="NLP", x^i_7="训练营"\), 所以 \(m_i=7\)。
Step1 MLE构建目标函数
朴素贝叶斯是生成模型,它的目标是要最大化概率 \(p(D)\) ,即 \(p(x,y)\) 。
式子说明:
-
式子(4)是利用的贝叶斯公式。
-
式子(4)到(5)利用了一个事实:样本 \(x^i\) 由很多个单词来构成。
-
式子(5)到(6)利用了朴素贝叶斯的假设,也就是每个单词都是相互独立的。即\(p(x,y,z|h) = p(x|h) \cdot p(y|h) \cdot p(z|h)\) 。
可以看到式子都是乘法项,而多个乘法项很容易导致数据的overflow或underflow(这里是underflow)。所以我们一般不直接最大化 \(p(D)\) ,而是改成最大化 \(\log p(D)\) 。
所以上式修改为:
式子说明:
-
式子(7)到(8)的技巧:假设 \(x^i="我们天天运动"\) ,那么其概率可以表示为 \(p(我们天天运动|y)=p(我们天们|y) \cdot p(天|y) \cdot p(运动|y)\) ,另一方面,也可以利用词典库中的所有单词来表示这个概率为 \(p(我们天天运动|y)=p(啊|y)^0 \cdot p(呀|y)^0 \cdots p(天|y)^2 \cdots p(我们|y)^1 \cdots p(运动|y)^1\)。这两者其实是等价的,所以把 \(\prod_{j=1}^{m_j}p(x_j^i|y_i)\) 表示成 \(\prod_{j=1}^{V}p(w_j|y_i)^{n_{ij}}\)。其中,\(n_{ij}\) 代表单词 \(j\) 出现在文档 \(i\) 中的次数,\(w_j\) 代表词典库里的第 \(j\) 个单词。
-
式子(8)到(9)利用了 \(\log\) 的性质。
-
式子(9)到(10)是把文档按照类别做了分类。一开始我们是从文档1到N的顺序来循环的,但是现在先取出类别为1的文档,然后再取出类别为2的文档,以此类推。所以 \(\sum_{i=1}^N\) 被拆分成 \(\sum_{k=1}^K \sum_{i:y^i=k}\) ,\(K\) 表示类别的个数,\(i:y^i=k\) 代表属于类别 \(k\) 的所有文档。
-
式子(10)到(11)引入两组变量,令 \(p(w_j|y^i=k)=\Theta_{kj}\) ,表示当文章分类为 \(k\) 的时候出现单词 \(w_j\) 的概率;令 \(p(y^i=k)=\pi_{k}\) ,表示文章属于分类 \(k\) 的概率,这个也是朴素贝叶斯模型的先验概率(prior)。
-
式子(10)到(11)引入一个新的变量 \(n_k\) ,\(\sum_{i:y^i=k}=n_k\) 表示属类别 \(k\) 的文章个数。
上式中有两个约束条件需要满足,分别是:
式子说明:
-
条件(13)表示所有类别的概率加起来等于1。
-
条件(14)表示的是对于任意一个类别k,出现所有词典里的单词的总概率等于1。
所以,这是一个有约束条件的优化问题,把约束条件和目标函数写在一起:
利用拉格朗日乘法项,得到目标函数:
Step2 偏导数求解最优解
通过计算偏导数的方法,求解目标函数的最优解。
找出最优解 \(\pi_k\)
\(L\) 对 \(\pi_k\) 的偏导数为:
解得:
需要求解参数 \(\lambda\) ,把 \(\pi_k\) 的解代入约束条件 \(\sum_{u=1}^K \pi_u=1\) ,可以得到:
则得出 \(\lambda = - \sum_{u=1}^K n_u\) ,把 \(\lambda\) 代入 \(\pi_k\) 里面,得到:
分子 \(n_k\) 表示k类文档的个数,分母 \(\sum_{u=1}^K \pi_u\) 表示语料库中文档的个数。
找出最优解 \(\Theta_{kj}\)
类似的,\(L\) 对 \(\Theta_{kj}\) 的偏导数为:
解得:
需要求解参数 \(\lambda_k\) ,把 \(\Theta_{kj}\) 的解代入约束条件 \(\sum_{v=1}\Theta_{kv}=1\) ,可以得到:
Note: 文档中的 \(\lambda_k\) 式子写错了。
把 \(\lambda_k\) 代入上面的解,得到:
分子表示在所有类别为k的文档中出现了多少次 \(w_j\) (词典库中的第j个单词),分母代表类别k的所有文档中出现的单词个数。