了解词向量要从语言模型说起,语言模型其实就是计算任意一个句子的概率。
经典的语言模型是n-gram模型,该模型假设每个词的生成仅仅依赖前面n个词,所以从大规模语料中统计每个词的概率和基于前面n词的条件概率,就可以计算出一个句子的概率。对于没有出现的条件概率,则采用平滑方法来估计。该方法的假设太强,没有考虑更多的上下文。而且训练需要大量语料,一般的统计也只到trigram。
后来出现了神经网络语言模型,该模型训练出语言模型的同时可以输出词向量。
也就是说所有词向量模型的目标都是训练一个语言模型,最大化训练数据中每个句子的概率,词向量作为参数一起训练,当语言模型训练好的时候,词向量也就有了。
Bengio的模型
2003年bengio推出了《A Neural Probabilistic Language Model》,对每个词采用分布式表示,即词向量表示,用一个三层的神经网络训练出一个好的语言模型。
第一层为词向量层,每个词都查表替换为词向量作为输入,第二层是一个tanh层(隐藏层),与第一层相连,第三层是一个softmax输出层,与第一层和第二层都相连。
该网络估计的是一个ngram片段的概率,输入层是n-1个词的词向量拼接而成的向量,输出是|V|个词的概率,对应一个|V|维向量。
假设词向量为m维,隐藏层节点数为h,词表大小为|V|,则
输入层参数:(n-1)m
输入层-隐藏层参数:h*(n-1)m+1(偏置)
输入层-输出层参数:|V|*(n-1)m+1(偏置)
隐藏层-输出层参数:|V|*h
训练目标就是最大化所有ngram片段(n个连续词)的似然性,可以加正则项。
词向量也是参数,采用随机梯度下降法训练,训练结束后,语言模型有了,词向量也有了。
更多词向量模型可参考: Licstar的 Deep Learning in NLP (一)词向量和语言模型
Word2Vec模型
与Bengio的模型相比,Word2Vec去掉了最耗时的非线性隐藏层的计算,改为简单的求和隐层,并提出了两种模型:
一种是CBOW模型,通过前后n个词(上下文)来预测当前词的概率,隐藏层对上下文词的词向量求和,所以节点数和词向量维度相同。
一种是Skip-gram模型,通过词w预测上下文范围内每个词的概率,所以Skip-gram 中的每个词向量表征了上下文的分布。
每种模型又有两种选择:层次softmax,或者Negative Sampling。
层次Softmax结合了哈夫曼编码,每个词的编码对应从树根到这个词的路径,路径每个节点计算出的概率的乘积就是当前预测词的概率。
# f = sigmoid(neu1 * syn1)
Loss = -Log Likelihood = -(code[j]*logf + (1-code[j])*log(1-f))
层次softmax的思想其实借鉴了Hinton提出的层次log-bilinear模型,N元层次log-bilinear模型通过上下文预测下一个词w概率的方法为: 词w对应编码中每一位的条件概率的乘积
- 词编码对应从树根到词的路径
- 路径上的每个节点都是一个逻辑回归的二分类器,会输出0或者1的概率
- 这个逻辑回归分类器的输入是:上下文向量*路径中第i个节点向量(代入sigmoid函数输出概率值)
Negative Sampling的思想就是随机找些负样本,通过计算对比损失来优化,理论上叫作噪声对比估计(Noise Contrastive Estimation),损失函数为:
# f = sigmoid(neu1 * syn1)
Loss = -Log Likelihood = -(y*logf + (1-y)*log(1-f))
公式的推导可参考:
其他参考: