带负采样的 Doc2vec 和 word2vec

Doc2vec and word2vec with negative sampling

我目前的doc2vec代码如下

# Train doc2vec model
model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4, iter = 20)

我还有一个word2vec代码如下。

 # Train word2vec model
model = word2vec.Word2Vec(sentences, size=300, sample = 1e-3, sg=1, iter = 20)

我有兴趣在 doc2vec 中同时使用 DM 和 DBOW,在 word2vec 中同时使用 Skip-gram 和 CBOW。

在Gensim中我发现了下面提到的句子: "Produce word vectors with deep learning via word2vec’s “skip-gram and CBOW models”, using either hierarchical softmax or negative sampling"

因此,我对使用分层 softmax 还是负采样感到困惑。请让我知道这两种方法的区别是什么。

此外,我有兴趣了解需要更改哪些参数才能使用hierarchical softmaxAND/OR 关于 dm、DBOW、Skip-gram 和 CBOW 的负采样?

P.s。我的应用程序是一个推荐系统:)

Skip-gram 或 CBOW 是为神经网络选择 输入上下文 的不同方法。 Skip-gram 选择一个附近的词,然后将其作为输入来尝试预测目标词; CBOW 将一堆附近的单词平均在一起,然后提供该平均值作为输入以尝试预测目标单词。

DBOW 与 skip-gram 最相似,因为整个文本的单个段落向量用于预测单个目标词,无论距离如何,也没有任何平均。它可以与同时进行的 skip-gram 训练很好地结合,其中除了使用单个段落向量外,还使用单个邻近的词向量。 gensim 选项 dbow_words=1 会将 skip-gram 训练添加到 DBOW dm=0 训练中。

DM 与 CBOW 最相似:将段落向量与周围的一些词进行平均,以尝试预测目标词。

所以在 Word2Vec 中,你必须在 skip-gram (sg=1) 和 CBOW (sg=0) 之间做出选择——它们不能混用。在 Doc2Vec 中,您必须在 DBOW (dm=0) 和 DM (dm=1) 之间做出选择——它们不能混用。但是您可以在执行 Doc2Vec DBOW 时,还添加 skip-gram 单词训练(dbow_words=1)。

hierarchical-softmax 和 negative-sampling 之间的选择是分开的,独立于上述选择。它决定了如何从神经网络中读取目标词预测。

使用负采样,每个可能的预测都被分配到网络的单个输出节点。为了改进特定输入上下文创建的预测,它检查 'correct' 词(语料库的当前训练示例摘录)的输出节点,以及 N 个其他 'wrong' 词(即与当前训练示例不匹配)。然后它微调网络的内部权重和输入向量,使 'correct' 字输出节点激活更强一点,而 N 'wrong' 字输出节点激活更弱一点。 (这被称为 'sparse' 方法,因为它避免了必须计算 每个 输出节点,这在大词汇表中是非常昂贵的,而是只计算 N+1 个节点并忽略休息。)

您可以使用参数 negative=2 设置带有 2 个负示例的负采样(在 Word2Vec 或 Doc2Vec 中,具有任何类型的输入上下文模式)。如果未指定 negative,则默认模式为 negative=5,遵循原始 Google word2vec.c 代码中的默认值。

使用 hierarchical-softmax,不是每个可预测的词都有自己的输出节点,而是将多个输出节点激活的某种模式解释为表示特定的词。哪些节点应该更接近 1.0 或 0.0 以表示一个词是词的编码问题,计算是为了使常见词具有较短的编码(仅涉及几个节点),而稀有词将具有较长的编码(涉及更多节点)。同样,这有助于节省计算时间:检查输入上下文是否正在将正确的节点集驱动到正确的值以预测 'correct' 单词(对于当前训练示例),只需几个节点需要检查和推动,而不是整套。

您使用参数 hs=1 在 gensim 中启用 hierarchical-softmax。默认情况下,不使用它。

如果启用 hierarchical-softmax,您通常应该通过提供 negative=0 来禁用负采样 - 通常,对于给定的 CPU-time/RAM 数量,一个或另一个会表现得更好。

(但是,按照原始 Google word2vec.c 代码的体系结构,可以但不建议同时激活它们,例如 negative=5, hs=1。这将导致更大、更慢的模型,它可能看起来表现更好,因为你给它更多的 RAM/time 来训练,但很可能只给一个或另一个等效的 RAM/time 会更好。 )

Hierarchical-softmax 往往随着词汇量的增加而变慢(因为每个训练示例中涉及的平均节点数增加);负采样不会(因为它总是 N+1 个节点)。具有较大语料库的项目倾向于倾向于使用负采样。