农企新闻网

我们剖析了超越50万首诗歌,教你用代码写诗(附代码)

发布者:丁书一
导读本文为雷锋字幕组编译的技术博客,原标题To a Poem is a Bott the Stranger,作者 Carly Stambaugh。翻译 | 于泽平  马雪洁    整理 |  凡江    编辑  |   吴璇代码即诗歌。这是WordPress软件的哲学。作为一位顺序员和诗人,我不断很喜欢这句话。我决议换种方式考虑这句话。我想问,我能用代码写诗吗?我可不可以做一个可以写出原创诗歌的机器人

本文为 雷锋字幕组 编译的技术博客,原标题To a Poem is a Bott the Stranger,作者 Carly Stambaugh。

翻译 | 于泽平  马雪洁    整理 |  凡江    编辑  |   吴璇

代码即诗歌 这是WordPress软件的哲学。

作为一位顺序员和诗人,我不断很喜欢这句话。我决议换种方式考虑这句话。

我想问,我能用代码写诗吗?我可不可以做一个可以写出原创诗歌的机器人?为了找出办法,我做了一个实验。

首先,我晓得假如我的机器人想写诗,首先要让它读诗。2017年,许多作者用WordPress宣布了超越50万个 标签为诗歌 的帖子。我联络了一些写了许多诗的诗人,并问他们能否情愿和我一同停止一个风趣的实验:他们能否允许我的机器人读他们的作品,让它可以从中学习出诗歌的方式和构造,从而能够学会本人写诗?特别感激这些为了迷信而协作的很棒的作家们!

  • 边缘之O -  Robert Okaji

  • 沃尔夫的诗 -  Linda J. Wolff

  • 诗歌,散文与漫步 -  Frank Hubeny

  • 生命的视角,宇宙和万物 -  Aurangzeb Bozdar

什么是LSTM,它如何生成文本?

我运用一种名为LSTM的神经网络创立我的机器人,它也叫作长短期记忆网络。神经网络运用“层”将成绩分解为许多小成绩。

举个例子,假定你正在训练一个可以辨认正方形的神经网络。能够一个层担任辨认直角,另一个层担任辨认平行边。它们同时存在时图像才是正方形。神经网络经过训练数百万张正方形图像,从中学习到这些层。它可以学习到图像中的哪些方面关于辨认正方形是重要的,哪些是不重要的。

如今假定你用一个神经网络预测这个序列的下一个字母:

th_

作为一个普通人,这个义务真是太复杂了。你会猜e,我打赌,假如你会说英文,你一定不会猜q。由于你晓得在英文中th前面不会接q。后面的字母和预测的接上去的字母关联性十分强。LSTM可以“记住”以前的形态并以此作出以后的决议。假如想深化理解LSTM是如何任务的,可以检查这个 很赞的帖子 ,作者是谷歌大脑的Chris Olah。

与许多用LSTM生成文本的例子相反,机器人生成文本时每一时辰生成一个字符。想要把单词聚集成有意义的诗句,首先它要学会如何发生单词。为了到达这个目的,它需求数百万个包括无效单词的序列例子。有一件坏事就是:WordPress有很多诗歌!

预备数据集

我从下面的链接中取得了一切的诗歌。我运用一个很复杂的规则,经过判别每个字符n对应多少个单词判别文本能否是诗歌。假如文本有许多单词但字符n很少,它能够是一段或多段文字的集合。相反地,假如异样的文本有许多行,那么它是诗歌的能够性更大。

当然,这是一个很复杂的办法,我能想出来很多好诗并不契合这样的测试办法!但为了这个实验的目的,我特别感兴味的是LSTM能否可以学习出如断行和节拍等构造特点,以及诗歌中包括的押韵、谐音、头韵等特点。所以,把训练数据限制在有构造的诗歌中是有道理的。

假如一段文本被判别为一首诗,我把它写到一个文件中,用++++n作为前缀,表示一首古诗歌的开端。最终取得了500KB的训练数据。通常,我尝试训练LSTM时都要用至多1MB的数据集,因而我需求寻觅更多的诗歌!我在去年宣布的标签为诗歌的公共帖子中随机选择样本作为特征诗人的补充。假如你在WordPress中点击过 诗歌 这一标签,你能够会发现你对它们很熟习。我在每一个作者中选择一个帖子作为诗歌。

训练LSTM网络

当我取得1MB的诗歌时,我开端树立LSTM网络。我运用Python中的 keras 工具树立神经网络,keras的GitHub中有 许多例子 ,可以协助你学习运用几种不同类型的神经网络,其中有一个例子就是运用 LSTM生成文本 。我在这个例子后贴出了我的代码,并开端尝试不同的模型配置。模型的目的是生成原始的诗歌。在这个例子中,过拟合--将训练数据学习得太好以致于模型无法概括数据的特点--会使生成的文本和输出文本十分类似。(这就像抄袭一样,没有诗人喜欢这样!)防止过拟合的一种方式是在网络中添加dropout。它迫使在每一步骤中有随机权重下降到0。这有点像强迫网络“遗忘”一些它刚刚学到的东西。(为了避免诗人的作品没有被机器人复制,我添加了额定的前期反省。)

我运用 FloydHub 的GPU完成训练我的网络这一繁重任务。这使我可以用比我的笔记本电脑快10倍的速度训练我的网络。我的第一个网络运用一个LSTM层,前面接入一个dropout层。这真的发生了像诗歌的文本!它有断行和阕,简直一切的字符组合都是真正的单词。有时整句话稍微分歧,现实上,第一个迭代后发生了这句如宝石般精彩的话:


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

添加LSTM层,在每一层中实验dropout的参数,直到最终取得了上面的模型。最终选择运用3个LSTM层,由于再添加层数会让训练工夫变得不合理,而且3层的后果曾经很不错了。

  1. model = Sequential()

  2. model.add(LSTM(300, input_shape=(maxlen, len(chars)), return_sequences=True, dropout=

  3. 20, recurrent_dropout=.20))

  4. model.add(LSTM(300, return_sequences=True, dropout=.20, recurrent_dropout=.20))

  5. model.add(LSTM(300, dropout=.20, recurrent_dropout=.20))

  6. model.add(Dropout(.20))

  7. model.add(Dense(len(chars)))

  8. model.add(Activation('softmax'))

  9. model.compile(loss='categorical_crossentropy', optimizer='adam')

这是一张图表,比照了添加不同LSTM层的模型对应的损失曲线。

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

网络中LSTM层数越多,验证损失下降的速率就越快。

哎呀!尖峰! 标明这种状况通常 发作在运用adam作为优化器时。留意到在网络中添加LSTM层数时,模型的验证损失下降得更多,而且下降的速率也更快。这意味着遍历更少的epoch就可以收敛,但添加LSTM层也添加了每一个epoch的训练工夫。网络中有一层LSTM时,训练一个epoch需求大约600秒,全部训练完毕需求一夜。但是,3个LSTM层的网络训练一个epoch需求7000秒,完成训练需求几天。因而,验证损失下降得更快并不意味着更快失掉后果。但在我看来,即便训练工夫很长,3个LSTM层的网络失掉了最好的诗歌。

生成诗歌

为了发生完全原创的文本,也需求改动生成文本的方式。在keras的例子中,这个例子从训练数据中选择一个随机的字符序列作为种子,输出到训练好的网络中。我要的是一个可以本人写诗的机器人,而不是完成其他诗人的提示!因而,我在文本生成步骤中尝试了不同的种子。由于我之前在训练集中运用++++n作为每首诗歌的开端,我以为它可以创作出原始的诗歌。但是后果是n,_,.和&的有意义的组合。

经过一些尝试和失败之后,我发现种子序列需求与训练序列具有相反数量的字符,这在预先看起来是不言而喻的!最终,我运用300个字符的序列,我将++++n反复到300个字符作为种子,机器人可以经过偶然将++++n分开以此生成每一轮诗歌。

