NLP+深度学习:paper(1) Bengio: A Neural Probabilistic Language Model, word2vec蓝本NNLM方法
摘要
统计语言模型的目的是想去学一系列词的联合概率分布,但如果不加技巧直接硬解的话会出现维数灾难(curse of dimensionality)问题。本文想通过学习每个词的分布表示(distributed representation)来解决这种维数灾难。本模型:
- 学习词汇的分布式表示(distributed representation)
- 学习词序列的概率函数(probability function for word sequences)
简介
收到非参数密度估计(non-parametric density estimation)的启发,一种将learning algorithm效果可视化的方法是,去看初始化时聚集在training points附近的概率质量在更广阔的数据集下的分布,比如在training points周围的一些词汇上的分布。
基本的统计语言模型:
,是一个词序列,是第个词。上式可以理解为整句话的概率是前面所有词的条件概率的乘积。
建立自然语言统计模型的时候,需要消除维数灾难带来的影响,这时n-gram的思想就很有用了。一般来说语义库的context都很大,n-gram只取某个词的前n个词作为context,可以大大减小计算量。
下面来继续说明一下本文的工作:
1. 用分布式表示解决维数灾难问题
这里的想法可以总结为如下三条:
- 把每个单词和一个单词特征向量()对应起来
- 写出单词序列的联合概率分布,in terms of 序列中的单词特征向量
- 自动学习这些单词特征向量和概率分布函数的参数
曾经的统计语言模型有两个重要的flaw,本文将重点关注这两个点:
1. 没有考虑多余1或2个单词的上下文(context)
曾经,我们只考虑那些在我们的训练集中出现过的连续单词的组合,但同时我们又不希望给那些从来没出现过的单词组合赋概率值0。
2. 没有考虑单词之间的语义相似性(similarity between words)
神经网模型
模型建立
现有词典,训练集是一个大的词序列。我们需要学:
这里把要学的东西拆成两部分:
1. 从词到向量的映射
把每个中的词用one-hot方式表示,那么每个单词都是一个的向量。记为从词one-hot向量映射到的映射,那么显然为一个的矩阵,一共有个自由参数。这里词特征向量与词One-hot向量之间的关系为:.
2. 从词向量到结果的映射
将词转换为特征向量后,设现有一个函数将特征向量序列映射到我们需要求的概率函数:
这里函数可以通过一个前向传播或者循环神经网络实现,设其中的参数集合为. 那么所有参数的集合为
这里再给出loss function.我们需要maximize下式:
这里是一个正则化项,包含 matrix的参数和神经网络中的权重,不包括偏置。
经过词特征映射后还有一个神经网络隐层。这里使用softmax来作为Output layer:
这也可以保证概率加和为1,满足之前提到的约束。
最优化求解
接下来讨论模型的求解。设为每个输出单词的未正则化的log概率,它可以被这样计算:
其中, 为特征词序列,逐个对元素进行处理,在没有直接联系的元素时为0。
使用SGD进行优化,每次随机选取一个sequence:
实验结果
使用含有1,181,041个单词的Brown语义库。这里800,000单词背用于训练集,200,000用于validation,另外181,041用于测试。不同的单词有47,578个,出现次数<=3次的稀有单词被全部替换为一个统一的单词。这样词典的大小为。
另外还测试了Associated Press(AP) News的数据,包含14M个单词,一共有148K不同的单词,经过同样方法过滤之后有。
学习率一开始设为, 随着训练次数递减:. 这里
N-Gram模型
第一个benchmark时内插或平滑的3-gram模型(Jelinkek and Mercer, 1980)。
此外还有一些当时比较先进的n-gram模型如Modified Kneser-Ney algorithm, class-based n-gram models等
结果
对比的criteria是考察test set perplexity(的几何平均值)。
表1展示了Brown语义库上的结果,MLP10意思是这里词的特征取了10个,也就是。是模型的阶数,class-based n-gram中词class的个数,是hidden unit的个数,是词特征的个数,是词特征和输出之间有没有直接连接,是有没有与trigram组成混合模型。
其他
并行计算求解
TODO
Other hint
- 使用混合模型,将神经网络的概率预测和内插3-gram方法可以获得更好效果。
- Out-of-vocabulary words。本模型能很好的适用于没在字典里出现过的单词。比如,当出现一个新单词,我们可以先将这样初始化:,然后把放入中再重新跑一遍我们的算法,这个计算相对较快。