我正在研究DeepDist (链接)模块,并考虑将其与Gensim的Doc2Vec API结合起来,以便在PySpark上训练段落向量。实际上,链接提供了以下简洁的示例,说明如何为Gensim的Word2Vec模型进行段落向量的训练:
from deepdist import DeepDist
from gensim.models.word2vec import Word2Vec
from pyspark import SparkContext
sc = SparkContext()
corpus = sc.textFile('enwiki').map(lambda s: s.split())
def gradient(model, sentences): # executes on workers
syn0, syn1 = model.syn0.copy(), model.syn1.copy() # previous weights
model.train(sentences)
return {'syn0': model.syn0 - syn0, 'syn1': model.syn1 - syn1}
def descent(model, update): # executes on master
model.syn0 += update['syn0']
model.syn1 += update['syn1']
with DeepDist(Word2Vec(corpus.collect()) as dd:
dd.train(corpus, gradient, descent)
print dd.model.most_similar(positive=['woman', 'king'], negative=['man']) 据我所知,DeepDist正在将梯度下降的工作分批分发给工人,并对其进行重组并在主版进行更新。如果我将Word2Vec替换为Doc2Vec,那么应该使用单词向量来训练文档向量。
因此,我研究了gensim.models.doc2vec (链接)的源代码。Doc2Vec模型实例中有以下字段:
model.syn0model.syn0_lockfmodel.docvecs.doctag_syn0model.docvecs.doctag_syn0_lockf与gensim.models.word2vec (链接)的源代码相比,Doc2Vec模型中缺少以下字段:
model.syn1model.syn1neg我认为我没有接触到lockf向量,因为当新的数据点出现时,它们似乎是在训练完成后使用的。因此,我的代码应该类似于
from deepdist import DeepDist
from gensim.models.doc2vec import Doc2Vec, LabeledSentence
from pyspark import SparkContext
sc = SparkContext()
# assume my dataset is in format 10-char-id followed by doc content
# 1 line per doc
corpus = sc.textFile('data_set').map(
lambda s: LabeledSentence(words=s[10:].split(),labels=s[:10])
)
def gradient(model, sentence): # executes on workers
syn0, doctag_syn0 = model.syn0.copy(), model.docvecs.doctag_syn0.copy() # previous weights
model.train(sentence)
return {'syn0': model.syn0 - syn0, 'doctag_syn0': model.docvecs.doctag_syn0 - doctag_syn0}
def descent(model, update): # executes on master
model.syn0 += update['syn0']
model.docvecs.doctag_syn0 += update['doctag_syn0']
with DeepDist(Doc2Vec(corpus.collect()) as dd:
dd.train(corpus, gradient, descent)
print dd.model.most_similar(positive=['woman', 'king'], negative=['man']) 我有遗漏什么重要的东西吗?例如:
model.syn1吗?他们到底是什么意思?model.*_lockf是训练后锁定的矩阵?lambda s: LabeledSentence(words=s[10:].split(),labels=s[:10]来解析数据集吗?任何建议/贡献都是非常感谢的。我将写一篇博客文章来总结结果,在这里提到贡献者,可能会帮助其他人在缩放的分布式系统上训练Doc2Vec模型,而不会花费大量的开发时间来解决我现在正在解决的问题。
谢谢
2018年6月13日更新
我很抱歉,因为我没有实现这一点。但是现在有更好的选择,DeepDist已经有一段时间没有被维护了。请阅读下面的评论。
如果你现在坚持尝试我的想法,请记住你是在冒险。另外,如果有人知道DeepDist仍然有效,请在评论中报告。它能帮助其他读者。
发布于 2019-03-03 20:34:51
为了避免这个问题保持开放状态,下面是提问者是如何解决这种情况的:
我没能实现这一点,直到我认为它不起作用已经太晚了。DeepDist在后端使用Flask应用程序与Spark界面进行交互。因为它不再被维护,斯派克的更新很可能已经破坏了它。如果你想在星火中接受Doc2Vec培训,只需选择Deeplearning4J(displearning4j.org/doc2vec#)
https://stackoverflow.com/questions/35616088
复制相似问题