剧本发生新一轮诗歌后,停止了最初的剽窃反省。因而,首先在训练集中创立了一切共同的4-grams(包括4个词的短语)的集合,且对机器人诗歌创立相反集。计算两集之间的交集。为验证明验目的,手动反省了4-grams,以确保在两个集合中呈现的短语为inane。通常状况下,这个交点包括如下内容: 

  • 我不想要

  • 我不可以

  • 我想成为

  • …的声响

然后反复这个进程,运用5-grams和6-grams停止良好测量。若要使该进程自动化,能够会采取一种基频法,扫除在多个著作中罕见的n-gram,以为是抄袭的状况。

诗歌!

每个时期输入模型权重意味着我们可以在训练时期的几个点上加载模型快照。回忆最初模型的晚期时代,分明机器人掉线很快。希冀可以将其用于设计上,训练数据最明显的特征是每行几个字符。上面是一个例子,训练完毕后生成的诗歌: 

眉头紧皱 魔杖,一me一me
你会我们穿着和咬
在什么叫什么东西你一切的英勇

它曾经学到了一些实践的词语,并且模拟了每行之间空行的常规。从远处看,假如你不细心看,看起来确实像是一首诗!在单个LSTM模型的损失收敛之后,模型学习了断节和断行,甚至展现一些罕见的诗歌性反复。 

和美丽的指示

翱翔的方式  
我是言语的空间
我曾看见
但你的心将会看到这张脸

单一的LSTM模型的弱小套装毫无疑问是一般性的。除了标题行之外,我喜欢的另一个是:  

风只为我

在 Inspirobot 热烈的肉体之下, Demet 从她最喜欢的一行诗发明了宝石:  

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

单一的LSTM模型不可以精准地掌握诗歌主题,似乎在一切任务中一个共同的线索。即由单一LSTM模型生成的整个诗集词汇云。  

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

诱人!机器人沉浸于太阳和星星。  

若太阳成为训练数据中最普遍的话题,并不令人诧异,但现实并非如此!这里有由训练数据生成的文字云。  

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

诗人喜欢写爱情。  

艾米莉狄金森写了关于自然和死亡的诗歌。机器人给团体写有关天体的诗!

添加第二个LSTM图层后,可以开端看到其他诗歌技巧,如头韵和韵律。

可见,会发现  
种子浅笑
染红我的一天
一天之法
仁慈终结

它也开端发生一些十分有诗意的诗歌。与之前模型训练的单行诗歌相似,有时不知一行。例如, 

黑暗之中有一局部世界

暗影萦绕

哇,那很深入!

目前为止,曾经看到了行,节,韵(外部和行开头),反复和头韵。不错!但是,偶然戏剧性的天赋,这机遇器人模拟的诗歌通常是不连接的词聚集。废话绝大局部都没有语法构造。

但是发作了一些变化即添加了第三个LSTM层。这种形式更有能够发生在语法上合理的单行诗,即便仍是荒唐的。例如: 

父亲的光辉不是骨骼的拳

这句诗没有任何意义,但却正确地放置了词性。具有分歧性,名词从句具有普通的诗意。三层LSTM模型异样创作了这些,我以为是很波动,诗情画意地讲:  

这世界是蝴蝶岛
我深觉孤单

但三层LSTM形式的最高成就正是这首完好的诗。 

来自你内心的阴暗
我待着
灵魂中挣扎

这不是大段文字的摘录。这些单行诗被牢牢地定位在两个++++n分隔符之间。  

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

哇,人们好风趣啊,我们将发明奇观!  

特别感激我的诗人合伙人协助我停止这个风趣的实验!一定要拜访他们的网站,阅读他们的作品!

  • 边缘之O - 罗伯特Okaji

  • 沃尔夫 诗歌 - 琳达J.沃尔夫

  • 诗歌,散文与漫步 - 弗兰克·胡贝尼

  • 生命的视角,宇宙和万物 - 奥兰泽布兹达尔

博客旧址 https://data.blog/2018/01/19/to-a-poem-is-a-bott-the-stranger/?from=singlemessage&isappinstalled=0


更多文章,关注雷锋网 雷锋网雷锋网 (大众号:雷锋网)

添加 雷锋字幕组 微信号(leiphonefansub)为好友

备注「我要参加」,To be a  AI  Volunteer !


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

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

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