Как использовать обученного персонажа для генерации слов?
Когда 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
, Если распределение на некотором символе сильно достигло максимума, большую часть времени вы все равно получите один и тот же результат, но в большинстве случаев высока вероятность того, что несколько следующих символов будут выбраны, что приведет к изменению всей сгенерированной последовательности.
Обратите внимание, что это не единственная возможная процедура отбора проб: выборка на основе температуры более популярна. Вы можете посмотреть, например, этот пост для обзора.