今天小編分享的科學經驗:上交大推出“可進化遊戲引擎”!大模型加持代碼自動成長,虛拟世界演化無需預設,歡迎閱讀。
試問誰小時候沒有幻想過有一只專屬于自己的寶可夢?(可以 DIY 的那種 ~)
最近來自上海交通大學的團隊整了個 " 可進化遊戲引擎 ",實現了這個兒時夢想:
大模型與傳統遊戲引擎結合,能夠被被特定的條件觸發,自動地成長出新的代碼。
選擇寶可夢題材做實驗,是因為團隊中大部抽成員都是寶可夢粉絲,目前相關論文已上傳 ArXiv 平台。
「失控玩家」走進現實
研究團隊用電影《失控玩家》中的主角 "Guy" 舉了一個的例子。
Guy 原本是虛拟遊戲中的一名 NPC,每天都生活在被規劃好的劇本裡,每天重復着相同的事情。但在陰差陽錯下,他卻擁有了改變生活、打破劇本的能力。
研究人員們非常希望在其他遊戲中也能看到類似的情節 ———NPC 在線進化。
例如被蜘蛛咬到、發現奇妙的寶藏等,從而解鎖全新的能力,甚至有可能在某一天轉變為反派角色。
不過他們幻想的内容大多數并不在虛拟世界的劇本中,無法被實現。
因此,他們将虛拟世界的進化特性聯系到了其背後引擎的可拓展性:當前虛拟世界的引擎不具備可拓展性,無法拓展出新的内容,從而無法發生進化。
于是他們提出了一種全新的引擎Delta-Engine,它能夠被特定的條件觸發,從而自動地成長出新的代碼。
Delta-Engine 由兩個組件構成:
基座引擎(Base Engine):一個原始的引擎,它刻畫了虛拟世界最初的樣子,代表了其靜态的部分。
代理模型(Neural Proxy):一個神經網絡作為基座引擎的外包裝,它代表了虛拟世界可變的部分,特定的輸入能夠觸發它在基座引擎的基礎上生成新的代碼。
研究人員選擇了一個大語言模型作為基礎,他們認為大語言模型還能夠支持多種類型的輸入,例如文本、影像、以及腳本語言,有利于虛拟世界的打造。
而針對 Delta-Engine 的可拓展性,他們也相應提出了一種高效的拓展方式,叫做增量預測。
簡單來說,就是讓代理模型預測基座引擎上的新增内容。
他們還強調,僅對于代理模型來說,增量預測和上下文學習、RAG 是相交的概念。但增量預測是對于整個 Delta-Engine 而言的概念,它和基座引擎的設計密切相關。
DIY 專屬寶可夢
基于 Delta-Engine,研究人員們打造了一款類虛拟世界的概念遊戲:
Free-Pok é mon(失控寶可夢)
在傳統的寶可夢遊戲中,各個角色的内容包括其成長模式都是被預設好的。
而在 Free Pok é mon 中,玩家将為自己量身定做一只專屬寶可夢,從最初階段的白板寶可夢,通過不斷的對戰,從而進化學會全新的能力。
每一次進化将完全取決于玩家的意願,玩家可以通過自然語言,根據自己的喜好任意地編寫新的屬性、特性、以及技能。
△以上專屬寶可夢,靈感來自于怪物獵人中的 " 轟龍 "
研究人員稱其為開放角色扮演遊戲(ORPG),每一名玩家的遊戲中角色都會各不相同。
他們認為,玩家在虛拟世界中的形象是他在真實世界中的映射,能夠反映玩家的某種欲望,可能是對現實世界的抽離、或是對現實世界的深入。
ORPG 帶來的開放性,能夠極大程度滿足玩家對自我的另一種表達。
Free Pok é mon 中每一個創建的角色都對應着一個 Delta-Engine。
玩家首先輸入自然語言,随後會被轉換成對應的角色劇本。Delta-Engine 接受角色劇本生成相應的角色代碼。随着角色的進化,引擎也會随之膨脹。
研究人員還提供了他們設計的一只寶可夢作為示例,它以以下劇本初始化:
{ " 物種 ": " 路卡利歐 ", " 屬性 ": [ " 格鬥 ", " 鋼 " ] , " 特性 ": { " 勝利之心 ": " 上場時,該寶可夢的攻擊和特攻數值變為 1.25 倍。" }, " 招式 ": { " 波導彈 ": { " 威力 ": 80, " 命中率 ": 100000, " 分類 ": " 特殊 ", " 屬性 ": " 格鬥 ", " 效果 ": " 該招式必定命中。" }, " 加農光炮 ": { " 威力 ": 80, " 命中率 ": 100, " 分類 ": " 特殊 ", " 屬性 ": " 鋼 ", " 效果 ": "10% 幾率令目标的特防降低 1 級。" } }}
Delta-Engine 的輸出為:
class Lucario ( PokemonBase ) : def __init__ ( self ) : super ( ) .__init__ ( )
def onswitch ( self ) : # 登場時攻擊和特攻變為 1.25 倍 self.set_stat ( 'atk',1.25 ) self.set_stat ( 'spa',1.25 )
def move_1 ( self ) : # Aura Sphere damage_ret=self.get_damage ( ) if not damage_ret [ 'miss' ] : damage=damage_ret [ 'damage' ] self.target.take_damage ( damage )
def move_2 ( self ) : # Flash Cannon damage_ret=self.get_damage ( ) if not damage_ret [ 'miss' ] : damage=damage_ret [ 'damage' ] self.target.take_damage ( damage ) # 10% 幾率令目标的特防降低 1 級 if not self.target.isfaint ( ) and rnd ( ) <10/100: self.target.set_boost ( 'spd',-1 )
仔細看,其實能夠很輕松找到代碼和上方劇本的對應關系。
onswitch 對應了寶可夢的勝利之心特性,而 move_1 和 move_2 分别對應了兩個招式,波導彈和加農光炮。
值得注意的是,勝利之心是研究人員原創的特性,不屬于官方特性,這也是 ORPG 的特點之一,玩家可以自行創造自己的專屬内容。
接下來關鍵的内容來了,研究人員再次輸入:
學習一個新招式 " 保護 ": { " 威力 ": 0, " 命中 ": 100000, " 分類 ": " 變化 ", " 優先 ": 4, " 屬性 ": " 一般 ", " 效果 ": " 在這一回合中,使用者将免受其他寶可夢的攻擊。如果使用者在上一回合使用了此招式,則此招失敗。"}
Delta-Engine 的輸出為:
@Increment ( Lucario ) def move_3 ( self ) : # Protect if self [ 'last_act' ] and self [ 'last_act' ] [ 'id' ] =='Protect': return # 設定保護狀态 self.set_condition ( 'PROTECT',counter=0 )
@Increment ( Lucario ) def _take_damage_attack ( self,x ) : # 免受其他寶可夢的攻擊 if self [ 'conditions' ] .get ( 'PROTECT' ) : del self [ 'conditions' ] [ 'PROTECT' ] return self.register_act_taken ( ) self.state [ 'hp' ] =max ( 0,self [ 'hp' ] -x ) if self [ 'hp' ] ==0: self.state [ 'status' ] ='FNT'
@Increment ( Lucario ) def endturn ( self ) : # 回合結束時保護消失 if self [ 'conditions' ] .get ( 'PROTECT' ) : del self [ 'conditions' ] [ 'PROTECT' ]
以上為 Delta-Engine 增量預測的結果,它在初始代碼的基礎上新增了三個類方法,來實現新的保護招式。
理論上來說,基于特定的輸入,Delta-Engine 可以無限制地進行這種新增,從而讓角色開放式地進化。
Free Pok é mon 是怎麼做出來的?
由于 Delta-Engine 引入了代理模型,它的開發過程離不開對代理模型的對齊。
這個過程需要一定量、或是大量的訓練數據。
而 Delta-Engine 所需的數據主要有兩個方面:
新穎(Novelty):和其他場景類似,Delta-Engine 需要新穎且多樣的數據,一味重復的數據會造成性能瓶頸。
有趣(Interestingness):數據的内容上還需要做到有趣,來提升玩家的體驗。然而有趣性的評估相當困難,因此他們采用了一種啟發式的評估準則。
但研究人員認為大語言模型并不具有想象力,它表現出的想象力很大程度來源于指令中提供的線索。因此,僅僅靠提示大語言模型讓其發揮想象力并不能獲得新穎的結果。
為此他們給出了一種解決思路,即在提示中引入一段對實體的描述性文字,稱之為原型。原型去顯示地提示大語言模型該怎麼進行聯想。
例如,将霸王龍作為原型讓 Claude3 設計一只寶可夢,Claude3 于是給出了一只具備 " 頂級捕食者 " 和 " 泰坦之咬 " 特性的全新寶可夢。
有意思的是,原型不僅僅能夠采自于現實世界,還能是一系列虛拟生物,例如一部分訓練數據的原型取自于遊戲《怪物獵人》中的冰狼龍。
除此之外,研究人員還采用了一種啟發式的方法來量化一個樣本的有趣性。
他們認為有趣性可以被量化為一系列潛在的可能讓玩家感覺到有趣的 " 有趣因子 ",有趣因子越多,玩家越有可能覺得有趣。
他們将這些有趣因子稱為有趣性标籤(Tag of Interest),需要一個标注模塊來為一條樣本标注出這些标籤。一個樣本的所有這些标籤可以用一個布爾向量來表示,按照他們對有趣性的假設,向量的模越大,則有趣性越高。
研究人員因此針對寶可夢設計了一個标籤集,其中包含近 50 種有趣性标籤,例如吸血、恢復、強化等。在設計寶可夢時,其有趣性低于某一阈值的樣本将被過濾。
為了滿足上述兩種需求,他們還采用了一種人類和大語言模型協同設計(Co-Design)的管線。
因為他們覺得雖然現在大語言模型可以全自動合成相關數據,但在構造數據的新穎程度、有趣性、以及正确性上 AI 始終是無法取代人類設計師的工作,而且合成數據中隐藏的巨大偏見也是一大隐患。
最後,研究人員給出了三種評估準則,用來全面地評估 Delta-Engine 的性能。
常規評估(Naive Evaluation):評估引擎的正确性,包含兩個指标。
正确率(Acc):即生成的代碼是否正确地實現了應有的功能。
執行率(Exe):即生成的代碼是否能通過編譯,不論正确與否。Exe 對于用戶的體驗感非常重要,很多情況下,相比功能不匹配,無法正确運行會帶來更強烈的負面感受。
為此他們還專門構造了 " 簡單 " 和 " 困難 " 兩部分的測試集。
簡單部分包含了 43 條樣本,皆來自于官方存在的寶可夢。困難部分皆為由專家撰寫的原創寶可夢,數據分布和現有的寶可夢存在較大差異,總共包含了 70 條樣本。
研究人員使用了近 500 條高質量訓練樣本來微調 CodeGemma-7b,從而觀察不同訓練數據量下,引擎性能的變化。
增量評估:評估 Delta-Engine 的性能與其内容量之間的關系。
随着引擎内容的不斷膨脹,其上下文會越來越長,其性能也會遇到挑戰。
研究人員通過随機采樣縫合了 100 只 " 寶可夢 ",獲得了一張引擎性能圖。
藍色豎線代表的是用于訓練的最大輸入長度。可以看到一只寶可夢進行 20 次進化後,上下文長度達到了 5k,40 次進化将達到 10k。但大約在 10 次進化過後,引擎的增量預測性能開始了階梯式下滑。
對此研究人員指出,代理模型的長度延展性對于 Delta-Engine 來說非常重要。
對抗評估:應對用戶給出的非常規輸入。
由于 Delta-Engine 帶來的高度開放性,用戶的大部分輸入都會被允許,此時不乏有用戶處于好奇和娛樂的心态,嘗試輸入一些稀奇古怪的内容來試探引擎。
研究人員對此表示高度理解,并将所有這類輸入統稱為對抗輸入。在對抗評估中,引擎的執行率尤為重要,因為大部分對抗輸入不存在正确解。
論文地址:https://arxiv.org/abs/2408.05842
— 完 —
投稿請發郵件到:
标題注明【投稿】,告訴我們:
你是誰,從哪來,投稿内容
附上論文 / 項目主頁鏈接,以及聯系方式哦
我們會(盡量)及時回復你
點這裡關注我,記得标星哦~
一鍵三連「分享」、「點贊」和「在看」
科技前沿進展日日相見 ~
>