这一节是讲解关于机器学习中的概率的。
概率是基于统计的机器学习中最重要的基础知识。由于从零开始讲解概率是有点不现实的,同时考虑大家在高中时学习的概率知识还有些记忆的前提下,下面从「高中的概率」和「机器学习中的概率」的不同点出发,以这种形式进行讲解。
机器学习和概率
首先,先明确一下对于机器学习,概率到底发挥着什么样的作用。
实际上,在机器学习中,概率并不是必须的。甚至像神经网络,支持向量机等有名的方法都是「非概率型机器学习」,除此之外还有很多方法。但是,「非概率型机器学习」的方法中大部分都有「结果排序困难(由于评价值无法进行大小比较)」「条件不同导致无法比较」等缺点。
与此相对,「概率型机器学习」中可以通过概率计算评价结果和推定的参数有「多大的信用度」(最可能的)。因为概率之间是可以比较的,所以为计算结果排序,比较前提条件不同的结果(经常用在探索更优模型上)都是很自然能做到的。
而且,可以列举出的「概率可以与其他手法结合使用」「具有通过模型生成数据的特征」等,都是使用概率的优点。
为了达到这些优点,本来没有使用概率的方法,被扩展到概率上也是很多的。总之为了达到更好效果的方法,是离不开概率的。
概率函数和概率分布
首先说明一下概率中使用的符号和专业词汇。
使用P(X)来表示概率。这里面,X是「随机变量」,p(X)是「变量X的概率分布」或者简单的说是「变量X的概率」。当变量X取值a时,对应的概率表示为p(X=a)或者简写为p(a)。
这种标记方法,需要注意「概率分布的种类通过随机变量表示」。其他的随机变量Y的随机分布也使用P来表示,写作p(Y)。这种标记方式与函数中表示两个不同函数f(x)和g(x)不同。
p(X)作为概率分布,有两个重要的条件。
〇概率值:大于等于0,小于等于1
〇所有可取值的概率和为1
严密来讲,通过事件和集合来说明是更好的,在这里省略。
这里通过常见的骰子的例子来证明。X表示投掷骰子所得点数的「随机变量」,p(X)是该变量的「概率分布」。所以,X的取值是1~6的六种结果。假设所有点数出现的概率都是一样的,从「概率和为1」的条件推理可得,p(X=1)=...=p(6)=1/6。
然而,虽然很明确的说「假设所有点数以相同概率出现」了,真的是这样吗?最初学习概率时,你想过「虽然说点数1出现的概率出现的概率是1/6,但是掷6次筛子也不一定正好出现一次点数1啊」吗?
对于这个问题,经常解释为「无数次投掷后,平均每6次出现1次」,虽然当时认同了,但是心里面有没有反驳「不行,骰子是不可能被无限次投掷的」呢?
实际上,基于统计的机器学习的最终目标是:以工程学思维(现实地)解决「也可以说进行的有限次数的试验中,每个点数以相同概率出现」的问题。
我想高中时为这样的问题苦恼过的人会非常期待学习机器学习。
联合概率和条件概率
至此,都是只有一个随机变量的情况,还有多个随机变量的情况。特别是在机器学习中,即使是很简单的例题也包含多个随机变量,学会处理多个随机变量是必须的。
首先,和刚才一样,先学习专业术语。以随机变量个数为2的情况来讲解,3个以上也是一样的。
对应两个随机变量X,Y的概率分布写作:P(X,Y),称作:X和Y的「同时分布」或者「联合概率」。
随机变量Y被赋予某值时的X的概率写作:P(X|Y)。称作:Y为某值时,X的条件概率。
也有不考虑随机变量Y,只考虑随机变量X的情况。把该情况称作「边缘概率」,单纯的写作P(X)。
参照具体例子,讲解这3个概率分布。这里使用机器学习(自然语言处理)中实际使用的bag-of-words模型的迷你版。
bag-of-words模型中,不考虑单词的排列顺序,只考虑本章中是否包含单词,并把结果数值化:包含=1,不包含=0。也有使用计算单词使用频度的方式,这次只考虑「包含?还是不包含?」。
很明显这个模型的适用范围被大大限制了。但是,「想实现的东西能够解决问题的话,就没有必要再考虑必要以上的模型了」是机器学习的铁的法则。这些东西,请参照前章的内容。
下面,计算模型的构建将从随机变量的设定开始。
X是「文章中含有单词“program”」的随机变量,Y是「文章中含有单词“application”」随机变量。二者,都是在包含时取值为1,不包含时取值为0。
因为真实的数字具有说服力,所以调查了gihyo上开发者平台上1560篇文章中每个每个单词出现的概率。
p(X=1, Y=1) = 0.082
p(X=1, Y=0) = 0.271
p(X=0, Y=1) = 0.172
p(X=0, Y=0) = 0.475
上面分别表示「同时包含两个单词的概率」「仅包含“program”的概率」「仅包含“application”的概率」「不包含两个单词的任一个」。
虽然处理的范围很小,却是个优秀的“模型”。
这里试着考虑一下,把随机变量Y放一边,只考虑X的概率的情况。
P(X=1),总之在求「文章中含有单词“program”」的概率时,考虑是否含有“application”的两种情况便行了,通过下面的式子求:
p(X=1) = p(X=1, Y=1) + p(X=1, Y=0) = 0.082 + 0.271 = 0.353
同样,P(X=0),总之在求「文章中含有单词“program”」的概率时,考虑是否含有“application”的两者情况便行了,通过下面的式子求:
p(X=0) = p(X=0, Y=1) + p(X=0, Y=0) = 0.172 + 0.475 = 0.647
因为满足:p(X=0) +p(X=1)=1,所以可以使用下式求解:
p(X=0) = 1 - p(X=1) = 1 - 0.353 = 0.647
这样求出的是随机变量X的边缘概率:p(X=1) 和 p(X=0)。同样,随机变量Y也可以求出。作为习题,请大家尝试一下。
下面,已知X=1的情况下,试求Y的概率。也就是,「含有“program”的文章中,含有“application”」的概率。从联合概率,求出满足X=1的概率。
p(X=1, Y=1) = 0.082
p(X=1, Y=0) = 0.271
上面是「包含“program”,且包含“application”的概率」,下面为「包含“program”,不含“application”的概率」。这样看起来还不错,但是二者之和为0.353,不满足「所有取值的概率之和为1」的必要条件。
这个0.353的值,和之前求出的边缘概率p(X=1)=0.353一致。因为事先已经知道X=1了,p(X=1)=0.353中两个概率的比例作为新的概率,也就是两者都除以0.353,相加后得到1。这就是条件概率P(Y|X)。
p(Y=1|X=1) = p(X=1, Y=1) / p(X=1) = 0.082 / 0.353 = 0.232
p(Y=0|X=1) = p(X=1, Y=0) / p(X=1) = 0.271 / 0.353 = 0.768
同样,先得出X=0的情况的条件概率。
p(Y=1|X=0) = p(X=0, Y=1) / p(X=0) = 0.172 / 0.647 = 0.266
p(Y=0|X=0) = p(X=0, Y=0) / p(X=0) = 0.475 / 0.647 = 0.734
使用条件概率就能以概率的形式表现「和使用“program”的文章相比,没有使用“program”的文章中使用“application”的可能性更高」的信息。
p(X|Y)也同样可以求得。这里作为演习,请一定要尝试一下。
概率的加法定理・乘法定理
以公式的形式表现二者的计算方法。
概率的加法定理:
对于两个随机变量X,Y,联合概率p(X,Y)和边缘概率p(X)满足下面的等式:
左边的Σ,表示随机变量Y的可取值之和。
概率的乘法定理:
关于2个随机变量X,Y,联合概率p(X,Y),条件概率p(Y|X),边缘概率p(X),满足下面的等式。
p(X, Y) = p(Y|X) p(X)
乘法定理,不仅仅可以通过条件概率和边缘概率求解联合概率,请注意:通过三个概率中的任意2个,求出剩下的1个。实际的p(Y|X)计算时,就是通过边缘概率和联合概率求出条件概率。
加法定理经常被说为:「概率分布的边缘化」或「p(X,Y)中Y的偏微分」。
另外,虽然条件概率和联合概率看起来挺相似,但是,与从联合概率能计算出条件概率不同,仅仅通过条件概率不能求出联合概率。总之,也就是,条件概率比联合概率包含的信息量少。
这些东西对于直观的理解机器学习的很多演算是很有效的,记住的话会很有帮助。
实际上,基于统计的机器学习就是,反复使用这两个定理最终引导出想求得概率的基本步骤。如果能把,概率的加法定理和乘法定理像99乘法口诀一样熟练使用的话,是和掌握机器学习等价的。不好意思,言过其实了。
事后概率和贝叶斯公式
和联合概率p(X,Y)相对的条件概率,可以从「给定Y值时,p(X|Y)」,「给定X值时,p(Y|X)」两方面考虑。X和Y同时出现的概率(例如:同时掷2个骰子,每个骰子的点数),这两个都很简单可以作为条件概率来考虑。
另一方面,X是应该先发生的,或者X作为模型的参数,Y为观测值,等「决定X值后,之后最初的Y值可以确定。」的模型中,给Y赋值时,X的值必须已经实现确定了,p(X|Y)的概率是未知的。
概率的定义是「表示事情有多大可能发生的值」。但是却不存在这样的值。暂且把前后的事情放一边,这样的条件概率p(X|Y)被称为「事后概率」或「事后分布」,下面接着讲解。
事后概率p(X|Y),形式上是条件概率的一种。因此,对Y和X使用乘法概率,下面的等式成立:
p(X, Y) = p(X|Y) p(Y) = p(Y|X) p(X)
第2个式子和第3个式子除以p(Y)后,推导出下面的等式,也就是「贝叶斯公式」。
这是在机器学习中最常用的公式,只有2个随机变量的容易理解的问题还行,在更复杂的模型使用时容易出错。
如上面的推导一样,每次考虑联合概率时都要展开为两个等式,是不容易出错的,也不会成为黑盒子,不用考虑「贝叶斯公式倒是以怎样的顺序推导出的?」就能解决问题,非常建议这样使用。
但是,这么恶心的认同「事后概率」真的没关系吗?不担心吗?
ここで少し歴史の話でもしてみましょう。「事後確率」について最初に言及したのは18世紀の数学者,トーマス・ベイズです。
高校数学での確率のような「どのくらい起こりうるか」という考え方では都合が悪いことに気づいたベイズは,確率を「どれくらい信用できるか(もっともらしいか)」を表す量(信念の度合い)として広く再定義します。すると,さきほどの p(Y|X) も「与えられた Y は,どの X から導かれたと信じられるか」を表す値となり,事後確率が意味のある存在になったのです。
数学者としてベイズを紹介しましたが,ベイズの本職は実は牧師でした。いわゆる「市井の数学者」,アマチュアだったのです。一方のラプラスは,当事すでに数学者として大きな実績を持っていました。彼の名前で発表したら,もっと大きな問題になると考えたのでしょう(なにしろ,今でも一部では論争が続いているそうですから……)。
その論争に参加するのも別の意味で楽しそうですが,ここではやはり「どれくらい信用できるか(もっともらしいか)」を新しい確率の定義と認めることにしましょう。新しい定義によって様々な不確かさを足したり掛けたり比較したりできる「確率」で表せるようになり,機械学習の力は大きく広がるのですから。
機械学習に限らず,様々な統計的手法の発展に大きく貢献したその新しい確率は,ベイズの名を冠して「ベイズ的確率」と呼ばれています。現在では,様々な分野でベイズの名前がついた技術が用いられています。アマチュア数学者だったベイズ自身は,何百年も後に,自分の名前がこれほど多くの分野の多くの人の口にのぼるとは,まさか夢にも思わなかったでしょうね。
模型的参数个数
下面讲解概率学中另一个重要的概念「独立性」,还要回到之前的「文章中含有单词」。
X代表「文章中包含单词“program”吗?」的随机变量,Y代表「文章中包含“application”吗?」的随机变量。各自概率如下:
p(X=1, Y=1) = 0.082
p(X=1, Y=0) = 0.271
p(X=0, Y=1) = 0.172
p(X=0, Y=0) = 0.475
这些联合概率有4个值,这些值都是已知的,可以完整的表述这个模型了。另外,因为所有概率和为1,其实已知3个概率值时,剩下的一个自动就求出来了,所以也可以说这个模型的参数个数为3。
下面,在模型中增加1个处理的单词(例:"internet"),变成了3个个变量的情况,那么为了表述这个模型需要几个参数呢?
第三个随机变量定为Z。X,Y,Z都有0和1两种取值,为了表述所有的联合概率,共需要2^3=8个。存在「总和=1」的条件,可以去掉一个,参数个数变为7。
即使单词增加到100种,同理可得,参数个数为2^100-1≒10^30。
参数暴增,编程实现时需要多大的内存空间呢?
按照1个值占用4byte计算,4,000,000,000,000,000,000T的内存的话可以满足。但是这是不可能的。
一般情况下,人类语言含有2万~10万的词汇,怎么看都不可能处理的单词数。怎样才能实现这个模型呢?
随机变量的独立性和「更好的模型」
这里虽然有点突然,「随机变量的独立性」定义如下:
对于随机变量 X和Y,p(Y|X) = p(Y) 成立时,可以说X和Y是独立的。 同时,X和Y 颠倒顺序后,由乘法定理导出,p(X|Y) = p(X) 也成立。
p(Y|X) = p(Y) 实际上就等同于,Y 的概率和X的取值无关。X=1 也好,X=0 也好,或者X 的值未知。Y 的概率不发生变化。无关的东西也可以说为「独立」。
之前只有2个单词种类的模型中:
p(Y=1|X=1) = 0.232
p(Y=1|X=0) = 0.266
p(Y=1) = 0.254
所以,X和Y不相互独立。
如果用语言描述独立性的条件的话,就成了「即使文章中不含单词“program”,包含单词“application”的概率发生变化吗?」。
相关性高的单词在同一篇文章中使用的概率高。反之则低。感觉这个模型不是独立的,这是很自然的事。
明知道随机变量 X 和 Y 是不独立的,还去假定「X 和 Y 是独立的」。虽然明显是矛盾的,还请稍稍忍耐一下。
在上面的假设下,下式成立,已知p(X) 和 p(Y) 的话,可以求出联合概率。
p(X, Y) = p(X|Y)p(Y) = p(X)p(Y)
具体说明:由p(X=1) = 0.353, p(Y=1) = 0.254 两个值,可以求出:p(X=0) = 1 - 0.353 = 0.647, p(Y=0) = 1 - 0.254 = 0.746 ,所以所有的联合概率都可以求出。
p(X=1, Y=1) = p(X=1) * p(Y=1) = 0.090
p(X=1, Y=0) = p(X=1) * p(Y=0) = 0.263
p(X=0, Y=1) = p(X=0) * p(Y=1) = 0.164
p(X=0, Y=0) = p(X=0) * p(Y=0) = 0.483
表述模型必须的参数有p(X=1) 和 p(Y=1) 2个,少了1个。
有三种单词的模型也一样,3个随机变量, 假定X ,Y , Z 中任意两个是独立的(这里只是说「 X と Y と Z 是独立的」),就可以求出p(X=1) , p(Y=1) , p(Z=1) 三个变量的联合概率。
即使单词种类增加至100个,同理参数个数只需要100个就足够了。本来需要2^100 - 1 ≒ 1030个参数是骗人的。 这样的话,单词种类增至100万时,计算机也是可以处理的。
但是,看似解决了参数个数过多的问题,但是这样求出的联合概率和「真正的联合概率值」是不一样的。这由于是把原本不相互独立的事件假定为独立造成的。
虽然本文中的例子中误差很小,但是随着单词种类的增加,会产生更大的偏差。那么是不是可以断定,这样不正确的方法没有意义呢?
但是,无论多么正确的方法,如果没有办法计算的话是更没有意义的。机器学习中,機械学習では,「可计算性」是最首要的。平衡计算成本和结果的可信度是很重要的。计算简单,且结果足够满意的就是「好模型」。
所以,即使是降低准确度的假设,也要采用。
具有独立性的模型(无论是真的,还是假设的)要比非独立性模型容易计算的多。另外,处理独立性处理,还有很多技术(近似法)可以削减计算量。要对得出的结果进行评价。有机会的话,会对近似法和评价方法进行讲解。
基于朴素贝叶斯的文本分类
最后,至此讲解的事后概率都是在独立性的假定下进行的,下面讲解文章分类模型。
X 为「文章类别」,Y1, Y2, …… 为「文章中是否含有单词」的随机变量。Y 的下标对应的单词都是事先确定的。
gihyo.jp上有「デベロッパステージ」「アドニミストレータステージ」「WEB+デザインステージ」的博客区,把这些作为文章类别。
为了简化,限定为只有「デベロッパステージ」と「アドニミストレータステージ」两个分类,每个博客区文章数所占的比例作为X的概率。实际值如下:
p(X=dev) = 0.652
p(X=admin) = 0.348
注意,随机变量 X=dev 指「デベロッパステージ」,X=admin 指「アドミニストレータステージ」。
使用条件概率描述的话,「虽然dev中单词“program”经常使用,admin中不怎么用」的情报可以数值化表示。
そこで,文章に“プログラム”が含まれる確率(=Y1)を各ステージごとに調べてみました。
p(Y1=1|X=dev) = 0.271
p(Y1=1|X=admin) = 0.136
条件付き確率 p(Y1=1|X=dev) は「デベロッパステージの文章で,“プログラム”が含まれる確率」です。X=admin の方も同様です。
確かに p(Y1=1|X=dev) > p(Y1=1|X=admin) となっていますね。
同じように,確率変数 Y2 を「文章に“アプリケーション”が含まれる」として,その確率を求めておきましょう。
p(Y2=1|X=dev) = 0.172
p(Y2=1|X=admin) = 0.523
それでは「“アプリケーション”は含まれているが“プログラム”は含まれていない文書」があったときに,それがどのカテゴリの文書かを判断したいとします。
この条件に対応する確率変数は Y1=0, Y2=1 ですが,カテゴリを表す X の値はまだわかっていません。ここで,p(X=dev|Y1=0, Y2=1) と p(X=admin|Y1=0, Y2=1) を求めれば,その確率の大きい方が「信用できる X の値」をさしている,と判断することができます。
文章を書くときに,中身を書いてからカテゴリを考える,なんてことは普通ありませんよね。つまり,p(X|Y1, Y2) はまさに事後確率であり,これを計算することは,実際にそこにあるもの(観測値)から隠れた情報(例えば「この文章はデベロッパーステージに載せるつもりで書いたよ!」)を推測する手段であるわけです。
この一連の流れが,統計的機械学習の代表的な考え方の一つになっています。