Почему sampled_softmax_loss Tensorflow заставляет вас использовать смещение, когда эксперты рекомендуют не использовать смещение для Word2Vec?

Все реализации тензорного потока Word2Vec, которые я видел, имеют уклон в функцию softmax отрицательной выборки, в том числе на официальном сайте тензорного потока.

https://www.tensorflow.org/tutorials/word2vec#vector-representations-of-words

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

Это из бесплатного курса глубокого обучения Google https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/udacity/5_word2vec.ipynb

 loss = tf.reduce_mean(
    tf.nn.sampled_softmax_loss(weights=softmax_weights, biases=softmax_biases, inputs=embed,
                               labels=train_labels, num_sampled=num_sampled, num_classes=vocabulary_size))

Однако, как из лекций Эндрю Нг, так и Ричарда Сочера, они не включают предвзятость в свои softmax отрицательных выборок.

Даже там, где возникла эта идея, Миколов утверждает, что:

смещения в нейросети не используются, так как существенного улучшения производительности не наблюдалось — следуя бритве Оккама, решение настолько простое, насколько оно должно быть.

Миколов Т.: Статистические языковые модели на основе нейронных сетей, с. 29 http://www.fit.vutbr.cz/~imikolov/rnnlm/thesis.pdf

Так почему же в официальных реализациях тензорного потока есть смещение, и почему, похоже, нет возможности не включать смещение в функцию sampled_softmax_loss?


person Patrick J Fitzgerald    schedule 24.04.2018    source источник


Ответы (1)


упражнение, на которое вы ссылаетесь, определяет softmax_biases как нули:

softmax_biases = tf.Variable(tf.zeros([vocabulary_size]))

То есть: они не используют фактическую предвзятость в своем примере word2vec.

Функция sampled_softmax_loss() является общей и используется во многих нейронных сетях; его решение потребовать аргумент biases не связано с тем, что лучше для конкретного приложения нейронной сети (word2vec), и подходит для случая word2vec, разрешая (как здесь) все нули.

person gojomo    schedule 25.04.2018
comment
Нужно ли мне также указывать не тренировать смещение, чтобы они оставались на нуле? - person Patrick J Fitzgerald; 04.05.2018
comment
Я не знаю; если вы проверите смещения после обучения, они были изменены? - person gojomo; 04.05.2018
comment
Они это сделали, поэтому мне пришлось явно указать, чтобы обучались только другие переменные. - person Patrick J Fitzgerald; 04.05.2018
comment
Ага! Просто любопытно, как вы указываете, что не тренируете предубеждения? - person gojomo; 04.05.2018
comment
оптимизатор = tf.train.AdamOptimizer().minimize(cost, var_list=[переменная 1, которую вы хотите обучить, переменная 2, которую вы хотите обучить, и т. д.]) - person Patrick J Fitzgerald; 04.05.2018
comment
Возможно ли, что обучение смещений приводит к лучшим значениям (хотя это обычно не делается в других пакетах word2vec после исходной статьи), и поэтому пример Google Deep Learning, который вы цитируете, оставляет их такими? (Кажется, комментарий прямо над строкой minimize() обращает внимание на тот факт, что все значения Variable оптимизированы; может ли быть другой способ заморозить предубеждения, заключающийся в том, чтобы не заключать результат tf.zeros() в tf.Variable()? - person gojomo; 04.05.2018