私はDeepDist
(link)モジュールを見て、それを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
(link)のソースコードを調べました。Doc2Vec
モデルインスタンスには、次のフィールドがあります。
model.syn0
model.syn0_lockf
model.docvecs.doctag_syn0
model.docvecs.doctag_syn0_lockf
gensim.models.word2vec
(link)のソースコードと比較すると、Doc2Vec
モデルに次のフィールドがありませんでした。
model.syn1
model.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]
各ドキュメントが1行にあり、接頭辞が0で埋められた10桁のIDであると仮定して、データセットの解析に使用しても問題ありませんか?任意の提案/貢献は非常に高く評価されています。結果を要約するブログ投稿を作成し、ここで貢献者に言及します。これは、現在解決していることを解決するために多くの開発時間を費やすことなく、他の人がスケーリングされた分散システムでDoc2Vecモデルをトレーニングするのに役立つ可能性があります。
ありがとう
2018年6月13日更新
これを実装できなかったので、お詫びします。しかし、今日はより良いオプションがありDeepDist
、しばらくの間維持されていません。以下のコメントをお読みください。
現時点で私のアイデアを試すことを主張する場合は、自己責任で進めていることを忘れないでください。また、DeepDist
それでも機能することがわかっている場合は、コメントで報告してください。それは他の読者を助けるでしょう。
この質問が未解決のまま表示されないようにするために、質問者が状況を解決した方法は次のとおりです。
手遅れになるまで、これを実装することはできませんでした。DeepDistは、バックエンドでFlaskアプリを使用して、SparkWebインターフェイスと対話します。それはもう維持されていないので、Sparkのアップデートはおそらくすでにそれを壊しました。SparkでDoc2Vecトレーニングを探している場合は、Deeplearning4J(deeplearning4j.org/doc2vec#)にアクセスしてください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加