2017-05-05 4 views
1

私は以下のコードで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なぜ私はそれを余分なステップと呼んでいるのですか、彼は同じ説明をしています。

答えて

1

は、私が読んでtensorflowを通過考え出したしたい全体の事は単一の隠れ層ニューラルネットワーク、確かにオートエンコーダであるものの、その

です。しかし、体重は結ばれていません。

エンコーダは、重み行列embeddingsで構成され、デコーダは、nce_weightsで構成されています。そして今度はembedは、入力にembeddingsを乗じることによって与えられる隠れ層の出力に過ぎません。

したがって、embeddingsnce_weightsの両方がグラフで更新されます。そして、我々は2つの重量マトリックスのいずれかを選択することができ、ここではembeddingsがより好ましい。

EDIT1:tf.nn.nce_losstf.nn.sampled_softmax_loss両方に対する実際

、パラメータ、重みおよびバイアスは、ロジスティック回帰/ソフトマックス関数 [refer]あり得る、目的関数に、入力Weights(tranpose) X + biasためのものです。

しかし、バックプロパゲーション/グラジェント降下は、作成しているグラフの基底まで発生し、関数の重みと偏りだけで停止しません。したがって、tf.nn.nce_losstf.nn.sampled_softmax_lossの両方のinputパラメータも、embeddings行列のビルドで更新されています。

関連する問題