Muestreo negativo de flujo tensor

Estoy tratando de seguir el tutorial de udacity sobre tensorflow donde encontré las siguientes dos líneas para los modelos de inserción de palabras:

# 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)) 

Ahora entiendo que la segunda statement es para muestrear tags negativas. Pero la pregunta es ¿cómo sabe cuáles son las tags negativas? Todo lo que estoy proporcionando la segunda función es la entrada actual y sus tags correspondientes junto con el número de tags de las que quiero (negativamente) muestrear. ¿No existe el riesgo de muestrear desde el conjunto de entrada en sí mismo?

Este es el ejemplo completo: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/udacity/5_word2vec.ipynb

Puede encontrar la documentación para tf.nn.sampled_softmax_loss() aquí . Incluso hay una buena explicación del muestreo de candidatos proporcionado por TensorFlow aquí (pdf) .


¿Cómo sabe cuáles son las tags negativas?

TensorFlow seleccionará aleatoriamente clases negativas entre todas las clases posibles (para usted, todas las palabras posibles).

¿No existe el riesgo de muestrear desde el conjunto de entrada en sí mismo?

Cuando quiere calcular la probabilidad de softmax para su etiqueta verdadera, debe calcular: logits[true_label] / sum(logits[negative_sampled_labels] . Como el número de clases es enorme (el tamaño del vocabulario), hay muy pocas probabilidades de probar el true_label como una etiqueta negativa.
De todos modos, creo que TensorFlow elimina por completo esta posibilidad cuando se realiza un muestreo aleatorio. (EDITAR: @Alex confirma que TensorFlow hace esto por defecto)

El muestreo del candidato explica cómo se calcula la función de pérdida muestreada:

  • Calcule la función de pérdida en un subconjunto C de todas las muestras de entrenamiento L , donde C = T ⋃ S , T son las muestras en las clases objective y S son las muestras elegidas al azar en todas las clases.

El código que proporcionó usa tf.nn.embedding_lookup para obtener las entradas [batch_size, dim] embed .

Luego usa tf.nn.sampled_softmax_loss para obtener la función de pérdida muestreada:

  • softmax_weights: Un tensor de forma [num_classes, dim].
  • softmax_biases: Un tensor de forma [num_classes]. Los sesgos de clase.
  • incrustar: un tensor de forma [batch_size, dim].
  • train_labels: un tensor de forma [batch_size, 1]. Las clases objective T.
  • num_sampled: un int. El número de clases a muestrear aleatoriamente por lote. el número de clases en s .
  • vocabulary_size: El número de clases posibles.
  • sampled_values: predeterminado para log_uniform_candidate_sampler

Para un lote, las muestras objective son solo train_labels ( T ). Elige muestras num_sampled de embed aleatoriamente ( S ) como muestras negativas.

Se tomará una muestra uniforme de la embed respecto a softmax_wiehgt y softmax_bias. Dado que embed es incrustar [train_dataset] (de forma [batch_size, embedding_size]), si incrustar [train_dataset [i]] contiene train_labels [i], puede seleccionarse de nuevo, entonces no es una etiqueta negativa.

Según la página 2 de muestreo del candidato , hay diferentes tipos. Para NCE y muestreo negativo, NEG = S , que puede contener una parte de T ; para logística muestreada, softmax muestreado, NEG = ST borra explícitamente T.

De hecho, podría ser una oportunidad de tomar muestras del conjunto de trenes.