语言模型

1 Introduction

在实际应用中,我们经常需要解决这样一类问题:如何计算一个橘子的概率?如:

  • 机器翻译:P(high winds tonite) >P(large winds tonite)
  • 拼写纠错:P(about fifteen minutes from) > P(about fifteen minutes from)
  • 语言识别:P(I saw a van) >>P(eyes awe of an)
  • 音字转换:P(你现在在干什么|nixianzaiganshenme)>P(你西安在干什么|nixianzaiganshenme)
  • 自动文摘、问答系统……

以上问题的形式化表示如下:
$$
p(S)=p(w_1,w_2,w_3,w_4,…,w_n)\\=p(w_1)p(w_2|w_1)p(w3|w_1,w_2)…p(w_n|w_1,w_2,…,w_{n-1})
$$
$p(S)$被称为语言模型,即用来计算一个句子概率的模型。

为了避免数据溢出、提高性能,通常会使用取log后使用加法运算替代乘法运算。

那么,如何计算$p(w_i|w_1,w_2,…,w_{i-1})=p(w_1,w_2,…,w_{i-1},w_i)/p(w_i,w_2,…,w_{i-1})$

但是,这里面面临两个重要问题:数据稀疏严重;参数空间过大,无法实现

目标:
$$
P(w_1,w_2,…,w_n)
$$

  • 一阶马尔科夫过程

下一个词的出现仅依赖于前面的一个词。
$$
p(S)=p(w_1,w_2,…,w_n)\\=p(w_1)\prod p(w_i|w_1,w_2,..,w_{i-1})\\=p(w_1) \prod p(w_i|w_{i-1})
$$

  • 二阶马尔科夫过程

    假设下一个词的出现依赖它的前面两个词

$$
p(S)=p(w_1,w_2,\dots,w_n)\\=p(w_1)p(w_2|w_1)\prod p(w_i|w_{i-2},w_{i-1})\\=\prod p(w_i|w_{i-2},w_{i-1})
$$

(为了方便起见,我们假设$w_0=w_{-1}=$,这里代表起始标志)

那么,我们在面临实际问题时,如何选择依赖词的个数,即n。

  • 更大的n:对下一个词出现的约束信息更多,具有更大的辨别力
  • 更小的n:在训练语料库中出现的次数更多,具有更可靠的统计信息,具有更高的可靠性。

理论上,n越大越好,经验上,trigram用的最多,尽管如此,原则上,能用bigram解决,绝不使用trigram。

例:

通常,通过计算最大似然估计(Maximum Likelihood Estimate)构造语言模型,这是对训练数据的最佳估计,公式如下:
$$
p(w_1|w_{i-2},w_{i-1}) = Count(w_{i-2},w_{i-1}, w_i) / Count(w_{i-2},w_{i-1})
$$
the dog barks STOP
$$
p(the dog barks STOP)=p(the|,)p(dog|*,the)p(barks|the dog)p(STOP|dog,barks)
$$

$$

$$

$$
p(w_i|w_{i-2},w_{i-1})=Count(w_{i-2},w_{i-1},w_i)/Count(w_{i-2},w_{i-1})
$$

假设词典大小为$N$,这个模型由$N^3$个参数,当$N=20000$,$N^3=20000^3=8 \times 10^{12}$

2 评估一个语言模型:Perplexity

理论方法:迷惑度/困惑度/混乱度(preplexity),其基本思想是给测试集赋予较高概率值的语言模型较好,公式如下:

假设有$m$个句子的数据集:
$$
s_1,s_2,s_3,\dots, s_m
$$
我们可以计算这个$m$个句子在我们模型下的概率$\prod p(s_i)$,或者更方便地,计算对数概率$log \prod^m_{i-1}=\sum_{i=1}^m logp(s_i)$

一般来说,评估度量是perplexity
$$
Perplexity=2^{-l} \\l=1/M\sum_{i-1}^m logp(s_i)
$$
$M$是测试集中所有词的总数。

关于Perplexity的一些直观理解

假设我们有一个词典$V$,$N=|V|+1$,模型预测$p(w|u,v)=1/N$对于任意的$w \in V \cup {STOP},u,v \in V\cup{*} $

可以得出,
$$
Perplexity=N
$$
Perplexity 是”branching factor”(分支系数,即预测下一个词可以有多少种选择)的一个有效衡量。由公式可知,迷惑度越小,句子概率越大,语言模型越好。

注:语言模型评估时我们可以用perplexity大致估计训练效果,作出判断和分析,但它不是完全意义上的标准,具体问题还是要具体分析。

对于一个句子的preplexity定义如下:
$$
PP(W)=P(w_1,w_2,\dots,w_N)^{-1/N}\\=\sqrt [N]{1/P(w_1,w_2,\dots,w_N)}
$$
对于二元模型,该公式为
$$
PP(W)=P(w_1,w_2,\dots,w_N)^{1/N}\\=\sqrt [N]{\prod_{i=1}^N1/P(w_i|w_{i-1})}
$$
可以看到,概率越大,困惑度越小,即perplexity越小模型越好。

另一种表达,

$$
PP(S)=2^{-\frac 1N\sum logP(wi|w_{i-1})}
$$
Perplexity的影响因素

  1. 训练数据集越大,PPL会下降得更低,1billion dataset和10万dataset训练效果是很不一样的;
  2. 数据中的标点会对模型的perplexity产生很大影响,一个句号能让PPL波动几十,标点的预测总是不稳定;
  3. 预测语句中的“的,了”等词也对PPL有很大影响,可能“我借你的书”比“我借你书”的指标值小几十,但从语义上分析有没有这些停用词并不能完全代表句子生成的好坏。

参考:

http://www.cnblogs.com/bnuvincent/p/6939787.html

https://blog.csdn.net/index20001/article/details/78884646

http://www.cs.columbia.edu/~mcollins/cs4705-spring2018/

本文标题:语言模型

文章作者:goingcoder

发布时间:2018年07月27日 - 18:07

最后更新:2018年07月27日 - 21:07

原始链接:https://goingcoder.github.io/2018/07/27/ner9/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------