Обучение языковой модели TensorFlow с помощью NCE или выборки softmax

Я адаптирую учебник TensorFlow RNN для обучения языковой модели с потерей NCE или сэмплированным softmax, но я все еще хочу сообщить о недоумениях. Однако недоумения, которые я получаю, очень странные: за NCE я получаю несколько миллионов (ужасно!), тогда как за семплированный softmax я получаю PPL 700 после одной эпохи (слишком хорошо, чтобы быть правдой?!). Интересно, что я делаю неправильно.

Вот моя адаптация к PTBModel:

class PTBModel(object):
  """The PTB model."""

  def __init__(self, is_training, config, loss_function="softmax"):
    ...
    w = tf.get_variable("proj_w", [size, vocab_size])
    w_t = tf.transpose(w)
    b = tf.get_variable("proj_b", [vocab_size])

    if loss_function == "softmax":
      logits = tf.matmul(output, w) + b
      loss = tf.nn.seq2seq.sequence_loss_by_example(
          [logits],
          [tf.reshape(self._targets, [-1])],
          [tf.ones([batch_size * num_steps])])
      self._cost = cost = tf.reduce_sum(loss) / batch_size
    elif loss_function == "nce":
      num_samples = 10
      labels = tf.reshape(self._targets, [-1,1])
      hidden = output
      loss = tf.nn.nce_loss(w_t, b,                           
                            hidden,
                            labels,
                            num_samples, 
                            vocab_size)
    elif loss_function == "sampled_softmax":
      num_samples = 10
      labels = tf.reshape(self._targets, [-1,1])
      hidden = output
      loss = tf.nn.sampled_softmax_loss(w_t, b,
                                        hidden, 
                                        labels, 
                                        num_samples,
                                        vocab_size)

    self._cost = cost = tf.reduce_sum(loss) / batch_size
    self._final_state = state

Вызов этой модели выглядит следующим образом:

mtrain = PTBModel(is_training=True, config=config, loss_function="nce")
mvalid = PTBModel(is_training=True, config=config)

Я не делаю здесь ничего экзотического, изменение функции потерь должно быть довольно простым. Так почему же это не работает?

Спасибо, Джорис


person niefpaarschoenen    schedule 14.07.2016    source источник


Ответы (1)


С базовой моделью (Softmax) в одну эпоху вы должны получить намного лучше, чем 700. Изменяя потери, вам может потребоваться перенастроить некоторые гиперпараметры, в частности скорость обучения.

Кроме того, ваша модель оценки должна сообщать об истинных затруднениях с помощью Softmax — вы делаете это?

person Oriol Vinyals    schedule 14.07.2016
comment
Похоже, что сэмплированный softmax действительно работает, он заканчивается на 129 с 20 отрицательными образцами после 13 эпох (SmallConfig). - person niefpaarschoenen; 14.07.2016
comment
С другой стороны, NCE все еще меня не устраивает. Недоумения (вычисленные с полным softmax, как вы говорите) исчисляются миллионами. Согласен, что мне нужно перенастроить, но даже без настройки я ожидаю, что недоумения немного упадут, а не увеличатся с ~ 10k до 2M ?! - person niefpaarschoenen; 14.07.2016
comment
К вашему сведению: NCE фактически дает разумные значения для небольшого количества временных шагов. Он начинает сходить с ума, когда вы увеличиваете это число. - person niefpaarschoenen; 26.07.2016
comment
@niefpaarschoenen привет, я сейчас работаю над этим. Вы заметили улучшение производительности с помощью NCE? В частности, в терминах слова в секунду? Спасибо - person pltrdy; 21.11.2016