基于Andrej Karpathy的代码https://github.com/karpathy/char-rnn和Samy Bengio的纸张http://arxiv.org/abs/1506.03099
制作代码可以处理英语和汉字。这是我对lua的第一个触摸,所以弦乐过程似乎很愚蠢,但是效果很好。
我还添加了一个称为“ min_freq”的选项,因为中文的词汇大小很大,这使参数数字增加了很多。因此,删除一些罕见的角色可能会有所帮助。
Samy Bengio的纸张计划对NIPS15中复发性神经网络进行序列预测进行了抽样,提出了一种简单但功率的方法来暗示RNN。
在我的实验中,我发现它有很大帮助避免过度拟合并使测试损失更深。我只使用线性衰减。
使用-use_ss以打开或关闭计划的采样,默认为ON。 -start_ss是真实数据的开始,我建议使用1,因为我们的模型应该在一开始就学习数据而不会噪声。 -min_ss也非常重要,因为太多的噪声会损害性能。最后, -decay_ss是线性衰减率。
我添加了一个脚本来将由GPU训练的模型文件转换为CPU模型。您可以尝试以下操作:
$ th convert.lua gpu_model cpu_model根据Redis的子/酒吧,添加了Web演示,以便其他人轻松测试模型。我之所以使用Redis,是因为我找不到与Torch充分整合的好RPC或Web服务器的工作。您应该注意到演示是Ajax的异步。在Ubuntu上设置演示:安装Redis并启动它
$ wget http://download.redis.io/releases/redis-3.0.3.tar.gz
$ tar xzf redis-3.0.3.tar.gz
$ cd redis-3.0.3
$ make
$ sudo make install
$ redis-server &然后安装烧瓶和redis插件:
$ sudo pip install flask
$ sudo pip install redis
$ luarocks install redis-lua将您的模型放在在线_model中,将其重命名为“ Model.t7”,“启动后端”和“ Fontend脚本:”
$ nohup th web_backend.lua &
$ nohup python web_server.py & 请关注此设置您的实验。
该代码实现了多层复发性神经网络(RNN,LSTM和GRU),用于从字符级语言模型中进行培训/采样。该模型学会在序列中预测下一个字符的概率。换句话说,输入是一个文本文件,该模型学会了生成类似的文本。
该代码基础的上下文在我的博客文章中详细描述。项目页面上有一些数据集。
该代码最初是基于牛津大学机器学习类实用6的,而该课程又基于学习从Wojciech Zaremba执行代码的基础。它的大块也与我的Labmate Justin Johnson合作开发。
该代码用LUA编写,需要火炬。此外,您需要使用Luarocks安装nngraph和optim软件包,然后在安装火炬后可以执行这些操作:
$ luarocks install nngraph
$ luarocks install optim如果您想使用CUDA GPU计算,则首先需要安装CUDA工具包,然后是cutorch和cunn软件包:
$ luarocks install cutorch
$ luarocks install cunn如果您想使用OpenCL GPU计算,首先需要安装cltorch和clnn软件包,然后在培训过程中使用选项-opencl 1 :
$ luarocks install cltorch
$ luarocks install clnn所有输入数据都存储在data/目录中。您会注意到,在存储库中包含一个示例数据集(在文件夹data/tinyshakespeare中),该数据集由莎士比亚的一部分组成。我在项目页面上提供了更多数据集。
您自己的数据:如果您想使用自己的数据,请创建一个文件input.txt并将其放入data/中的文件夹中。例如, data/some_folder/input.txt 。您第一次运行培训脚本时,它将在data/some_folder中写两个便利性文件。
请注意,如果您的数据太小(1MB已被认为很小),则RNN不会有效地学习。请记住,它必须从头开始学习所有内容。
相反,如果您的数据大(大于2MB),请有信心增加rnn_size并训练更大的模型(请参见下面的培训详细信息)。它将工作得更好。例如,使用6MB,您可以轻松提高rnn_size 300甚至更多。适合我的GPU的最大的,并且我已经使用此代码训练的是rnn_size 700,使用num_layers 3(默认为2)。
例如,使用train.lua开始训练模型:例如:
$ th train.lua -data_dir data/some_folder -gpuid -1
-data_dir标志最重要,因为它指定了要使用的数据集。请注意,在此示例中,我们还将gpuid设置为-1,该gpuid告诉代码使用CPU训练,否则默认为GPU 0。对于各种选项,还有许多其他标志。请咨询$ th train.lua -help以获取全面的环境。这是另一个例子:
$ th train.lua -data_dir data/some_folder -rnn_size 512 -num_layers 2 -dropout 0.5
在训练模型时,它将定期将检查点文件写入cv文件夹。按照eval_val_every选项指定的数量迭代控制这些检查点的频率(例如,如果是1,则每次迭代都写了一个检查点)。这些检查点的文件名包含一个非常重要的数字:损失。例如,带有文件名的检查点lm_lstm_epoch0.95_2.0681.t7指出,此时,该模型在Epoch 0.95上(即它已经对培训数据进行了完整的通行证),并且验证数据的损失为2.0681。这个数字非常重要,因为它越低,检查点的工作越好。一旦开始生成数据(下面讨论),您将需要使用具有最低验证损失的模型检查点。请注意,这可能不一定是培训结束时的最后一个检查站(由于可能过度拟合)。
要注意的另一个重要数量是batch_size (称其为b), seq_length (称为s)以及train_frac和val_frac设置。批处理大小指定一次并行处理多少个数据流。序列长度指定每个块的长度,这也是梯度剪辑的极限。例如,如果seq_length为20,则梯度信号将永远不会反向传播超过20个时间步,并且该模型可能不会发现依赖关系长于该字符数量的长度。在运行时,您的输入文本文件具有n个字符,首先将它们分为大小BX的块。然后将这些块分配给三个拆分:根据frac设置,火车/阀/测试。如果您的数据很小,则可能只有默认设置,您总共只有很少的块(例如100)。这是不好的:在这些情况下,您可能需要降低批处理大小或序列长度。
您还可以使用init_from从先前保存的检查点进行INET参数。
我们可以使用这些检查点生成文本(下一步讨论)。
给定一个检查点文件(例如写给cv文件),我们可以生成新文本。例如:
$ th sample.lua cv/some_checkpoint.t7 -gpuid -1
确保如果您的检查站已经接受了GPU的培训,它也可以用GPU取样,反之亦然。否则,代码将(当前)抱怨。与火车脚本一样,有关完整选项,请参见$ th sample.lua -help 。一个重要的是(例如) -length 10000 ,它将生成10,000个字符(默认值= 2000)。
温度。您可能想使用很多很多内容的一个重要参数是-temperature ,它在范围[0,1]中的数字(不包括在内),默认值= 1。温度将预测的对数概率划分为软磁体之前,因此较低的温度会导致模型更可能产生更大的可能性,但也更有填充和保守的预测。较高的温度会导致模型有更多的机会并增加结果的多样性,但要付出更多错误。
启动。也可以使用-primetext使用一些启动文本来启动模型。这是从RNN开始使用一些硬编码字符的RNN,可以在开始生成文本之前在某些上下文中加热它。
愉快的抽样!
如果您对机器学习或神经网络有些陌生,则可能需要一些专业知识才能获得良好的模型。跟踪最重要的数量是您的训练损失(在培训期间打印)和验证损失(偶尔在验证数据上运行RNN时偶尔打印(默认每1000次迭代))。尤其:
控制模型的两个最重要的参数是rnn_size和num_layers 。我建议您始终使用2/3的num_layers 。 rnn_size可以根据您拥有的数据进行调整。跟踪此处的两个重要数量是:
这两个应大约相同的数量级。这有点棘手。这里有一些例子:
rnn_size更大。获得非常好的模型的获胜策略(如果您有计算时间)是要始终错误地使网络更大(您愿意等待它计算的大小),然后尝试不同的辍学值(在0,1之间)。无论哪种型号具有最佳的验证性能(在检查点文件名中编写的损失,低为好),都是您最终应使用的损失。
在深度学习中运行许多不同的模型非常常见,最终以任何检查点获得最佳的验证性能。
顺便说一句,培训和验证拆分的大小也是参数。确保您在验证集中有大量数据,或者否则验证性能将是嘈杂的,并且不太有用。
麻省理工学院