统计语言模型
Language modeling:
利用条件概率公式,S这个序列出现的概率等于每一个词出现的条件概率相乘。
举个例子:
问题:条件概率太多,无法估算。
N-gram
k-dependent Markov chain:
当序列长度增加时,计算和存储多个词共同出现的概率会指数增加。N 元语法通过马尔可夫假设(虽然并不一定成立)简化了语言模型的计算。马尔可夫假设是指一个词的出现至于前面 n 个词相关,即 n 阶马尔可夫假设。n 元语法(n-grams)。它是基于 n−1 阶马尔可夫链的概率语言模型:
常用:
为了避免数据溢出、提高性能,通常会使用取 log 后使用加法运算替代乘法运算
N-grams是基于n−1阶马尔可夫链的概率语言模型,n权衡计算复杂度和模型准确性。一元模型实际上就是一个上下文无关的模型,也就是假设当前词出现的频率与前面的词无关。实际中应用最多的是N=3的三元模型,更高阶的模型就很少用了。N元模型的复杂度 O(|V|N) O ( | V | N ) 。
- 当 n 较小时,更可靠的统计结果,但是约束信息更少,单 n 元语法往往并不准确
- 当 n 较大时,对下一个词出现的约束性信息更多,更大的辨别力,但是更稀疏,n元语法需要计算并存储大量的词频和多词相邻频率。
应用:n-grams模型用来评估语句是否合理;搜索引擎或输入法的自动补全、猜想、提示。(数据来源:用户log)
问题:上下文的相关性跨度可能非常大,需要采取一些长程的依赖性。
使用语言模型需要知道模型中的所有条件概率,通过对语料的统计,得到条件概率的过程称作模型的训练。
smoothing
问题:(零概率或者统计量不足问题)如果上面统计过程中一对词 (wi−1,wi) ( w i − 1 , w i ) 在语料库中没出现,或只出现1-2词,估计概率会有点棘手。
- 分子没出现过,概率为0
- 分子分母都只出现了一次,概率为1
平滑的基本思想:提高低概率,降低高概率,尽量使分布趋于均匀。
加法平滑(additive smoothing)
古德-图灵估计法(Good-Turing Estimate)
基本思路:对于任何一个出现 r r 次的n元语法,都假设它出现了次:
一般来说,出现一次的词的数量比出现两次的多,出现两次的比出现三次的多。这种规律称为Zipf定律(Zipf’s Law)。即上式中的 nr+1<nr n r + 1 < n r , 所以, dr<r,d0>0 d r < r , d 0 > 0 。
对于统计数为r的n元语法,其概率为:
所以,样本中所有实践的概率之和为:
因此,有 n1/N n 1 / N 的概率剩余量可以分配给所有未知事件(r=0)
Katz backooff
对于二元组 (wi−1,wi) ( w i − 1 , w i ) 的条件概率估计 P(wi|wi−1) P ( w i | w i − 1 ) 也可以通过古德-图灵估计做同样的处理。
前提:通过 wi−1 w i − 1 预测 wi w i 时,所有可能情况的条件概率总和为1,即:
对于出现次数非常少( T T 通常在8-10左右)的二元组 ,按照古德-图灵方法打折扣,这样上式结果小于1(),意味着一部分概率量没有分配出去可以留给没有看到的二元组 (wi−1,wi) ( w i − 1 , w i ) 。二元模型概率公式:
三元模型:
N元模型,依次类推。
Kneser-Ney backoff
Kneser-Ney平滑方法中,使用的一元文法的概率不与单词出现的次数成比例,而是与它前面的不同单词的数目成比例。
大多数平滑算法可以用下面的等式表示:
也就是说如果n阶语言模型具有非零的计数,就用正常的分布,否则就后退到低阶分布,选择比例因子使条件概率分布之和等于1。通常负和这种框架的平滑算法称为后备模型(back-off model) 。
区别于后备模型,插值模型(如Jelinek-Mercer平滑方法、修正的Kneser-Ney平滑方法)在确定非零计数的n元文法的概率时,也会使用低阶分布的信息。
语言模型的训练中,我们还要关注语料的选取问题。
- 保持训练数据和应用的一致
- 训练数据通常越多越好
- 需要对训练数据进行预处理,如网页文本中存在大量制表符,需要过滤
几款开源的语言模型项目:
- SRILM(http://www.speech.sri.com/projects/srilm/)
- IRSTLM(http://hlt.fbk.eu/en/irstlm)
- MITLM(http://code.google.com/p/mitlm/)
- BerkeleyLM(http://code.google.com/p/berkeleylm/)
神经语言模型
NNLM
首先,将n-1字上下文中的每个词 wt−i w t − i (由整数[1,N]表示)映射到一个关联的d维的特征向量 Cwt−i C w t − i ,也就是参数矩阵C中的第 wt−i w t − i 列。 向量 Ck C k 包含单词 k k 的学习特征。设向量x表示这些n-1个特征向量的拼接:
该模型的容量由隐藏单元h的数量和学习的单词特征d的数量控制。词典大小通常比较大,所以输出层的计算量很大,复杂度为 O(Nh) O ( N h ) 。
使用基于梯度的优化算法训练神经网络以最大化训练集对数似然:
改进:将概率计算层级分解,采用二分树,计算复杂度降为O(logN) (Morin and Bengio 2005).
RNNLM
循环神经网络,它不是刚性地记住所有固定长度的序列,而是通过隐藏状态来储存前面时间的信息。
实际应用中输入为num_steps
个可以输入进网络的形状为(batch_size, vocab_size
)的矩阵。也就是总时间步
T
T
=num_steps
,时间步 的输入
Xt∈Rn×d
X
t
∈
R
n
×
d
,其中
n
n
=batch_size
,=vocab_size
(one-hot 向量长度)。
Ht∈Rn×h H t ∈ R n × h 是该时间步的隐藏层变量。
权重参数 Wxh∈Rd×h W x h ∈ R d × h
Whh∈Rh×h W h h ∈ R h × h
偏差参数 bh∈R1×h b h ∈ R 1 × h
def rnn(inputs, state, params):
# inputs 和 outputs 皆为 num_steps 个形状为(batch_size, vocab_size)的矩阵。
W_xh, W_hh, b_h, W_hy, b_y = params
H, = state
outputs = []
for X in inputs:
H = nd.tanh(nd.dot(X, W_xh) + nd.dot(H, W_hh) + b_h)
Y = nd.dot(H, W_hy) + b_y
outputs.append(Y)
return outputs, (H,)
值得一提的是,即便在不同时间步,循环神经网络始终使用这些模型参数。因此,循环神经网络模型参数的数量不随历史增长而增长。
重点:
- 循环神经网络通过引入隐藏状态来捕捉时间序列的历史信息。
- 循环神经网络模型参数的数量不随历史增长而增长。
- 可以基于字符级循环神经网络来创建语言模型。
对RNN、LSTM、GRU感兴趣,想进一步了解的同学,欢迎移步: > https://blog.csdn.net/Shingle_/article/details/82469351
效果评估
交叉熵损失函数。在语言模型中,该损失函数即被预测字符的对数似然平均值的相反数:
困惑度(perplexity):困惑度是对交叉熵损失函数做指数运算后得到的值。
- 最佳情况下,模型总是把标签类别的概率预测为 1。此时困惑度为 1。
- 最坏情况下,模型总是把标签类别的概率预测为 0。此时困惑度为正无穷。
- 基线情况下,模型总是预测所有类别的概率都相同。此时困惑度为类别数。
《数学之美》 3
《统计自然语言处理》 5
《A Neural Probabilistic Language Model》 Bengio 2003 http://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf
Morin, F. and Bengio, Y. (2005) 《Hierarchical Probabilistic Neural Network Language Model》. AISTATS’2005. http://www.iro.umontreal.ca/~lisa/pointeurs/hierarchical-nnlm-aistats05.pdf
http://www.scholarpedia.org/article/Neural_net_language_models
《Recurrent neural network based language model》 Toma´s Mikolov 2010 http://www.fit.vutbr.cz/research/groups/speech/publi/2010/mikolov_interspeech2010_IS100722.pdf