nlp入门基础之语言模型
@[toc]
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=\omega_1,\omega_2,\cdots,\omega_T$,而一个语言模型的作用是构建这个时间序列的概率分布$P(s)$。概率计算公式可以表示为:
对于$P(\omega_t|\omega_1,\omega_2,\cdots,\omega_{t-1})$,可以在大量娱乐库中采用频率统计的方式来近似估计:
直接计算上式是不现实的。假设词汇表大小为$V$,由上式可以看到,产生第$i$个词$\omega_i$的概率是由已经产生的$i-1$个词$\omega_1,\omega_2,\cdots,\omega_{i-1}$决定的,那么我们必须考虑所有$V^{i-1}$种不同历史情况下,产生第$i$个词的概率。这样模型中就会有$V^i$个自由参数(每个条件概率看成一个参数)。这在实际中几乎是无法从训练数据中估计出这些参数的。并且,很多词的组合可能在语料库中根本不存在,这样会导致最后估计出的概率为零(数据稀疏问题)。
因此需要引入语言模型来降低参数个数。语言模型有基于统计模型的,比如n元语法(n-gram),也有基于神经网络的。
2. n元语法
n元语法(n-grams)是基于n-1阶马尔科夫链的概率语言模型,也即在n-gram模型中,一个词的出现概率只与前面n-1个词有关:
每个条件概率需要实现在大量语料库中根据频率近似求得。
- n=1: unigram,每个词独立于历史
- n=2: bigram,每个词只与它前面的一个词有关。实际中常用
- n=3: trigram,每个词只与它前面的两个词有关
n元语法模型可能的缺陷:
- 参数空间过大
- 数据稀疏
2.1. 一元模型(unigram)
一元模型假设每句子中的每个每个词都是独立的,也即:
需要实现在语料库中统计每个字的频率。
2.2. 二元模型(bigram)
注意需要有句子开头和结尾标识符。实践中,需要先统计语料库中词语的两两组合情况的各自频率,再统计每个词的频率,以便得到条件概率。
3. n-gram模型实践
3.1. 文本分类
假设类别有两类:$Y_1,Y_2$,原始文本为$X$。由贝叶斯公司可知:
$P(Y_i)$就是类别$Y_i$的文本比例;$P(X|Y_i)$就是在类别$Y_i$下句子$X$的概率,可以由n-gram算得
在上述贝叶斯假设条件下,可以简化过程,直接将训练样本的n-gram特征作为输入去训练一个分类器,得到分类模型。
4. 神经网络语言模型
4.1. 基于前馈神经网络的语言模型
Bengio在2003的论文A Neural Probabilistic Language Model。
先给每个词在连续空间中赋予一个向量(词向量),再通过神经网络去学习这种分布式表征。利用神经网络去建模当前词出现的概率与其前 n-1 个词之间的约束关系。很显然这种方式相比 n-gram 具有更好的泛化能力,只要词表征足够好。从而很大程度地降低了数据稀疏带来的问题。但是这个结构的明显缺点是仅包含了有限的前文信息。
该模型利用前n-1个词去预测下一个词,输入层是n-1个词的one-hot向量(每个向量是$1\times V$),再乘以一个$1\times D$的权重矩阵,得到$1\times D$的中间向量,将n-1个中间向量拼接成隐藏层(长度为$D(n-1)$)。隐藏层的激活函数为tanh,输出层为一个全连接层再接一个softmax函数生成概率分布。该模型的副产物就是词向量(输入层到隐藏层的权重矩阵)
这篇论文是词向量的鼻祖,后面的cbow和skip-gram都是由这里启发而来。
4.2. 基于循环神经网络的语言模型
为了解决定长信息(只能利用前面n-1个词的信息)的问题,Mikolov在2010的论文 Recurrent neural network based language model。
网络的输入层是”s我想你”,输出层可以看作是分别计算条件概率 P(w|s)、P(w|s我)、P(w|s我想)、P(w|s我想你) 在整个词表V中的值。而我们的目标就是使期望词对应的条件概率尽可能大。
相比单纯的前馈神经网络,隐状态的传递性使得RNN语言模型原则上可以捕捉前向序列的所有信息(虽然可能比较弱)。通过在整个训练集上优化交叉熵来训练模型,使得网络能够尽可能建模出自然语言序列与后续词之间的内在联系。
为了解决依赖的信息过长的问题,后续又有LSTM、attention等改进方法