传统的语言模型,模型评估参数(信息、各种熵和困惑度),最后介绍了一些数据平滑的方法

语言模型

二元语法$ $

对于一个句子\(s=w_1 \cdots w_n\),近似认为一个词的概率只依赖于它前面的1个词。即一个状态只跟上一个状态有关,也称为一阶马尔科夫链

\[ \color{blue}{p(s)}=p(w_1)p(w_2|w_1)p(w_3|w_2) \cdots p(w_n|w_{l-1})= \color {red} {\prod_{i=1}^l {p(w_i|w_{i-1})}} \]\(\color {blue} {c(w_{i-1}w_i)}\) 表示二元语法\(\color {green} {w_{i-1}w_i}\)在给定文本中的出现次数,则上一个词是\(w_{i-1}\)下一个词是\(w_i\)的概率\(\color {blue} {p(w_i \mid w_{i-1})}\)是当前语法\(\color {green} {w_{i-1}w_i}\)出现的次数比上所有形似\(\color {green} {w_{i-1}}w\)的二元语法的出现次数 \[ \color {blue} {p(w_i \mid w_{i-1})} =\color {red} {\frac {c(w_{i-1}w_i)} {\sum_{w} {c(w_{i-1}w)}}},w是变量 \] \(n\)元语法

认为一个词出现的概率和它前面的n个词有关系。则对于句子\(s=w_1w_2 \cdots w_l\),其概率计算公式为如下:

\[ \color{blue}{p(s)}=p(w_1)p(w_2|w_1)p(w_3|w_1w_2) \cdots p(w_n|w_1w_2 \cdots w_{l-1})=\color {red} {\prod_{i=1}^n{p(w_i|w_1 \cdots w_{i-1})}} \] 上述公式需要大量的概率计算,太理想了。一般取\(n=2\)或者\(n=3\)

对于\(n>2\)\(n\)元语法模型,条件概率要考虑前面\(n-1\)个词的概率,设\(w_i^j\)表示\(w_i\cdots w_j\),则有 \[ \color{blue} {p(s)} = \prod_{i=1}^{l+1}p(w_i \mid w_{i-n+1}^{i}),\color {blue} {p(w_i \mid w_{i-n+1}^{i})}=\frac { \overbrace {c(w_{i-n+1}^i)}^{\color{red}{具体以w_i结尾的词串w[i-n+1, i]}}} { \underbrace{\sum_{w_i}{c(w_{i-n+1}^i)}}_{\color{red}{所有以w_i结尾的词串w[i-n+1, i]}}} \] 实际例子

假设语料库\(S\)是由下面3个句子组成,所求的句子t在其后:

1
2
s = ['brown read holy bible', 'plm see a text book', 'he read a book by david']
t = 'brown read a book'

那么求句子\(t\)出现的概率是

\[\color{blue}{p(t)}=p(\color{green}{brown\,read\, a\, book})=p(brown|BOS)p(read|brown)p(a|read)p(book|a)p(eos|book)\approx0.06\]

\(n\)元文法的一些应用如下

语音识别歧义消除

如给了一个拼音 \(\color{green}{ta\,shi \,yan \,jiu \,sheng\, wu\, de}\),得到了很多可能的汉字串:踏实研究生物的,他实验救生物的,他是研究生物的 ,那么求出\(arg_{str}maxP(str|pinyin)\),即返回最大概率的句子

汉语分词问题

给定汉字串他是研究生物的。可能的汉字串 他 是 研究生 物 的他 是 研究 生物 的,这也是求最大句子的概率

开发自然语言处理的统计方法的一般步骤

  • 收集大量语料(基础工作,工作量最大,很重要
  • 对语料进行统计分析,得出知识(如n元文法,一堆概率)
  • 针对场景建立算法,如计算概率可能也用很多复杂的算法或者直接标注
  • 解释或者应用结果

模型评估参数

基础

  • 评价目标:语言模型计 算出的概率分布与“真实的”理想模型是否接近
  • 难点:无法知道“真实的”理想模型的分布
  • 常用指标:交叉熵,困惑度

信息量和信息熵

\(X\)是一个离散随机变量,取值空间为\(R\),其概率分布是\(p(x)=P(X=x), x \in R\)

信息量

概率是对事件确定性的度量,那么信息就是对不确定性的度量。信息量 \(\color {blue} {I(X)}\)代表特征的不确定性,定义如下 \[ \color {blue} {I(X)}= \color {red} {-\log {p(x)}} \] 信息熵

信息熵\(\color{blue}{H(x)}\)是特征不确定性的平均值,用表示,定义如下 \[ \color{blue}{H(X)}=\sum_{x \in R}{p(x)log\frac 1 {p(x)}}=\color {red} {-\sum_{x \in R} {p(x) \log p(x)}} \] 一般是\(log_2{p(x)}\),单位是比特。若是\(\ln {p(x)}\),单位是奈特。

  • 信息熵的本质是信息量的期望
  • 信息熵是对不确定性的度量
  • 随机变量\(X\)的熵越大,说明不确定性也大;若\(X\)为定值,则熵为0
  • 平均分布是"最不确定”的分布

联合熵和条件熵

\(X, Y\)是一对离散型随机变量,并且\(\color{blue}{X,Y \sim p(x,y)}\)

联合熵

联合熵实际上描述的是一对随机变量平均所需要的信息量,定义如下。 \[ \color{blue}{H(X, Y)} = \color{red} {- \sum_{x \in X} \sum_{y \in Y} p(x, y) \log p(x, y)} \] 条件熵

给定\(X\)的情况下,\(Y\)的条件熵为 \[ \color{blue}{H(Y \mid X)} = \color{red}{ - \sum_{x \in X} \sum_{y \in Y} p(x, y) \log p(y \mid x)} \] 其中可以推导出:\(H(X, Y) = H(X) + H(Y \mid X)\)

相对熵和交叉熵

相对熵

随机变量\(X\)的状态空间\(\Omega {x}\)上有两个概率分布\(p(x)\)\(q(x)\)。一般p是真实分布,q是预测分布

相对熵也称为KL距离,用来衡量相同事件空间里两个概率分布的差异

\(p\)\(q\)相对熵\(\color{blue}{D(p\mid\mid q)}\)用来度量它们之间的差异,如下 \[ \color{blue}{D(p\mid\mid q)} =\color{red}{\sum_{x\in X} {p(x)\log{\frac {p(x)}{q(x)}}}} = E_p(\log \frac{p(X)}{q(X)}) \; (期望) \] 特别地,若\(p==q\),则相对熵为0;若差别增加,相对熵的值也增加。简单理解“相对”如下: \[ D(p \mid\mid q)=\sum_{x \in X}{p(x)(\log p(x) - \log q(x))} = \underbrace{\left(-\sum_{x \in X}{ \color{red}{p(x)\log q(x)}}\right)}_{\color {red}{以q去近似p的熵=交叉熵}} - \underbrace{\left(-\sum_{x \in X} {\color{red}{p(x)\log p(x)}}\right)}_{\color{red} {p本身的熵}} \] 交叉熵

交叉熵用来衡量估计模型与真实概率分布之间的差异。

随机变量\(X \sim p(x)\)\(q(x)\)近似于\(p(x)\)。 则随机变量\(X\)和模型\(q\)之间的交叉熵\(\color {blue} {H(X, q)}\)如下:\(q\)去近似\(p\)的熵 \[ \color {blue} {H(p, q)} = H(X) + D(p \mid\mid q) = \color {red} {-\sum_{x \in X}{p(x)\log q(x)}} \]

实际应用

交叉熵的实际应用,设\(y\)是预测的概率分布,\(y^\prime\)为真实的概率分布。则用交叉熵去判断估计的准确程度 \[ H(y^{\prime}, y)= - \sum_i y_i^{\prime}\log y_i = \color {red} {-\sum_i y_{真实} \log y_{预测}} \] n元文法模型的交叉熵

设测试集\(T=(t_1, t_2, \ldots, t_l)\)包含\(l\)个句子,则定义测试集的概率\(\color {blue} {p(T)}\)为多个句子概率的乘积 \[ \color {blue} {p(T)} = \prod_{i=1}^{l} p(t_i), \, \text{其中}\color{blue}{p(t_i)}=\color{red}{\prod_{i=1}^{l_w} {p(w_i|w_{i-n+1}^{i-1})}}, \text{见上面} \] 其中\(w_i^j\)表示词\(w_i\cdots w_j\)\(\sum_{w}{c(read \, w)}\)是查找出所有以\(read\)开头的二元组的出现次数。

则在数据\(T\)n元模型\(\color {green} {p(w_i|w_{i-n+1}^{i-1})}\)的交叉熵\(\color {blue} {H_p(T)}\)定义如下 \[ \color {blue} {H_p(T)} = \color {red} {-\frac {1} {W_T} \log _2 p(T)},其中W_T是文本T中基元(词或字)的长度 \] 公式的推导过程如下 \[ -\sum_{x \in X}{p(x)\log q(x)} \implies \underbrace { -{\frac{1} {W_T}}\sum \log q(x)}_{\color{red}{使用均匀分布代替p(x)}} \implies -{\frac{1} {W_T}} \log {\prod r(w_i|w_{i-n+1}^{i-1})} \implies -{\frac{1} {W_T}} \log_2p(T) \] 可以这么理解:利用模型\(p\)\(W_T\)个词进行编码,每一个编码所需要的平均比特位数。

困惑度

困惑度是评估语言的基本准则人,也是对测试集T中每一个词汇的概率的几何平均值的倒数。 \[ \color{blue}{PP_T(T)} =\color{red}{ 2^{H_p(T)}= \frac {1} {\sqrt [W_T]{p(T)}}} = 2 ^{\text{交叉熵}} \]

当然,交叉熵和困惑度越小越好。语言模型设计的任务就是要找出困惑度最小的模型。

在英语中,n元语法模型的困惑度是\(50 \sim 1000\),交叉熵是\(6 \sim 10\)个比特位。

数据平滑

问题的提出

按照上面提出的语言模型,有的句子就没有概率,但是这是不合理的,因为总有出现的可能,概率应该大于0。设\(\color {blue}{c(w)}\)\(w\)在语料库中的出现次数。 \[ p(\color{green} {read \mid plm}) = \frac {c(plm \mid read)} {\sum_{w_i}{c(plm | w_i})} = \frac {\color{red}{0}} {1}=\color{red}{0, \, 这是不对的} \] 因此,必须分配给所有可能出现的字符串一个非0的概率值来避免这种错误的发送。

平滑技术就是用来解决这种零概率问题的。平滑指的是为了产生更准确的概率来调整最大似然估计的一种技术,也称作数据平滑。思想是劫富济贫,即提高低概率、降低高概率,尽量是概率分布趋于均匀。

数据平滑是语言模型中的核心问题

加法平滑

其实为了避免0概率,最简单的就是给统计次数加1。这里我们可以为每个单词的出现次数加上\(\delta,\delta \in [0, 1]\),设\(V\)是所有词汇的单词表,\(|V|\)是单词表的词汇个数,则有概率: \[ p_{add}(w_i \mid w_{i-n+1}^{i-1}) = \frac {\delta + c(w_{i-n+1}^i)} {\sum_{w_i}{(\delta*|V| + c(w_{i-n+1}^i)})}=\frac {\delta + \overbrace {c(w_{i-n+1}^i)}^{\color{red}{具体词串[i-n+1, i]}}} {\delta*|V| + \underbrace{\sum_{w_i}{c(w_{i-n+1}^i)}}_{\color{red}{所有以w_i结尾的词串[i-n+1, i]}}} \]

注:这个方法很原始。

Good-Turing

Good-Turing也称作古德-图灵方法,这是很多平滑技术的核心。

主要思想是重新分配概率,会得到一个剩余概率量\(\color {blue} {p_0}= \color {red} {\frac {n_1} N}\),设\(n_0\)为未出现的单词的个数,然后由这\(n_0\)个单词去平均分配得到\(p_0\),即每个未出现的单词的概率为\(\frac {p_0} {n_0}\)

对于一个\(n\)元语法,设\(\color {blue} n_r\)恰好出现\(r\)次的\(n\)元语法的数目,下面是一些新的定义

  • 出现次数为\(r\)\(n\)元语法 新的出现次数\(\color {blue} {r^*} = \color {red} {(r+1)\frac{n_{r+1}}{n_r}}\)
  • \(N = \sum_{r=0}^{\infty}n_r r^* = \sum_{r=1}^{\infty} n_r r\),即\(N\)是这个分布中最初的所有文法出现的次数,例如所有以\(read\)开始的总次数
  • 出现次数为\(r\)的修正概率 \(\color {blue}p_r = \color {red} {\frac {r^*} {N}}\)

剩余概率量\(\color {blue} {p_0}= \color {red} {\frac {n_1} N}\)的推导 \[ 总的概率 = \sum_{r>0}{n_r p_r} = \sum_{r>0}{n_r (r+1)\frac{n_{r+1}}{n_r N}} = \frac {1}{N} (\sum_{r>0} (r+1)n_{r+1} = \frac {1}{N} (\sum_{r>0} (r n_r - n_1) = 1 - \frac {n_1} N < 1 \] 然后把\(p_0\)平均分配给所有未见事件(r=0的事件)。

缺点

  • 若出现次数最大为\(k\),则无法计算\(r=k\)的新的次数\(r^*\)和修正概率\(p_r\)
  • 高低阶模型的结合通常能获得较好的平滑效果,但是Good-Turing不能高低阶模型结合

Jelinek-Mercer

问题引入

假如\(c(send \, the)=c(send \, thou)=0\),则通过GT方法有\(p(the \mid send)=p(thou \mid send)\),但是实际上却应该是\(p(the \mid send)>p(thou \mid send)\)

所以我们需要在二元语法模型中加入一个一元模型 \[ p_{ML}(w_i) = \frac {c(w_i)}{\sum_w{c(w)}} \] 二元线性插值

使用\(r\)将二元文法模型和一元文法模型进行线性插值 \[ p(w_i \mid w_{i-1}) = \lambda p_{ML}(w_i | w_{i-1}) + (1-\lambda)p_{ML}(w_i),\lambda \in [0, 1] \] 所以可以得到\(p(the \mid send)>p(thou \mid send)\)