赞
踩
语言模型通俗的将就是判断一句话是不是正常人说出来的。统计语言模型是所有 NLP的基础,被广泛应用与语音识别、机器翻译、分词、词性标注和信息检索等任务。传统的统计语言模型是表示语言基本单位(一般为句子)的概率分布函数,这个概率分布也是该语言的生成模型。通俗的讲,如果一句话没有在语料库中出现,可以模拟句子的生成的方式,生成句子在语料库中的概率。一般语言模型可以使用各个词语条件概率的形式表示:
其中,Context 为 w_i 的上下文表示。根据 Context 的表示差异,统计语言模型又可以分为不同的类别,其中最具代表性的有 n-gram 语言模型及 nn 语言模型:
是自然语言处理(NLP)中一个非常重要的概念,通常在 NLP 中,人们基于一定的语料库,可以利用 N-gram 来做以下几类事情:
统计语言模型实际上是一个概率模型,所以常见的概率模型都可以用于求解这些参数。
常见的概率模型有:N-gram 模型、决策树、最大熵模型、隐马尔可夫模型、条件随机场、神经网络等。目前常用于语言模型的是 N-gram 模型和神经语言模型。
假设没有计算和存储限制,n 是不是越大越好?
早期因为计算性能的限制,一般最大取到 n=4;如今,即使 n>10 也没有问题,但是,随着 n 的增大,模型的性能增大却不显著,这里涉及了可靠性与可区别性的问题。
参数越多,模型的可区别性越好,但是可靠性却在下降——因为语料的规模是有限的,导致 count(W) 的实例数量不够,从而降低了可靠性
OOV 即 Out Of Vocabulary,也就是序列中出现了词表外词,或称为未登录词,或者说在测试集和验证集上出现了训练集中没有过的词。
一般解决方案:
count(W) = 0 是怎么办?
平滑方法:
Add-one Smoothing (Laplace)
这是一个经典的神经概率语言模型,它沿用了 N-gram 模型中的思路,将 w 的前 n-1 个词作为 w 的上下文 context(w),而 V_context 由这 n-1 个词的词向量拼接而成,即
1. 其中 c(w) 表示 w 的词向量
2. 不同的神经语言模型中 context(w) 可能不同,比如 Word2Vec 中的 CBOW 模型
3. 每个训练样本是形如 (context(w), w) 的二元对,其中 context(w) 取 w 的前 n-1
个词;当不足 n-1,用特殊符号填充
4. 同一个网络只能训练特定的 n,不同的 n 需要训练不同的神经网络
【输入层】首先,将 context(w) 中的每个词映射为一个长为 m 的词向量,词向量在
训练开始时是随机的,并参与训练;
【投影层】将所有上下文词向量拼接为一个长向量,作为 w 的特征向量,该向量的维
度为 m(n-1)
【隐藏层】拼接后的向量会经过一个规模为 h 隐藏层,该隐层使用的激活函数为 tanh
【输出层】最后会经过一个规模为 N 的 Softmax 输出层,从而得到词表中每个词作为下一个词的概率分布
其中 m, n, h 为超参数,N 为词表大小,视训练集规模而定,也可以人为设置阈值
训练时,使用交叉熵作为损失函数。当训练完成时,就得到了 N-gram 神经语言模型,以及副产品词向量
整个模型可以概括为如下公式:
需要注意的是:对于任意的单词,Input layer 和 Hidden Layer 之间的权重矩阵 W 是
参数共享的
所以,需要定义 loss function(一般为交叉熵代价函数),采用梯度下降算法更新 W和 W’。训练完毕后,输入层的每个单词与矩阵 W 相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的 word embedding)也叫做 look up table(其实这个 look up table 就是矩阵 W 自身),也就是说,任何一个单词的 onehot 乘以这个矩阵都将得到自己的词向量。有了 look up table 就可以免去训练过程直接查表得到单词的词向量了。
假设我们现在的 Corpus 是这一个简单的只有四个单词的 document:
{I drink coffee everyday}
我们选 coffee 作为中心词,window size 设为 2。
也就是说,我们要根据单词"I","drink"和"everyday"来预测一个单词,并且我们希望这个单词是 coffee。
假设我们此时得到的概率分布已经达到了设定的迭代次数,那么现在我们训练出来的look up table 应该为矩阵 W。即,任何一个单词的 one-hot 表示乘以这个矩阵都将得到自己的 word embedding。
Continuous Bag-of-Word Mode(l 连续词袋模型)和 skip-gram mode(l 跳字模型),分别对应了词向量的两种训练方法:利用 context 预测中心词以及利用中心词去预测context。
对于连续词袋模型(CBOW)来说,一般的做法是先对每个单词进行 one-of-N编码(one-hot encoded),作为训练网络的输入,接着构建一层 hidden layer,最后构建输出层,这一层是一个 softmax 层,每个 context 单词到中心单词的事件都被认为是独立的,所以将这些事件发生的概率相乘,最后构建损失函数,即:将输出概率分布和实际选中的词概率分布进行 Corss Entropy 计算,接下来使用 SGD 对参数进行更新。这里,hidden layer 的训练结果就是最终的 word vector 了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。