2016-06-07 17 views
7

Ich versuche, die Udacity Tutorial auf tensorflow zu folgen, wo ich über die folgenden zwei Zeilen für Wort Einbettung Modelle kam:Tensorflow negativer Sampling

# Look up embeddings for inputs. 
    embed = tf.nn.embedding_lookup(embeddings, train_dataset) 
    # 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)) 

Jetzt ich, dass die zweite Aussage verstehe zum Abtasten negative Etikett ist. Aber die Frage ist, woher weiß es, was die negativen Etiketten sind? Alles, was ich die zweite Funktion zur Verfügung stelle, ist die aktuelle Eingabe und ihre entsprechenden Etiketten zusammen mit der Anzahl der Etiketten, von denen ich (negativ) abtasten möchte. Besteht nicht die Gefahr, dass die Eingabe an sich selbst erfolgt?

Dies ist die vollständige Beispiel: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/udacity/5_word2vec.ipynb

Antwort

8

Sie in der Dokumentation zu tf.nn.sampled_softmax_loss()here finden. Es gibt sogar eine gute Erklärung von Candidate Sampling zur Verfügung gestellt von TensorFlow here (pdf).


Woher weiß er, was die negativen Etiketten sind?

TensorFlow wählt nach dem Zufallsprinzip negative Klassen aus allen möglichen Klassen (für Sie alle möglichen Wörter).

Besteht nicht das Risiko einer Stichprobenentnahme aus dem Eingang selbst?

Wenn Sie die Softmax-Wahrscheinlichkeit für Ihre echte Beschriftung berechnen möchten, berechnen Sie: logits[true_label]/sum(logits[negative_sampled_labels]. Da die Anzahl der Klassen sehr groß ist (die Größe des Vokabulars), ist es sehr unwahrscheinlich, dass das true_label als negatives Label abgetastet wird.
Wie auch immer, ich denke, TensorFlow entfernt diese Möglichkeit bei der zufälligen Stichprobe. (EDIT: @ Alex bestätigt TensorFlow tut dies standardmäßig)

+5

"Ich denke, dass TensorFlow diese Möglichkeit bei der zufälligen Stichprobenentnahme komplett beseitigt." Richtig! Da ist die Flagge: 'remove_accidental_hits': A bool. ob "zufällige Treffer" entfernt werden sollen, wobei eine ausgewählte Klasse einer der Zielklassen entspricht. Der Standardwert ist "True". – Alex

+0

Kennt jemand eine Möglichkeit, Stichprobengewichte bereitzustellen? –

1

Candidate sampling erklärt, wie die abgetastete Verlustfunktion berechnet wird:

  • Berechne die Verlustfunktion in einer Untergruppe C aller Trainingsmuster L, Wobei C, T die Stichproben in Zielklassen und S die zufällig ausgewählten Stichproben in allen Klassen sind.

Der Code, den Sie tf.nn.embedding_lookup vorgesehen verwendet die Eingänge [batch_size, dim] embed zu bekommen.

Dann verwendet sie tf.nn.sampled_softmax_loss die abgetastete Verlustfunktion zu erhalten:

  • softmax_weights: Ein Tensor der Form [num_classes, dim].
  • softmax_biases: Ein Tensor der Form [num_classes]. Die Klasse verzerrt.
  • Einbetten: Ein Tensor der Form [batch_size, dim].
  • train_labels: Ein Tensor der Form [batch_size, 1]. Die Zielklassen T.
  • num_sampled: An int. Die Anzahl der Klassen, die pro Batch zufällig ausgewählt werden. die Anzahl der Klassen in S.
  • vocabular_size: Die Anzahl der möglichen Klassen.
  • sampled_values:

Für eine Charge, die Zielproben sind nur train_labels (T) log_uniform_candidate_sampler Standard. Es wählt num_sampled Proben aus embed nach dem Zufallsprinzip (S) zu negativen Proben sein.

Es wird gleichmäßig von embed Bezug auf die Softmax_wieghgt und Softmax_Bias. Seit embed ist Einbettungen [train_dataset] (von Form [Batch_Size, Einbettung_Größe]), wenn Einbettungen [Zug_Dataset [i]] Zug_Labels [i] enthält, könnte es zurück ausgewählt werden, dann ist es keine negative Bezeichnung.

Nach Candidate sampling Seite 2 gibt es verschiedene Arten. Für NCE und negative Probenahme, NEG = S, die einen Teil von T enthalten können; für Stichprobenlogistik, Stichprobe softmax, NEG = S-T explizit löschen T.

In der Tat könnte es eine Chance von Stichproben aus Train_set sein.