大数据语言模型与程序化叙事生成(下)

聊聊出现在2018年之后的基于深度神经网络预训练语言模型的故事生成技术。由于内容篇幅较长,分成上、下两个部分,下篇介绍语言模型生成叙事在实际应用中会遇到的问题以及与传统技术的比较。掺杂了一些个人观点。

大数据语言模型与程序化叙事生成(下)

前言

基于大数据的语言模型与程序化叙事生成(上)中,我们介绍了通过语言模型生成文本叙事的基本原理。其中我们简单地引出了这种叙事方法存在的可控性问题、言之无物问题和前后一致性问题。

这一章,我们来具体讨论这几个问题和可能的解决方案,以及基于语言模型的文本叙事生成与2018年的文章故事工程学:人工智能与程序化叙事生成所介绍的那些方法之间的关系。

如何控制语言模型生成的叙事

一直以来在我们的概念中,指挥计算机做事的方法就是通过编程,我们要去学习一整套有严格的语法和语义的编程语言,了解这些编程语言中的指令是如何在计算机的运作过程中起作用,设计好想要计算机执行任务的整个过程后,再翻译成能够实现这个过程的代码,最后编译成程序。

这是一个容错性非常低的任务,程序必须完全准确无误,才能让计算机做我们想让它做的事,因此对用户的专业技能要求也很高。

这个特征也反映在传统的叙事生成方法中。传统的叙事生成方法非常依赖于一个故事域的定义,这个故事域要定义清楚所有可能发生的事件,每个事件发生的前置条件是什么,发生之后又会对世界状态产生什么影响。有了这个故事域的定义,算法才能去搜索满足用户要求的事件序列。

这也是一个容错性极低的过程,故事域的定义完全不能模棱两可、不能存在信息缺失,否则生成的故事就会产生各种荒谬的错误。我在过去的文章Cybertext》读书笔记(六):文本创作机器中介绍过著名的童话故事生成程序Tale-spin由于故事域的定义问题产生的一些掉链子的故事。

Tale-spin中对事件”X试图将Y移动到Z“的定义,跟编程语言非常相似

而跟机器交代任务的这种方式,跟与人类交接任务的情况非常不一样。想象我们现在是在委托一个职业写手来帮我们写一段“某个对玩家团队非常忠诚的NPC最后却背叛了大家”的中世纪背景下的跑团剧情。

首先,我们肯定不会把所有中世纪背景下的跑团故事所有可能发生的事件全部列成一个清单交给对方——我们一般认为只需跟对方说“中世纪背景下的跑团”,对方就应该对哪些事件可以发生、那些事件不会发生有了基本的概念。

我们也不会跟对方精确定义“背叛”的概念,因为对方应该也对这个概念有自己的理解了。我们只需要用自然语言跟对方描述,这个故事中应该有“某个对玩家团队非常忠诚的NPC最后却背叛了大家”的桥段。

因为自然语言也是对方熟悉的语言,而且我们与对方身处相近的文化环境和社会环境中,从小到大的经历有相当多的共通之处,对自然语言中的各种各样的概念的理解,应该大致上是相通的,这构成了我们沟通的基础。

而大数据语言模型,事实上也是想要通过从超庞大语料库中的学习,来模拟这样一个“对自然语言中的概念与人类有相当多的相通之处”的人工智能系统。

虽然这个模拟与真实之间还存在很大差异,在“究竟有多少相通之处”这一点上也有非常多的争议:比如我们可能会问,并未与我们身处同一个文化环境和社会环境、也没有从小到大与世界互动的经历的AI,它对语言的理解跟我们究竟能相似到什么程度?

但从原则上说,如果我们接受“它是对一个说着自然语言的人的模拟”,就应该像与一个说着自然语言的人交代工作那样,用自然语言对它说,“写一段某个对玩家团队非常忠诚的NPC最后却背叛了大家的中世纪跑团故事桥段”。

于是,我在ChatGPT中输入:

写一段某个对玩家团队非常忠诚的NPC最后却背叛了大家的中世纪跑团故事桥段。

ChatGPT的回答是:

