我目前的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,我找到了下面提到的句子: “通过word2vec的”skip-gram和CBOW模型“使用分层softmax或负抽样生成具有深度学习的单词向量”
因此,我很困惑使用分层softmax或负采样。请告诉我这两种方法中的差异是什么。
此外,我有兴趣了解需要更改的参数以使用分层softmax 和/或负抽样尊重 dm,DBOW,Skip-gram和CBOW ?
P.S。我的申请是一个推荐系统:)
答案 0 :(得分:8)
Skip-gram或CBOW是为神经网络选择输入上下文的不同方法。 Skip-gram选择一个附近的单词,然后将其作为输入提供,以尝试预测目标单词; CBOW将一堆附近的单词平均在一起,然后提供该平均值作为输入以尝试预测目标单词。
DBOW与skip-gram最相似,因为整个文本的单个段落向量用于预测单个目标词,无论距离如何,并且没有任何平均值。它可以与同步跳过式训练混合使用,其中除了使用单个段落向量之外,还使用各个附近的单词向量。 gensim选项dbow_words=1
将向DBOW dm=0
培训添加skip-gram培训。
DM与CBOW最相似:段落矢量与许多周围的单词一起平均以尝试预测目标单词。
因此,在Word2Vec中,您必须在skip-gram(sg=1
)和CBOW(sg=0
)之间进行选择 - 它们无法混合。在Doc2Vec中,您必须在DBOW(dm=0
)和DM(dm=1
)之间进行选择 - 它们不能混合使用。但是,在执行Doc2Vec DBOW时,您还可以添加skip-gram单词训练(使用dbow_words=1
)。
hierarchy-softmax和negative-sampling之间的选择是独立的,与上述选择无关。它确定如何从神经网络中读取目标词预测。
通过负采样,每个可能的预测都被分配给网络的单个输出节点。为了改进特定输入上下文创建的预测,它会检查输出节点以确定正确的输入节点。单词(当前训练示例的语料库摘录),以及其他N'错误'单词(与当前的训练示例不匹配)。然后它会轻推网络的内部权重和输入向量,以使“正确”变为“正确”。字输出节点激活稍强,而N'错误'字输出节点激活稍微弱一些。 (这被称为稀疏'方法,因为它避免了必须计算每个输出节点,这在大型词汇表中非常昂贵,而只是计算N + 1个节点并忽略其余部分。)
您可以使用参数negative=2
(在Word2Vec或Doc2Vec中,使用任何类型的输入上下文模式)使用2个负示例设置负采样。默认模式(如果未指定negative
)为negative=5
,遵循原始Google word2vec.c代码中的默认模式。
对于hierarchical-softmax,而不是每个具有自己的输出节点的可预测字,多个输出节点激活的某种模式被解释为特定字。为了表示单词,哪个节点应该更接近1.0或0.0是单词编码的问题,这是为了使常用单词具有短编码(仅涉及几个节点),而罕见单词将具有更长的编码编码(涉及更多节点)。同样,这可以节省计算时间:检查输入上下文是否正在将正确的节点集驱动到正确的值以预测“正确的”。 word(对于当前的训练示例),只需要检查几个节点,并轻推,而不是整个集合。
使用参数hs=1
在gensim中启用hierarchical-softmax。默认情况下,不使用它。
如果启用了hierarchy-softmax,通常应该通过提供negative=0
禁用负采样 - 通常一个或另一个在给定量的CPU时间/ RAM中表现更好。
(但是,遵循原始Google word2vec.c代码的架构,可以但不建议同时激活它们,例如negative=5, hs=1
。这将导致更大,更慢的模型,这似乎表现得更好,因为你给它提供了更多的RAM /时间训练,但是给予相同的RAM /时间只有一个或更好的可能会更好。)
对于较大的词汇表,Hierarchical-softmax往往会变慢(因为每个训练示例中涉及的平均节点数增加);负采样不会(因为它总是N + 1个节点)。具有较大语料库的项目倾向于倾向于偏向负抽样。