本节书摘来自异步社区《贝叶斯方法:概率编程与贝叶斯推断》一书中的第1章,第1.1节,作者 【加】Cameron Davidson-Pilon(卡梅隆 戴维森-皮隆),更多章节内容可以访问云栖社区“异步社区”公众号查看
第1章 贝叶斯推断的哲学
贝叶斯方法:概率编程与贝叶斯推断
1.1 引言
尽管你已是一个编程老手,但bug仍有可能在代码中存在。于是,在实现了一段特别难的算法之后,你决定先来一个简单的测试用例。这个用例通过了。接着你用了一个稍微复杂的测试用例。再次通过了。接下来更难的测试用例也通过了。这时,你开始觉得也许这段代码已经没有bug了。
如果你这样想,那么恭喜你:你已经在用贝叶斯的方式思考!简单地说,贝叶斯推断是通过新得到的证据不断地更新你的信念。贝叶斯推断很少会做出绝对的判断,但可以做出非常可信的判断。在上面的例子中,我们永远无法100%肯定我们的代码是无缺陷的,除非我们测试每一种可能出现的情形,这在实践中几乎不可能。但是,我们可以对代码进行大量的测试,如果每一次测试都通过了,我们更有把握觉得这段代码是没问题的。贝叶斯推断的工作方式就在这里:我们会随着新的证据不断更新之前的信念,但很少做出绝对的判断,除非所有其他的可能都被一一排除。
1.1.1 贝叶斯思维
和更传统的统计推断不同,贝叶斯推断会保留不确定性。乍听起来,这像一门糟糕的统计方法,难道不是所有的统计都是期望从随机性里推断出确定性吗?要协调这些不一致,我们首先需要像贝叶斯派一样思考。 在贝叶斯派的世界观中,概率是被解释为我们对一件事情发生的相信程度,换句话说,这表明了我们对此事件发生的信心。事实上,我们一会儿就会发现,这就是概率的自然的解释。 为了更清晰地论述,让我们看看来自频率派关于概率的另一种解释。频率派是更古典的统计学派,他们认为概率是事件在长时间内发生的频率。例如,在频率派的哲学语境里,飞机事故的概率指的是长期来看,飞机事故的频率值。对许多事件来说,这样解释概率是有逻辑的,但对某些没有长期频率的事件来说,这样解释是难以理解的。试想一下:在总统选举时,我们经常提及某某候选人获选的概率,但选举本身只发生一次!频率论为了解决这个问题,提出了“替代现实”的说法,从而用在所有这些替代的“现实”中发生的频率定义了这个概率。
贝叶斯派,在另一方面,有更直观的方式。它把概率解释成是对事件发生的信心。简单地说,概率是观点的概述。某人把概率0赋给某个事件的发生,表明他完全确定此事不会发生;相反,如果赋的概率值是1,则表明他十分肯定此事一定会发生。0和1之间的概率值可以表明此事可能发生的权重。这个概率定义可以和飞机事故概率一致。如果除去所有外部信息,一个人对飞机事故发生的信心应该等同于他了解到的飞机事故的频率。同样,贝叶斯概率的定义也能适用于总统选举,并且使得概率(信心)更加有意义:你对候选人A获胜的信心有多少?
请注意,在之前,我们提到每个人都可以给事件赋概率值,而不是存在某个唯一的概率值。这很有趣,因为这个定义为个人之间的差异留有余地。这正和现实天然契合:不同的人即便对同一事件发生的信心也可以有不同的值,因为他们拥有不同的信息。这些不同并不说明其他人是错误的。考虑下面的例子。
1.在抛硬币中我们同时猜测结果。假设硬币没有被做手脚,我和你应该都相信正反面的概率都是0.5。但假设我偷看了这个结果,不管是正面还是反面,我都赋予这个结果1的概率值。现在,你认为正面的概率是多少?很显然,我额外的信息(偷看)并不能改变硬币的结果,但使得我们对结果赋予的概率值不同了。
2.你的代码中也许有一个bug,但我们都无法确定它的存在,尽管对于它是否存在我们有不同的信心。
3.一个病人表现出x、y、z三种症状,有很多疾病都会表现出这三种症状,但病人只患了一种病。不同的医生对于到底是何种疾病导致了这些症状可能会有稍微不同的看法。
对我们而言,将对一个事件发生的信心等同于概率是十分自然的,这正是我们长期以来同世界打交道的方式。我们只能了解到部分的真相,但可以通过不断收集证据来完善我们对事物的观念。与此相对的是,你需要通过训练才能够以频率派的方式思考事物。
为了和传统的概率术语对齐,我们把对一个事件A发生的信念记为P(A),这个值我们称为先验概率。
伟大的经济学家和思想者John Maynard Keynes曾经说过(也有可能是杜撰的):“当事实改变,我的观念也跟着改变,你呢?”这句名言反映了贝叶斯派思考事物的方式,即随着证据而更新信念。甚至是,即便证据和初始的信念相反,也不能忽视了证据。我们用P(A|X)表示更新后的信念,其含义为在得到证据X后,A事件的概率。为了和先验概率相对,我们称更新后的信念为后验概率。考虑在观察到证据X后,以下例子的后验概率。
1.P(A):硬币有50%的几率是正面。P(A|X):你观察到硬币落地后是正面,把这个观察到的信息记为X,那么现在你会赋100%的概率给正面,0%的概率给负面。
2.P(A):一段很长很复杂的代码可能含有bug。P(A|X):代码通过了所有的X个测试;现在代码可能仍然有bug,不过这个概率现在变得非常小了。
3.P(A):病人可能有多种疾病。P(A|X):做了血液测试之后,得到了证据X,排除了之前可能的一些疾病。
在上述例子中,即便获得了新的证据,我们也并没有完全地放弃初始的信念,但我们重新调整了信念使之更符合目前的证据(也就是说,证据让我们对某些结果更有信心)。
通过引入先验的不确定性,我们事实上允许了我们的初始信念可能是错误的。在观察数据、证据或其他信息之后,我们不断更新我们的信念使得它错得不那么离谱。这和硬币预测正相反,我们通常希望预测得更准确。
1.1.2 贝叶斯推断在实践中的运用
如果频率推断和贝叶斯推断是一种编程函数,输入是各种统计问题,那么这两个函数返回的结果可能是不同的。频率推断返回一个估计值(通常是统计量,平均值是一个典型的例子),而贝叶斯推断则会返回概率值。
例如,在代码测试的例子中,如果你问频率函数:“我的代码通过了所有测试,它现在没有bug了吗?”频率函数会给出“yes”的回答。但如果你问贝叶斯函数:“通常我的代码有bug,现在我的代码通过了所有测试,它是不是没有bug了?”贝叶斯函数会给出非常不同的回答,它会给出“yes”和“no”的概率,例如“‘yes’的概率是80%,‘no’的概率是20%。”
这和频率函数返回的结果是非常不同的。注意到贝叶斯函数还有一个额外的信息——“通常的我的代码有bug”,这个参数就是先验信念。把这个参数加进去,贝叶斯函数会将我们的先验概率纳入考虑范围。通常这个参数是可省的,但我们将会发现缺省它会产生什么样的结果。
加入证据 当我们添加更多的证据,初始的信念会不断地被“洗刷”。这是符合期望的,例如如果你的先验是非常荒谬的信念类似“太阳今天会爆炸”,那么你每一天都会被打脸,这时候你希望某种统计推断的方法会纠正初始的信念,或者至少让初始的信念变得不那么荒谬。贝叶斯推断就是你想要的。
让N表示我们拥有的证据的数量。如果N趋于无穷大,那么贝叶斯的结果通常和频率派的结果一致。因此,对于足够大的N,统计推断多多少少都还是比较客观的。另一方面,对于较小的N,统计推断相对而言不稳定,而频率派的结果有更大的方差和置信区间。贝叶斯在这方面要胜出了。通过引入先验概率和返回概率结果(而不是某个固定值),我们保留了不确定性,这种不确定性正是小数据集的不稳定性的反映。
有一种观点认为,对于大的N来说,两种统计技术是无差别的,因为结果类似,并且频率派的计算要更为简单,因而倾向于频率派的方法。在采纳这种观点之前,也许应该先参考Andrew Gelman的论述:
“样本从来都不是足够大的。如果N太小不足以进行足够精确的估计,你需要获得更多的数据。但当N“足够大”,你可以开始通过划分数据研究更多的问题(例如在民意调查中,当你已经对全国的民意有了较好的估计,你可以开始分性别、地域、年龄进行更多的统计)。N从来无法做到足够大,因为当它一旦大了,你总是可以开始研究下一个问题从而需要更多的数据。”(参见http://andrewgelman.com/2005/07/31/n_is_never_largl.)
1.1.3 频率派的模型是错误的吗?
不。频率方法仍然非常有用,在很多领域可能都是最好的办法。例如最小方差线性回归、LASSO回归、EM算法,这些都是非常有效和快速的方法。贝叶斯方法能够在这些方法失效的场景发挥作用,或者是作为更有弹性的模型而补充。
1.1.4 关于大数据
出乎意料的是,通常解决大数据预测型问题的方法都是些相对简单的算法。因此,我们会认为大数据预测的难点不在于算法,而在于大规模数据的存储和计算。(让我们再次回顾Gelman的关于样本大小的名言,并且提问:“我真的有大数据吗?”)
中等规模或者更小规模的数据会使得分析变得更为困难。用类似Gelman的话说,如果大数据问题能够被大数据方法简单直接地解决,那么我们应该更关注不那么大的数据集上的问题。