上次写到word2Vec中一次训练过程。
训练一次需要更新的向量有Vcat 以及所有的Uw。这样一次训练成本似乎过于大,如何解决这个问题呢?
快速的训练:负采样
为什么我们必须在每个步骤中考虑词汇表中的所有上下文向量? 假设在当前步骤中,我们不考虑所有单词的上下文向量,而只考虑当前目标和几个随机选择的单词。 下图显示了差别。
和以前一样,我们增加Vcat和Ucute之间的相似性。 所不同的是,现在我们不减少所有单词之间的上下文向量之间的相似性,而仅使用K个“负”示例的子集来减小它们之间的相似性。
由于我们的语料库很大,因此平均而言,在所有更新中,我们将对每个向量进行足够多次的更新,所以向量仍将能够很好地学习单词之间的关系。
新的损失函数变为了:
因为:
所以:
负样例的选择
每个单词只有几个“真实”上下文。 因此,随机选择的单词很可能是“否定的”,即不是真实的上下文。 这个简单的想法不仅用于有效地训练Word2Vec,而且还用于许多其他应用程序。
Word2Vec根据单词的经验分布对否定样本进行随机抽样。
Word2Vec变种:Skip-Gram and CBOW
Skip-Gram:是我们之前一直研究的。给定中心词,预测上下文。带有负采样的Skip-Gram是最常用的方法。
CBOW(Continuous Bag-of-Words):连续词袋,根据上下文向量的总和预测中心词。 单词向量的总和称为“单词袋”,它也是模型的名称由来。
注意:
1.
Word2Vec的起源论文:
Efficient Estimation of Word Representations in Vector Space
网址:https://arxiv.org/pdf/1301.3781.pdf
Distributed Representations of Words and Phrases and their Compositionality
网址:https://papers.nips.cc/paper/2013/file/9aa42b31882ec039965f3c4923ce901b-Paper.pdf
2.
为什么有两个向量:
Word2Vec中训练了两个向量,一个是中心词向量,一个是上下文向量。上下文词向量会在训练完成后被丢弃。
那么,为什么要训练两个向量呢?
观察损失函数可以得到,所以损失函数的第一部分和第二部分求和中的内容对于参数而言都是线性的,对于求导很方便。这也是Word2Vec训练速度很快的秘诀之一。
再次声名,本篇文章是学习记录,原文地址为:
https://lena-voita.github.io/nlp_course/word_embeddings.html
如有翻译不正确地方还请不吝批评指正。