论文|万物皆可Vector之语言模型:从N-Gram到NNLM、RNNLM
本主题文章将会分为三部分介绍,每部分的主题为:
word2vec的前奏-统计语言模型 word2vec详解-风华不减 其他xxx2vec论文和应用介绍
后续会更新Embedding相关的文章,可能会单独成系列,也可能会放到《特征工程-Embedding系列中》,欢迎持续关注「搜索与推荐Wiki」
语言模型
a):定义
语言模型(Language model)是自然语言处理的重要技术,自然语言处理中最常见的是文本数据,我们可以把一段自然语言文本看作是一段离散的时间序列,假设一段长度为的文本中的词依次是,语言模型就是计算他的概率:
也就是说语言模型是对语句的概率分布的建模。
语言模型可以分为:统计语言模型和神经网络语言模型。
b):概率表示
假设 表示一个有意义的句子,eg:今天天气晴朗,适合户外爬山,可以将这个句子表示为:,换成例子中的句子:。
用 表示这个句子出现的概率,展开为:
利用条件概率可以转化为:
其中 表示第一个词出现的概率,即「今天」在整个语料库中出现的概率, 表示在给定第一个词的情况下,第二个词出现的概率,即在整个语料库中给定「今天」这个词,「天气」这个词也出现的概率,后边的依次类推。
其中的和很容易计算得到,但是及以后涉及变量较多,计算的复杂度也会变得更加复杂。
统计语言模型——N-gram模型
a):马尔可夫假设
为了解决上面的过于复杂难以计算的问题,需要引入马尔可夫假设,马尔科夫假设中很重要的一点是有限视野假设,即每一个状态只与它前面的个状态有关,这被称为 阶马尔可夫链
b):n-gram
当应用在语言模型中时,就是指每一个词的概率只与前边的 个词有关系,这就被称为 元语言模型,当 时,被称为二元模型,此时上述公式展开为:
经过马尔可夫假设的简化,计算的概率也会变得容易很多,当然随着的增加,相应的计算复杂度也会增加,而 越大,越逼近数据的真实分布, 通常取值为2、3、4、5。
c):概率估计
通过上面的描述,可以明确的是:
每一个句子都可以拆分成不同的词的全排列 每一个句子都可以通过条件概率公式计算得到一个表示该句子的合理性概率 通过引入马尔可夫假设,简化句子的计算概率
以二元模型为例,如何计算 ?从概率统计中可知:
在大语料的情况下,基于大数定理,词语$w_iP(w_i|w_{i-1})$,所以有:
所以一般情况下,统计语言模型都要求语料足够大,这样得到的结果相对会准确一些。但这里边也存在一个问题,如果 或者都等于0的话,计算出来得结果显然是不合理的。因此引入了平滑技术。
d):n-gram模型中的平滑技术
平滑技术就是为了解决 c)中描述的次数统计比值不合理的情况。常见的平滑技术有(这里不展开描述,感兴趣的可以自行搜索了解):
加法平滑 古德-图灵(Good-Turing)估计法 Katz平滑方法 Jelinek-Mercer平滑方法 Witten-Bell平滑方法 绝对减值法 Kneser-Ney平滑方法
e)n-gram 语言模型的优缺点:
优点:
(1) 采用极大似然估计,参数易训练 (2) 完全包含了前 n-1 个词的全部信息 (3) 可解释性强,直观易理解。
缺点:
(1) 缺乏长期依赖,只能建模到前 n-1 个词 (2) 随着 n 的增大,参数空间呈指数增长 (3) 数据稀疏,难免会出现OOV的问题 (4) 单纯的基于统计频次,泛化能力差。
神经网络语言模型——NNLM
NNLM论文:《A Neural Probabilistic Language Model》
下载链接:http://www.ai.mit.edu/projects/jmlr/papers/volume3/bengio03a/bengio03a.pdf
NNLM模型的网络是一个三层的网络结构图,如下所示:

其中最下层为输出词前 个词,NNLM模型的目标是急于这 个词计算 第 个词 的概率。
的训练目标是:
其中 表示第 个单词, 表示从第1个单词到第 个词组成的子序列,模型需要满足的约束条件是:
上面模型的意思是当给定一段序列时,由其前面的个词预测第个词的概率。
限制条件一:即是通过网络得到的每个概率值都要大于0。 而对于第二个限制条件:因为我们的神经网络模型最终得到的输出是针对每 个词的输入来预测下一个,也即是第个词是什么。因此模型的实际输出是一个向量,该向量的每一个分量依次对应下一个词为词典中某个词的概率。所以维的概率值中必定有一个最大的概率,而其他的概率较小。
模型的训练目标可以分解为两部分:
1、特征映射:即将 中的第个单词映射成一个维的向量,这里的映射可以是 (可以是初始化的词向量,因为要同模型一起进行训练),然后将通过特征映射得到的进行拼接合并成一个维的向量。也可以说是:一个从词汇表到实数向量空间的映射。通过这个映射得到每个单词的向量表示。 2、计算条件概率分布:通过一个函数 将输入的词向量序列 转化为一个概率分布 ,所以这里的输出是维的,和词典的维度是相同的, 中第个词表示词序列中第个词是的概率,即:
模型的输出为一个 函数,形式如下:
其中 表示的是第 个单词没有进行归一化的概率,其计算公式为:
其中模型参数为:
表示的神经网络的输入矩阵: 表示隐藏层神经元个数 表示隐藏层的偏置参数 表示每个单词对应的向量维度 是可选参数,如果输入层和输出层之间没有直接相连,可令 表示的是输入层到隐藏层的权重矩阵 表示的时隐藏层到输出层的权重矩阵
一般的神经网络不需要对输入进行训练,但是在该模型中的输入是词向量,也是需要训练的参数,由此可见模型的权重参数和词向量是同时训练的,模型训练完成后同时得到网络的权重参数和词向量
的训练目标是最大化似然函数,即:
其中为所有模型参数,为正则化项(在论文对应的实验中, 表示的是权重衰减参数,仅适用于神经网络和单词对应的向量矩阵)。
然后使用梯度下降法更新参数:
其中为学习率(步长)。
基于Pytorch和Tf实现的代码参考:
https://www.jianshu.com/p/be242ed3f314
神经网络语言模型——RNNLM
RNNLM 论文:
《Recurrent neural network based language model》
下载连接:
https://www.fit.vutbr.cz/research/groups/speech/publi/2010/mikolov_interspeech2010_IS100722.pdf
RNNLM模型的思想比较简单,主要改进的是NNLM中的前馈神经网络,其主要的结构图如下所示:

读者乍看可能不知道这个描述的是什么,不着急,先来补一下简单的RNN知识。
一个简答的RNN结构如下图所示:

其包含输入层、隐藏层和输出层, 表示的是输入层的向量, 表示输入层到隐藏层的权重矩阵, 表示隐藏层的向量值, 表示的是隐藏层到输出层的权重矩阵, 表示的是输出层的向量值, 表示隐藏层上一次的值。
将上面的图展开为:

现在看上去就比较清楚了,这个网络在时刻接收到输入 之后,隐藏层的值是 ,输出值是 。关键一点是, 的值不仅仅取决于 ,还取决于 。
接着看RNNLM模型的结构图, 表示的就是 时刻的输入, 表示的就是 时刻的隐藏层(), 则表示时刻的隐藏层的值(), 表示的就是时刻的输出()。
其中:
其中 表示的是 函数:
表示的是函数:
其中有一些细节需要注意:
通常设置为比较小的向量值,如0.1 隐藏层单元数一般为30-500,因为输入的词库特别大 权重使用带噪声的高斯函数进行初始化 优化算法使用的是随机梯度下降 学习率初始值设置为0.1,后续随着迭代的进行,如果没有明显改善,学习率修改为原先的一半 通常在10-20次迭代之后开始收敛
每一epoch结束之后,向量的误差基于交叉熵准则进行计算:
其中 表示预测值,为真实值。
最终单词出现概率计算公式为: