翻译 | 于泽平 马雪洁 整理 | 凡江 编辑 | 吴璇
代码即诗歌。这是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层。这真的产生了像诗歌的文本!
它有断行和阕,险些所有的字符组合都是真正的单词。有时整句话略微同等,事实上,第一个迭代后产生了这句如宝石般精彩的话:
添加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层的模型对应的丢失曲线。
网络中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从她最喜好的一行诗创造了宝石:
单一的LSTM模型不能够精准地节制诗歌主题,彷佛在所有事情中一个共同的线索。即由单一LSTM模型天生的全体诗集词汇云。
迷人!
机器人沉迷于太阳和星星。
若太阳成为演习数据中最普遍的话题,并不令人惊异,但事实并非如此!
这里有由演习数据天生的笔墨云。
墨客喜好写爱情。
艾米莉狄金森写了关于自然和去世亡的诗歌。机器人给个人写有关天体的诗!
添加第二个LSTM图层后,可以开始看到其他诗歌技巧,如头韵和韵律。
可见,会创造
种子微笑
染红我的一天
一天之法
善良闭幕
它也开始产生一些非常有诗意的诗歌。与之前模型演习的单行诗歌类似,有时不知一行。例如,
阴郁之中有一部分天下
阴影萦绕
哇,那很深刻!
目前为止,已经看到了行,节,韵(内部和行结尾),重复和头韵。不错!
但是,偶尔戏剧性的天赋,这机遇器人模拟的诗歌常日是不连贯的词搜集。废话绝大部分都没有语法构造。
然而发生了一些变革即增加了第三个LSTM层。这种模式更有可能产生在语法上合理的单行诗,纵然仍是荒谬的。例如:
父亲的光芒不是骨骼的拳
这句诗没有任何意义,但却精确地放置了词性。具有同等性,名词从句具有一样平常的诗意。三层LSTM模型同样创作了这些,我认为是很稳定,诗情画意地讲:
这天下是蝴蝶岛我深觉孤独
但三层LSTM模式的最高造诣正是这首完全的诗。
来自你内心的惨淡
我待着
灵魂中挣扎
这不是大段笔墨的摘录。这些单行诗被牢牢地定位在两个++++\n分隔符之间。
哇,人们好有趣啊,我们将创造奇迹!
特殊感谢我的墨客合资人帮助我进行这个有趣的实验!
一定要访问他们的网站,阅读他们的作品!
边缘之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 !