nlp基础之语言模型

nlp入门基础之语言模型



https://zhuanlan.zhihu.com/p/28080127
https://zhuanlan.zhihu.com/p/52061158
https://blog.csdn.net/weixin_40056628/article/details/89364456

1. 简介

语言模型(language model)是用来计算一个句子的概率的模型,或者预测下一个词出现的概率。通俗地讲,就是用来评估一个句子有多大的可能性是有意义的(是人话而不是一堆杂乱无章的词语组合)。
一段自然语言文本可以看做是一个离散时间序列s=ω1,ω2,,ωTs=\omega_1,\omega_2,\cdots,\omega_T,而一个语言模型的作用是构建这个时间序列的概率分布P(s)P(s)。概率计算公式可以表示为:
P(s)=P(ω1,ω2,,ωT)=P(ω1)P(ω2ω1)P(ω3ω1,ω2)P(ωTω1,ω2,,ωT1)=t=1TP(ωtω1,ω2,,ωt1)(1-1) \begin{aligned} P(s)&=P(\omega_1,\omega_2,\cdots,\omega_T)\\ &=P(\omega_1)P(\omega_2|\omega_1)P(\omega_3|\omega_1,\omega_2)\cdots P(\omega_T|\omega_1,\omega_2,\cdots,\omega_{T-1})\\ &=\prod_{t=1}^{T}P(\omega_t|\omega_1,\omega_2,\cdots,\omega_{t-1})\\ \tag{1-1} \end{aligned}
对于P(ωtω1,ω2,,ωt1)P(\omega_t|\omega_1,\omega_2,\cdots,\omega_{t-1}),可以在大量娱乐库中采用频率统计的方式来近似估计:
P(ωtω1,ω2,,ωt1)=C(ω1,ω2,,ωt)ωC(ω1,ω2,,ωt1,ω)=C(ω1,ω2,,ωt)C(ω1,ω2,,ωt1)(1-2) \begin{aligned} P(\omega_t|\omega_1,\omega_2,\cdots,\omega_{t-1})&=\frac{C(\omega_1,\omega_2,\cdots,\omega_t)}{\sum_{\omega}C(\omega_1,\omega_2,\cdots,\omega_{t-1},\omega)}\\ &=\frac{C(\omega_1,\omega_2,\cdots,\omega_t)}{C(\omega_1,\omega_2,\cdots,\omega_{t-1})}\\ \tag{1-2} \end{aligned}
直接计算上式是不现实的。假设词汇表大小为VV,由上式可以看到,产生第ii个词ωi\omega_i的概率是由已经产生的i1i-1个词ω1,ω2,,ωi1\omega_1,\omega_2,\cdots,\omega_{i-1}决定的,那么我们必须考虑所有Vi1V^{i-1}种不同历史情况下,产生第ii个词的概率。这样模型中就会有ViV^i个自由参数(每个条件概率看成一个参数)。这在实际中几乎是无法从训练数据中估计出这些参数的。并且,很多词的组合可能在语料库中根本不存在,这样会导致最后估计出的概率为零(数据稀疏问题)。
因此需要引入语言模型来降低参数个数。语言模型有基于统计模型的,比如n元语法(n-gram),也有基于神经网络的。

2. n元语法

n元语法(n-grams)是基于n-1阶马尔科夫链的概率语言模型,也即在n-gram模型中,一个词的出现概率只与前面n-1个词有关:
P(ω1,ω2,,ωT)=t=1TP(ωtωt(n1),ω2,,ωt1)(2-1) P(\omega_1,\omega_2,\cdots,\omega_T)=\prod_{t=1}^{T}P(\omega_t|\omega_{t-(n-1)},\omega_2,\cdots,\omega_{t-1})\\\tag{2-1}
每个条件概率需要实现在大量语料库中根据频率近似求得。

  • n=1: unigram,每个词独立于历史
  • n=2: bigram,每个词只与它前面的一个词有关。实际中常用
  • n=3: trigram,每个词只与它前面的两个词有关

n元语法模型可能的缺陷:

  1. 参数空间过大
  2. 数据稀疏

2.1. 一元模型(unigram)

一元模型假设每句子中的每个每个词都是独立的,也即:
p(s)=p(ω1)p(ω2)p(ωT)(2-2) p(s)=p(\omega_1)p(\omega_2)\cdots p(\omega_T)\\\tag{2-2}
需要实现在语料库中统计每个字的频率。

2.2. 二元模型(bigram)

p(s)=p(ω1start)p(ω2ω1)p(ωTend)(2-3) p(s)=p(\omega_1|start)p(\omega_2|\omega_1)\cdots p(\omega_T|end)\\\tag{2-3}

注意需要有句子开头和结尾标识符。实践中,需要先统计语料库中词语的两两组合情况的各自频率,再统计每个词的频率,以便得到条件概率。

3. n-gram模型实践

3.1. 文本分类

假设类别有两类:Y1,Y2Y_1,Y_2,原始文本为XX。由贝叶斯公司可知:
P(YiX)P(XYi)P(Yi),i=1,2(2-4) P(Y_i|X)\propto P(X|Y_i)P(Y_i),i=1,2\tag{2-4}

P(Yi)P(Y_i)就是类别YiY_i的文本比例;P(XYi)P(X|Y_i)就是在类别YiY_i下句子XX的概率,可以由n-gram算得

在上述贝叶斯假设条件下,可以简化过程,直接将训练样本的n-gram特征作为输入去训练一个分类器,得到分类模型。

4. 神经网络语言模型

4.1. 基于前馈神经网络的语言模型

Bengio在2003的论文A Neural Probabilistic Language Model。
在这里插入图片描述

图4.1 前馈神经网络语言模型

先给每个词在连续空间中赋予一个向量(词向量),再通过神经网络去学习这种分布式表征。利用神经网络去建模当前词出现的概率与其前 n-1 个词之间的约束关系。很显然这种方式相比 n-gram 具有更好的泛化能力只要词表征足够好。从而很大程度地降低了数据稀疏带来的问题。但是这个结构的明显缺点是仅包含了有限的前文信息
该模型利用前n-1个词去预测下一个词,输入层是n-1个词的one-hot向量(每个向量是1×V1\times V),再乘以一个1×D1\times D的权重矩阵,得到1×D1\times D的中间向量,将n-1个中间向量拼接成隐藏层(长度为D(n1)D(n-1))。隐藏层的激活函数为tanh,输出层为一个全连接层再接一个softmax函数生成概率分布。该模型的副产物就是词向量(输入层到隐藏层的权重矩阵)
这篇论文是词向量的鼻祖,后面的cbow和skip-gram都是由这里启发而来。

4.2. 基于循环神经网络的语言模型

为了解决定长信息(只能利用前面n-1个词的信息)的问题,Mikolov在2010的论文 Recurrent neural network based language model。
在这里插入图片描述

图4.2 RNN语言模型(图片来源见水印)

网络的输入层是"s我想你",输出层可以看作是分别计算条件概率 P(w|s)、P(w|s我)、P(w|s我想)、P(w|s我想你) 在整个词表V中的值。而我们的目标就是使期望词对应的条件概率尽可能大。

相比单纯的前馈神经网络,隐状态的传递性使得RNN语言模型原则上可以捕捉前向序列的所有信息(虽然可能比较弱)。通过在整个训练集上优化交叉熵来训练模型,使得网络能够尽可能建模出自然语言序列与后续词之间的内在联系。

为了解决依赖的信息过长的问题,后续又有LSTM、attention等改进方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章