2.2 掷骰子游戏 55
2.2 掷骰子游戏
在阐述统计建模方法前,先看一个有趣的实例(图2.4掷骰子,一个生活中比
较常见的游戏,掷一个骰子,玩家猜一个数字,猜中就算赢。按照常识来说,随便选
一个数字,获胜的概率是一样的,即所有选择的获胜概率都是 1/6因此这个游戏玩
家很难获胜,除非运气很好。假设进行一次游戏,玩家随意选了一个数字,比如是 1
当投掷 30 次骰子(如图2.4,发现运气不错,命中 7 次,好于预期7/30 > 1/6
2
3
1 4 4 1
5
1 4 4
5
6
4 4
3
2 1 4
5
1
4 2 2
3
4 1
5
1
3
4
2.4 骰子结果
此时玩家的胜利似乎只能来源于运气。不过,这里的假设“随便选一个数字,
胜的概率是一样的”本身就是一个概率模型,它对骰子六个面的出现做了均匀分布
假设:
P (1) = P (2) = ... = P (5) = P (6) = 1/6 (2.16)
但是在这个游戏中没有人规定骰子是均匀的。如果骰子的六个面不均匀呢?这
里可以用一种更加“聪明”的方式定义一种新的模型,即定义骰子的每一个面都以
一定的概率出现,而不是相同的概率。描述如下:
P (1) = θ
1
P (2) = θ
2
P (3) = θ
3
P (4) = θ
4
P (5) = θ
5
P (6) = 1
X
1i5
θ
i
C 归一性 (2.17)
这里,θ
1
θ
5
可以被看作是模型的参数,因此这个模型的自由度 5。对于这样的
模型,参数确定了,模型也就确定了。但是一个新的问题出现了,在定义骰子每个面
的概率后,如何求出具体的概率值呢?一种常用的方法是,从大量实例中学习模型
参数,这个方法也是常说的参数估计Parameter Estimation)。可以将这个不均匀的
骰子先实验性地掷很多次,这可以被看作是独立同分布的若干次采样。比如投掷骰
X 次,发现 1 出现 X
1
次,2 出现 X
2
次,以此类推,可以得到各个面出现的次数。
假设掷骰子中每个面出现的概率符合多项式分布,那么通过简单的概率论知识可以
56 Chapter 2. 统计语言建模基础 肖桐 朱靖波
知道每个面出现概率的极大似然估计为:
P (i) =
X
i
X
(2.18)
X 足够大时,X
i
/X 可以无限逼近 P (i) 的真实值,因此可以通过大量的实验
推算出掷骰子各个面的概率的准确估计值。
回归到原始的问题,如果在正式开始游戏前,预先掷骰子 30 次,得到如图2.5
结果。
3
4 2
3
4
5
1 4 4
3
2 1 4
5
4 4 4
3
1 4
4
3
2
6
1 2
3
4 4 1
2.5 实验性投掷骰子的结果
此时,可以注意到,这是一个有倾向性的模型(图 2.6在这样的预先实验基础
上,可以知道这个骰子是不均匀的,如果用这个骰子玩掷骰子游戏,选择数字 4
胜的可能性是最大的。
1 1 1 1 1
P (1) = 5/30
2 2 2 2
P (2) = 4/30
3 3 3 3 3 3
P (3) = 6/30
4 4 4 4 4 4 4 4 4 4 4 4
P (4) = 12/30
5 5
P (5) = 2/30
6
P (6) = 1/30
2.6 投骰子模型
与上面这个掷骰子游戏类似,世界上的事物并不是平等出现的。在“公平”的
世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓
“不公平”实际上是客观事物中蕴含的一种偏置Bias也就是很多事情天然地
就有对某些情况有倾向。而图像处理、自然语言处理等问题中绝大多数都存在着偏
置。比如,当翻译一个英语单词的时候,它最可能的翻译结果往往就是那几个词。
计统计模型的目的正是要学习这种偏置,之后利用这种偏置对新的问题做出足够好
的决策。
在处理自然语言问题时,为了评价哪些词更容易在一个句子中出现,或者哪些句
子在某些语境下更合理,常常也会使用统计方法对词或句子出现的可能性建模。与
掷骰子游戏类似,词出现的概率可以这样理解:每个单词的出现就好比掷一个巨大
2.2 掷骰子游戏 57
的骰子,与前面的例子中有所不同的是:
骰子有很多个面,每个面代表一个单词。
骰子是不均匀的,代表常用单词的那些面的出现次数会远远多于罕见单词。
如果投掷这个新的骰子,可能会得到图2.7这样的结果。如果把这些数字换成
语中的词,比如:
88 =
87 =
45 =
就可以得到图2.8示的结果。于是,可以假设有一个不均匀的多面骰子,每
面都对应一个单词。在获取一些文本数据后,可以统计每个单词出现的次数,进而
利用极大似然估计推算出每个单词在语料库中出现的概率的估计值。图2.9给出了
个实例
88
87
45
47
100 15
5
230
7
234 500
39
100 15
975
7
234
294 69
15
2.7 投掷一个很多面骰子的结果
数据
...
现在
已经
不少
数据
...
确实
疑问
...
2.8 掷骰子游戏中把数字换成汉字后的结果
通过这个学习过程,就可以得到每个词出现的概率,成功使用统计方法对“单
词的频率”这个问题进行建模。那么该如何计算一个句子的概率呢?在自然语言处
理领域中,句子可以被看作是由单词组成的序列,因而句子的概率可以被建模为若
干单词的联合概率,即 P (w
1
w
2
.. .w
m
)。其中,w
i
表示句子中的一个单词。
为了求 P (w
1
w
2
.. .w
m
),最直接的方式是统计所有可能出现的词串 w
1
w
2
.. .w
m
58 Chapter 2. 统计语言建模基础 肖桐 朱靖波
总词数:6 + 8 + 5 = 20
P () = 1/20 = 0.05
P () = 3/20 = 0.15
P (确实) = 1/20 = 0.05
更多数据-总词数:1 百万个词
P () = 0.000010
P () = 0.001812
P (确实) = 0.000001
2.9 单词概率的估计结果
在数据中出现的次数 c(w
1
w
2
.. .w
m
),之后利用极大似然估计计算 P (w
1
w
2
.. .w
m
)
P (w
1
w
2
.. .w
m
) =
c(w
1
w
2
.. .w
m
)
P
w
1
,w
2
,...,w
m
V
c(w
1
w
2
.. .w
m
)
(2.19)
其中,V 为词汇表。本质上,这个方法和计算单词出现概率 P (w
i
) 的方法是一样的。
但是这里的问题是: m 较大时,词串 w
1
w
2
.. .w
m
可能非常低频,甚至在数据中没
有出现过。这时,由于 c(w
1
w
2
.. .w
m
) 0,公式(2.19)的结果会不准确,甚至产生 0
概率的情况。这是观测低频事件时经常出现的问题。对于这个问题,另一种思路是
对多个联合出现的事件进行独立性假设,这里可以假设 w
1
w
2
.. .w
m
的出现是相互
独立的,于是:
P (w
1
w
2
.. .w
m
) = P (w
1
)P (w
2
). ..P(w
m
) (2.20)
这样,单词序列的出现的概率被转化为每个单词概率的乘积。由于单词的概率估计
是相对准确的,因此整个序列的概率会比较合理。但是,这种独立性假设也破坏了
句子中单词之间的依赖关系,造成概率估计结果的偏差。那如何更加合理的计算一
个单词序列的概率呢?下面介绍的 n-gram 语言建模方法可以很好地回答这个问题。