2016-06-07 4 views
7

Я пытаюсь следовать Udacity учебника по tensorflow, где я наткнулся на следующие две строк для слов встраивания моделей:Tensorflow отрицательного отбора проб

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

Теперь я понимаю, что второе утверждение для выборки отрицательных меток. Но вопрос в том, как он знает, что такое негативные метки? Все, что я предоставляю второй функции, это текущий ввод и соответствующие метки, а также количество меток, которые я хочу (отрицательно) отбирать. Не существует ли риск выборки из набора входных данных сам по себе?

Это полный пример: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/udacity/5_word2vec.ipynb

ответ

8

Вы можете найти документацию для tf.nn.sampled_softmax_loss()here. Существует даже хорошее объяснение Кандидат выборки от TensorFlow here (pdf).


Как он знает, что негативные ярлыки?

TensorFlow будет произвольно выбирать отрицательные классы среди всех возможных классов (для вас, все возможные слова).

Не существует ли риск отбора проб из набора входных данных сам по себе?

Если вы хотите вычислить вероятность softmax для вашей истинной метки, вы вычисляете: logits[true_label]/sum(logits[negative_sampled_labels]. Поскольку количество классов огромно (размер словаря), очень мало шансов пробовать true_label как отрицательную метку.
В любом случае, я думаю, что TensorFlow полностью удаляет эту возможность при случайном отборе проб. (EDIT: @Alex подтверждает TensorFlow делает это по умолчанию)

+5

«Я думаю, что TensorFlow полностью удаляет эту возможность при случайной выборке». Верный! Есть флаг: 'remove_accidental_hits': bool. следует ли удалять «случайные удары», когда выбранный класс равен одному из целевых классов. Значение по умолчанию - True. ' – Alex

+0

Кто-нибудь знает способ предоставления весов для отбора проб? –

1

Candidate sampling объясняет, как вычисляется выборочный функция потерь:

  • Compute функции потерь в подмножестве C всех учебных образцов L, где C = T ⋃ S, T - это образцы в целевых классах, а S - случайно выбранные образцы во всех классах.

код вы предоставили использует tf.nn.embedding_lookup, чтобы получить входы [batch_size, тусклые] embed.

Затем он использует tf.nn.sampled_softmax_loss, чтобы получить сэмпл функцию потерь:

  • softmax_weights: тензором формы [num_classes, тусклое].
  • softmax_biases: Тензор формы [num_classes]. Класс смещается.
  • embed: Тензор формы [batch_size, dim].
  • train_labels: Тензор формы [batch_size, 1]. Целевые классы T.
  • num_sampled: int. Количество классов для случайной выборки за партию. numbed классов в S.
  • vocabulary_size: Число возможных классов.
  • sampled_values: по умолчанию log_uniform_candidate_sampler

Для одной партии, целевые выборки только train_labels (Т). Он выбирает num_sampled образцы от embed случайно (S), чтобы быть отрицательными образцами.

Он будет равномерно от embed уважать softmax_wiehgt и softmax_bias. Поскольку embed является вложением [train_dataset] (формы [batch_size, embedding_size]), если вложения [train_dataset [i]] содержат train_labels [i], он может быть выбран обратно, то это не отрицательная метка.

Согласно Candidate sampling страница 2, существуют разные типы. Для НСЕ и отрицательной выборки NEG = S, который может содержать часть T; для выборочной логистики, сэмплированный softmax, NEG = S-T явно удалять T.

Действительно, это может быть шанс отбора проб из набора train_.

Смежные вопросы