昨天讨论了使用神经网络的方法来得到词向量语言模型的原理和一些问题,word2vec也使用了CBOW与Skip-Gram来训练模型与得到词向量,但是并没有使用传统的DNN模型。现在我们开始关注word2vec的语言模型如何改进传统的神经网络的方法。word2vec有两种改进方法,一种是基于Hierarchical Softmax的,另一种是基于Negative Sampling的。
Word2vec主要思想是对每个单词及其上下文单词进行预测
包含两个算法:
• Skip-gram (SG): 预测上下文。
• Continuous Bag of Words (CBOW): 预测目标单词。
以及两种训练方法:
• hierarchical softmax: 通过树结构来定义目标函数,来计算所有词汇的概率。
• negative sampling: 通过负样本采样,来定义目标函数
CBOW和Skip-gram
对于Skip-gram
假设我们有 10,000 个独特单词的词汇表。
我们把像“ants”这样的输入词表示为一个one-hot向量。该向量将有 10,000 个分量(表示词汇表中的每个单词),我们将在与单词“ants”相对应的位置放置“1”,在所有其他位置放置"0"。
网络的输出也是一个单个向量(也包含 10,000 个分量),其中对于词汇表中的每个单词,包含随机选择的附近单词是该词汇表单词的概率。
这是我们的神经网络的架构。 隐藏层神经元上没有激活函数,但输出神经元使用softmax。
当在单词对上训练该网络时,输入是代表输入单词的 one-hot 向量,训练输出也是代表输出单词的one-hot 向量。输出向量实际上将是一个概率分布(即一堆浮点值,而不是一个one-hot向量)。
对于我们的示例,假设我们正在学习具有 300 个特征的词向量。因此,隐藏层将由一个具有 10,000 行(对应词汇表中的每个单词)和 300 列(对应每个隐藏神经元)的权重矩阵表示。
这个权重矩阵的行 实际上就是我们的词向量! 等于用300个特征表示了单词表中的每个词,每个词向量都可以独一无二的表示这个词。
这是一个直观的小例子。
然后,“ants”的词向量1 x 300被输入到输出层。输出层是一个softmax回归分类器。每个输出神经元(词汇表中的每个单词都有一个)将产生 0 到 1 之间的输出,并且所有这些输出值的总和将相加至 1。
具体来说,每个输出神经元都有一个权重向量(300 x 1),它与隐藏层的词向量相乘,然后将函数应用于exp(x)结果。最后,为了使输出总和为 1,我们将此结果除以所有10,000 个输出节点的结果之和。
大致的完整网络结构如下:
对于CBOW
CBOW 有点类似于 Skip-gram,
- 隐藏层和输出层的尺寸将保持不变。
- 输入层的维度和隐藏层激活的计算会改变
- 如果单个目标词有 4 个上下文词,我们将有 4 个 1 x 10000 的输入向量。每个都将与返回 1 x 300 向量的 10000 x 300 隐藏层相乘。所有 4 个 1 x 300 向量将按元素平均以获得最终激活值,然后将其输入到 softmax 层。
啊哦,明天早上起来赶一下基于Hierarchical Softmax的模型和基于Negative Sampling的模型。
参考链接:http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/