NPC叫做亨利,是玩家团队的一名非常忠诚的成员。他总是在战斗中率先冲锋,并且从不犹豫地为团队成员提供援助。玩家们都非常信任他,并且深信他永远不会背叛他们。 然而,当玩家们被一支强大的敌人围攻时,亨利突然变卦了。他开始与敌人合作,并且帮助他们攻击玩家团队。玩家们感到震惊和愤怒,试图解释亨利的行为。但是,亨利冷酷地告诉他们,他只是为了自己的利益而背叛了他们,并且不会为此感到羞愧。玩家们被迫不得已自己逃脱,并且永远不会忘记亨利的背叛。

这个故事确实跟我的指示非常符合,但似乎过于空洞、缺少细节,于是我指示说:

改写上面的故事,加入更多细节。

ChatGPT给出的第二版故事是:

NPC叫做亨利,是玩家团队的一名非常忠诚的成员。他总是在战斗中率先冲锋,并且从不犹豫地为团队成员提供援助。他的勇气和冒险精神令人敬佩,而他的忠诚和友好态度也让团队成员们都非常信任他。 团队成员们和亨利一起经历了许多冒险,他们共同解决了各种各样的难题,并且在战斗中取得了巨大的胜利。在这些冒险中,亨利总是是团队中最可靠的成员之一。所以,当团队面对着一支强大的敌人围攻时,没有人会想到亨利会背叛他们。 然而,亨利突然变卦了。当敌人围攻时,他开始与敌人合作,并且帮助他们攻击玩家团队。玩家们感到震惊和愤怒,试图解释亨利的行为。但是,亨利冷酷地告诉他们,他与敌人签订了一项协议,换取金钱和地位上的提升。他不顾及团队成员的生命安全,只为了自己的利益而背叛了他们。玩家们被迫不得已自己逃脱,并且永远不会忘记亨利的背叛。在此之后,团队成员们决定抵制亨利,并在之后的冒险中不再与他合作。亨利因此孤立无援,最终被敌人所杀。然而,对于团队成员来说,他的背叛带给了他们巨大的心理创伤,使得他们在之后的冒险中更加谨慎,并且永远不会再相信任何人。这次的事件也教会了他们,在冒险的道路上,真正的忠诚和信任是非常珍贵的,而背叛则会带来永恒的痛苦。

这段话确实更具体了,但我还是觉得不满意。因为NPC的背叛显得很突然没什么来由。我突然想到一个点子,如果NPC其实是个很善良的人,但还是背叛了,整个故事会更有戏剧性。于是我由对ChatGPT指示说:

改写上面的故事,突出亨利其实很善良,但迫不得已还是背叛了大家。

这次得到的第三版故事是:

NPC叫做亨利,是玩家团队的一名非常忠诚的成员。他总是在战斗中率先冲锋,并且从不犹豫地为团队成员提供援助。他的勇气和冒险精神令人敬佩,而他的忠诚和友好态度也让团队成员们都非常信任他。 团队成员们和亨利一起经历了许多冒险,他们共同解决了各种各样的难题,并且在战斗中取得了巨大的胜利。在这些冒险中,亨利总是是团队中最可靠的成员之一。所以,当团队面对着一支强大的敌人围攻时,没有人会想到亨利会背叛他们。 然而,亨利突然变卦了。当敌人围攻时,他开始与敌人合作,并且帮助他们攻击玩家团队。玩家们感到震惊和愤怒,试图解释亨利的行为。亨利深感内疚,他告诉他们,他被迫害者威胁到了,他必须为了保护自己的家人而做出了这样的事情。亨利表示他很抱歉背叛了大家,并祈求他们的原谅。玩家们虽然对此感到失望,但他们也能理解亨利的处境,最终还是决定原谅了亨利。然而,这次的背叛对团队来说是一次巨大的打击,他们不得不重新建立起对彼此的信任。亨利意识到自己的错误,决定为自己的行为付出代价,并努力重新赢得团队成员的信任。他再次成为了团队中最可靠的成员之一,并在之后的冒险中为团队作出了巨大贡献。这次的事件也教会了团队成员,在冒险的道路上,信任是可以重建的,而人性有时也会让我们做出错误的决定。

