J'essaie de comparer mon implémentation de Doc2Vec (via tf) et celle de gensims. Il semble, du moins visuellement, que celles de gensim soient plus performantes.
J'ai exécuté le code suivant pour entraîner le modèle gensim et celui qui suit pour le modèle tensorflow. Mes questions sont les suivantes :
- Mon implémentation tf de Doc2Vec est-elle correcte ? En fait, elle est censée concaténer les vecteurs de mots et le vecteur de document pour prédire le mot central dans un certain contexte ?
- Est-ce que le
window=5
dans gensim signifie que j'utilise deux mots de chaque côté pour prédire celui du milieu ? Ou est-ce que c'est 5 de chaque côté. Le fait est qu'il y a pas mal de documents qui sont plus petits que la longueur 10. - Avez-vous une idée de la raison pour laquelle Gensim est plus performant ? Mon modèle est-il différent de la façon dont ils le mettent en œuvre ?
- Étant donné qu'il s'agit effectivement d'un problème de factorisation matricielle, pourquoi le modèle TF obtient-il une réponse ? Il y a une infinité de solutions à ce problème puisqu'il s'agit d'un problème de déficience de rang. <- Cette dernière question est simplement un bonus.
Gensim
model = Doc2Vec(dm=1, dm_concat=1, size=100, window=5, negative=10, hs=0, min_count=2, workers=cores)
model.build_vocab(corpus)
epochs = 100
for i in range(epochs):
model.train(corpus)
TF
batch_size = 512
embedding_size = 100 # Dimension of the embedding vector.
num_sampled = 10 # Number of negative examples to sample.
graph = tf.Graph()
with graph.as_default(), tf.device('/cpu:0'):
# Input data.
train_word_dataset = tf.placeholder(tf.int32, shape=[batch_size])
train_doc_dataset = tf.placeholder(tf.int32, shape=[batch_size/context_window])
train_labels = tf.placeholder(tf.int32, shape=[batch_size/context_window, 1])
# The variables
word_embeddings = tf.Variable(tf.random_uniform([vocabulary_size,embedding_size],-1.0,1.0))
doc_embeddings = tf.Variable(tf.random_uniform([len_docs,embedding_size],-1.0,1.0))
softmax_weights = tf.Variable(tf.truncated_normal([vocabulary_size, (context_window+1)*embedding_size],
stddev=1.0 / np.sqrt(embedding_size)))
softmax_biases = tf.Variable(tf.zeros([vocabulary_size]))
###########################
# Model.
###########################
# Look up embeddings for inputs and stack words side by side
embed_words = tf.reshape(tf.nn.embedding_lookup(word_embeddings, train_word_dataset),
shape=[int(batch_size/context_window),-1])
embed_docs = tf.nn.embedding_lookup(doc_embeddings, train_doc_dataset)
embed = tf.concat(1,[embed_words, embed_docs])
# Compute the softmax loss, using a sample of the negative labels each time.
loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed,
train_labels, num_sampled, vocabulary_size))
# Optimizer.
optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss)
Mise à jour :
Consultez le carnet de notes jupyter ici (J'ai les deux modèles en fonctionnement et testés ici). Il semble toujours que le modèle gensim soit plus performant dans cette première analyse.
3 votes
Une discussion approfondie à ce sujet se trouve ici : groups.google.com/forum/#!topic/gensim/0GVxA055yOU
1 votes
Selon la documentation - "la fenêtre est la distance maximale entre le mot prédit et les mots du contexte utilisés pour la prédiction dans un document". Donc, c'est 5 mots de chaque côté. Par ailleurs, pouvez-vous me dire ce que signifie l'expression
negative
ounum_sampled
? Je n'ai pas bien compris.1 votes
L'approche de l'échantillonnage négatif est décrite dans l'un des ouvrages de Mikolov. documents . En outre, il réduit le nombre de paramètres qui sont mis à jour à chaque étape d'apprentissage.
1 votes
Notez que le
dm_concat
donne des modèles beaucoup plus grands, plus lents à entraîner et qui nécessitent probablement beaucoup plus de données (ou de passages d'entraînement) que le PV-DBOW ou le PV-DM-with-context-window-averaging, plus couramment utilisés. J'ai initialement ajoutédm_concat
à gensim, pour essayer de reproduire fidèlement les résultats de l'article 'Paragraph Vector' qui dit utiliser ce mode. (Je n'ai pas pu le faire, et personne d'autre n'a essayé.) Je n'ai personnellement pas trouvé d'ensembles de données/évaluations dans lesquellesdm_concat
valait l'effort supplémentaire - mais peut-être qu'ils existent avec de très grands corpus de documents.