您当前位置:永濑唯在线 > 最新福利 > 正文

制作一个中文版AI地牢

时间:2021-10-19  来源:未知   作者:admin

成果

经过一段时间的业余时间,最终的结果是一个中文版的ai地牢开源项目。

github.com/bupticybee/ChineseAiDungeon

你也可以直接在google colab上玩演示,这是一款文字冒险游戏:

colab.research.google.com/github/bupticybee/ChineseAiDungeon/blob/main/ChineseAiDungeonColabDemo.ipynb

这是我第一次玩自己的中文ai地牢游戏时产生的一个故事:

你在树林里冒险,指不定会从哪里蹦出来一些奇怪的东西,你握紧手上的手枪,希望这次冒险能够找到一些值钱的东西 > 你 往树林深处走去 一进去就会有一股寒意笼罩着你,你甚至都不知道自己为什么要继续走下去,但你知道,现在不冒险就太愚蠢了。有一种更加令人不安的气息在你身后,尽管你没有感觉到它,但那是一股非常浓烈的血腥味,几乎淹没了你的每一根头发。你转过身来,发现你身后是一块空地,一群男人围坐在中间,而你看起来好像已经在那里被吃掉了。这就是你要去的地方。 > 你 绕过这个奇怪的地方 你们这些笨蛋在这个奇怪的地方转了几圈,最终到了你之前认为正确的地方。你的直觉在这里很强,你觉得似乎有一股更强的力量从你身后的那块空地涌出,你的手颤抖着抓住了枪。你向前移动,但你的直觉仍然在警告你,你不应该这么做。你甚至感觉到枪的重量压在你的肩膀上,而且你看到有什么东西从你身后的空地上向你靠近。 > 你 悄悄地走进前面的村子 当你的生命在你面前逝去时,你会感觉到它,并且你的直觉在警告你,你可能会在村子里找到某个东西。你走得很快,而且当你意识到你已经走到了一个死胡同时,一切都太晚了。你看到一群人从他们的位置上走来,他们都拿着镰刀和其他锋利的东西,每个人的头都向后仰着,当你的手开始感到麻木时,你可以听到他们的喘息声。接触ai地牢

回到起点,第一次看到ai地下城的英文版是两个月前。在这个游戏中花了一些时间后,我认为它可能是未来游戏的重要方向之一。毕竟很难想象GTA5能和npc随意互动什么的。确实,ai地下城本身有很多不一致和不一致的地方,不可能直接应用到GTA这样的开放世界游戏中。然而,一切都有开始,不是吗?

对于不了解ai地牢的同学来说,ai地牢是一款文字游戏,是最古老的电子游戏类型之一。用户将自己的动作输入命令行,游戏给出相应的响应。最早的文字游戏都是预设脚本,玩家只能在预设的决策节点输入特定的命令。后来这款游戏增加了表现形式,发展成了今天的互动电影和gal游戏。

在GPT-2的帮助下,ai地下城能够合理响应玩家文本输入的动作,AI地下城生成的故事具有一定的连贯性,让玩家在一定程度上“自由”,可以在游戏世界中无拘无束地探索。

其实这种无约束在某种程度上也是一种约束。根据ai地牢的研究结果,大约有40%的用户使用ai地牢来生成丰富多彩的信息,似乎玩家在经历了七个波折之后就会开始生成一些丰富多彩的剧情。

当然我不是这样的玩家(手动狗头),但我是来学习的(狗头又来了)。在游戏本身花了一些时间后,我终于决定创建自己的中国ai地牢游戏。

在建造这个中国ai地牢项目的过程中,遇到了很多困难,甚至从结果来看,也没有完全达到最初的预期。然而,即便如此,我还是选择了开源项目,这是一项有价值的投资。

确定技术路线

幸运的是,ai地下城的早期版本是开源的[1],在关闭源代码后,仍然有社区维护版本[2]。遗憾的是,ai地下城的开发者并没有提供训练代码和训练数据,只是简单地听写了这部分[3],但从代码和作者的听写中,还是可以获得一些信息:

ai dungeon采用1.5B参数的GPT-2模型(~5GB 文件大小)ai dungeon用于finetune的数据包含choose your story[4]的大约30M数据,并且经过清洗,什么样的清洗?不知道ai dungeon采用了8块显卡和64的batch size来做finetune