故事渐渐丰满了起来,但我还是觉得NPC的背叛缺少铺垫,于是我又指示说:

重写上面的故事,给亨利的背叛更多铺垫。

ChatGPT给出第四版故事:

NPC叫做亨利,是玩家团队的一名非常忠诚的成员。他总是在战斗中率先冲锋,并且从不犹豫地为团队成员提供援助。他的勇气和冒险精神令人敬佩,而他的忠诚和友好态度也让团队成员们都非常信任他。 亨利来自一个贫穷的家庭,他的父亲早早失去了生计,母亲带着他们生活着。亨利希望能够改变自己的家庭状况,于是他加入了这支冒险队伍,希望能够掌握更多的技能并赚取到更多的财富。 然而在一次冒险中,亨利意外得知他母亲生病了,医疗费用非常昂贵,而他手头上的钱不够。他陷入了绝望之中,不知该怎么是好。就在这个时候,他被敌人所控制,要求他为了换取足够的钱去背叛自己的队友。亨利犹豫了许久,最终还是因为对家人的担忧而做出了背叛的决定。 当玩家们发现亨利的背叛时,他们感到震惊和愤怒,试图解释亨利的行为。亨利深感内疚,向他们坦露了自己的窘境,并祈求他们的原谅。玩家们意识到亨利的处境,也能理解他为了家人而做出的决定。 但是同时,这次背叛对团队来说是一次巨大的打击,他们不得不重新建立起对彼此的信任。亨利为此感到内疚和痛苦,并决定离开队伍,去寻找自己的道路。这次的事件让团队成员意识到,在冒险的道路上,人性有时会让我们面临极端的选择,而背叛并不一定是出自恶意,有时也是出自无奈。同时,这次事件也教会了他们,在冒险的道路上,信任是可以重建的,而人性有时也会让我们做出错误的决定。

这个版本已经很接近一个我想要的故事骨架。这个修改的过程还可以继续下去,来增加更多的细节信息。

我与ChatGPT的对话截图

可以看到,上面这个与ChatGPT合作迭代故事版本的过程,其实已经很接近跟一个人类写作者的合作方式:委托方提出需求,然后写手根据需求写出一个草稿,委托方看到草稿后会意识到一开始需求的问题——需求可能不够具体、可能不切实际、可能让对方产生误解、可能并没有准确反映出自己想要的东西等等——于是修改需求,然后写手根据新的需求写出新版本,如此迭代下去,直到最后得到委托方满意的作品。

对问题(需求)的定义与解(作品)之间的共同迭代关系(来自经典论文 Modelling design exploration as coevolution)

在这个过程中,不仅仅需求和作品得到修正和迭代,委托方与写手之间的沟通方式也在得到修正和迭代。虽然双方使用的都是自然语言,但是这个世界上不可能有两个人的生活和文化经历完全相同。这些经历上的不同导致两个人对自然语言表述的概念(尤其含义较为抽象的概念),难以避免地会有偏差。而这些偏差,只有双方在不断的沟通尝试之中加深对对方的了解,才能逐渐克服,使自己的沟通方式更加适用于对方。

而与一个基于语言模型的AI沟通也是这样。AI虽然使用着同样的自然语言,但是不像人类通过实实在在的生活经历获得对语言中各种概念的理解,AI对语言的理解完全只来自于训练时接触到的语料库。这意味着AI对语言的理解必然与我们存在偏差,我们也需要通过不断的沟通尝试,来掌握到对AI更有效的说话方式。

比如说,如果对方是一个跟我们交情足够深的人类写手,我们可能会在交谈中提起对方之前经历过的某一次痛彻心扉的出轨,然后指示说在作品中写出这种被背叛的感觉,以此来引导作品内容变得更加有血有肉。

GPT-3的训练数据组成 (图片来自Inside language models (from GPT-3 to PaLM), lifearchitect.ai/models/)

