2017-12-12 9 views
0

Ich habe eine vorhandene Gensim Doc2Vec-Modell, und ich versuche, iterative Updates für das Trainingssatz und durch das Modell zu erweitern.Aktualisieren von Schulungsunterlagen für Gensim Doc2Vec Modell

nehme ich die neuen Dokumente und führe als normal preproecssing:

stoplist = nltk.corpus.stopwords.words('english') 
train_corpus= [] 
for i, document in enumerate(corpus_update['body'].values.tolist()): 
    train_corpus.append(gensim.models.doc2vec.TaggedDocument([word for word in gensim.utils.simple_preprocess(document) if word not in stoplist], [i])) 

ich dann das ursprüngliche Modell laden, das Vokabular aktualisieren, und umschulen:

#### Original model 
## model = gensim.models.doc2vec.Doc2Vec(dm=0, size=300, hs=1, min_count=10, dbow_words= 1, negative=5, workers=cores) 

model = Doc2Vec.load('pvdbow_model_6_06_12_17.doc2vec') 

model.build_vocab(train_corpus, update=True) 

model.train(train_corpus, total_examples=model.corpus_count, epochs=model.iter) 

ich dann den Trainingssatz aktualisieren Pandas Datenframe durch Anhängen der neuen Daten und Zurücksetzen des Indexes.

corpus = corpus.append(corpus_update) 
corpus = corpus.reset_index(drop=True) 

aber wenn ich versuche, infer_vector zu verwenden() mit dem aktualisiert Modell:

inferred_vector = model1.infer_vector(tokens) 
sims = model.docvecs.most_similar([inferred_vector], topn=len(model.docvecs)) 

die Ergebnisqualität ist schlecht, was darauf hindeutet, dass die Indizes aus dem Modell und der Trainingssatz Datenrahmen nicht längere Übereinstimmung

Wenn ich es mit dem nicht aktualisierten Trainingssatz Datenrahmen (wieder unter Verwendung des aktualisierten Modells) vergleichen, sind die Ergebnisse in Ordnung - obwohl, natürlich, fehlen mir die neuen Dokumente.

Gibt es sowieso beide aktualisiert zu haben, da ich in der Lage sein werde, häufige Aktualisierungen des Modells ohne eine vollständige Umschulung des Modells vornehmen zu können?

Antwort

1

Gensim Doc2Vec hat noch keine offizielle Unterstützung für die Erweiterung des Vokabulars (über build_vocab(..., update=True)), so dass das Verhalten des Modells hier nicht definiert ist, um etwas Nützliches zu tun. In der Tat, ich denke, alle bestehenden doc-Tags werden komplett verworfen und durch irgendwelche im letzten Korpus ersetzt. (Darüber hinaus gibt es hervorragende ungelöste Berichte von Speicher-Fehler-Prozess-Abstürze bei dem Versuch, update_vocab() mit Doc2Vec zu verwenden, wie this issue.)

Auch wenn das funktioniert, gibt es eine Reihe von trüben Balancing Probleme, wenn überhaupt zu erwägen Fortsetzung Rufen Sie train() auf einem Modell mit anderen als dem ursprünglichen Trainingssatz an. Insbesondere wird jede derartige Trainingseinheit das Modell anpeilen, um besser auf die neuen Beispiele zu sein, aber den Wert des ursprünglichen Trainings verlieren, wodurch das Modell möglicherweise für einige Fälle oder insgesamt schlechter wird.

Die vertretbarste Strategie mit einem wachsenden Korpus wäre es, gelegentlich mit allen Trainingsbeispielen, die in einem Korpus zusammengefasst sind, von Null zu lernen. Ein weiterer Überblick über einen möglichen Prozess zum Durchführen von Aktualisierungen an einem Modell wurde in my recent post to the gensim discussion list diskutiert.

Einige weitere Kommentare zu Ihrem Setup:

  • sowohl hierarchisch-softmax (hs=1) und negativen Probenahme mit (mit negative> 0) erhöht die Modellgröße und Trainingszeit, sondern bieten kann keinen Vorteil nur einen Modus mit mehr Wiederholungen (oder anderen Optimierungen) mit im Vergleich zu - so ist es selten beiden Modi haben aktiven

  • durch keine iter spezifiziert, sind Sie den Standard-geerbt-from-Word2Vec von ‚5‘ mit , während veröffentlichte Doc2Vec-Arbeit oft 10-20 oder mehr Iterationen verwendet

  • viele Bericht infer_vector arbeitet besser mit einem viel höheren Wert für die optionalen Parameter steps (die einen Standardwert von nur 5 hat), und/oder mit kleineren Werten von alpha (die einen Standardwert von 0.1 hat)

Verwandte Themen