经过调研,我决定用清华的CPM[5]2.6B参数的GPT2作为基准模型,但由于我的硬件限制(只有一个GPU),只能用finetune CPM[5]的fp16模型,而fp32模型在finetune期间会爆发内存。

至于数据,我制定了两个方案,一个是自己标注一批数据,另一个是用翻译软件翻译一批选择你的故事的语料库[4]。

似乎逻辑清晰,路线可行。会有什么问题?

开发!

问题太多,我痛苦地决定把开发开始后一周遇到的所有问题都记录下来。写这篇文章的时候,已经形成了三篇日志,共计3W多字。这三个血泪记录了我在这个开发中进行的每一个实验,实验的原因和结果,遇到的每一个坑。

中国艾登公司开发了log-1。

中国艾登公司开发了log-2。

中国艾登公司开发了log-3。

这三条记录太长了。在这里,我将整理一下开发过程中遇到的问题以及自己采用的手段。

问:为什么选择2.6B型号,是不是太大了?

答:清华的CPM [5]是市面上中国GPT-2中最大、最可靠的,而清华的CPM只发布了2.6B型号。模型真的很大,但是没有出路。其他比它小的是另一个1.5B型号[2]。但是最小的一个还没有经过充分的预训练,选择2.6B型号是无奈之举。直接的结果就是finetune对硬件要求极高,训练速度慢,以至于我只能以batch-size=1的乌龟速度训练,只能训练fp16型号,而fp32型号在训练的时候是装不下视频记忆的。

问:训练中最大的问题是什么?

答:其实最大的问题有两个,一是高估了GPT-2的能力,二是低估了数据获取的难度。在两点展开。

首先,我高估了GPT-2的能力,尤其是它的少样本学习能力。我最初的计划是自己标记数百个样本来微调GPT-2,这样它就可以同时学习扩展、继续和素描。当然,我很快发现这个方案太想当然,太不可行。从纸面上看,GPT可能非常有效,能力也很强,但当它真正着陆时,你会的。比如在搭建中文ai地牢的过程中,我发现GPT-2对数据格式极其敏感,动作前是否跟随“>”符号,线条在哪里变化,都会极大地影响模型的性能。这个模型经常做一些荒谬的事情。例如,在第三个日志中,我给出了一个由模型生成的故事示例:

你在树林里冒险,指不定会从哪里蹦出来一些奇怪的东西,你握紧手上的手枪,希望这次冒险能够找到一些值钱的东西> 你 向林子深处走去......突然,前方的林子里传来一阵怪异的声音,你的手紧紧握住手枪,但是,声音的主人已经消失了。你继续往前走......树林深处传来的声音越来越响,你的心脏越来越紧张,你已经不知道前面的路在何方了。你走进了树林深处,眼前出现了一个大厅,大厅中央的墙壁上画着很多奇怪的画,而大厅的另一边则是一片树林。> 你 进入城镇。(待续)如何看待中国的哈萨克族大量移民到哈萨克斯坦?5年前来自哈萨克斯坦的报道称已经有10多万中国的哈萨克族移民到哈萨克斯坦了,现在应该更多,而且逐年增长。我了解到这件事,是通过跟我一个班的大学同学(哈萨克族),他说他们家已经移民过去好几个了,他自己也打算毕业后去哈国。一方面是哈萨克斯坦的政策鼓励,一方面是当今很多哈萨克族愿意去哈国。

很容易注意到,我进城后,模特直接留下了一个“待续”,然后是一个右撇子,然后开始自己讲解哈萨克移民问题。这当然是由于CPM训练语料库的分布,但我认为可以反映大规模预训练GPT-2模型落地时的困难。

第二点是数据采集。由于国内没有等同于选择你的故事的网站[4],数据采集要么自行标注,要么由翻译软件批量翻译。当然,自己标注数据的过程太长太痛苦,所以最后用到的数据仍然是翻译软件批量翻译的语料库,对于自己标注的数据只进行了一些简单的证明概念实验。但是由于翻译的原因,批量翻译的语料库质量不会很好。

问:从从不工作转变为相对比较工作的过程中,最关键的因素是什么?

a:关键肯定是好的,而且语料比较多。虽然我没有发现什么特别好的,只是用了谷歌翻译,但还是,效果比我之前标注的和之前发现的好多了。其次是语料库的组织形式,无论是“上面n个动作n下面”还是“上面n >下面n个动作”,上面的文字是否有新的一行,下面的文字是否有新的一行都会对效果产生很大的影响。只是有些小把戏。

问:在创作《中国爱登堡》的过程中使用了什么技巧?

答:用了几招,确实很大程度上让模型生成的上下文更加一致。

首先对输入数据进行了清洗,将数据分为上文,动作,下文三个部分,上文表示在用户输入某个动作之前发生的事情,下文表示在用户输入动作之后发生的事情,只保留下文较短的一部分数据进行训练,这背后的启发式想法是,有些训练数据的“下文”比较长,导致直接相邻的下文和动作关联性不大,下面是一个例子:>你去雷特拉德王国 "你' VE从来没有听说过Quillars之前,但他们仍然听起来不那么危险比Tulan边境,那个地方只会变得更糟,你知道的。", "“我'会采取Retlad分配先生。”", '“嗯。聪明的。这里“是你的第一个月”的付出,我建议你在这里住它在扎尔,你离开之前,你必须关闭两天。”', "你拿起小袋子看看里面。这肯定会对您的家人有所帮助。您为自己拿了几枚硬币,然后询问是否可以安排从现在开始将付款发送给您的家人。他告诉你是的,但肯定会问你仍然想要一些。您同意只收取其中的 10%。你不'吨需要多少。",...(省略更多下文,实际的下文非常长)

可以看到,在这个语料库中,用户的动作是“前往莱特兰王国”。然而,由于翻译问题和后续文本较长,直接相邻的描述中根本没有“莱特兰王国”,而在中文aidongon中,一般只生成150字左右的后续文本,因此这个训练语料并不好训练。此外,从这个语料库中,我们还可以一窥翻译文本的质量有多差。

下面是另一个简短的例子:

穿过夜总会,你会看到一片肉的海洋随着爆炸的音乐有节奏地移动。你看到女人穿的裙子太短了,你不知道这是怎么合法的。然而,两个人最能引起你的兴趣。一个大约 20 岁左右的女人坐在酒吧里,凝视着远方。她穿着一件紫色的连衣裙,长到大腿上部。她的雪花石膏皮肤看起来比瓷器更光滑。她细密的金发就像一条金色的河流。你会立即被她吸引,但当你穿过人群时,你会发现另一个美女。在穿紫色裙子的女人的中间,你在酒吧的另一端发现了另一个。这个穿着低胸上衣(非常紧身)和迷你裙,她散发着性感。她也很苍白,有一头火红的头发,让你盯着她看。她微微一笑,然后移开视线。旧的占卜棒在这里没有帮助,那么它会是谁呢? >你搜索书柜 翻开书名,你会发现它们都是关于吸血鬼的神话和传说。然而,有一个让你眼前一亮,它被标记为“吸血鬼日记”,它吸引了你。翻开日记,你会发现它提到了一家夜总会和一个容易上当的家伙,他的皮线很俗气,试图进入主人的内裤。然后,日记的主人详细说明了他们想在吸干他们后如何肢解这个人。你惊恐地发现所有的相似之处,并发现你只有两种选择,你可以面对在日记底部签名的“莎拉”,或者你可以逃命。你选哪个?

可以看出,在下面的短语料库中,下面的文本和动作之间的相关性明显更高。

在fine-tune GPT-2的时候,仅使用batch-size=1的设置,而尽可能让训练时候的上下文窗口包含更多的文字,直观上说这有助于finetue的过程学到更好的上下文一致性和原本的ai dungeon一样[7],在采样时选择了[8]中类似的惩罚重复内容生成的方法,还有仔细调节了GPT-2生成文本时候的topk,p等参数,这些参数调节可以一定程度上减少重复,增加文本质量在训练的时候,并不学习所有内容,而是mask掉了上文和动作部分内容(这部分输出不参与loss计算),而是只在下文部分进行学习,这个trick的启发式原因是我不希望模型在生成下文时“顺便”生成了用户的下一个动作,并且在前面过滤合适的语料时,我只考虑了下文的质量,而没有考虑上文的质量,所以上文中可能仍然存在我不希望模型学习的冗长表述。下面是一个这种mask的例子:她微微一笑,然后移开视线。旧的占卜棒在这里没有帮助,那么它会是谁呢?0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >你搜索书柜0 0 0 0 0 0翻开书名,你会发现它们都是关于吸血鬼的神话和传说。然而,有一个让你眼前一亮,它被标记为“吸血鬼日记”,它吸引了你1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

