在上一期中遗留了以下问题:
- 矩阵X的维度经常改变
- 由于大部分词并不共现而导致的稀疏性
- 矩阵维度过高带来的高计算复杂度
在本期中将引入神经网络语言模型来解决上述问题。
咱们先来了解下什么是语言模型:
语言模型是一个可以计算一个句子出现的概率的模型. 一个句子S是由n个词语
组成的. 那么, 根据贝叶斯公式, 我们可以计算:
但是,像
这种概率,参数空间是非常大的, 太多可能, 难以计算. 同时, 这种很多词汇的组合出现在语料库中的概率是大概率为零的,非常稀疏, 整个句子的概率
也会因为与其相乘变为0。这也是所谓的curse of dimensionality.为了解决这个问题,著名的马尔可夫假设被引入了:在给定当前知识或信息的情况下,过去(即当前以前的历史状态)对于预测将来(即当前以后的未来状态)是无关的。
基于马尔可夫假设, n-gram模型被提出了, 其核心思想是:第i个词仅与其前面(n-1)个词有关
所以当n=1时, 计算句子的概率就变成了:
当n=2时:
依次类推, n = 3, 4 .... 但是一般用的都是二元, 三元模型,这就是N-gram
神经网络语言模型:
N-gram作为传统方法虽然有不俗的效果, 但它依然有如下问题:
- 无法利用大于n距离的词汇信息
- 无法计算词汇间的相似度,
- 无法应付从未出现过的词组(out-of-vocabulary)
为了解决上面的问题, Bengio 等人于2003年提出了第一篇运用神经网络搭建语言模型的文章: A Neural Probabilistic Language Model, 也被称作NNLM (Neural Network Language Model). 这也是第一次提出了词向量的概念, 即将文本用稠密, 低维, 连续的向量表达.NNLM的主要任务是利用前n-1个词汇,预测第n个词汇。
NNLM整体的框架非常的简单, 所以直接上框架图:
可以看到, NNLM主要由三层网络构成:输入层,隐含层,输出层。
输入层
输入层一共有n-1个词汇的输入,每个词汇将由one-hot vector的形式编码。
对于每个one-hot vector (
), 它们将会与Embedding size为m的矩阵 C (
)相乘, 得到一个distribution vector (
).其中,
为词表的大小(即语料库中出现过的所有唯一词汇数量),m为embedding size, 通常比
小很多,这样也就达到了降维的目的。C这个参数矩阵其实相当于一本字典,每一行都储存了相应位置词汇的词向量,每当有词汇输入的时候,根据词汇的one-hot-vector, C提取出相应行的向量,即为该词汇的词向量。C由神经网络的back propagation训练,不断优化,从而得到更好的词向量,即更优秀的表达能力。
隐含层
得到所有词的词向量后(即一个
的矩阵),为了利用所有词汇信息,将它们concatenate到一起,得到一个
的向量
隐含层为一个简单的tanh激活层,其公式为:
其维度信息为:
输出层
输出层利用了隐含层的输出以及原始合并词向量,最后套上softmax, 其公式为:
其维度信息为:
如果不想利用原始合并词向量的信息的话,可以将W设为零矩阵。
其损失函数为:
实验结果表明,NNLM模型比smoothed trigram(平均分布, unigram, bigram, trigram的加权结果)表现更好.
NNLM的问题:
- 计算复杂度过大
- 参数较多
因而,基于NNLM,研究人员又提出了word2vec、GloVe、EMLo、GPT及BERT等词向量生成模型,这些模型在实际中有广泛应用。
我们会在后续文章中详细介绍。
本文暂时没有评论,来添加一个吧(●'◡'●)