用深度学习生成序列数据的通用方法,就是使用前面的标记作为输入,训练一个网络(通常是循环神经网络或卷积神经网络)来预测序列中接下来的一个或多个标记。例如,给定输入the cat is on the ma,训练网络来预测目标t,即下一个字符。与前面处理文本数据时一样,标记(token)通常是单词或字符,给定前面的标记,能够对下一个标记的概率进行建模的任何网络都叫作语言模型(language model)。语言模型能够捕捉到语言的潜在空间(latent space),即语言的统计结构。
一旦训练好了这样一个语言模型,就可以从中采样(sample,即生成新序列)。向模型中输入一个初始文本字符串(即条件数据(conditioning data)),要求模型生成下一个字符或下一个单词(甚至可以同时生成多个标记),然后将生成的输出添加到输入数据中,并多次重复这一过程。这个循环可以生成任意长度的序列,这些序列反映了模型训练数据的结构,它们与人类书写的句子几乎相同。在本节的示例中,我们将会用到一个LSTM层,向其输入从文本语料中提取的 N N N个字符组成的字符串,然后训练模型来生成第 N + 1 N+1 N+1个字符。模型的输出是对所有可能的字符做softmax,得到下一个字符的概率分布。这个LSTM叫作字符级的神经语言模型(character-level neural language model)。
# 对于不同的softmax温度,对概率分布进行重新加权import numpy as np
# original_distribution是概率值组成的一维Numpy数组,这些概率值之和必须等于1。temperature是一个因子,用于定量描述输出分布的熵。defreweight_distribution(original_distribution, temperature=0.5):
distribution = np.log(original_distribution)/ temperature
distribution = np.exp(distribution)