Doc2Vecの実装(tf経由)とgensims実装を比較しようとしています。 gensimのものがより良いパフォーマンスをしていることは、少なくとも視覚的に思われます。
Gensimモデルとその下のテンソルフローモデルをトレーニングするために、次のコードを実行しました。私の質問は次のとおりです。
window=5
gensimのパラメーターは、両側の2つの単語を使用して中央の単語を予測することを意味しますか?または、どちら側も5です。長さ10より小さいドキュメントがかなりあるということです。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)
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)
Jupyterノートブックを確認してください here (ここで両方のモデルが動作し、テストされています)。この初期分析では、gensimモデルのパフォーマンスが向上しているように感じます。
古い質問ですが、回答は将来の訪問者に役立つでしょう。だからここに私の考えのいくつかがあります。
tensorflow
の実装にはいくつかの問題があります。
window
は1辺のサイズなので、window=5
は5*2+1
= 11
ワードになります。batch_size
がドキュメントの数になることに注意してください。したがって、train_Word_dataset
図形はbatch_size * context_window
になり、train_doc_dataset
およびtrain_labels
図形はbatch_size
になります。sampled_softmax_loss
はnegative_sampling_loss
ではありません。これらは、softmax_loss
の2つの異なる近似です。OPにリストされている質問の場合:
tensorflow
のdoc2vec
のこの実装は、独自の方法で機能し、正しく動作しますが、gensim
の実装と論文の両方とは異なります。window
は、上記の1辺のサイズです。ドキュメントのサイズがコンテキストサイズよりも小さい場合は、小さい方が使用されます。gensim
の実装が速い理由はたくさんあります。最初に、gensim
が大幅に最適化され、すべての操作が単純なpython操作、特にデータI/Oよりも高速です。2番目に、gensim
でのmin_count
フィルタリングなどの前処理ステップがデータセットサイズを縮小します。 、gensim
はnegative_sampling_loss
を使用します。これはsampled_softmax_loss
よりもはるかに高速です。これが主な理由だと思います。