深度学习小课堂:如何利用递归神经网络生成文本?
点击上方关注,All in AI中国
作者:Gilbert Tanner
深度学习可用于做许多有趣的事情,但人们通常可能会觉得只有那些最聪明的工程师才能创建这样的应用程序。但事实并非如此。
通过Keras和其他高级深度学习库,无论对深度学习理论和内部工作的理解如何,每个人都可以创建和使用深度学习模型。
在这篇文章中,我们将看看如何使用递归神经网络以亚瑟·柯南·道尔(Sir Arthur Conan Doyle)的风格,使用他的著作《夏洛克·福尔摩斯的历险记》作为我们的数据集创建新文本。
我们可以从免费数字图书馆Gutenberg的网站获取数据。(http://www.gutenberg.org/ebooks/1661?msg=welcome_stranger)
我们只需要将这本书保存为文本(.txt)文件,并删除文本中嵌入的Gutenberg页眉和页脚。如果你不想自己这样做,可以从我的Github获取文本以及本文中涉及的所有代码。
https://github.com/TannerGilbert/Keras-Tutorials/tree/master/4.%20LSTM%20Text%20Generation
递归神经网络
François Deloche展开的递归神经网络(RNN)
递归神经网络(RNN)是用于顺序数据的现有技术算法。这是因为他们可以通过内部记忆记住他们以前的输入。
在本文中,并不会深入探讨递归神经网络如何工作,但如果你有兴趣,可以观看解释递归神经网络(RNN)的工作原理视频。
https://programmingwithgilbert.firebaseapp.com/videos/machine-learning-explained/recurrent-neural-networks-lstm-explained
或者可以查看Niklas Donges的这篇精彩文章。
https://towardsdatascience.com/recurrent-neural-networks-and-lstm-4b601dd822a5
创建数据集
像往常一样,我们将开始创建数据集。为了使递归神经网络(RNN)能够使用我们提供的文本数据,我们需要将其转换为数值。然后,我们将创建一个字符序列作为我们的X值,并使用以下字符作为我们的Y值。最后,我们将数据转换为布尔值数组。
首先,我们将加载数据并创建从字符到整数和整数到字符的映射:
为了获得我们可用于训练模型的有价值数据,我们将把数据分成长度为40个字符的子序列。然后我们将数据转换为布尔数组。
递归神经网络模型
尽管创建递归神经网络(RNN)听起来很复杂,但使用Keras实现起来相当容易。我们将创建一个具有以下结构的简单递归神经网络(RNN):
(1)LSTM层:将学习序列
(2)密集(完全连接)层:每个唯一字符的一个输出神经元
(3)Softmax激活:将输出转换为概率值
我们将使用RMSprop优化器和分类Crossentropy损失函数。https://keras.io/losses/#categorical_crossentropy
辅助函数
为了看到我们的模型在训练时所做的改进,我们将创建两个辅助函数。这两个函数来自Keras团队的官方LSTM文本生成示例。
https://github.com/keras-team/keras/blob/master/examples/lstm_text_generation.py
第一个辅助函数将从输出(概率数组)中采样索引。它有一个名为temperature(温度)的参数,它定义了函数在创建文本时的自由度。第二个将在每个周期结束时生成具有四个不同temperature(温度)的文本,因此我们可以看到我们的模型如何。
我们还将定义另外两个回调函数。第一个叫做ModelCheckpoint(模型检查点)。它会在每个时期保存我们的模型,减少损失。
另一个回调将减少每次学习平台的学习率。
训练模型并生成新文本
对于训练,我们需要选择batch_size和想要训练的周期数。对于batch_size,选择128,这只是一个任意数字。只训练了5个周期的模型,所以不需要等待这么长时间,但如果你想要,可以训练更多。
训练输出:
为了自己生成文本,我们将创建一个类似于on_epoch_end函数的函数。它将采用随机起始索引,从文本中取出接下来的40个字符,然后使用它们进行预测。 作为参数,我们将传递想要生成的文本的长度以及生成的文本的多样性。
现在我们可以通过调用generate_text函数来创建文本:
生成文本:
结论
递归神经网络是一种处理顺序数据的技术,因为它们可以通过内部存储器记住最后的输入。它们几乎在每个连续问题上都达到了最先进的性能,并被大多数大公司使用。递归神经网络(RNN)可用于生成特定作者风格的文本。
创建文本生成递归神经网络(RNN)的步骤如下:
(1)创建或收集数据集
(2)构建递归神经网络(RNN)模型
(3)以随机句子为起点创建新文本
这个项目的细节可以在这里找到。鼓励任何人使用代码,也许可以更改数据集和预处理步骤,看看会发生什么。
你可以通过很多方法改进模型以获得更好的输出。其中一些是:
(1)使用更复杂的网络结构(更多LSTM和密集层)
(2)训练更多周期
(3)使用batch_size