没有真正与社会互动过的AI,不可能有这种经历可以诉诸。而更重要的是,在近乎整个互联网的语料库上训练出来的AI,如果一定要拟人化,那么它的”人格“比起某个特定的人来,更像是一个”所有互联网上的人格的平均值“。这样的AI,如果要让它写出个人风格较强的故事,可以在提示中要求它代入某个特定的广为人知(有足够训练数据)的情境,比如,在上面的ChatGPT写故事的例子中,我可以进一步指示:

请以《悲惨世界》的作者维克多·雨果的风格完整地重写上面的故事。

如此就能得到这样的风格性更强的故事:

在这个悲惨而残酷的世界里,亨利是一个忠诚的队员,他虽然来自贫穷的家庭,但他满怀着希望和渴望加入这支冒险队伍,改变自己和家人的命运。他在队伍中是最勇敢的一员,总是第一个冲锋陷阵,而且永远没有犹豫地为队友提供援助。 然而,命运总是充满曲折,当亨利得知他母亲生病,医疗费用巨高时,他陷入了绝望之中。在这个充满痛苦和无助的时刻,敌人伸出了援手,要求他为了换取足够的钱去背叛自己的队友,亨利虽然犹豫了许久,但最终还是为了拯救自己的家人而做出了背叛的决定。 当队友发现了他的背叛时,他们感到震惊和愤怒。亨利深感内疚和痛苦,知道自己已经失去了他们的信任和友谊。他选择离开队伍,孤独地面对着自己的过错和罪恶。这次的背叛不仅毁了亨利的人生,也撕裂了队伍的团结。在这个悲惨的世界里,忠诚和信任是如此珍贵,而背叛却是如此残酷。亨利知道自己将永远不能挽回自己在队伍中的地位,也永远不能挽回自己曾经拥有的友谊。他在这个悲惨的世界里独自前行,承受着无尽的痛苦和责任,这就是他为了拯救家人而付出的代价。

于是,怎样的沟通方式更适用于大数据语言模型这个问题,就变得像是如何训练猫狗、如何教育小孩、如何跟领导汇报工作一样,变成了一门深刻的学问,我们称之为是“提示工程”(Prompt Engineering)。

这是一种与机器的交互方式的根本性变革。在机器这种事物被发明出来初期,人们需要为每一个特定的任务去设计专门的硬件——某种意义上是“编程”的最早期形式。通用计算机的出现,实现了靠输入特定的指令来改变机器的行为,从而适应不同的任务——也就是设计算法。深度学习被广泛应用之后,我们发现机器能够模仿训练数据集的行为,因此设计数据集也成为指导机器去完成特定任务的方式。而今天,随着大数据驱动的语言模型的出现,我们看到了构建一个功能普适性的统计模型的可能性,这个统计模型理论上可以蕴含我们想要的任何计算功能,而我们需要去做的只是用恰当的自然语言去激发正确的功能——这将我们引向软件工程的最新时代:提示设计时代。

在这样的时代,交代机器执行任务,将与交代人执行任务,不再有根本性的差别。不知道这样的未来什么时候会到来。

关于提示工程,非常推荐英文好的朋友阅读语言模型学者Gwern的个人wiki:https://www.gwern.net/GPT-3

叙事背后的那个故事在哪里

我们说了那么久的“叙事生成”,但究竟什么是叙事?

维基百科上的“Narrative(叙事)”词条,有这么一个简单的定义:

A narrative is a telling of some true or fictitious event or connected sequence of events. 一个叙事是对某个真实的或虚假的事件或相连的事件序列的讲述。

当我们人类在进行叙事时,我们往往现在脑海中想到要去讲述的这个事件或者事件序列,然后再去思考怎样去讲述它。而叙事的观众,也只有在能够根据叙事者的讲述,在他们自己的脑海中还原出了这个事件或者事件序列,才能被认为是“理解”了这个叙事。先有能够被讲述的事件,再有对这些事件的讲述,这一直是我们脑中的常理。

因此传统的叙事生成技术,也沿用这样的思路。让程序先去生成一个能够被讲述的事件/事件序列,然后再去生成讲述这个事件/事件序列的文本。

如何生成一个有趣的事件序列,成为“如何生成一个有趣的叙事”这个问题的核心。人们想到了图搜索、自动化逻辑推理、遗传算法、社会关系模拟等等方法。计算的瓶颈也往往在这里。

即使只是”一场电影院约会“这么简单的故事域,也已经有非常复杂i的结构化事件图表示 (来自论文Crowdsourcing Narrative Intelligence)

而大数据驱动的语言模型,却彻彻底底绕过了这一步。它不在事件序列上做任何预先的思考或者说计算,而直接去生成“讲述”本身。这个讲述被读者读到之后,也许能够在读者的脑中被提取出事件,但对于完全没有生活经历的语言模型来说,这些事件在它脑中多半并无对应物。这种情况下,事件和对事件的讲述之间的先后关系被彻底颠倒了。

事件和对事件的讲述之间的关系颠倒,以及讲述者和观众的“脑内模型(Mental Model)”之间的不一致,被很多学者认为是语言模型在叙事生成上的根本性缺陷。

既然如此,要解决这个问题,首要的任务就是在语言模型的背后引入“事件”的概念。

2017年的论文《Event Representations for Automated Story Generation with Deep Neural Nets (基于深度神经网络的自动化故事生成中的事件表示)》提出了一种思路。

在上篇中我们提到了,语言模型可以是一种“从序列到序列(seq2seq)”的模型,其中的序列指的是单词或者字组成的序列。这个序列显然跟文本叙事背后的事件没有直接联系。

但是,叙事背后的事件序列不也是一种“序列”吗?能不能将事件序列也看做是一种“语言”,用生成式语言模型来生成事件序列呢?

文章首先将一个事件定义为一个4元组<动作,主语,对象,附加信息>。这样就可以将用一句自然语言很松散地描述的事件,转换为更加结构化的表示形式。比如

“哈利认识了莱姆斯·卢平,一个黑魔法防御术教授——最后被发现其实是一个狼人”

所描述的事件,可以用这种结构化的方式表示为两个事件组成的序列

<认识,哈利,莱姆斯·卢平, N/A> <发现,大家,莱姆斯·卢平,是狼人>

语言模型的训练需要大量的语料库,要训练这个事件序列的语言模型,我们也需要大量的像上面这样的事件序列来作为语料库。

这篇论文从大量电影在维基百科中的情节描述所组成的语料库中,利用现有的自然语言处理技术(Stanford’s Core NLP),从句子中提取出这样的结构化的事件序列表示,组成了一个事件序列的语料库,来训练这个能够生成事件序列的语言模型。这个语言模型被称为是Event2Event模型。

能够生成事件序列之后,论文作者又引入一个从结构化的事件表示来生成对应的自然语言句子的语言模型,称之为是Event2Sentence。将两个模型组合,我们就得到一个先生成事件序列、再生成这个事件序列的自然语言描述的叙事生成工作流。这个工作流就非常接近于“先思考要讲什么故事,再思考怎么讲这个故事”的人脑叙事生成工作流。

Event2Event → Event2Sentence叙事生成工作流

这个方法为语言模型叙事引入了一个被叙述的事物,使得语言模型产生的文本看起来更加“言之有物”了。但它也还只是一个开始。作为一个四元组的事件表示,显然是一个过于简化的形式化定义,在将句子转换为这种表示的过程中,会有大量信息损失,也就意味着使用这种方法来进行叙事,只能对相对来说非常基本的事件言之有物。

而如果要人为去扩展这个事件的结构化表示,使得它能够适应现实中的事件的复杂程度,就成为一个更加复杂而庞大的工作——因为现实中的事件实在是太复杂了。而且,这种做法也不符合机器学习的理念——应该尽可能让机器自己从数据中学到解决问题需要的信息,而不是人为地灌输。

在2020年提出的另一种方法《PlotMachines: Outline-Conditioned Generation with Dynamic Plot State Tracking(PlotMachine:以情节梗概为条件的叙事生成,支持动态情节状态追踪)》就尝试在不去人为定义事件的结构化表示的基础上,通过设计神经网络的结构,让语言模型自己去建立事件的概念。

