条件独立与朴素贝叶斯
Conditional Independence And Naive Bayes
❦
此前我谈到过 X 与 Y 之间的互信息,记作 I(X;Y),它等于联合概率分布的熵 H(X,Y) 与边缘分布的熵 H(X) + H(Y) 之差。
我举过一个例子:变量 X 有 8 个状态,从 X1 到 X8;在尚未遇到任何证据之前,它们的概率相等。变量 Y 则有 Y1 到 Y4 共 4 个状态,同样在尚未遇到任何证据之前概率相等。于是我们计算边缘熵 H(X) 与 H(Y),会发现 X 的熵为 3 比特,Y 的熵为 2 比特。
然而,我们还知道 X 与 Y 要么同为偶数,要么同为奇数;关于它们之间的关系,我们只知道这一点。因此在联合分布 (X,Y) 中只有 16 种可能状态,且都等概率,所以联合熵为 4 比特。与 X 与 Y 独立时的 5 比特相比,这里少了 1 比特的熵——这 1 比特的熵缺口就是互信息:也就是 X 告诉我们关于 Y 的信息(或反之亦然),使得在已知其中一个之后,我们对另一个就不再那么不确定。
不过,假设还存在第三个变量 Z。变量 Z 有两个状态:「偶数」和「奇数」,与 (X,Y) 的奇偶性完全相关。事实上,我们就假设 Z 只是这个问题:「X 与 Y 是偶数还是奇数?」
如果我们对 X 与 Y 还没有任何证据,那么在已知信息下,Z 自身必然有 1 比特的熵。Z 与 X 之间有 1 比特的互信息,Z 与 Y 之间也有 1 比特的互信息。而且,如前所述,X 与 Y 之间也有 1 比特的互信息。那么,整个系统 (X,Y,Z) 的熵有多少?你也许会天真地以为:
H(X,Y,Z) = H(X) + H(Y) + H(Z) − I(X;Z) − I(Z;Y) − I(X;Y) ,
但事实并非如此。
联合系统 (X,Y,Z) 只有 16 种可能状态——因为 Z 只是这个问题「X 与 Y 是偶数还是奇数?」——所以 H(X,Y,Z) = 4 比特。但如果你按刚才给出的公式去算,就会得到:
(3 + 2 + 1 − 1 − 1 − 1) 比特 = 3 比特 = 错了!
为什么?因为如果你已经有了 X 与 Z 之间的互信息,以及 Z 与 Y 之间的互信息,它们可能已经包含了我们将要计算的 X 与 Y 之间互信息的一部分。在这个例子里,知道 X 为偶数会告诉我们 Z 为偶数;知道 Z 为偶数又会告诉我们 Y 为偶数;但这和 X 会告诉我们关于 Y 的信息是同一回事。我们对知识进行了重复计数,于是算出了过小的熵。
正确的公式(我相信)是:
H(X,Y,Z) = H(X) + H(Y) + H(Z) − I(X;Z) − I(Z;Y) − I(X;Y|Z).
这里最后一项 I(X;Y|Z) 的意思是:「在我们已知 Z 的前提下,X 还能告诉我们的关于 Y 的信息。」在这个例子里,一旦我们已经知道 Z,X 就不会再告诉我们任何关于 Y 的信息,因此这一项为 0——而方程就给出了正确答案。怎么样,妙吧?
「不,」你正确地回答道,「因为你并没有告诉我如何计算 I(X;Y|Z),只是给了我一个口头论证,说它理应为 0。」
我们计算 I(X;Y|Z) 的方法正如你所料。我们知道 I(X;Y) = H(X) + H(Y) − H(X,Y),因此:
I(X;Y|Z) = H(X|Z) + H(Y|Z) − H(X,Y|Z).
现在,我想,你会想知道如何计算条件熵?嗯,熵的原始公式是:
H(S) = Σi −P(Si) × log 2(P(Si)).
如果我们随后学到一个新事实 Z,那么我们对 S 的剩余不确定性将是:
H(S|Z) = Σi −P(Si|Z)log2(P(Si|Z)).
因此,如果我们将要学到一个新事实 Z,但还不知道会是哪一个 Z,那么平均而言,我们预计在那之后对 S 会有如下程度的不确定性:
H(S|Z) = Σj P(Zj)Σi −P(Si|Zj)log2(P(Si|Zj))
.
这就是计算条件熵的方法;进而,我们就可以得到条件互信息。
这里还有各种各样的辅助定理,比如:
H(X|Y) = H(X,Y) − H(Y)
以及
如果 I(X;Z) = 0 且 I(Y;X|Z) = 0,那么 I(X;Y) = 0,
但我不打算深入这些内容。
「但是,」你问道,「这跟词语的本性以及它们隐藏的贝叶斯结构有什么关系?」
对你能提出这个问题我高兴得难以言表,因为我本来就打算不管你喜不喜欢都要讲给你听。不过在此之前,还有几条预备知识。
你会记得——是的,你一定会记得——互信息与贝叶斯证据(Bayesian evidence)之间存在一种对偶关系。互信息为正,当且仅当至少有一些联合事件 P(x,y) 的概率不等于两个事件各自概率的乘积 P(x)P(y)。而这又恰好等价于 x 与 y 之间存在贝叶斯证据这一条件:
| I(X;Y) | > | 0 ⇒ |
||
| P(x,y) | ≠ | P(x)P(y) |
| P(x,y) | ≠ | P(x) |
| P(y) |
| P(x|y) | ≠ | P(x) |
如果你是对 Z 取条件,那么只需相应地调整整个推导:
| | I(X;Y|Z) | > | 0 ⇒ |
||
| | P(x,y|z) | ≠ | P(x|z)P(y|z) |
| | P(x,y|z) | ≠ | P(x|z) |
| P(y|z) |
| (P(x,y,z)/P(z)) | ≠ | P(x|z) |
| (P(y,z)/P(z)) |
| | P(x,y,z) | ≠ | P(x|z) |
| P(y,z) |
| | P(x|y,z) | ≠ | P(x|z). |
最后一行读作:「即便已知 Z,学到 Y 仍会改变我们对 X 的信念。」
反过来,就像我们最初那个 Z 为「偶数」或「奇数」的例子一样,Z 会把 X 与 Y 屏蔽开——也就是说,如果我们知道 Z 是「偶数」,那么再得知 Y 处于状态 Y4,并不会再告诉我们任何更多关于 X 究竟是 X2、X4、X6 还是 X8 的信息;或者,如果我们知道 Z 是「奇数」,那么再得知 X 是 X5,也不会再告诉我们任何更多关于 Y 是 Y1 还是 Y3 的信息。一旦得知 Z , X 与 Y 便条件独立(conditionally independent)了。
条件独立是概率论中极其重要的概念——就举一个例子:如果没有条件独立,宇宙将毫无结构可言。
不过在这里,我只打算谈一种特定的条件独立:当某个中心变量把围绕它的其他变量彼此屏蔽开来——就像一个中央躯体伸出触手那样。
假设有五个变量 U、V、W、X 和 Y,并且这些变量的任意一对之间,都存在相互印证的关系。比如你选取 U 与 W,那么已知 U = U1,会告诉你一些关于 W = W1 概率的新信息。
这岂不是一团理不清的推断乱麻?证据满天飞?未必。
也许 U 表示「会说某种语言」,V 表示「两条手臂与十根手指」,W 表示「穿衣服」,X 表示「会被铁杉毒死」,Y 表示「红色的血」。现在,如果你遇到一个「现实中的某个东西」——它可能是苹果,也可能是石头——而你得知这个东西会说中文,你就很可能大幅提高对它穿着衣服的概率估计;而如果你得知这个东西不会被铁杉毒死,你就会略微降低对它拥有红色血液的概率估计。
当然,这些规则里有的强、有的弱。比如 Fred 因为一次火山事故少了一根手指;Baby Barney 还不会说话;还有 Irving 这个 IRCBot,它能输出句子,却没有血。所以如果我们得知某个东西「没穿衣服」,这并不能屏蔽掉「会说话」对「血的颜色」所能告诉我们的一切:如果某个东西不穿衣服却会说话,那也许它就是 Nude Nellie。
这就使得这个例子比「五个整数变量要么全为奇数、要么全为偶数,但除此之外互不相关」那种情况更有意思。在那种情况下,只需知道任意一个变量,就足以屏蔽掉第二个变量对第三个变量所能告诉我们的一切。
但在这里,依赖关系并不会因为我们仅仅知道一个变量就立刻消失,Nude Nellie 的例子就说明了这一点。那么,这会变成一种无法处理的推断麻烦吗?
别怕!因为也许存在某个第六个变量 Z:如果我们知道它,它就真的会把任意一对变量彼此屏蔽开来。可能存在这样一个变量 Z——即便我们不得不去构造 Z 而不是直接观察它——使得:
| P(U|V,W,X,Y,Z) | = | P(U|Z) |
||
| P(V|U,W,X,Y,Z) | = | P(V|Z) |
| P(W|U,V,X,Y,Z) | = | P(W|Z) |
| | ⋮ | |
也许,在已知某个东西是「人类」这一前提下,它会说话、会穿衣服、拥有标准数量手指,这几件事的概率就彼此独立。Fred 可能少了一根手指——但他并不比别人更可能是个裸体主义者;Nude Nellie 从不穿衣服,但知道这一点并不会降低她会说话的概率;而 Baby Barney 虽然还不会说话,但也并没有缺胳膊少腿。
这就叫作「朴素贝叶斯(Naive Bayes)」方法,因为它通常并不完全为真,但假装它为真就能把你的计算简单得出奇。我们不会单独追踪「在给定手指数量时,穿衣与否对说话能力的影响」。我们只用所有已经观察到的信息,去追踪这个小东西是人类(或者是别的什么,比如黑猩猩或机器人)的概率;然后用我们对这个中心类别的信念,去预测我们尚未观察到的任何东西,比如它会不会被铁杉毒死。
对 U、V、W、X 和 Y 的任何观测,都只是作为中心类别变量 Z 的证据;随后我们用 Z 的后验分布,去对 U、V、W、X 与 Y 中那些尚未观测到的变量取值做出一切必要的预测。
听起来耳熟吗?应该的:
Network 2
事实上,如果你使用合适类型的神经网络单元,这个「神经网络」最终会与朴素贝叶斯在数学上完全、严格等价。中心单元只需要一个 logistic 阈值——一种 S 曲线响应——而输入的权重只需要匹配似然比对数(logarithms of the likelihood ratios)等诸如此类的量。实际上,这大概也是 logistic 响应在神经网络中常常如此好用的原因之一——它让算法在设计者不注意的时候,悄悄塞进了一点贝叶斯推理。
仅仅因为有人给你呈现了一个他们称之为「神经网络」的算法,上面贴满了「scruffy」「emergent」之类的流行词,并且还自豪地声明他们完全不知道学出来的网络是怎么工作的——你也别因此就以为他们的小 AI 算法真的「超越逻辑的疆界」。对于这种临时拼凑的范式来说,如果它能奏效,就会被发现具有某种贝叶斯结构;它甚至可能与某类所谓「贝叶斯」算法完全等价。
即便表面上看起来不像贝叶斯也无妨。
然后你就知道那些贝叶斯主义者会开始解释:这个算法究竟如何工作,它反映了哪些底层假设,它利用了哪些环境规律,它在何处有效、又在何处失灵;他们甚至会给已训练的网络权重赋予可理解的含义。
真令人失望,不是吗?