2017-05-05 2 views
1

ich unten an this sample code
im Code-Schnipsel am referreing:tensorflow basic word2vec Beispiel: Sollten wir keine Gewichte [nce_weight Transpose] für die Darstellung und nicht die Einbettungsmatrix verwenden?

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) 

Jetzt NCE_Loss Funktion ist nichts anderes als eine einzelne verborgene Schicht neuronales Netz mit softmax an der optput Schicht [zu wissen, ist dauert nur wenige negative Probe]

Dieser Teil des Diagramms wird nur die Gewichte des Netzwerks aktualisieren, es tut nichts zur "embeddings" Matrix/Tensor.

also ideal sobald das Netzwerk trainiert ist, müssen wir es wieder einmal durch die embeddings_matrix durchlaufen und dann mit der Transponierung der "nce_weights" multiplizieren [bedenkt es als den gleichen Gewicht Auto-Encoder, am Eingang & Ausgabeschichten] zu erreichen Sie die verborgene Layer-Darstellung jedes Wortes, das wir nennen word2vec (?)

Aber wenn Sie auf den späteren Teil des Codes schauen, wird der Wert der embeddings Matrix eine Wortdarstellung verwendet. This

Auch die tensorflow doc for NCE loss erwähnt Eingang (auf die wir embed, sind vorbei, die embeddings verwendet) Aktivierungswerte als nur die erste Schicht Eingang.

inputs: A Tensor of shape [batch_size, dim]. The forward activations of the input network. 

Eine normale Backpropagation stoppt an der ersten Schicht des Netzes, diese Implementierung von NCE Verlust der Fall ist, geht darüber hinaus und breitet sich um den Verlust an die Eingangswerte (und damit zu dem Einbettungs)?

Dies scheint ein zusätzlicher Schritt? Refer this für warum ich es einen zusätzlichen Schritt nenne, hat er die gleiche Erklärung.

Antwort

1

Want Ich habe Lesung herausgefunden und durch tensorflow geht, ist, dass

obwohl die ganze Sache einzelne verborgene Schicht neuronales Netz ist in der Tat ein Auto-Encoder. Aber die Gewichte sind nicht gebunden, was ich angenommen habe.

Der Encoder besteht aus der Gewichtsmatrix embeddings und der Decoder besteht aus nce_weights. Und jetzt embed ist nichts als die versteckte Schicht Ausgabe, durch Multiplikation der Eingabe mit embeddings gegeben.

So werden embeddings und nce_weights beide in der Grafik aktualisiert werden. Und wir können jede der beiden Gewichtsmatrix wählen, embeddings mehr bevorzugt ist hier.

Edit1:

tatsächlich sowohl tf.nn.nce_losstf.nn.sampled_softmax_loss und die Parameter, Gewichte und Bias für den Eingang Weights(tranpose) X + bias, objektive Funktion, die [refer] logistischen Regressions/softmax Funktion sein kann.

Aber die Rückausbreitung/Gradientenabfallsaktualisierung geschieht, bis die eigentliche Basis des Graphen Sie bauen und endet nicht an den Gewichten und Vorspannung der Funktion nur.Daher werden auch die input Parameter in tf.nn.nce_loss und tf.nn.sampled_softmax_loss aktualisiert, die wiederum aus embeddings Matrix aufgebaut sind.

Verwandte Themen