可以看出,上述动作和动作的掩码为0,这意味着不包括损耗计算,在微调时只会学习以下动作。

问:总的来说,中国爱登生成的故事质量如何?

答:即使使用了这么多技巧,中国爱登生成的故事质量仍然令人担忧。我认为主要原因是训练语料库的数量和质量不足。一般来说,在前三五次互动中,模型可以大致保持故事的脉络和趋势,但多一点互动后,整个故事就会分崩离析。虽然最初的ai地下城本身也受到了这种情况的影响,但影响显然没有中文版ai dungeon那么大。

问:可以采取哪些措施来进一步提高中国爱豆的能力?

答:首先,肯定是数据。翻译数据的质量太低。如果我们能在中文版本中收集到类似的数据,肯定会提高模型的能力。我甚至考虑过以某种方式“改造”我想要的小说数据。

也有可能通过一些小说进行预精调训练,可能会在一定程度上让模型在讲故事能力上更好,但更重要的肯定是真正用于精调的数据质量。

还有硬件。目前我自己的硬件只有单卡+16G显存,只能以批量大小=1的设置来训练模型。更大的视频内存可以插入更大的数据。如果硬件提高了,可能会有一些帮助,但这里的帮助肯定没有数据大。ai地下城在微调时使用了8张牌+64批次大小[7]。我不知道他们是怎么做到的。另外,清华CPM[5]在文件中提到,fp16的型号在finetune方面不是很擅长,所以如果有更好的显卡(比如32G显存),那么或许fp32的型号可以在finetune方面做得更好。

吸取到的经验和教训不能低估任何一个任务,我原本仅仅计划使用一周的时间标注数据+训练模型,结果很快我便发现,这根本是不可能的,最后经过三周的努力,都没有达到一开始的预期,直到现在都还有诸多问题。数据,数据,还是数据,没有数据的DeepLearning是无源之水。DL不像RL,没有数据,只要有环境就能学习,想要好的模型,先得有好的数据,再好的预训练也抵不过一点点质量好的数据,如果我一开始知道在数据收集上会遇到如此多的困难,也许甚至都不会开始这个项目。不要迷信“权威”的代码和超参数,尽可能把训练中的细节自己实现/把控,控制细节才可以控制训练过程。记录每一次实验的目的,过程和结果,有助于设立benchmark,把控整体进度和计划之后的实验,这里的记录指事无巨细的全部记录。展望

对于这个项目,我觉得在有大量质量过硬的数据之前,是很难真正做好的。现在的水平只能说能打三五个回合,然后整个世界观开始分崩离析。

不过原版ai地牢[1]已经向我们展示了这款游戏在良好的训练过程和数据下可以达到什么水平,感兴趣的朋友可以体验一下。个人觉得这种讲故事的连贯性水平还不错,加上一些限制,可能已经可以应付一些开放世界游戏的对话场景了。

在最近的一款游戏《提取者》(The Extractors)[9]中,这款基于GPT的对话系统已经在游戏中使用,并且成为了游戏的一部分,使得NPC在游戏中有了一定的互动性。当然,应用这种系统还为时过早,类似系统在游戏中的定位还有待探索。

但是你还记得智能手机上的人脸识别是如何普及的吗?好像前一天只有几部手机可用,即使有,人脸识别也很难用。然而,突然之间,找到了合适的方法和场景,所有的手机一夜之间都有了人脸识别。不管大家用不用,人脸识别都成为了一种标准,就像开水和电一样成为了生活的一部分。

类似AI地牢的东西是游戏行业的未来吗?也许不是,但类似的想法无疑会在未来的游戏行业中发挥重要作用。

引用

[1]纬度-档案/艾登贡

[2]童话镇/童话镇

[3] AI地牢2:用深度学习语言模型创造无限生成的文本冒险

[4]主页> ChooseYourStory.com

[5]清华/CPM-1-生成

[6] imcaspar/gpt2-ml

[7]to wards data science . com/ai-地下城的创造者-2-shares-GPT-2-fine tuning-advice-e 5800 df 407 c 9

[8]Keskar N . S,McCann B,Varshney L . R,等. Ctrl:可控生成的条件转换子语言模型[J].arXiv预印本arXiv:1909.05858,2019。

[9]随机对照试验

Powered by 永濑唯在线 @2018 RSS地图 HTML地图