这篇论文所提出的叙事生成工作流支持用户输入一个故事大纲,其中甚至能够包含多个角色的行动。

PlotMachine的输入输出范例

实现的方法是在GPT语言模型中加入一个记忆模块,在此基础上让模型学习到对当前段落和叙事的当前状态的特折向量表示。这些特征向量旨在让机器在叙述过程中建立起自己对“事件”概念的表示,通过训练将所叙述的“事件”和对这个“事件”的叙述语言风格描述区分开,并通过事件概念来控制叙述内容的前后一致性。

本篇论文提出的PlotMachine工作流一个段落一个段落地生成叙事,不同于一般地语言模型只是简单地在给定前置文本的条件概率分布中采样得到后续文本,PlotMachine在生成下一个段落时,还会考虑到用户一开始给出的整个故事大纲、机器用特征向量所表达的对当前叙述状态以及对上下文的理解。

控制故事的走向

一旦在语言模型叙事中引入事件的概念,就跟2018年之前的那些传统的方法相通了起来,且更有了可比性。传统的叙事生成方法中一个经典的思路是将事件序列的生成看作一个“自动规划(Automatic Planning)问题”:每一个事件的发生都要求当下的世界状态满足一定的前序条件,发生之后则会改变世界状态,为新的事件的发生创造可能的条件,故事生成需要产生这样的一个事件序列,最后能够达成用户所指定的故事走向这个目标。正是这个事件序列的环环相扣,保证了最后生成的故事读起来是前后一致、合情合理的。

在语言模型的方法背后也引入事件的概念,就很自然地产生如何去规划这些事件、使得它们之间环环相扣前后一致、还能像用户指定的故事走向发展的问题。传统的方法在生成这样的事件序列上存在一定的技术瓶颈,因为生成这样的序列潜在地可能要去考虑到所有可能的事件序列——而这样的事件序列的数量是庞大到令人叹为观止的。

如果继续贯彻机器学习的思路,那么我们能否在规划事件这一步也设法绕过这个技术瓶颈?2019年的论文《Controllable Neural Story Plot Generation via Reinforcement Learning(通过强化学习实现可控的神经网络故事情节生成)》提出了一种基于强化学习(Reinforcement Learning)的方法。

强化学习是机器学习的一种范式,它模拟一个个体在某种环境中有目的地行动,目的是训练出一个让个体能够有效达到目的的行动策略(Policy),方法则是让环境给与个体数值上的惩罚和奖励,让这些惩罚和奖励反映出个体与它所要达到的目标之间的距离,然后再根据奖惩数值来调整策略模型的参数,使得策略更倾向于获得奖励、避免惩罚。

图片来自网络,侵删

我们因此就可以把故事生成的问题也看作是一个强化学习问题:个体以生成一个合理且符合用户指定的故事走向的事件序列为目标,一步一步地选择事件加入到序列中,要训练出一个根据前序事件来选择下一个事件地策略。如果事件之间不能合理衔接,就受到惩罚,事件的走向越接近用户指定的走向,就得到越多的奖励。

在传统的自动规划方法中,程序要实实在在地去模拟世界状态的变化,来验证事件的衔接是否合理,之所以能这么做,是因为所有的事件都是在故事域中人为清晰定义好的。而当我们实际上是使用了语言模型从数据中提取出了事件的时候,我们就没有事件的前序条件和后果的清晰定义,合理性也不再能够非黑即白地判断,而成为一个模糊的概念。

这篇论文为事件序列的合理性和与用户指定故事走向的相符程度提供了一个简单粗暴的统计性估计。合理性就体现在当前事件所对应的动词,在给定前序事件的条件下,出现的概率要足够大,否则它就不会被采样成为下一个事件。而用户指定的故事走向则简单地就是一个动词,当前事件选择与这个故事走向的相近程度,也简单粗暴地用动词之间的相似程度(由语言模型给出)以及动词再语料库中共同出现的概率来衡量。

