私は以下のコードでthis sample code
にreferreingています:今すぐNCE_Loss機能がoptput層でのソフトマックスを持つ単一の隠れ層のニューラルネットワーク以外の何ものでもないtensorflow basic word2vec例:行列の埋め込みではなく、表現に対して重み[nce_weight Transpose]を使用するべきではありませんか?
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]))
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))
optimizer = tf.train.GradientDescentOptimizer(1.0).minimize(loss)
[さを知ることは、ほんの数、負のサンプルを取ります]
グラフのこの部分は、ネットワークの重みを更新するだけで、埋め込み行列/テンソルには何もしません。
ネットワークが訓練されたら理想的にはembeddings_matrixを最初にもう一度渡してから、 "nce_weights"の転置を乗算しなければなりません[入力では同じ重量の自動エンコーダとみなし、出力層は&です]
しかし、コードの後半部分を見ると、embeddings
行列の値が単語表現に使用されています。 This
さえtensorflow doc for NCE lossは、単に第1層入力活性値として(embeddings
を使用して、我々はembed
を通過される)入力に言及しています。
inputs: A Tensor of shape [batch_size, dim]. The forward activations of the input network.
通常のバックプロパゲーションは はNCE損失のこの実装を行い、ネットワークの第1の層で停止し、超えて、入力値(ひいては埋め込む)に損失を伝播?
これは追加の手順ですか? Refer thisなぜ私はそれを余分なステップと呼んでいるのですか、彼は同じ説明をしています。