大家以前可能听过人工智能自动写诗或者是自动写小说的新闻。利用RNN就可以实现这种智能写作。

教你用RNN实现人工智能写作_语言模型

我们可以利用上面的RNN模型来实现智能写作。下面我来给大家详细解说一下这个模型。

假设我们要用这个模型来自动写一首诗,并且我们已经用大量的包含诗句的数据集对模型进行了训练,下面我们将对这个训练好的模型进行输出采样来让它自动生成诗句。

第1个时间步的输入a<0>和x<1>可以都是0向量。因为在智能写作时,我们并不需要任何输入。在输出预测值y’<1>时我们会用softmax来输出每一个字的概率。还记得之前我们提到过“词表”这个概念吗?就是我们自己会有一个数据库,里面存了很多单词。假设这个词表里面有1万个汉字。那么这个softmax就会输出1万个不同的概率。然后我们再从这1万个概率中挑一个概率最大那个,当然也可以随机挑一个。假设概率最大那个是“床”字。也就是说y’<1>就是“床”字。然后我们再把这个输出当做第2个时间步的输入。也就是说把y’<1>也就是“床”字以及a<1>输入到第2个时间步中。同理,第2个时间步也会有一个softmax来输出1万个概率,假设这次概率最大的是“前”字。以此类推,最后产生了一整首诗,“床前明月光,疑是地上霜,举头望明月,低头思故乡。”这是风流才子李白写的一首诗。大致意思是床前有位叫明月的姑娘已脱光了,她皮肤白嫩的就像地上的白霜一样。抬起头望着这位光溜溜的明月姑娘,低下头不禁地想起了远在故乡老婆。这首诗反映了诗人李白作为一个正常的男人,独自在外地打工,寻花问柳时的矛盾心情。

在“词表”中有时候可能会有两个特殊的词。一个我们用EOS来表示,另一个我们用UNK来表示。EOS用来表示句子的结尾。例如在生成序列时,如果生成了EOS,那么就说明一个完整的句子生成了。UNK表示未知的词。因为即使是再大的词表,也不能包含全世界所有的词汇。例如我的网名叫做“床长”,这个你肯定在字典里是查不到的,顶多你只能查到“船长”。如果模型在训练时遇到了未知的词,那么就会用UNK来表示。当然,如果在进行序列生成时输出了UNK,我们可以跳过它就是了。

另外语言模型还分“Word level model”和“Character level model”,也就是词级别模型和字母级别模型。这个用英语句子来举例比较好理解。词级别模型就是在每一个时间步输出的都是一个单词,例如y’<1>输出bed;和字母级别模型,在每一个时间步输出的都是一个字母,例如y’<1>输出b。这两种模型各有好处。例如字母级别的模型的词表就很小,因为在英语世界里就只有26个字母,如果区分大小写的话就是52个字母,当然你还可以把一些标点符号包到里面去,标点符号也不是很多。而且字母级别模型不会遇到未知的词,因为所有词都是由着26个字母组成的。但是普遍来说,大家都会选择用词级别模型。为什么呢?因为字母级别的模型需要的计算量太大了,因为他每次只输出一个字母。

在本教程后面的实战编程中我会带领大家来实现智能写作程序。