前言
学习RNN的时候很多人应该都有看过Andrej Karpathy写的The Unreasonable Effectiveness of Recurrent Neural Networks,使用基于字符粒度的RNN让机器学会自己生成文本,比如令自己训练的RNN学会写歌词、写代码、写小说、写诗,听着就很新奇。
github上虽然已经有实现好的Char RNN,比如
1. https://github.com/karpathy/char-rnn
2. https://github.com/crazydonkey200/tensorflow-char-rnn
但是想要学习,最好的方式就是自己动手实现一遍。自己写一遍好处还是很多的,比如加深对RNN(LSTM)的理解,可以熟悉深度学习的框架。因为我主要用tensorflow,所以就基于tensorflow实现了一遍Char-RNN。
注:本文使用的tensorflow版本为1.0.0
个人经验,在实现的过程中最好是抛开别人代码的影响,只根据基本理论以及所用的框架的API文档一步步把代码写出来跑通,这样自己的收益才是最大的。
模型选择
要让机器生成文本,本质上是需要一个语言模型。语言模型可以用来评估一句话是自然语言的概率,即根据一句话中已观测到的词,预测下一个词出现的概率。也就是要能够处理序列数据,根据已有的序列数据,推断接下来可能的数据。如一句话“已经到了午餐时间,我正准备去吃{?}”,根据前面的描述,可以推断“吃”字背后是要接上可食用的东西,并且是可以作为午餐的,可能是“饭”、“面”等等,通常不可能是“汽车”、“树木”之类…因此我们需要一个能够处理序列数据,并且能够抽象出过去序列与任务相关方面的信息,再根据这些信息预测未来的模型。
神经网络中,RNN天然适合用于处理序列数据,它可以提取任意长度序列 (x(t),x(t−1),