Doc2Vec (tf 経由) の実装と gensims の実装を比較しようとしています。少なくとも視覚的には、gensim の方がパフォーマンスが優れているように見えます。
次のコードを実行して gensim モデルをトレーニングし、その下のコードを tensorflow モデル用にトレーニングしました。私の質問は次のとおりです。
- Doc2Vec の私の tf 実装は正しいですか。基本的に、単語ベクトルと文書ベクトルを連結して、特定のコンテキストで中間の単語を予測することになっていますか?
- gensimの
window=5
パラメーターは、両側の 2 つの単語を使用して中央の単語を予測していることを意味しますか? それとも左右5か。問題は、長さが 10 より小さいドキュメントがかなりあるということです。 - Gensim のパフォーマンスが優れている理由についての洞察はありますか? 私のモデルは、彼らがそれを実装する方法と何か違いがありますか?
- これが実質的に行列因数分解の問題であることを考えると、なぜ TF モデルで答えが得られるのでしょうか? ランク不足の問題であるため、これには無限の解決策があります。<- この最後の質問は単なるおまけです。
ゲンシム
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)
アップデート:
ここでjupyterノートブックをチェックしてください(ここで両方のモデルが動作し、テストされています)。この初期分析では、gensim モデルのパフォーマンスが向上しているように感じられます。