Я пытаюсь понять функцию потери NCE в Tensorflow. Потеря NCE используется для задачи word2vec, например:
# Look up embeddings for inputs.
embeddings = tf.Variable(
tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
embed = tf.nn.embedding_lookup(embeddings, train_inputs)
# Construct the variables for the NCE loss
nce_weights = tf.Variable(
tf.truncated_normal([vocabulary_size, embedding_size],
stddev=1.0 / math.sqrt(embedding_size)))
nce_biases = tf.Variable(tf.zeros([vocabulary_size]))
# Compute the average NCE loss for the batch.
# tf.nce_loss automatically draws a new sample of the negative labels each
# time we evaluate the loss.
loss = tf.reduce_mean(
tf.nn.nce_loss(weights=nce_weights,
biases=nce_biases,
labels=train_labels,
inputs=embed,
num_sampled=num_sampled,
num_classes=vocabulary_size))
более подробную информацию, пожалуйста, обратитесь к Tensorflow word2vec_basic.py
- Каковы матрицы ввода и вывода в функции NCE?
В модели word2vec мы заинтересованы в построении представлений для слов. В процессе обучения, учитывая скользкое окно, каждое слово будет иметь два вложения: 1) когда слово является центральным словом; 2) когда слово является контекстным словом. Эти два вложения называются входными и выходными векторами, соответственно. (больше объяснений входных и выходных матриц)
На мой взгляд, входная матрица - это embeddings
а выходная матрица - nce_weights
. Это правильно?
- Каково окончательное вложение?
Согласно сообщению s0urcer, также относящемуся к nce
, он говорит, что конечная матрица внедрения - это только входная матрица. В то время как некоторые другие говорят, final_embedding=input_matrix+output_matrix
. Что является правильным/более распространенным?