最近学习NPL的一些模型,训练了一个古诗生成模型作为练习。记录一些学习过程中的想法。在电脑上建了一个用于测试的网页,但条件有限,不确定能运行多久。https://www.qizhen.xyz/
诗词生成问题要比散文、小说生成简单。最主要的原因是一般诗词篇幅比较短。现在的ML模型还做不到特别长的记忆力。
目前,我可以测试到的,文章生成能力最强的是GPT3模型。我在OpenAI的网站上试用了一下这个模型,它生成文字时也会经常写着写着就跑题了。
小说将会是最难生成的文体,因为篇幅太长。一段新生成的内容要考虑是不是跟之前的几十万字内容都没有冲突,甚至需要设计一个伏笔,在几十万字之后再去填坑。这个复杂度太高了。
所以做练习,一般也都会选用古诗,歌词这类题材。我个人喜欢古诗,讨厌大多数的现代诗,所以选择古诗做测试。但是真正考虑到实际需求,古诗却是最缺乏市场需求的。
我也想到了一些会有实用的文字生成产品,有些单位公司会定期要员工写学习心得,思想总结之类的文章。这些个空洞无趣的文章对于某些人来说是非常头疼的,但却比较适合有机器生成。可是我暂时还没法做类似的实验,我没有渠道获得足够的训练数据。
写诗跟许多其它的NPL任务类似,经历了基于规则、基于统计到现在主要基于预训练模型的过程。
基于规则和基于统计的模型产生出来的诗文基本上一看就不是人写的。它们只能把一些符合规则的高频词凑在一起,但经常是前言不搭后语。即使是后来使用简单的LSTM、seq2seq等模型也不太容易生成行文自然的诗句。真正效果好的模型都是最近两年在超大模型比如BERT,GPT等基础上构架的。我在github上看到一些例子,效果真的很好,我作为理科生,已经分辨不出某些诗句是AI还是真人写的了。
模型肯定是越大的模型效果越好,但是越大的模型训练越费时费钱。
另外一个考虑的因素是,有的预训练模型可以直接做文本生成,有的还需要在附加一些神经网络层才可以。我用了GPT2的小型模型做练习,这个模型写大文章可能差点,但应付诗词还可以;而且GPT2可以直接生成文字,用起来很方便。将来我有时间的时候会再试一下其它一些比较常用的模型,比较一下它们的差别。
GPT2在某些情况下,可能还是太费钱了一些。训练一个GPT2模型一般最多两三天吧,就算用GPU,只租两天也不算是太贵。可是要长期发布就麻烦了。这个GPT2模型如果只使用CPU做预测,当下主流电脑做一个预测需要十秒钟以上,有点太长了。使用GPU,速度可以快一百倍左右,但价格可就高得多了。目前租一个云服务器,只用CPU的话,第一年只需要¥70左右;租一个带GPU的,需要¥7000每年,价格贵了一百倍啊。我可舍不得,毕竟只是玩玩,没什么收益的。
整个项目里,整理训练集是最费时间和精力的工作。对于多数机器学习项目,都是训练集越大效果越好,但是做诗词生成也学并不是的。古人创作过无数的诗词,能广为流传的是极其少数的一部分。也就是说,我们能够整理出来的诗词大多数其实写的并不好,如果让电脑跟它们学,恐怕也学不了多好。理想情况是只收集那些高水平的诗词。另外,太多的训练数据会激励算法使用一些不太常用的字词来作诗。这些词语如果应用不当,就非常影响作品可读性。反之,风月、云雨、山水等高频词,无论如何搭配,读起来都不至于太别扭。
当然小数据集也有缺点,它只会覆盖部分主题。我实验有了相对较小的数据集,主要包含了《千家诗》、《唐诗三百首》和其它一些我个人比较喜欢的诗词。训练好的模型对于处理风花雪月这类常见题材是可以产生出相对不错的结果,但是如果让它写个没训练过的内容,比如关于建设现代化等的题材,就没办法生成的很好了。
我偷懒,使用了默认的损失函数,也就是说,训练时没有添加额外规则。但实际上这样会影响模型的效果。一些规则,模型是很难自己学习到的,尤其是数据集也不够大的情况。比如,押韵、用词要丰富多彩等一些规则,模型自己领悟不到。
通过挑选训练集,可以弥补一部分不足,比如比如尽量避免有重复词的诗句,以方便模型更快的掌握这个规律。
看别人的经验,训练时间在使用GPU的情况下一般一两天。这与模型大小和数据集有关。我试验的模型和数据集都不算太大,用GPU一两个小时效果就已经不错了。这时候,模型还会时不时产生一些莫名其妙的结果。增加训练时间,可以让模型产生更规范的结果,但同时,也会削弱预训练数据的作用。个人感觉,虽然这时候模型的输出减少了明显错误,但也同时减少了惊艳的诗句。可能模型也跟人一样,要有创造力、要天马行空才能写出神句来。学习的太多,反而影响创造力。
我也试了一下只使用CPU做训练,比使用GPU要慢一两个数量级。
我个人纯理工背景,文采很差,对于诗词的好赖,只能大致一评。
我觉得程序生成的诗词基本还行吧,虽然也有一些不足。首先是生成的诗完全没有考虑押韵。其次是生成的诗不是每一首都令人满意的。当然也可能我的水平太差,看不懂模型生成文字的深意。不过以我的水准来评判,程序有时也是会产生一些惊艳的诗句。
我虽然不会写诗,但我能读,至少可以把一些太差劲的去掉。我在计算机生成的诗篇里挑拣了一些,个人认为还算可以的,贴到了一些诗友论坛(比如:https://www.52shici.com/posts.php?id=354317)。诗句文采怎样先不论,至少没有读者跳出来说你这根本不是人话,也算是成功了。(坦率的讲,如果不做人工筛选,把所有生成的东西都放在一起,还是很容易看出来里面有些明显不是人话。)
列出一些具体的例子:
首先,作对。吟诗常以做对为基础嘛。以“倦鸟无心归去”为上联,电脑对下联“野花有意偷开”。对的妙啊,能把“花”和“开”联系起来就算不错了,还能把“野”和“偷”关联上,已经超出我的预料了。我不相信电脑真的明白什么是野花,也许只是在训练集或预训练集中野花总和偷摸之类的词在一起吧。但无论怎样,这表明电脑水平还是可以的。
有时候模型写的对联思路极其开阔。比如看到这一副生成的对联时,我差点一口老血喷到屏幕上:“千家百姓,共建和谐社会;三宫六院,同沾雨露春风”。
我最满意的诗句是这首《送友》“城南雨过花飞泪,陌上风来柳泣音。远客回身扶杖问,长亭别后共谁言。” 这句“雨过花飞泪,风来柳泣音”让我大吃一惊。这一句单从用词和发音上来说或许称不上完美,但在意境上,已经无可挑剔了。如果换做我,我脑袋拍扁了也写不出这样的句子。
另外“晓雾轻笼野,春风漫渡山。谁家新酿酒,香我满小楼。”也算上乘之做。
其它一些也还不错的作品:
万卉齐春我自芳,幽姿媚眼不争光。
不是芳菲知有意,却遣妖娆到野堂。
昨夜送客到西江,最恨水远难共枕。
此间看月生孤影,只盼灯火再成双。
安得携琴酒,同君醉不归。
曲新茅舍熟,情至故人欢。
门对青山水满池,竹篱茅舍傍花枝。闲调绿绮尊前舞,每看乌犍雨后犁。
云影半空来叠嶂,岚光十里送高低。东风好借春光住,独坐田头守稻苗。
模型可以生成标题,有时候带着标题还挺唬人的:
《送李判官宰安溪兼呈潘中丞》
谢公诗酒旧相知,长是忧思别后时。今日不知何处是,青山尽日看杨枝。
博文的最后会贴出更多的生成样例。
诗人一生的经历都会体现在作品里,比如,读李煜的诗,就总是会联想到他亡国之君的悲伤;读苏轼的诗,就又会让我燃起在逆境中乐观态度。计算机没有任何国王经历,它堆出来的词在美丽也都没有任何内涵。但反过来,(高情商说法)也可说电脑作诗最擅长那些不需要具体内容的空洞题材,比如说泛泛的写景,赞美称颂等等。下面这一大堆,都是电脑擅长的,一分钟能写八百首:
玉蕊娇阳初映树,金枝翠叶正迎风。
百里江山春好处,八方锦绣景添时。
一路烟霞入眼新,春光满眼又和暖。天蓝水碧江东海,风顺云开岭上津。
花吐异香迎旭日,鸟传佳语报清辰。民安国泰天和顺,何似人间百事亨。
千家共筑中国梦,万户重兴古邑春。九域和谐四方福,五洲同庆又一岁。
华表犹疑归鹤语,青山时见暮云飘。但愿神州千古好,更凭道德治安民。
总体来说,诗词市场太狭小。唯一可能的需求是在一些庆典活动中作为点缀。
我现在最烦的是要定期写工作总结,还要给同事领导写评语。其它单位或者公司也都有定期的提交各种心得体会、思想进步之类的硬性要求。如果AI可以在这方面创作有所提高,必然前景不错。我如果有机会得到这方面的训练数据,肯定会尝试一下的。
再拓宽一点,文字创作的需求可能不如音乐创作的需求更强烈。现在哪个视频节目需要配乐呢,专业的视频内容可能无法自动生成,但配乐没什么特殊需求的,还是可以靠AI来大量制作的。如果有时间,我也会尝试尝试。
对联: (上下联都是生成的)
人比青山更寂寥;情如白雪正苍茫
何处飘红,一夕飞花,满径芳香扑鼻;清波小桨,半江飞鹭,几声细雨敲窗
不忍清风侵我梦;难容浊水污君心
春去谁人知暖度;花开哪处问芳心
清明天下雨;盛世万家春
春风拂大地;德政暖人心
历尽沧桑有痕;悟得心性无尘
曾经风雨无羁;空留我梦成真
古诗:
帘前燕过梦无痕,半点春心犹未醒。
月下花开香有约,一世风流不知愁。
邀来仙娥坐竹下,伴君同饮过月明。
浊酒一杯醉东风,清歌几曲传天下。
早来风起东江水,登山遥看西子湖。
一蓑烟雨一壶酒,几片桃花几树春。
岁晚仍为客,借宿古渡头。暮云生浦口,落日下江桥。
天地多离别,秦淮几滞留。无穷怀古意,独倚万鼓楼。
长叹红尘尽,犹留白发生。
今年行处多,几度到扬州。
老去书多废,夜夜睡少安。不知春已去,但觉暑犹寒。
日月闲中过,阴晴醉里看。穷山缺钱米,无事不出门。
一帆风至水云乡,客舟相逢酒百觞。今夜月明人不寐,满船灯火照波光。
青山绿水共烟波,千载风云一棹歌。自古英雄全没了,只有词赋传后世。
真君得道入仙乡,获一奇方百医藏。
药有至灵非凡品,更凭妙手治回春。
春心一夜动相思,晓枕惊残梦觉时。
应是无人来问讯,隔帘微雨又花枝
小雨入窗明,残冬腊月来。寒灯犹独坐,残烛只相陪。
客舍影微暗,人家雾尚开。殷勤一杯酒,斟与共清杯。
青灯对孤影,深夜一长吟。独宿黄昏后,相随白露深。
庭空花欲落,山黑叶弥阴。可怜双泪尽,难道是离心。
清风两袖随波荡,江上千帆伴浪行。水阔天高空有影,山远地险自无形。
不知身向何方去,又听渔歌唱晚霞。从今未了人生事,明月相随再不来。
江上渔歌起暮愁,远山半在夕阳楼。
不知何处渔歌起,吹落西风一夜秋。
墙外樱花一簇香,门前燕子报春忙。
春色几枝凭雨洗,虫声半夜与风来。
几家深巷争欢散,风雨无声春水生。
桃花浅深红欲尽,柳叶低垂绿初成。
老去不看花,春风度万家。
几回随燕至,一别到人前。
自笑居贫亦养闲,小园无客与人间。溪头采药归来晚,石上烧茶夜半闲。
门巷不须尘扫尽,衣食应有月催还。小楼一过春晴后,又得长天更晚回。
万里江山归梦远,千秋风月寄琴闲。
从今独自思乡泪,莫道无人识姓名。
祖国山河丽,人民喜气妍。
共欢三代会,同乐万家春。
举国欢歌日,神州喜庆年。
民生如锦绣,九域乐尧舜。
万里长天一线明,中都雄镇与时名。
自从玉兔传捷报,从此云山焕彩生。
水漫相思隔别离,不见君时独自愁。
长怀往事一杯酒,不负春风几度花。
人间何处是归路,天际何时见故城。
可是春来春又去,落花飞蝶乱纷纷。
春归人已半,独立花无眠。
一别山川远,长怀天地怜。
昨夜花开日,今年人未归。
人生如梦幻,不为花消殒。
春去还归夜又残,桃红李白总难留。
不知何事吹花落,独自留香在画栏。
不忍相逢月色白,江南烟雨满天涯。
一枝寂寞无人赏,几度相思对酒歌。
江湖从远别,风雨会重逢。
自叹声名浅,谁知意气浓。
世情今日异,交态古来同。
且喜尊前泰,吾庐又一峰。
别久两心苦,情深痛更深。
不言将别泪,何苦为相寻。
江上灯昏月满船,船头灯火照人眠。
夜深不见船如水,满棹清风入梦眠。
杏花露水湿衣袂,燕子出山随马尘。
无人更弃生前乐,有鬼应怜市上嚣。
雷鼓千钧震夜来,天街月殿斗婵娟。
银河水面浮星斗,玉宇风前映彩霞。
自幼相悦好,为爱两情交。
日月明双影,春秋一色行。
独立小桥边,寂寥行人少。
无言不惜醉,何必相思苦。
心随花意逐风流,莫作离愁恨,自怜别泪流。
日暖风和,桃花红白樱花紫。天涯人共老,一岁相思,几度芳菲。
天上人间事渺茫,春风吹雨过平阳。
小溪浅草留残碧,深树幽花半日黄。
蝶向旧丛寻烂漫,燕衔初絮入微茫。
愁肠欲断无消处,更向西楼嗅晚香。
不畏风霜苦,还能傲岁华。
清香如可染,好色乃难赊。
冷艳应须及,寒光只自赊。
何当持醉看,万里见霜花。
碧水明如镜,清风轻扫尘。
此时闲不寐,梦落木兰花。
大江东去浪千重,一舸西来眼界空。
云影不随帆影去,风声没在涛声中。
风雨飘摇万里秋,扁舟一叶渡江流。
江南春事无多日,又是黄昏独倚楼。
满院春光欲动摇,一帘花影醉流莺。
谁知此景真难得,自有清风来枕簟。
春风一夜拂幽径,芳草绿阴连水碧。
却忆当年曾折柳,今日此处又垂枝。
万民共圆中国梦,百姓同奔小康途。
两岸并进盛世春,千家齐奏和谐曲。
野花落尽天涯路,一瓣枯英照水岸。
满地残红多是泪,不知明年回不回。
一轮旭日照华夏,万里祥云锦绣天。
四海同颂文明歌,九州共襄幸福图。
落叶飘飞一路秋,问何日枫林共醉。
闲云摆落千山红,趁此时燕子相携。
宛转月下夜初更,人静不知何处冷。
依稀梦中花正好,醒来方觉几回愁。
《青菜》
野菜花开满树林,晚风吹雨不闻香。
年年岁岁无人采,只有青青白白心。
《头疼》
老去无奇字,时来有病身。
莫怪诗笔拙,只因日日雨。
《信佛》
人若无欲即如来,何用修行求妙果。
佛为有情坐菩提,未曾参透起因缘。
《春运》
野渡登舟情欲飞,紧把舵盘月下摇。
万里云帆同追风,满船归心共逐浪。
《隐居》
隐居栖遁处,山水总相连。
绿树围村舍,黄花满院墙。
云聚闲种田,客散静敲禅。
倦卧山中庐,悠悠悟岁月。
《传法》
观音显灵台上坐,十方共传天竺法。
无边妙意竟虚无,一切众生不须求。
《龙门山》
龙门山深翠影微,一溪烟树杂云飞。千寻绝壁藏金地,十丈高台倚玉旗。
仙鹤舞空迎雾霭,仙蛇盘树向天楣。自来万宝非人力,不待春风吹九枝。
《送陈君》
相思从此远,愁绪满江边。一别无消息,重来又暮天。
风烟愁客舍,春雨梦家船。不识淮南老,临行泪满前。
《秋日南楼寓思》
十里西楼日似霜,江城灯火夜深长。
秋风正是离愁起,独坐西楼赋晚凉。
《金谷园》
金谷园中春已深,柳条杨花尽垂阴。
东风不是为侬惜,空带残花遍地金。
《金山》
十里长松百尺楼,九霄云汉出浮丘。
水回江面浮空远,金顶峰前望月留。
《春行》
花阴不到半时间,日暮春来渐是闲。
山郭雨余如见我,桃花源里有人还。
《题山家壁》
篱落深红碧玉丛,门前时见好儿童。一帘白露滋桃李,数点疏星照榕桂。
庭树静闻莺语轻,池荷寒见蝶影空。闲来便作诗穷兴,笑与邻翁醉眼中。
《题墨斋》
画罢东风似有情,夜来霜雨打芭蕉。
不知花月有多少,暗入诗怀一半清。
《秋日溪居》
水边无处觅鱼踪,时有渔翁唤不应。
夜半独吟秋思起,半轮明月挂西南。
《题西林老住持像二首》
十法经如达摩祖,三花刹里放瓦钵。
金陀慧口禅心少,铁棒开关妙见空。
LabVIEW 编程经验: http://labview.qizhen.xyz/