首頁 遊戲資訊 基於大數據的語言模型與程序...

基於大數據的語言模型與程序化敘事生成(下)

在基於大數據的語言模型與程序化敘事生成(上)中,我們介紹了通過語言模型生成文本敘事的基本原理。其中我們簡單地引出了這種敘事方法存在的可控性問題、言之無物問題和前後一致性問題。

這一章,我們來具體討論這幾個問題和可能的解決方案,以及基於語言模型的文本敘事生成與2018年的文章故事工程學:人工智慧與程序化敘事生成所介紹的那些方法之間的關系。

如何控制語言模型生成的敘事

一直以來在我們的概念中,指揮計算機做事的方法就是通過編程,我們要去學習一整套有嚴格的語法和語義的程式語言,瞭解這些程式語言中的指令是如何在計算機的運作過程中起作用,設計好想要計算機執行任務的整個過程後,再翻譯成能夠實現這個過程的代碼,最後編譯成程序。

這是一個容錯性非常低的任務,程序必須完全准確無誤,才能讓計算機做我們想讓它做的事,因此對用戶的專業技能要求也很高。

這個特徵也反映在傳統的敘事生成方法中。傳統的敘事生成方法非常依賴於一個故事域的定義,這個故事域要定義清楚所有可能發生的事件,每個事件發生的前置條件是什麼,發生之後又會對世界狀態產生什麼影響。有了這個故事域的定義,算法才能去搜索滿足用戶要求的事件序列。

這也是一個容錯性極低的過程,故事域的定義完全不能模稜兩可、不能存在信息缺失,否則生成的故事就會產生各種荒謬的錯誤。我在過去的文章《Cybertext》讀書筆記(六):文本創作機器中介紹過著名的童話故事生成程序Tale-spin由於故事域的定義問題產生的一些掉鏈子的故事。

基於大數據的語言模型與程序化敘事生成(下)

而跟機器交代任務的這種方式,跟與人類交接任務的情況非常不一樣。想像我們現在是在委託一個職業寫手來幫我們寫一段「某個對玩家團隊非常忠誠的NPC最後卻背叛了大家」的中世紀背景下的跑團劇情。

首先,我們肯定不會把所有中世紀背景下的跑團故事所有可能發生的事件全部列成一個清單交給對方——我們一般認為只需跟對方說「中世紀背景下的跑團」,對方就應該對哪些事件可以發生、那些事件不會發生有了基本的概念。

我們也不會跟對方精確定義「背叛」的概念,因為對方應該也對這個概念有自己的理解了。我們只需要用自然語言跟對方描述,這個故事中應該有「某個對玩家團隊非常忠誠的NPC最後卻背叛了大家」的橋段。

因為自然語言也是對方熟悉的語言,而且我們與對方身處相近的文化環境和社會環境中,從小到大的經歷有相當多的共通之處,對自然語言中的各種各樣的概念的理解,應該大致上是相通的,這構成了我們溝通的基礎。

而大數據語言模型,事實上也是想要通過從超龐大語料庫中的學習,來模擬這樣一個「對自然語言中的概念與人類有相當多的相通之處」的人工智慧系統。

雖然這個模擬與真實之間還存在很大差異,在「究竟有多少相通之處」這一點上也有非常多的爭議:比如我們可能會問,並未與我們身處同一個文化環境和社會環境、也沒有從小到大與世界互動的經歷的AI,它對語言的理解跟我們究竟能相似到什麼程度?

但從原則上說,如果我們接受「它是對一個說著自然語言的人的模擬」,就應該像與一個說著自然語言的人交代工作那樣,用自然語言對它說,「寫一段某個對玩家團隊非常忠誠的NPC最後卻背叛了大家的中世紀跑團故事橋段」。

於是,我在ChatGPT中輸入:

ChatGPT的回答是:

這個故事確實跟我的指示非常符合,但似乎過於空洞、缺少細節,於是我指示說:

ChatGPT給出的第二版故事是:

這段話確實更具體了,但我還是覺得不滿意。因為NPC的背叛顯得很突然,沒什麼來由。我突然想到一個點子,如果NPC其實是個很善良的人,但還是背叛了,整個故事會更有戲劇性。於是我又對ChatGPT指示說:

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

