图灵奖获得者Bengio 03年的论文,虽然年代已经比较“久远”,但意义非凡。它的贡献在于提出了神经网络语言模型以及这个模型同时能学习词向量(word embedding),这为后来深度学习在解决NLP问题奠定了坚实的基础,并且这种训练词向量的方式为后来的研究提供了更广阔的思路。
在这之前的统计语言模型,比如n-gram,它们的缺陷在于:缺乏长期依赖,只考虑了前 n-1 个词;随着 n 的增大,参数空间呈指数增长;数据稀疏,难免会出现OOV问题;单纯基于词频统计,泛化能力差。
而关于词的向量空间表示在03年以前已经有了一些工作,比如熟知的one-hot,以及信息检索领域的共现矩阵(co-occurrence matrix)做SVD分解得到的词的特征向量,但它们存在的问题是one-hot的维度太大并且词向量之间没有关系,无法计算相似度,而SVD得到的词向量可解释性较差,而且SVD分解效率较差。
本文设计的神经网络语言模型如下:
模型的输入层是将词映射成向量,相当于一个 1 × V 1 \times V 1×V 的 one-hot 向量乘以一个 V × D V \times D V×D 的向量 C C C得到一个 1 × D 1 \times D 1×D 的向量,再将 n-1 个词向量拼接在一起,得到一个 D ( n − 1 ) D(n-1) D(n−1)的向量。隐藏层则是一个以tanh为激活函数的全连接层。输出层为一个全连接层,后面接一个softmax函数来生成概率分布,因为这里的语言模型是根据前 n-1 个词去预测下一个词,则可以看成一个多分类器,则得到下一个词的概率为 P ~ ( w t ∣ w t − 1 , . . . , w t − n + 1 ) = e y w t ∑ i e y i \tilde{P}(w_t|w_{t-1},...,w_{t-n+1})=\frac{e^{y_{w_t}}}{\sum_ie^{y_i}} P~(wt∣wt−1,...,wt−n+1)=∑ieyieywt,如果要计算一句话的概率,只需将条件概率相乘得到联合概率。
这里值得注意的是语言模型困惑度和Loss的关系。这里的模型 loss 的计算采用的是 cross-entropy: L = − 1 T ∑ i = 1 T log p ( w i ∣ w i − n + 1 , . . . , w i − 1 ) L=-\frac{1}{T}\sum_{i=1}^T\log{p(w_i|w_{i-n+1},...,w_{i-1})} L=−T1∑i=1Tlogp(wi∣wi−n+1,...,wi−1),而语言模型困惑度为 P P ( s ) = P ( w 1 , w 2 , . . . , w T ) − 1 T = 1 P ( w 1 , w 2 , . . . , w T ) T PP(s)=P(w_1,w_2,...,w_T)^{-\frac{1}{T}}=\sqrt[T]{\frac{1}{P(w_1,w_2,...,w_T)}} PP(s)=P(w1,w2,...,wT)−T1=TP(w1,w2,...,wT)1,这里可以推得 P P ( s ) = e L PP(s)=e^L PP(s)=eL。这也意味着着在实现语言模型困惑度时,不需要单独计算,只需根据 loss 计算就可得到。但在具体实现时,因为采用的 batch 的训练方式,有些序列长度未达到 n − 1 n-1 n−1 ,需要做 padding,而此时做 padding 后计算得到的困惑度会与原本的有偏差。
Bengio这篇论文还有一个惊艳之处在于,他提出了几个未来值得去尝试的idea:
上面提到几个方向,在现在看来,有一些都取得了不错的进展。
在论文中提到了一个“direct connections from word features to output”,这个就是将输入经过变换在加到输出层上,这个地方在实验的设置并没有对比实验,而且论文中提到的也是说可选择的,那么这个地方是否有必要做 direct connections,需要后面实验下。