版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Shingle_/article/details/82392017
统计语言模型
Language modeling:
利用条件概率公式,S这个序列出现的概率等于每一个词出现的条件概率相乘。
P(S)=P(w1,w2,…,wt−1,wt)=P(w1)P(w2|w1)P(w3|w1,w2)…P(wt|w1,w2,…wt−1).
P(w1,w2,…,wT)=∏t=1TP(wt∣w1,…,wt−1).
举个例子:
P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w1,w2)P(w4∣w1,w2,w3).
P(w1)=num(w1)/num(all)
P(w2∣w1)=P(w1,w2)/P(w1)
P(w3∣w1,w2)=P(w1,w2,w3)/P(w1,w2)
...
问题:条件概率太多,无法估算。
N-gram
k-dependent Markov chain:
当序列长度增加时,计算和存储多个词共同出现的概率会指数增加。N 元语法通过马尔可夫假设(虽然并不一定成立)简化了语言模型的计算。马尔可夫假设是指一个词的出现至于前面 n 个词相关,即 n 阶马尔可夫假设。n 元语法(n-grams)。它是基于 n−1 阶马尔可夫链的概率语言模型:
P(w1,w2,…,wT)≈∏t=1TP(wt∣wt−(n−1),…,wt−1).
常用:
unigram:P(w1,w2,w3,w4)=P(w1)P(w2)P(w3)P(w4),
bigram:P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w2)P(w4∣w3),
trigrams:P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w1,w2)P(w4∣w2,w3).
为了避免数据溢出、提高性能,通常会使用取 log 后使用加法运算替代乘法运算
N-grams是基于n−1阶马尔可夫链的概率语言模型,n权衡计算复杂度和模型准确性。一元模型实际上就是一个上下文无关的模型,也就是假设当前词出现的频率与前面的词无关。实际中应用最多的是N=3的三元模型,更高阶的模型就很少用了。N元模型的复杂度
O(|V|N)
。
- 当 n 较小时,更可靠的统计结果,但是约束信息更少,单 n 元语法往往并不准确
- 当 n 较大时,对下一个词出现的约束性信息更多,更大的辨别力,但是更稀疏,n元语法需要计算并存储大量的词频和多词相邻频率。
应用:n-grams模型用来评估语句是否合理;搜索引擎或输入法的自动补全、猜想、提示。(数据来源:用户log)
问题:上下文的相关性跨度可能非常大,需要采取一些长程的依赖性。
使用语言模型需要知道模型中的所有条件概率,通过对语料的统计,得到条件概率的过程称作模型的训练。
smoothing
问题:(零概率或者统计量不足问题)如果上面统计过程中一对词
(wi−1,wi)
在语料库中没出现,或只出现1-2词,估计概率会有点棘手。
P(wi∣wi−1)=P(wi−1,wi)P(wi−1)
- 分子没出现过,概率为0
- 分子分母都只出现了一次,概率为1
平滑的基本思想:提高低概率,降低高概率,尽量使分布趋于均匀。
加法平滑(additive smoothing)
P(wi∣wi−1)=P(wi−1,wi)+1P(wi−1)+|V|
古德-图灵估计法(Good-Turing Estimate)
基本思路:对于任何一个出现
r
次的n元语法,都假设它出现了
dr
次:
dr=(r+1)nr+1nr
一般来说,出现一次的词的数量比出现两次的多,出现两次的比出现三次的多。这种规律称为Zipf定律(Zipf’s Law)。即上式中的
nr+1<nr
, 所以,
dr<r,d0>0
。
对于统计数为r的n元语法,其概率为:
pr=drN
N=∑r=0∞nrdr=∑r=0∞(r+1)nr+1=∑r=1∞nrr
所以,样本中所有实践的概率之和为:
∑r>0nrpr=1−n1N<1
因此,有
n1/N
的概率剩余量可以分配给所有未知事件(r=0)
Katz backooff
对于二元组
(wi−1,wi)
的条件概率估计
P(wi|wi−1)
也可以通过古德-图灵估计做同样的处理。
前提:通过
wi−1
预测
wi
时,所有可能情况的条件概率总和为1,即:
∑wi∈VP(wi|wi−1)=1
对于出现次数非常少(
T
通常在8-10左右)的二元组
(wi−1,wi)
,按照古德-图灵方法打折扣,这样上式结果小于1(),意味着一部分概率量没有分配出去可以留给没有看到的二元组
(wi−1,wi)
。二元模型概率公式:
P(wi|wi−1)=⎧⎩⎨⎪⎪f(wi|wi−1),count(wi−1,wi)≥Tfgt(wi|wi−1),0<count(wi−1,wi)<TQ(wi−1)f(wi),otherwise
Q(wi−1)=1−∑wiseenP(wi|wi−1)∑wiunseenP(wi
三元模型:
P(wi|wi−2,wi−1)=⎧⎩⎨⎪⎪f(wi|wi−2,wi−1),count(wi−2,wi−1,wi)≥Tfgt(wi|wi−2,wi−1),0<count(wi−2,wi−1,wi)<TQ(wi−2,wi−1)f(wi|wi−1),otherwise
N元模型,依次类推。
Kneser-Ney backoff
Kneser-Ney平滑方法中,使用的一元文法的概率不与单词出现的次数成比例,而是与它前面的不同单词的数目成比例。
大多数平滑算法可以用下面的等式表示:
Psmooth(wi|wi−1i−n+1)={α(wi|wi−1i−n+1),count(wii−n+1)>0γ(wi−1i−n+1)Psmooth(wi|wi−1i−n+2),count(wii−n+1)=0
也就是说如果n阶语言模型具有非零的计数,就用正常的分布,否则就后退到低阶分布,选择比例因子使条件概率分布之和等于1。通常负和这种框架的平滑算法称为后备模型(back-off model) 。
区别于后备模型,插值模型(如Jelinek-Mercer平滑方法、修正的Kneser-Ney平滑方法)在确定非零计数的n元文法的概率时,也会使用低阶分布的信息。
语言模型的训练中,我们还要关注语料的选取问题。
- 保持训练数据和应用的一致
- 训练数据通常越多越好
- 需要对训练数据进行预处理,如网页文本中存在大量制表符,需要过滤
几款开源的语言模型项目:
神经语言模型
NNLM
首先,将n-1字上下文中的每个词
wt−i
(由整数[1,N]表示)映射到一个关联的d维的特征向量
Cwt−i
,也就是参数矩阵C中的第
wt−i
列。 向量
Ck
包含单词
k
的学习特征。设向量x表示这些n-1个特征向量的拼接:
x=(Cwt−n+1,1,…,Cwt−n+1,d,Cwt−n+2,1,…Cwt−2,d,Cwt−1,1,…Cwt−1,d).
P(wt=k|wt−n+1,…wt−1)=eak∑Nl=1eal
ak=bk+∑i=1hWkitanh(ci+∑j=1(n−1)dVijxj)
该模型的容量由隐藏单元h的数量和学习的单词特征d的数量控制。词典大小通常比较大,所以输出层的计算量很大,复杂度为
O(Nh)
。
使用基于梯度的优化算法训练神经网络以最大化训练集对数似然:
L(θ)=∑tlogP(wt|wt−n+1,…wt−1)
改进:将概率计算层级分解,采用二分树,计算复杂度降为O(logN) (Morin and Bengio 2005).
RNNLM
循环神经网络,它不是刚性地记住所有固定长度的序列,而是通过隐藏状态来储存前面时间的信息。
Ht=ϕ(XtWxh+Ht−1Whh+bh),
实际应用中输入为num_steps
个可以输入进网络的形状为(batch_size, vocab_size
)的矩阵。也就是总时间步
T
=num_steps
,时间步
t
的输入
Xt∈Rn×d
,其中
n
=batch_size
,
d
=vocab_size
(one-hot 向量长度)。
Ht∈Rn×h
是该时间步的隐藏层变量。
权重参数
Wxh∈Rd×h
Whh∈Rh×h
偏差参数
bh∈R1×h
Ot=HtWhy+by.
def rnn(inputs, state, params):
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
效果评估
交叉熵损失函数。在语言模型中,该损失函数即被预测字符的对数似然平均值的相反数:
loss=−1N∑i−1Nlogptargeti
困惑度(perplexity):困惑度是对交叉熵损失函数做指数运算后得到的值。
e−1N∑Ni−1logptargeti=eloss
- 最佳情况下,模型总是把标签类别的概率预测为 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
http://www.flickering.cn/nlp/2015/02/%E6%88%91%E4%BB%AC%E6%98%AF%E8%BF%99%E6%A0%B7%E7%90%86%E8%A7%A3%E8%AF%AD%E8%A8%80%E7%9A%84-2%E7%BB%9F%E8%AE%A1%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/
http://www.flickering.cn/nlp/2015/03/%E6%88%91%E4%BB%AC%E6%98%AF%E8%BF%99%E6%A0%B7%E7%90%86%E8%A7%A3%E8%AF%AD%E8%A8%80%E7%9A%84-3%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/
http://www.flickering.cn/ads/2015/02/%E8%AF%AD%E4%B9%89%E5%88%86%E6%9E%90%E7%9A%84%E4%B8%80%E4%BA%9B%E6%96%B9%E6%B3%95%E4%B8%80/