Bayes' theorem (贝叶斯定理)
前言
AI时代的到来一下子让人感觉到数学知识有些捉襟见肘,为了不被这个时代淘汰,我们需要不断的学习再学习。其中最常见的就是贝叶斯定理,这个定理最早由托马斯·贝叶斯提出。
贝叶斯方法的诞生源于他生前为解决一个“逆向概率”问题写的一篇文章,而这篇文章是在他死后才由他的一位朋友发表出来的。在贝叶斯写这篇论文之前,人们已经能够计算“正向概率”,如“袋子里N个白球,M个黑球,随机抓一个,抓到白球的概率”。而随之而来的另一个反过来的问题就是 “如果我们事先并不知道袋子里面黑白球的比例,而是闭着眼睛摸出一个(或好几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里面的黑白球的比例作出什么样的推测”。这个问题,就是所谓的“逆概”问题。
实际上,贝叶斯当时的论文只是对这个问题的一个直接的求解尝试,并不清楚他当时是不是已经意识到这里面包含着的深刻的思想。然而后来,贝叶斯方法席卷了概率论,并将应用延伸到各个问题领域,所有需要作出概率预测的地方都可以见到贝叶斯方法的影子,特别需要提的是:贝叶斯是机器学习的核心方法之一。这背后的深刻原因在于,现实世界本身就是不确定的,人类的观察能力是有局限性的(否则有很大一部分科学就没有必要做了——设想我们能够直接观察到电子的运行,还需要对原子模型争吵不休吗?),我们日常所观察到的只是事物表面上的结果,沿用刚才那个袋子里面取球的比方,我们往往只能知道从里面取出来的球是什么颜色,而并不能直接看到袋子里面实际的情况。这个时候,我们就需要提供一个猜测(hypothesis,更为严格的说法是“假设”,这里用“猜测”更通俗易懂一点),所谓猜测,当然就是不确定的(很可能有好多种乃至无数种猜测都能满足目前的观测),但也绝对不是两眼一抹黑瞎蒙——具体地说。
我们需要做两件事情:1. 算出各种不同猜测的可能性大小。2. 算出最靠谱的猜测是什么。第一个就是计算特定猜测的后验概率,对于连续的猜测空间则是计算猜测的概率密度函数。第二个则是所谓的模型比较,模型比较如果不考虑先验概率的话就是最大似然方法。
歧义句
下面举一个自然语言中有歧义的例子:
我看见小明扶着一位老人走下车来,手里握着一根拐杖。
当你看到这句话的时候,你肯定会说你对这句话的说的就是“小明扶着老人,老人手里拿着拐杖”。但实际这句话呢,还可以解释成“小明扶着老人,且小明拿着拐杖”。那为什么我们能够通过这句话迅速的对这种二义性进行消解呢?这里面到底有什么样的思维法则?一会后面解释。
贝叶斯公式
P(B|A) = P(AB) / P(A) 也可以写作 P(B|A) = P(A|B)*P(B) / P(A)
相信大家看到这个公式,应该很不好理解吧,没关系,我们用一个Wikipedia上实际的例子来推到一下贝叶斯公式。
一所学校里面有 60% 的男生,40% 的女生。男生总是穿长裤,女生则一半穿长裤一半穿裙子。我们可以非常容易的算出“随机选取一个学生,ta穿长裤的概率和穿裙子的概率”,这个也就是我们前面说到的“正向概率”。然而,贝叶斯公式解决问题就是“假设你走在校园中,迎面走来一个穿长裤的学生,你能够推断出ta是男生的概率是多大吗?”
其实吧,我们可能不善于解决贝叶斯公式,但是一般的概率问题我们还是可以很快解决的,因此刚才那个问题可以被理解为“你在校园里随便逛,遇到了 N 个穿长裤的人,求这 N 个人里面有多少个男生。”这样是不是就简单多了:先算出穿长裤人的概率,然后再算出穿长裤人的里面有多少男生即可。
假设你遇到了N个人,那么你遇到:
穿长裤人 = 穿长裤的男生 + 穿长裤的女生 = 总人数*男生的概率*男生穿长裤的概率 + 总人数*女生的概率*女生穿长裤的概率 = N*P(男)*P(长裤|男) + N*P(女)*P(长裤|女)
这里需要注意一下 P(长裤|男) 是条件概率,即“男”这个条件下“穿长裤”的概率,由题目得知男生都穿长裤,因此 P(长裤|男) = 100%;同理 P(长裤|女) = 50%。
那么我们最初要求的穿长裤的男生的概率 P(男|长裤) = 穿长裤的男生/穿长裤人 = N*P(男)*P(长裤|男) / N*P(男)*P(长裤|男) + N*P(女)*P(长裤|女)
我们很容易发现分子分母可以同时约去N,这个公式里实际结果和N是没有关系的:P(男|长裤) = P(男)*P(长裤|男) / P(男)*P(长裤|男) + P(女)*P(长裤|女)
再收缩一下 其实分母就是 P(长裤) 分子是P(长裤,男) (注意是逗号),读作“穿长裤的男孩”;因此 P(男|长裤) = P(长裤,男)/P(长裤)
如果我们将 上式中“男”和“裤”替换成其他的内容,例如B和A,那么:
P(B|A) = P(B)*P(A|B) / P(A) = P(AB) / P(A) 即 P(B|A) * P(A) = P(AB)
就这样贝叶斯公式就被我们推敲了出来。
我们再解读一次:
P(男|长裤) = P(长裤|男) *P(男)/ P(长裤)
P(男|长裤),叫后验概率,即穿长裤这个条件下,是男生的概率,也就是我们要计算的概率。
P(长裤|男),叫似然度,即男生穿长裤的概率。
P(男) ,叫做先验概率,即男生出现的概率。
P(长裤),叫做标准化常量,和先验概率定义类型,就是一般情况下,穿长裤人的概率。
P(男|长裤) = 100%*60%/(60%+40%/2)= 0.75
P(女|长裤) = 50%*40%/(60%+40%/2)= 0.25
可以看到我们的计算和我们之前的猜测是一致的。
拼写纠正
一位大牛Peter Norvig 写过这样一篇关于拼写纠正的文章,里面用到的就是贝叶斯的思想,我们可以简单介绍下核心:
首先第一步就是如果把这个问题转换到我们的公式上面,我们要做的就是“当用户输入了一个不在字典中的单词,我们需要去猜测他真正想输入的单词到底是什么呢”。
因此我们需要算的就是
P(我们猜测他想输入的单词 | 他实际输入的单词)
当然这个猜测的结果不止一个,我们需要找到概率最大的那个猜测单词。比如用户输入: thew ,那么他到底是想输入 the ,还是想输入 thaw ?到底哪个猜测可能性更大呢?由于我们可以用贝叶斯公式来直接出它们各自的概率,因此我们不妨多些猜测,我们将多个猜测记为 h1 h2 .. ( h 代表 hypothesis),它们都属于一个有限且离散的猜测空间 H (单词总共就那么多而已),将用户实际输入的单词记为 D ( D 代表 Data ,即观测数据),于是:
P(我们猜测他想输入的单词 | 他实际输入的单词) 可以抽象地记为:P(h1 | D)
对于我们的猜测2,则是 P(h2 | D)。我们统一记为:P(h | D)
运用一次贝叶斯公式,我们得到:
P(h | D) = P(h) * P(D | h) / P(D)
对于不同的具体猜测 h1 h2 h3 .. ,P(D) 都是一样的,所以在比较 P(h1 | D) 和 P(h2 | D) 的时候我们可以忽略这个常数。因此P(h | D) 的大小取决于 P(h) * P(D | h)
可以记为:P(h | D) ∝ P(h) * P(D | h) (∝ 这个符号代表“正比例于”)
P(h) * P(D | h)的含义,我们可以抽象为:对于给定观测数据,一个猜测是好是坏,取决于“这个猜测本身独立的可能性大小(先验概率,Prior )”和“这个猜测生成我们观测到的数据的可能性大小”(似然概率,Likelihood )的乘积。具体到我们的那个 thew 例子上,含义就是,用户实际是想输入 the 的可能性大小取决于 the 本身在词汇表中被使用的可能性(频繁程度)大小(先验概率)和 想打 the 却打成 thew 的可能性大小(似然概率)的乘积。
那么这个问题就解决了,对于我们猜测为可能的每个单词计算一下 P(h) * P(D | h) 这个值,然后取最大的,得到的就是最靠谱的猜测。
奥卡姆剃刀
我们继续上面的例子,当我们要计算 P(D | h) 这个似然概率的时候,我们通常使用编辑距离的方法,来判断这两个单词的一个相似度。
然而 the 和 thaw 离 thew 的编辑距离都是 1 。这可咋办捏?你说,不慌,那还是好办。我们就看到底哪个更可能被错打为 thew 就是了。我们注意到字母 e 和字母 w 在键盘上离得很紧,无名指一抽筋就不小心多打出一个 w 来,the 就变成 thew 了。而另一方面 thaw 被错打成 thew 的可能性就相对小一点,因为 e 和 a 离得较远而且使用的指头相差一个指头(一个是中指一个是小指,不像 e 和 w 使用的指头靠在一块——神经科学的证据表明紧邻的身体设施之间容易串位)。OK,很好,因为你现在已经是在用最大似然方法了,或者直白一点,你就是在计算那个使得 P(D | h) 最大的 h 。
而贝叶斯方法计算的是什么?是 P(h) * P(D | h) 。多出来了一个 P(h) 。我们刚才说了,这个多出来的 P(h) 是特定猜测的先验概率。为什么要掺和进一个先验概率?刚才说的那个最大似然不是挺好么?很雄辩地指出了 the 是更靠谱的猜测。有什么问题呢?既然这样,我们就从给最大似然找茬开始吧——我们假设两者的似然程度是一样或非常相近,这样不就难以区分哪个猜测更靠谱了吗?比如用户输入tlp ,那到底是 top 还是 tip ?(这个例子不怎么好,因为 top 和 tip 的词频可能仍然是接近的,但一时想不到好的英文单词的例子,我们不妨就假设 top 比 tip 常见许多吧,这个假设并不影响问题的本质。)这个时候,当最大似然不能作出决定性的判断时,先验概率就可以插手进来给出指示——“既然你无法决定,那么我告诉你,一般来说 top 出现的程度要高许多,所以更可能他想打的是 top ”)
以上分析当中隐含的哲学是,观测数据总是会有各种各样的误差,比如观测误差(比如你观测的时候一个 MM 经过你一不留神,手一抖就是一个误差出现了),所以如果过分去寻求能够完美解释观测数据的模型,就会落入所谓的数据过配(overfitting)的境地,一个过配的模型试图连误差(噪音)都去解释(而实际上噪音又是不需要解释的),显然就过犹不及了。所以 P(D | h) 大不代表你的 h (猜测)就是更好的 h。还要看 P(h) 是怎样的。所谓奥卡姆剃刀精神就是说:如果两个理论具有相似的解释力度,那么优先选择那个更简单的(往往也正是更平凡的,更少繁复的,更常见的。
回归原始问题
最后我们回到最开始的问题上来。
我看见小明扶着一位老人走下车来,手里握着一根拐杖。
相信大家这时候应该已经比较清楚了吧,显示生活中 似然概率小明恰好拿着拐杖的概率要比一个老人拿着拐杖的概率要低的多,所以这里的歧义我们都会自动的消除掉,这也就是为什么会有说小孩子也能解决贝叶斯问题。
最后,我们先不管算法,也不管各种公式,我们就看看贝叶斯理论体系是在干什么?在我看来,贝叶斯的理论体系其实揭示的是一种非常典型的人类自身的推测逻辑行为。
例如,在黄昏的时候走在自己居住的小区里,光线很昏暗,前面突然闪过一个影子,从路一边的草丛蹿到另一边,速度较快体型较大,其他信息没捕捉到。这时候大概会猜测,这有可能是一只较大的家犬。而如果是在非洲大草原上,从越野车里同样看到昏暗的草原上蹿过一个速度较快体型较大的动物,也许会猜测那是一头狮子,或者一头猎豹。这两种猜测对于捕捉到的对象信息都是非常有限的,而且内容相近,但是得出两种不同的推测。
原因很简单,就是因为当时的环境不同,导致的两种事件的概率不同,带有比较明确的倾向性。也就是说,正常人的逻辑推断不会和上述例子相反,不会在小区里推断出现狮子或者猎豹,也不会推断在非洲大草原上出现家犬。这种推断的思路或者方式本身就是贝叶斯理论体系的核心内容。朴素贝叶斯是一种机器学习的思想,而不是一个简单的直接套用的公式。而且在用朴素贝叶斯方式进行分类机器学习时还经常需要使用其他一些辅助的建模手段。朴素贝叶斯在生产生活中作为机器学习手段的场景确实非常多,是一种使用很广泛的方式,所以也很重要。后面的文章里我还会继续讲解一些贝叶斯的东西。
这篇文章的内容大部分是参考未鹏老师的,这也是唯一一篇,不是自己原创的文章,但是所有文字都是我自己读了不下5遍的,里面也有些我自己加入的内容,如有侵权及时告知我删除。