因此机器就不再需要真正去模拟世界状态的改变——其背后假定是语料库已经提供了足够多的世界状态改变的例子。策略模型的训练虽然需要时间,但一旦训练完成,执行生成一个事件序列不需要去考虑所有序列的可能性,效率非常高。这种方法如此绕过了传统自动规划方法的计算瓶颈,代价是对故事合理性和故事走向采取了机器简单粗暴的近似,牺牲了结果的质量。

建立读者模型

上篇中,我提到一段体验AI Dungeon的经历,说到语言模型的输出一切只存在于语言层面,由于前后一致性的问题,作为读者的我很难建立起一个关于文本所描述的那个虚拟世界的脑内模型(Mental Model)。

读者在读到一段文本之后(“比如“X杀了Y”),会在脑中尝试为这段文本所描述的事件建立上下文(比如”X跟Y有仇”),而如果文本后续的走向违背了这个脑内建立的上下文(比如”X其实深爱着Y“),我们会尝试去调整脑内上下文再次去符合文本——但如果很难调整,我们就会感到困惑。这种困惑积累到一定程度,我们就会放弃去建立这个脑内模型,并继而放弃去理解文本,失去阅读的代入感和沉浸感。

自动叙事生成领域的著名学者Mark Riedl在一篇Blog中,提到这一点背后的一个原因

The shift from symbolic systems to neural language models shifted the focus from the modeling of the reader to the modeling of the corpus. This makes sense because data in the form of story corpora is readily available but data in the form of the mental models readers form is not readily available.

从符号系统转移到基于神经网络的语言模型,将叙事生成的关注点从对读者的建模转移到了对语料库的建模。这是因为叙事语料库的数据容易得到,而读者脑内模型的数据却没法得到。

(注:其中所说的“符号系统”就对应于传统的基于故事域搜索的叙事生成方法)

2022年出自Riedl的一篇论文《Inferring the Reader: Guiding Automated Story Generation with Commonsense Reasoning(推理出读者:用常识性推理来引导自动故事生成)》尝试用自动化推理的方式来解决这个问题。在他们所提出的文本叙事生成框架中,文本的生成不是单纯地从语言模型所定义的概率分布中采样,而是会对采样得到“候选文本”进行评分,再选出评分较高的样本。

这个评分的机制反应了文本在读者脑中与上下文的一致性。这个框架使用了叫做COMET_20^20的常识性推理模型,来模拟读者在读到文本之后会在脑内建立起的语义网络。给定一个事件,比如”X修好了他的车“,COMET_20^20​能够推理出可能作为这个事件的上下文的各种假设,比如”X需要开这辆车“、”修车应该没有X承担不起的巨大花销“、“X去了修车店”、“X付了钱”等等。

COMET_20^20中关于”X修好了他的车“这一事件的相关常识性推理知识图谱

在叙事生成的过程中,作者使用COMET_20^20来为前一个句子和用语言模型采样得到的下一个句子的候选分别生成这样的上下文语义网络,然后去比较这两个网络的一致性,根据一致性程度来确定下一个句子的候选的得分,最后选择得分高的句子作为下一个句子,以这种方式来保证读者能够建立起脑内的上下文。

这种方法首次将读者脑内模型的概念也引入到了语言模型叙事生成的技术之中,虽然这里考虑的只是简单的脑内模型的一致性问题,但它开启了不少新的可能性:比如,有没有可能通过控制读者脑内模型的演变序列生成叙事,来实现各种各样的叙事诡计?

结语

生成文本叙事,对于AI来说,是一件很特殊的任务。在一般的人工智能任务中,比如自动驾驶、图像识别、自动装配等,AI都只需要完成任务,而不太需要在完成任务的过程中与人类沟通。这些情形下,它就不太需要突破它的“黑盒子”特性——它尽可以用任何在人类概念中毫无对应物的、无法向人类解释的逻辑完成任务——只要任务完成了,它就是成功的。它的成功可以完全只由结果得到衡量。

而生成文本叙事,却迫使AI去模仿人类思考问题的方式。它被要求生成的内容本身就是人类进行抽象的思考和交流的媒介,训练的目的实际上是迫使它在它不同于人脑的思考回路基础之上,形成对语言含义的与人类一致的理解,继而让语言这个向来只能运行在人脑这个“硬件”上的“软件”,被“移植到全新的硬件平台上“。

