如何使用训练有素的char-rnn生成单词?

时间:2018-01-23 12:21:08

标签: char nlp recurrent-neural-network words sequence-generators

当训练char-rnn时,网络的权重是固定的。如果我使用相同的第一个字符,我怎么能得到不同的句子?比如两句“有什么不对?”和“我能为你做什么?” 具有相同的第一个单词“W”。 char-rnn可以生成两个不同的句子吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以通过 sampling 从同一个州获得不同的结果。看看Andrej Karpathy的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上找到确定性分发。但结果是 random ,因为代码执行np.random.choice而不是np.argmax。如果分布在某些字符处高度达到峰值,那么您在大多数情况下仍会获得相同的结果,但在大多数情况下,几个下一个字符很可能会被采样,从而改变整个生成的序列。

请注意,这不是唯一可能的采样程序:基于温度的采样更受欢迎。例如,您可以查看this post以获取概述。