Как использовать обученного персонажа для генерации слов?

Когда char-rnn обучен, вес сети фиксирован. Если я использую один и тот же первый символ, как я могу получить другое предложение? Например, два предложения "Что не так?" и "Что я могу сделать для тебя?" имеют то же самое первое слово "W". Может ли char-rnn генерировать два разных предложения?

1 ответ

Решение

Да, вы можете получить разные результаты из одного и того же состояния путем выборки. Взгляните на min-char-rnn Андрея Карпати. Пример кода в строке 63:

def sample(h, seed_ix, n):
  """ 
  sample a sequence of integers from the model 
  h is memory state, seed_ix is seed letter for first time step
  """
  x = np.zeros((vocab_size, 1))
  x[seed_ix] = 1
  ixes = []
  for t in xrange(n):
    h = np.tanh(np.dot(Wxh, x) + np.dot(Whh, h) + bh)
    y = np.dot(Why, h) + by
    p = np.exp(y) / np.sum(np.exp(y))
    ix = np.random.choice(range(vocab_size), p=p.ravel())
    x = np.zeros((vocab_size, 1))
    x[ix] = 1
    ixes.append(ix)
  return ixes

Начиная с того же скрытого вектора h и семенной полукокса seed_ixвы будете иметь детерминированное распределение по следующему символу - p, Но результат случайный, потому что код выполняет np.random.choice вместо np.argmax, Если распределение на некотором символе сильно достигло максимума, большую часть времени вы все равно получите один и тот же результат, но в большинстве случаев высока вероятность того, что несколько следующих символов будут выбраны, что приведет к изменению всей сгенерированной последовательности.

Обратите внимание, что это не единственная возможная процедура отбора проб: выборка на основе температуры более популярна. Вы можете посмотреть, например, этот пост для обзора.

Другие вопросы по тегам