跳到内容
用于火炬的字符级语言模型的多层递归神经网络(LSTM,GRU,RNN)
卢阿
分支 硕士
克隆或下载

读数

字符递归神经网络

本代码实现多层递归神经网络(RNN,LSTM,GRU)用于字符级语言模型的训练/采样。换言之,该模型以一个文本文件作为输入,并训练一个递归神经网络,该神经网络学习预测序列中的下一个字符。然后,RNN可以用来生成文本字符,其字符将看起来像原始训练数据。这个代码库的上下文在我的文章中详细描述。博客帖子.

如果您对Trase/Lua/神经网络是新的,那么知道这个代码真的只是一个稍微好一些的版本可能会有帮助。100线要旨我用Python/NuMPy写的。另外,该回购中的代码允许多个层,使用LSTM而不是香草RNN,具有更多的用于模型检查点的支持代码,并且当然是更高效的,因为它使用小批量并且可以在GPU上运行。

更新:火炬RNN

贾斯廷约翰逊(@ JCJSONSON)最近重新从一个更好的/更小/更清洁/更快的火炬代码基础重新开始Car RNN。它的名字火炬RNN. 它使用亚当优化和硬编码的RNN/LSTM向前/向后通过空间/时间效率。这也避免了这个模型中的克隆模型带来的麻烦。换句话说,火炬RNN应该是默认的char RNN实现,而不是使用这个代码库中的一个。

要求

此代码是在Lua编写的,需要手电筒. 如果你在Ubuntu,在你的家庭目录中安装手电筒可能看起来像:

$CURL -HTTPS://RAW.GithuBueSercTun.COM/TrCH/EZStuts/Mask/Studio DEPSγBASH $Git克隆HTTPS://GITHUBCOM/TrCH/DistRO.Git~/火炬——递归$CD ~手电筒$/安装γ并在最后输入“是”来修改您的BASHC$来源 ~BASHC

详情请参阅火炬安装文件。在安装手电筒之后,我们需要使用更多的软件包。卢卡克斯(已经有了火炬的安装)。特别地:

$LuAROCKS安装NNGRADIO$LUAROCKS安装OpTime$LuAROCKS安装NN

如果你想用CUDA在NVIDIA GPU上训练(这可能快到15X左右),你当然需要GPU,你必须安装CUDA工具包. 然后得到刀口库恩包裹

$LuAROCKS安装CutoRCH$LuAROCKS安装CUNN

如果您想使用OpenCL GPU来代替(例如ATI卡),您将需要安装手电筒共轭神经网络包,然后使用选项- OpenCL 1训练期间(克拉克问题):

$LoAROCKS安装CLKORK$LUAROCKS安装CLNN

用法

数据

所有输入数据都存储在数据目录您会注意到在RePO中包含了一个示例数据集(在文件夹中)数据/ TyyySakes由莎士比亚作品的一个子集组成。我正在提供更多的数据集本页.

自己的数据如果您想使用自己的数据,则创建单个文件。输入文件并将其放入文件夹中数据目录例如,数据/其他文件夹/输入. 第一次运行训练脚本时,它会进行一些预处理,并将两个方便的缓存文件写入数据/文件夹.

数据集大小注意,如果你的数据太小(1MB已经被认为很小),RNN将不能很有效地学习。记住,必须从零开始学习一切。相反,如果你的数据很大(超过2MB),就有信心增加。RNNE尺寸训练一个更大的模型(参见下面的训练细节)。它会起作用明显好. 例如6MB,你可以很容易地达到。RNNE尺寸300甚至更多。最大的适合我的GPU和我已经训练了这个代码是RNNE尺寸700与数字层3(默认为2)。

培训

开始使用模型训练卢亚训练. 作为一个明智的检查,在包含的示例数据集上运行简单地尝试:

第1次训练

注意,我们在这里设置标志GPUIDto - 1,它告诉代码使用CPU进行训练,否则默认为GPU 0。有许多其他标志可供选择。查阅第六次训练用于全面设置。这是另一个训练更大网络的例子,也展示了如何在自己的自定义数据集上运行(这已经假定数据/其他文件夹/输入存在):

$TH培训。Lua - DATAYDIR数据/某个文件夹- RNNY大小512 - NUMY层2 -辍学0.5

检查点。当模型正在训练时,它会周期性地将检查点文件写入履历文件夹写入这些检查点的频率用迭代次数来控制,如用每一个选项(例如,如果这是1,那么每次迭代都会写入一个检查点)。这些检查点的文件名包含一个非常重要的数字:损失. 例如,带有文件名的检查点LMY-LSTMyEng0.0.95Y2.061.1.T7指示在该点上的模型是历元0.95(即它几乎已经完成了训练数据的一个完整的传递),并且验证数据的损失是2.0681。这个数字非常重要,因为它越低,检查点就越有效。一旦开始生成数据(下面讨论),您将希望使用报告最低验证丢失的模型检查点。注意,这可能不一定是训练结束时的最后一个检查点(由于可能的过度拟合)。

另一个需要注意的重要量是批量尺寸(称之为B)塞克长度(称之为S),以及训练压裂瓦拉法设置批处理大小指定一次并行处理多个数据流。序列长度指定每个流的长度,这也是梯度可以在时间上向后传播的极限。例如,如果塞克长度是20,那么梯度信号将不会反向传播超过20个时间步长,并且该模型可能不会。发现在字符数上比这个长度更长的依赖关系。因此,如果你有一个非常困难的数据集,那里有很多长期的依赖关系,你会想要增加这个设置。现在,如果在运行时输入的文本文件有N个字符,则这些第一个文件都被分成大小块。BXS. 这些块然后被分配到三个分支:根据压裂设置默认情况下训练压裂是0.95和瓦拉法是0.05,这意味着我们的数据块的95%将被训练,并且5%的块将被用来估计验证丢失(并因此泛化)。如果您的数据很小,那么默认设置可能只会有非常少的块(例如100)。这是不好的:在这些情况下,您可能想要减少批量大小或序列长度。

注意,还可以使用以前保存的检查点初始化参数。来自于.

抽样

给定一个检查点文件(如写入的文件)履历我们可以生成新的文本。例如:

$TAMPLU.LUA CV/SONTH检查点。T7- GPUID - 1

确保如果你的检查点是用GPU训练的,它也是用GPU采样的,反之亦然。否则代码将(目前)抱怨。与列车脚本一样,请参见第三个样本用于完全选项。其中一个重要的例子是-长度10000生成10000个字符(缺省值=2000)。

温度. 您可能想玩的一个重要参数是温度在范围(0, 1)(0不包括),默认值=1。温度是在SOFTMax之前划分预测的对数概率,因此较低的温度将使模型更可能,但也更无聊和保守的预测。较高的温度使模型获得更多的机会并增加结果的多样性,但代价是更多的错误。

预充. 也可以用一些起始文本来使用模型来初始化模型。PrimeExcel. 这开始了RNN与一些硬编码字符到温暖的它在生成文本之前有一些上下文。有趣的PrimeTeXe可能是PrimeTeXT“生命的意义”.

基于GPU的训练,但在CPU上进行采样. 现在的解决方案是使用转换程序将GPU检查点转换为CPU检查点的脚本。在不久的将来,你将不必明确地这么做。例如。:

$Twitter CpPuCpPug检查点. LuaCV/LMY-LSTMMYECHCH30.0Y1.1.550.T7

将创建一个新文件CV/LMY-LSTMLEPOCH30.0Y1.1.350.T7YCPU.T7可以与示例脚本一起使用- GPUID - 1对于CPU模式。

快乐取样!

提示和技巧

监控验证损失与培训损失

如果你对机器学习或神经网络有一些新的知识,那么可以获得一些专业知识来获得好的模型。要跟踪的最重要的量是您的训练损失(在训练期间打印)和验证损失之间的差异(当RNN运行在验证数据上时,每隔一段时间打印一次(默认每1000次迭代))。特别地:

  • 如果你的训练损失远低于验证损失,那么这意味着网络可能是过度拟合. 解决这一问题的方法是减少网络规模,或者增加辍学率。例如,你可以尝试0.5的辍学等等。
  • 如果你的训练/验证损失大约相等,那么你的模型是欠拟合. 增加模型的大小(每层的数量或原始神经元的数量)

近似参数数

控制模型的两个最重要的参数是RNNE尺寸数字层. 我建议你总是使用数字层2/3个。这个RNNE尺寸可以根据你有多少数据进行调整。这里要记录的两个重要量是:

  • 模型中的参数数目。这是在你开始训练时打印出来的。
  • 数据集的大小。1MB文件大约有100万个字符。

这两个应该是相同的数量级。说起来有点棘手。下面是一些例子:

  • 我有一个100MB的数据集,我使用默认的参数设置(目前正在打印150 K参数)。我的数据大小明显更大(100密耳>0.15密耳),所以我预计会严重不足。我想我可以负担得起。RNNE尺寸更大的。
  • 我有一个10MB数据集,运行一个1000万参数模型。我有点紧张,我正在仔细监控我的确认损失。如果它比我的训练损失大,那么我可能想尝试增加辍学一点,看看它是否会导致验证丢失。

最佳模型策略

获得非常好的模型(如果你有计算时间)的获胜策略是总是使网络变得更大(如你愿意等待它计算的那么大),然后尝试不同的辍学值(在0,1之间)。任何模型都有最好的验证性能(损失,写在检查点文件名,低是好的)是你应该在最后使用的。

在深度学习中,使用许多不同的超参数设置来运行许多不同的模型是非常普遍的,并且最终采用任何检查点给出最佳的验证性能。

顺便说一下,训练和验证分割的大小也是参数。确保在验证集中有相当数量的数据,否则验证性能会很嘈杂,并不是非常有用。

附加指针和确认

这个代码最初是基于牛津大学机器学习类的。实用6这又是基于学会执行来自WojCiC.ZReMBA的代码。其中的一部分也是和我的同事合作开发的。贾斯廷约翰逊.

要了解更多关于RNN语言模型,我建议看:

许可证

麻省理工学院

此时不能执行此操作。