故事漸漸豐滿了起來,但我還是覺得NPC的背叛缺少鋪墊,於是我又指示說:

ChatGPT給出第四版故事:

這個版本已經很接近一個我想要的故事骨架。這個修改的過程還可以繼續下去,來增加更多的細節信息。

基於大數據的語言模型與程序化敘事生成(下)

可以看到,上面這個與ChatGPT合作疊代故事版本的過程,其實已經很接近跟一個人類寫作者的合作方式:委託方提出需求,然後寫手根據需求寫出一個草稿,委託方看到草稿後會意識到一開始需求的問題——需求可能不夠具體、可能不切實際、可能讓對方產生誤解、可能並沒有準確反映出自己想要的東西等等——於是修改需求,然後寫手根據新的需求寫出新版本,如此疊代下去,直到最後得到委託方滿意的作品。

基於大數據的語言模型與程序化敘事生成(下)

在這個過程中,不僅僅需求和作品得到修正和疊代,委託方與寫手之間的溝通方式也在得到修正和疊代。雖然雙方使用的都是自然語言,但是這個世界上不可能有兩個人的生活和文化經歷完全相同。這些經歷上的不同導致兩個人對自然語言表述的概念(尤其含義較為抽象的概念),難以避免地會有偏差。而這些偏差,只有雙方在不斷的溝通嘗試之中加深對對方的瞭解,才能逐漸克服,使自己的溝通方式更加適用於對方。

而與一個基於語言模型的AI溝通也是這樣。AI雖然使用著同樣的自然語言,但是不像人類通過實實在在的生活經歷獲得對語言中各種概念的理解,AI對語言的理解完全只來自於訓練時接觸到的語料庫。這意味著AI對語言的理解必然與我們存在偏差,我們也需要通過不斷的溝通嘗試,來掌握到對AI更有效的說話方式。

比如說,如果對方是一個跟我們交情足夠深的人類寫手,我們可能會在交談中提起對方之前經歷過的某一次痛徹心扉的出軌,然後指示說在作品中寫出這種被背叛的感覺,以此來引導作品內容變得更加有血有肉。

基於大數據的語言模型與程序化敘事生成(下)

沒有真正與社會互動過的AI,不可能有這種經歷可以訴諸。而更重要的是,在近乎整個網際網路的語料庫上訓練出來的AI,如果一定要擬人化,那麼它的「人格」比起某個特定的人來,更像是一個「所有網際網路上的人格的平均值」。這樣的AI,如果要讓它寫出個人風格較強的故事,可以在提示中要求它代入某個特定的廣為人知(有足夠訓練數據)的情境,比如,在上面的ChatGPT寫故事的例子中,我可以進一步指示:

如此就能得到這樣的風格性更強的故事:

於是,怎樣的溝通方式更適用於大數據語言模型這個問題,就變得像是如何訓練貓狗、如何教育小孩、如何跟領導匯報工作一樣,變成了一門深刻的學問,我們稱之為是「提示工程」(Prompt Engineering)。

這是一種與機器的交互方式的根本性變革。在機器這種事物被發明出來初期,人們需要為每一個特定的任務去設計專門的硬體——某種意義上是「編程」的最早期形式。通用計算機的出現,實現了靠輸入特定的指令來改變機器的行為,從而適應不同的任務——也就是設計算法。深度學習被廣泛應用之後,我們發現機器能夠模仿訓練數據集的行為,因此設計數據集也成為指導機器去完成特定任務的方式。而今天,隨著大數據驅動的語言模型的出現,我們看到了構建一個功能普適性的統計模型的可能性,這個統計模型理論上可以蘊含我們想要的任何計算功能,而我們需要去做的只是用恰當的自然語言去激發正確的功能——這將我們引向軟體工程的最新時代:提示設計時代。

基於大數據的語言模型與程序化敘事生成(下)

在這樣的時代,交代機器執行任務,將與交代人執行任務,不再有根本性的差別。不知道這樣的未來什麼時候會到來。

關於提示工程,非常推薦英文好的朋友閱讀學者Gwern的個人wiki。

敘事背後的那個故事在哪里

我們說了那麼久的「敘事生成」,但究竟什麼是敘事?

維基百科上的「Narrative(敘事)」詞條,有這麼一個簡單的定義:

當我們人類在進行敘事時,我們往往先在腦海中想到要去講述的這個事件或者事件序列,然後再去思考怎樣去講述它。而敘事的觀眾,也只有在能夠根據敘事者的講述,在他們自己的腦海中還原出了這個事件或者事件序列,才能被認為是「理解」了這個敘事。先有能夠被講述的事件,再有對這些事件的講述,這一直是我們腦中的常理。

因此傳統的敘事生成技術,也沿用這樣的思路。讓程序先去生成一個能夠被講述的事件/事件序列,然後再去生成講述這個事件/事件序列的文本。

如何生成一個有趣的事件序列,成為「如何生成一個有趣的敘事」這個問題的核心。人們想到了圖搜索、自動化邏輯推理、遺傳算法、社會關系模擬等等方法。計算的瓶頸也往往在這里。

基於大數據的語言模型與程序化敘事生成(下)

而大數據驅動的語言模型,卻徹徹底底繞過了這一步。它不在事件序列上做任何預先的思考或者說計算,而直接去生成「講述」本身。這個講述被讀者讀到之後,也許能夠在讀者的腦中被提取出事件,但對於完全沒有生活經歷的語言模型來說,這些事件在它腦中多半並無對應物。這種情況下,事件和對事件的講述之間的先後關系被徹底顛倒了。

事件和對事件的講述之間的關系顛倒,以及講述者和觀眾的「腦內模型(Mental Model)」之間的不一致,被很多學者認為是語言模型在敘事生成上的根本性缺陷。

既然如此,要解決這個問題,首要的任務就是在語言模型的背後引入「事件」的概念。

2017年的論文《Event Representations for Automated Story Generation with Deep Neural Nets (基於深度神經網絡的自動化故事生成中的事件表示)》提出了一種思路。

在上篇中我們提到了,語言模型可以是一種「從序列到序列(seq2seq)」的模型,其中的序列指的是單詞或者字組成的序列。這個序列顯然跟文本敘事背後的事件沒有直接聯系。

但是,敘事背後的事件序列不也是一種「序列」嗎?能不能將事件序列也看做是一種「語言」,用生成式語言模型來生成事件序列呢?

文章首先將一個事件定義為一個4元組。這樣就可以將用一句自然語言很鬆散地描述的事件,轉換為更加結構化的表示形式。比如

所描述的事件,可以用這種結構化的方式表示為兩個事件組成的序列

語言模型的訓練需要大量的語料庫,要訓練這個事件序列的語言模型,我們也需要大量的像上面這樣的事件序列來作為語料庫。

這篇論文從大量電影在維基百科中的情節描述所組成的語料庫中,利用現有的自然語言處理技術(Stanford’s Core NLP),從句子中提取出這樣的結構化的事件序列表示,組成了一個事件序列的語料庫,來訓練這個能夠生成事件序列的語言模型。這個語言模型被稱為是Event2Event模型。

能夠生成事件序列之後,論文作者又引入一個從結構化的事件表示來生成對應的自然語言句子的語言模型,稱之為是Event2Sentence。將兩個模型組合,我們就得到一個先生成事件序列、再生成這個事件序列的自然語言描述的敘事生成工作流。這個工作流就非常接近於「先思考要講什麼故事,再思考怎麼講這個故事」的人腦敘事生成工作流。

基於大數據的語言模型與程序化敘事生成(下)

這個方法為語言模型敘事引入了一個被敘述的事物,使得語言模型產生的文本看起來更加「言之有物」了。但它也還只是一個開始。作為一個四元組的事件表示,顯然是一個過於簡化的形式化定義,在將句子轉換為這種表示的過程中,會有大量信息損失,也就意味著使用這種方法來進行敘事,只能對相對來說非常基本的事件言之有物。

而如果要人為去擴展這個事件的結構化表示,使得它能夠適應現實中的事件的復雜程度,就成為一個更加復雜而龐大的工作——因為現實中的事件實在是太復雜了。而且,這種做法也不符合機器學習的理念——應該盡可能讓機器自己從數據中學到解決問題需要的信息,而不是人為地灌輸。

在2020年提出的另一種方法《PlotMachines Outline-Conditioned Generation with Dynamic Plot State Tracking(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中,提到這一點背後的一個原因

(註:其中所說的「符號系統」就對應於傳統的基於故事域搜索的敘事生成方法)

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來為前一個句子和用語言模型采樣得到的下一個句子的候選分別生成這樣的上下文語義網絡,然後去比較這兩個網絡的一致性,根據一致性程度來確定下一個句子的候選的得分,最後選擇得分高的句子作為下一個句子,以這種方式來保證讀者能夠建立起腦內的上下文。

這種方法首次將讀者腦內模型的概念也引入到了語言模型敘事生成的技術之中,雖然這里考慮的只是簡單的腦內模型的一致性問題,但它開啟了不少新的可能性:比如,有沒有可能通過控制讀者腦內模型的演變序列生成敘事,來實現各種各樣的敘事詭計?

結語

生成文本敘事,對於AI來說,是一件很特殊的任務。在一般的人工智慧任務中,比如自動駕駛、圖像識別、自動裝配等,AI都只需要完成任務,而不太需要在完成任務的過程中與人類溝通。這些情形下,它就不太需要突破它的「黑盒子」特性——它盡可以用任何在人類概念中毫無對應物的、無法向人類解釋的邏輯完成任務——只要任務完成了,它就是成功的。它的成功可以完全只由結果得到衡量。

而生成文本敘事,卻迫使AI去模仿人類思考問題的方式。它被要求生成的內容本身就是人類進行抽象的思考和交流的媒介,訓練的目的實際上是迫使它在它不同於人腦的思考迴路基礎之上,形成對語言含義的與人類一致的理解,繼而讓語言這個向來只能運行在人腦這個「硬體」上的「軟體」,被「移植到全新的硬體平台上「。

為了能夠進行這樣的「移植」,我們勢必要面對這樣一個問題:促成一個人對語言的理解的條件是什麼?或者換句話說,語言的含義究竟來自哪里?

將網際網路上的龐大文本數據作為訓練數據集投餵給模型,指望訓練出一個能夠跟人類有溝通基礎的AI,實際上是在表達這樣的一個語言學假設:語言的含義有相當大一部分是來自於語詞所出現的文本環境。

盡管按照我們的常識來看,我們對很多概念(比如「幸福」、「痛苦」、「愛情」)的理解,都是紮根於實實在在的生活經歷和大腦中的情緒化學反應的,其含義很難說完全存在於單純的文本環境。但是從現在大數據驅動的語言模型的表現來看,即使剝離掉所有這些生活經歷和情緒機制,似乎也能得到一個跟人類有一定溝通基礎的AI了。

這無疑是一個顛覆性的認知。

然而,剝離掉了生活經歷和情緒基礎、目的也單純只是為人類服務的AI,所產生的文本作品,比起人類作家寫出的作品,就缺少了豐富的自我表達。我們不能像閱讀傳統的文學作品那樣,將閱讀的過程看作也是在解讀作者想要傳達的某種訊息、甚至解讀作者的人生。文本的含義甚至在作者一方是相對單薄而淺層次的,含義更多的是在讀者這里被豐富化並被賦予意義。這是一種不進行自我表達的藝術,或者說一種「表達先於意義」的後現代主義藝術。

這樣的藝術,對我們來說也不是陌生的。擁有幾百上千人製作團體的商業電影、根據大數據分析決定劇情走向來迎合觀眾喜好的電視劇、單純為了配合遊戲機制而編出的劇情、用公式演算出的分形藝術,不都是這樣的「藝術」嗎?

它可以是資本家割韭菜的手段,也可以是超越人類創意的通靈自然的媒介,全看怎麼被使用。

關於計算機與藝術,歡迎閱讀我的另一個文章系列:計算創意學。

對語言模型感興趣的朋友,也歡迎收聽我參加的播客節目:Google LaMDA :謝邀,希望大家理解,我也是個人。

作者公眾號: junjunstorytelling

參考文獻

[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):wikipedia: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.

來源:機核