为了能够进行这样的“移植”,我们势必要面对这样一个问题:促成一个人对语言的理解的条件是什么?或者换句话说,语言的含义究竟来自哪里?

将互联网上的庞大文本数据作为训练数据集投喂给模型,指望训练出一个能够跟人类有沟通基础的AI,实际上是在表达这样的一个语言学假设:语言的含义有相当大一部分是来自于语词所出现的文本环境。

尽管按照我们的常识来看,我们对很多概念(比如”幸福“、”痛苦“、”爱情“)的理解,都是扎根于实实在在的生活经历和大脑中的情绪化学反应的,其含义很难说完全存在于单纯的文本环境。但是从现在大数据驱动的语言模型的表现来看,即使剥离掉所有这些生活经历和情绪机制,似乎也能得到一个跟人类有一定沟通基础的AI了。

这无疑是一个颠覆性的认知。

然而,剥离掉了生活经历和情绪基础、目的也单纯只是为人类服务的AI,所产生的文本作品,比起人类作家写出的作品,就缺少了丰富的自我表达。我们不能像阅读传统的文学作品那样,将阅读的过程看作也是在解读作者想要传达的某种讯息、甚至解读作者的人生。文本的含义甚至在作者一方是相对单薄而浅层次的,含义更多的是在读者这里被丰富化并被赋予意义。这是一种不进行自我表达的艺术,或者说一种”表达先于意义“的后现代主义艺术。

这样的艺术,对我们来说也不是陌生的。拥有几百上千人制作团体的商业电影、根据大数据分析决定剧情走向来迎合观众喜好的电视剧、单纯为了配合游戏机制而编出的剧情、用公式演算出的分形艺术,不都是这样的”艺术“吗?

它可以是资本家割韭菜的手段,也可以是超越人类创意的通灵自然的媒介,全看怎么被使用。

关于计算机与艺术,欢迎阅读我的另一个文章系列:计算创意学

对语言模型感兴趣的朋友,也欢迎收听我参加的播客节目:谷歌 LaMDA :谢邀,希望大家理解,我也是个人。

参考文献

[1] Mark Riedl, “An Introduction to AI Story Generation”: https://mark-riedl.medium.com/an-introduction-to-ai-story-generation-7f99a450f615

[2] Calderwood, Alex, Noah Wardrip-Fruin, and Michael Mateas. "Spinning Coherent Interactive Fiction through Foundation Model Prompts."

[3] 维基百科条目”叙事(Narrative)“: https://en.wikipedia.org/wiki/Narrative[4] Martin, Lara, et al. "Event representations for automated story generation with deep neural nets." Proceedings of the AAAI Conference on Artificial Intelligence. Vol. 32. No. 1. 2018.

[5] Rashkin, Hannah, et al. "Plotmachines: Outline-conditioned generation with dynamic plot state tracking." arXiv preprint arXiv:2004.14967 (2020).

[6] Tambwekar, Pradyumna, et al. "Controllable neural story plot generation via reinforcement learning." arXiv preprint arXiv:1809.10736 (2018).

[7] Peng, Xiangyu, et al. "Inferring the reader: Guiding automated story generation with commonsense reasoning." arXiv preprint arXiv:2105.01311 (2021).

[8] Hwang, J. D., Bhagavatula, C., Le Bras, R., Da, J., Sakaguchi, K., Bosselut, A., & Choi, Y. (2021). On symbolic and neural commonsense knowledge graphs.

[9] Wei, Jason, et al. "Chain of thought prompting elicits reasoning in large language models." arXiv preprint arXiv:2201.11903 (2022).

[10] Gwern的个人wiki:https://www.gwern.net/GPT-3

[11] Reynolds, Laria, and Kyle McDonell. "Prompt programming for large language models: Beyond the few-shot paradigm." Extended Abstracts of the 2021 CHI Conference on Human Factors in Computing Systems. 2021.

Subscribe to 菌群反应器

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe