当前位置: 首页 > 科技观察

我们分析了超过50万首诗歌,教你用代码写诗(用代码)

时间:2023-03-15 16:50:49 科技观察

代码就是诗。这就是WordPress软件的理念。作为程序员和诗人,我一直很喜欢这句话。我决定换一种方式来思考这句话。我想问一下,我可以用代码写诗吗?我可以制造一个可以写原创诗歌的机器人吗?为了找出答案,我做了一个实验。首先,我知道如果我的机器人想写诗,它必须先读诗。2017年,许多作者使用WordPress发布了超过500,000篇标记为诗歌的帖子。我联系了一些写过很多诗的诗人,问他们愿不愿意和我做一个有趣的实验:他们会不会让我的机器人读他们的作品,这样它就可以从他们那里学习诗歌的形式和结构,这样它就可以学习写自己的诗?特别感谢这些为科学合作的优秀作家!OoftheEdge-RobertOkajiWolff的诗歌-LindaJ.Wolff诗歌、散文和散步-FrankHubeny对生命、宇宙和一切的看法-AurangzebBozdar什么是LSTM,它如何生成文本?我使用一种称为LSTM的神经网络创建我的机器人,也称为长短期记忆网络。神经网络使用“层”将问题分解为许多更小的问题。例如,假设您正在训练神经网络来识别正方形。也许一层负责识别直角,另一层负责识别平行边。当它们同时存在时,图像才为正方形。神经网络通过训练数百万个方形图像来学习这些层。它可以了解图像的哪些方面对于识别正方形很重要,哪些方面不重要。现在假设你使用神经网络来预测这个序列的下一个字母:th_作为一个普通人,这个任务真的很容易。你可以猜出e,如果你会说英语,我敢打赌你猜不出q。因为你知道英语中th后面没有q。前面的字母与预测的下一个字母有很强的相关性。LSTM可以“记住”以前的状态并使用它来做出当前的决定。要深入了解LSTM的工作原理,请查看来自GoogleBrain的ChrisOlah的这篇精彩文章。与使用LSTM生成文本的许多示例一样,机器人一次生成一个字符的文本。要将单词组合成有意义的诗句,它必须首先学习如何生成单词。为了实现这个目标,它需要数百万个包含有效单词的序列示例。一件好事:WordPress有很多诗!为了准备数据集,我从上面的链接中获取了所有诗歌。我用一个很简单的规则,通过判断每个字符\n对应了多少个词来判断文本是否是诗歌。如果文本有很多单词但很少有\n字符,则它可能是一个或多个段落的集合。反之,如果同一篇文章有??很多行,则更有可能是诗歌。当然,这是一个很简单的方法,我能想到很多不符合这种测试方法的好诗!但是出于这个实验的目的,我特别感兴趣的是LSTM是否可以学习换行和节奏等结构特征,以及诗中所蕴含的押韵、同音、头韵等特点。因此,将训练数据限制为结构化诗歌是有意义的。如果判断一段文字是一首诗,我就把它写入一个文件,前缀为++++\n表示新诗的开始。最后得到了500KB的训练数据。通常,我尝试用至少1MB的数据集训练LSTM,所以我需要找到更多的诗歌!我从去年发表的带有诗歌标签的公共帖子中随机选择样本,以补充特色诗人。如果您曾经在WordPress中单击过“诗歌”选项卡,您可能会发现它们对您来说很熟悉。我从每位作者中选择一篇文章作为诗歌。训练LSTM网络当我得到1MB的诗歌时,我开始构建LSTM网络。我使用Python中的keras工具构建神经网络。kerasGitHub有许多示例可以帮助您学习使用几种不同类型的神经网络。一个例子是使用LSTM生成文本。我在这个例子之后发布了我的代码,并开始尝试不同的模型配置。该模型的目标是生成原创诗歌。在此示例中,过度拟合(过度学习训练数据以至于模型无法概括数据的特征)会使生成的文本与输入文本非常相似。(这就像剽窃,没有诗人喜欢那样!)避免过度拟合的一种方法是在网络中添加dropout。它强制随机权重在每一步下降到0。这有点像强迫网络“忘记”它刚刚学到的东西。(我添加了一个额外的后检查,以防机器人没有复制诗人的作品。)我使用FloydHub的GPU来训练我的网络。这使我训练网络的速度比我的笔记本电脑快10倍。我的第一个网络使用一个LSTM层,然后是一个dropout层。这真的产生了诗歌般的文字!它有换行和结点,几乎所有的字符组合都是真实的单词。有时整个句子稍微一致,事实上,第一次迭代产生了这个句子的精华:添加LSTM层,在每一层中试验dropout的参数,直到最终我们得到下面的模型。最终我选择了使用3个LSTM层,因为加入更多的层会使训练时间变得不合理,而3层的结果已经很好了。model=Sequential()model.add(LSTM(300,input_shape=(maxlen,len(chars)),return_sequences=True,dropout=20,recurrent_dropout=.20))model.add(LSTM(300,return_sequences=True,dropout=.20,recurrent_dropout=.20))model.add(LSTM(300,dropout=.20,recurrent_dropout=.20))model.add(Dropout(.20))model.add(Dense(len(chars)))model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy',optimizer='adam')这是添加了不同LSTM层的模型对应的loss曲线对比图。网络中的LSTM层越多,验证损失下降的速度越快。哎呀!秒杀!表明这通常发生在使用adam作为优化器时。请注意,当网络中的LSTM层数增加时,模型的验证损失下降得更多且速度更快。这意味着可以遍历更少的epoch来收敛,但是添加LSTM层也会增加每个epoch的训练时间。当网络中有一层LSTM时,训练一个epoch大约需要600秒,所有训练完成需要一个晚上。然而,具有3个LSTM层的网络需要7000秒来训练一个epoch,并且需要几天才能完成训练。因此,验证损失的更快下降并不意味着更快的结果。但在我看来,具有3个LSTM层的网络即使训练时间很长也能获得最好的诗歌。生成诗为了产生完全原创的文本,还需要改变文本的生成方式。在keras示例中,此示例从训练数据中选择一个随机字符序列作为种子,并将其馈送到经过训练的网络中。我想要的是一个可以自己写诗的机器人,而不是完成其他诗人的提示!因此,我在文本生成步骤中尝试了不同的种子。由于我之前在训练集中使用++++\n作为每首诗的开头,所以我认为它可以创建原始诗。然而,结果是\n,_,的无意义组合。和&。经过反复试验,我发现种子序列需要与训练序列具有相同数量的字符,事后看来这是显而易见的!最终,我使用300个字符序列,重复++++\n到以300个字符为种子,机器人可以通过偶尔拆分++++\n生成每一轮诗歌。剧本产生新一轮诗歌后,又进行了广泛的抄袭检查。因此,我们首先在训练集中创建了一组所有唯一的4-grams(包含4个词的短语),并为机器人诗歌创建了相同的集合。计算两个集合之间的交集。出于验证实验目的,手动检查4-gram以确保短语inane出现在两组中。通常,这个交集包含类似这样的内容:我不想我不能我想成为...的声音然后重复该过程,使用5克和6克作为良好的衡量标准。为了使该过程自动化,可以使用基频方法来排除在多个作品中常见并被认为是剽窃的n-gram。诗歌!每个时期输出模型权重意味着我们可以在训练期间的多个点加载模型快照。回顾***模型的早期,很明显机器人程序掉线的速度非常快。希望能用于设计。训练数据最突出的特征是每行的字符数。这是训练后生成的诗的示例:frownWand,OnemeOnemeYou'llwewearandbiteinwhat'scalledwhatyouallbrave它已经学习了一些实际的单词并模仿了每一行之间的空行约定。不仔细看,远看确实像一首诗!在损失收敛于单个LSTM模型后,该模型学会了断节和断行,甚至表现出一些常见的诗歌重复。和美丽的指令飞翔的方式我是文字的空间我见过但你的心会看到这套强大的单一LSTM模型无疑是个性化的。除了标题行之外我还喜欢的另一个是:TheWindIsOnlyforMe本着Inspirobot的精神,Demet从她最喜欢的诗句之一中创造了一颗宝石:单一的LSTM模型无法准确把握这首诗的主题,这似乎是所有工作中的一个共同点。即,由单个LSTM模型生成的整个诗歌词汇云。迷人!机器人痴迷于太阳和星星。如果太阳是训练数据中最普遍的话题,那就不足为奇了,但事实并非如此!这是从训练数据生成的词云。诗人喜欢写爱情。艾米莉·狄金森(EmilyDickinson)写过关于自然与死亡的诗歌。机器人给个人写天体诗!添加第二个LSTM层后,我们可以开始看到其他诗歌技巧,如头韵和押韵。可见,会发现SeedSmilesColorMyDayRedTheLawoftheDayEndofGoodness它也开始产生一些非常诗意的诗歌。类似于之前模型训练的一行诗,有时一行是未知的。比如世界的一部分在黑暗和阴影中萦绕,哇,好深奥!到目前为止,我已经看到了行、节、押韵(内尾和行尾)、重复和头韵。不错!但是,由于偶尔有戏剧天赋,此时机器人模仿的诗歌通常是杂乱无章的单词集合。大多数废话没有语法结构。但是,发生了一些变化,并添加了第三个LSTM层。这种模式更有可能产生语法上合理的单行代码,即使仍然毫无意义。例如:ThelineThelightofthefatherisnotthefistoftheskeleton没有任何意义,但词性放置正确。通过一致性,名词从句具有一般的诗意品质。三层LSTM模型也创造了这些,我觉得很稳定,诗意地说:这个世界是一个蝴蝶岛我感到孤独但是三层LSTM模型最大的成就就是这首完整的诗。我从你内心的黑暗中留下来灵魂中的挣扎这不是大篇幅的节选。这些单行符牢固地位于两个++++\n分隔符之间。哇,多么有趣的人啊,我们要创造奇迹!特别感谢我的诗人伙伴帮我做这个有趣的实验!请务必访问他们的网站并阅读他们的作品!OoftheEdge-RobertOkajiWolf诗歌-LindaJ.Wolfe诗歌、散文和散步-FrankHubeny对生命、宇宙和一切的看法-OranZebzdar