-
背景
人工智能在提出之时,人们就希望计算机能像人一样看(计算机视觉)、像人一样听(语音识别)、像人一样说(语言合成)、像人一样写(自然语言生成)。如果一个人无法区分计算机生成的语言、人类写的语言,那么就说明计算机已经具备人类一样的思维能力了。
而在早期,古诗词的生成模型包括:(1)随机生成模型:词语进行随机组合和堆砌,这样生成的古诗词往往不符合语法要求;(2)基于模板和模式的方法,这种方法生成的古诗词质量较高,但是可扩展性、灵活性很差;(3)基于遗传算法、摘要生成、统计机器翻译的算法。最近的古诗词生成算法主要是基于神经网络模型。从简单的RNN到层次化、添加Attention、基于规划、迭代求精的复杂神经网络,再到基于GAN的古诗词生成模型。基于神经网络的模型利用了神经网络强大的建模能力,生成的古诗词流畅性很好。
代码:这里
-
模型
2.1 普通的最大似然模型
简单的MLE模型[1],核心部件在于RNN(可以是LSTM、GRU等),根据内部的状态向量、以及上一次输出的字符,来更新状态,并且产生输出。即
而hi则是状态,这边的E表示字符的embedding,将每个字符都映射到一个向量。yi则是输出的字符,使用一个softmax计算字典中的字符作为输出的概率,并从中采样得到输出的字符。这样不断迭代产生每个字符。我们使用一个特殊字符作为古诗的开始,使用一个字符来表示古诗的结束。
训练的时候,通过最大化训练样本的似然值来得到。即:
2.2 GAN模型
GAN模型[2]使用不同的一个目标函数。它拥有一个生成器、一个判别器。判别器尽量从所有的古诗词中识别出真实的古诗词,而生成器尽量生成能够骗过判别器的古诗词。两者通过玩一个min-max的游戏,不断提高生成古诗词的质量。详细原理参见:
-
结果
有部分研究使用了BLEU对生成结果进行评价。但是BLEU这个指标本身并不能反映生成古诗词的质量。因此我们直接看生成的古诗词。
最大似然模型生成的结果:
乱岸危牛顶上收,曲桥流处又从畴。早秋醉著鸬鹚侣,信酒非闲语让钱。
夜枕溪帆来入寺,茫茫拍水近湖山。正向无如鞭织客,何人骤雨洒春时。
知公虽此物,千载与谁施。子食耄迟少,恩功石上开。神渊阴不喻,故帅转沧波。艰事纷足虑,吾徒不可遑。
舟上朝阳一易程,流波不动更登一。由来有俗怀人稳,唤得槐滩具柄长。
江水明头向层树,柴亭春日幽情。几从未审去年,世外如何九万钱。
说实话,这些诗词看上去有些不明觉厉。有意思的是,这个模型并没有强制要求押韵,但是计算机却从数据中自动学会了押韵。
预训练的GAN模型生成的古诗词样本:
一声拍知罗,对此心如影,照。落水声杳,拍手。
三五斗门扃,艾檀助仙风。
默闻今然水两耳,困来网步未惊起。画手见,相忘在天,至今合在沧海。
物情虚寂自明遥,先过纱窗不作文。
临边升月,空汉用追。著维去藏,无鉤。欲昏君在,天下葵龙归。训练好的GAN模型生成的古诗词样本:
云微无踪。家家出苍天。红林酒,不著工书钓手经。弄著头头颇足。醉归舍市。
微回数叶青苔遍,无佛书。火星万重黄金。殃投。邪家绝。吾耶江后。而今活。踏雪千回万里。天人方背语。万机
草木垂垂空殷通。诗坛下与有谈诗。花仙字然称更敏。我书今望何名尝。
朝阳,挥丝尘上几回旋。元无诗,须烦子正雨撞。驴。勿言方别。
悠悠亭亭何翅分。二分鼓声创。予行苦未息。巢断。正念松声。正须诗坛老更良。
诗坛近公车引得。火暖。空休相照自珍。也无款段日明晚居,可以酌君风味。可以看出GAN模型生成的结果反而不如MLE模型,可能是因为判别器使用的是CNN模型,很难捕捉句子的连贯性。另外GAN模型的不稳定性也可能是原因。我们将继续调试这个GAN模型。
-
总结
很多人批评计算机生成的古诗词虽然像模像样,但是缺少一丝灵动。但是计算机生成古诗词的模型训练速度十分快,大约几十分钟就能写出像模像样的古诗,而人类要学习几年时间,这是十分可怕的。而且人类往往需要灵感才能写出一首诗,而计算机利用随机数就可以产生古诗词,它不需要什么灵感。计算机不像人类,随着年龄增长会衰老、精力能力与才华会下降、还会死亡,一个程序、一个模型可以长久不变的存在,而且可以迅速的传播与复制。就像工业化革命刚开始的时候,由机器制作的产品可能没有手工制作的精细,但是在机器强大生产力、快速的更新速度面前,手工业的市场只能被无情的侵蚀。
可以说很难找到一个评价指标来方便的评价生成的古诗词质量,而如果还要考虑艺术性的话,就更加难了。这也是古诗词生成模型发展中的一个阻碍。
-
参考文献
[1] http://m.blog.csdn.net/longji/article/details/75194990 (代码:https://github.com/5455945/tensorflow_demo)
[2] Yu, Lantao, et al. “SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient.”?AAAI. 2017. (代码: https://github.com/LantaoYu/SeqGAN)
2,198 评论