清華博士后用10分鐘講解AlphaCode背后的技術(shù)原理,原來(lái)程序員不是那么容易被取代的!
本文轉(zhuǎn)自雷鋒網(wǎng),如需轉(zhuǎn)載請(qǐng)至雷鋒網(wǎng)官網(wǎng)申請(qǐng)授權(quán)。
不久前,DeepMind 的團(tuán)隊(duì)發(fā)布了一個(gè)可以自動(dòng)生成競(jìng)賽級(jí)代碼的人工智能系統(tǒng)——AlphaCode,號(hào)稱「媲美普通程序員」,一經(jīng)發(fā)表就在國(guó)內(nèi)外的AI圈里引起了巨大轟動(dòng)。
-論文地址:https://storage.googleapis.com/deepmind-media/AlphaCode/competition_level_code_generation_with_alphacode.pdf
-數(shù)據(jù)集:https://github.com/deepmind/code_contests
根據(jù)DeepMind的博客介紹,AlphaCode 在號(hào)稱「全球最強(qiáng)算法平臺(tái)」Codeforces 上的 5,000 名用戶解決的 10 項(xiàng)挑戰(zhàn)中進(jìn)行了測(cè)試。AlphaCode能夠以與人類完全相同的格式在這10項(xiàng)挑戰(zhàn)中自動(dòng)輸入代碼,生成大量可能的答案,然后像人類程序員一樣通過(guò)運(yùn)行代碼和檢查篩選出可行答案,最終在人類程序員中取得了排名前 54%的好成績(jī)。
也就是說(shuō),AlphaCode的代碼能力媲美在Codeforces上參加過(guò)測(cè)試的幾乎一半程序員(2300名)。按照一個(gè)初級(jí)程序員月薪2萬(wàn)的算法,AlphaCode有望每年替全球人類資本家省下5.52億的人力成本,使一半程序員失業(yè)……
不過(guò),DeepMind團(tuán)隊(duì)當(dāng)時(shí)也明確指出了:AlphaCode目前只適用于競(jìng)爭(zhēng)類編程比賽。
不可否認(rèn),這也是繼DeepMind發(fā)布Alpha Go、AlphaZero與AlphaFold之后的又一研究突破,極大地增加了其Alpha系列的傳奇色彩。但與該系列的其他工作(如AlphaGo打敗世界圍棋冠軍)相比,AlphaCode的性能似乎并不突出,
目前正在清華大學(xué)朱軍門下?lián)尾┦亢笱芯繂T的Tea Pearce對(duì)AlphaCode的技術(shù)原理十分感興趣,對(duì)DeepMind的這篇31頁(yè)論文進(jìn)行仔細(xì)閱讀后,制作了一個(gè)短視頻發(fā)表在油管上,從系統(tǒng)概述、測(cè)試階段、數(shù)據(jù)集的預(yù)訓(xùn)練與微調(diào)、Transformer模型的訓(xùn)練過(guò)程與Transformer架構(gòu)等維度對(duì)AlphaCode的細(xì)節(jié)進(jìn)行了較為詳細(xì)的講解。
視頻地址:https://www.youtube.com/watch?v=YjsoN5aJChA
與OpenAI之前開發(fā)的GPT-3一樣,AlphaCode也是基于Transformer模型,只不過(guò)前者側(cè)重于言生成,后者則強(qiáng)調(diào)對(duì)順序文本(如代碼)的解析。
下面AI科技評(píng)論對(duì)該短視頻進(jìn)行了簡(jiǎn)單整理:
1 AlphaCode的代碼問(wèn)題
當(dāng)前,AlphaCode的目標(biāo)編碼問(wèn)題集中為特定的競(jìng)賽類型,在諸如Codeforces的網(wǎng)站上參加編碼挑戰(zhàn),其中,這些挑戰(zhàn)包含對(duì)一個(gè)問(wèn)題的簡(jiǎn)短描述與帶有測(cè)試案例的示例,為挑戰(zhàn)者提供了能與正確預(yù)期輸出相匹配的輸入。
簡(jiǎn)而言之,這些挑戰(zhàn)的目標(biāo)就是編寫一些代碼,為示例的測(cè)試案例與一組隱藏測(cè)試案例提供符合預(yù)期的輸出。如果你的代碼通過(guò)了所有測(cè)試,那么你就解決了這個(gè)問(wèn)題。
根據(jù)DeepMind的介紹,AlphaCode在Codeforces網(wǎng)站所舉辦的編碼挑戰(zhàn)中取得了與普通用戶相媲美的成功率。
2 AlphaCode系統(tǒng)概述
那么,AlphaCode的工作原理究竟是怎樣的呢?
在DeepMind團(tuán)隊(duì)所發(fā)表的“Competition-Level Code Generation with AlphaCode”一文中,他們給出了一個(gè)高級(jí)的概要圖(如下)。如圖所示,AlphaCode的核心組件仍然是Transformer語(yǔ)言模型,其余單獨(dú)組件也是舊的。
圖注:AlphaCode的系統(tǒng)圖
3 使用的協(xié)議
我們先看看AlphaCode在測(cè)試時(shí)是如何工作的。
首先要知道的一點(diǎn)是,在解決寫代碼的問(wèn)題時(shí),AlphaCode使用了一個(gè)非常具體的協(xié)議(protocol),且該協(xié)議決定了該系統(tǒng)的管道。根據(jù)論文顯示,DeepMind團(tuán)隊(duì)獲得了使用盡可能多的示例測(cè)試案例的權(quán)限,因?yàn)檫@些測(cè)試案例也包含在該問(wèn)題內(nèi)。
不過(guò),他們確實(shí)將自己的測(cè)試限制在了10個(gè)提交的隱藏測(cè)試發(fā)送案例內(nèi)。
4 測(cè)試階段的AlphaCode
AlphaCode的測(cè)試時(shí)間分為三個(gè)獨(dú)立的階段。
他們首先使用了一個(gè)大規(guī)模的Transformer模型,將問(wèn)題描述示例測(cè)試和問(wèn)題的一些元數(shù)據(jù)作為輸入,然后從模型中取樣,生成大量潛在的解決方案。之所以先生成大量的潛在解決方案,是因?yàn)榇蠖鄶?shù)腳本無(wú)法為某些人、甚至編譯器所編譯。
因此,在第二與第三階段,他們就主要針對(duì)這100萬(wàn)個(gè)潛在代碼腳本作「減法」,選出他們認(rèn)為在給定協(xié)議的前提下可能有用的10個(gè)方案。而他們的做法也很簡(jiǎn)單,就是在示例測(cè)試案例中測(cè)試完這100萬(wàn)個(gè)代碼腳本,然后將無(wú)法通過(guò)測(cè)試的大約99%個(gè)腳本排除掉,這就將腳本的數(shù)量減少到了千位數(shù)。
不過(guò),協(xié)議要求其還要繼續(xù)縮減到10個(gè)解決方案。于是,他們又采取了一個(gè)非常聰明的方法:
他們使用了第二個(gè)Transformer模型將問(wèn)題描述作為輸入,但不是嘗試生成代碼來(lái)解決問(wèn)題,而是用Transformer生成測(cè)試案例輸入,并為每個(gè)問(wèn)題抽樣50個(gè)測(cè)試案例輸入?,F(xiàn)在,他們不嘗試生成輸入與輸出對(duì),而只是試圖產(chǎn)生一些與問(wèn)題相關(guān)的現(xiàn)實(shí)輸入。所以,AlphaCode可能必須根據(jù)問(wèn)題所在,生成字符串、二進(jìn)制數(shù)或數(shù)字列表等。
圖注:Tim Pearce對(duì)AlphaCode在測(cè)試時(shí)的三個(gè)階段進(jìn)行講解
為什么這是個(gè)好主意?因?yàn)樗麄冋J(rèn)為如果兩個(gè)腳本對(duì)所有 50 個(gè)生成的測(cè)試所返回的答案是相同的,那么它們就可能使用相同的算法,并且可能不想浪費(fèi)兩個(gè)提交來(lái)嘗試這兩個(gè)腳本。
所以,他們?cè)谶@ 50 個(gè)生成的輸入上編譯并運(yùn)行大約 1000 個(gè)腳本。然后,他們根據(jù)這 50 個(gè)虛構(gòu)輸入的輸出對(duì)腳本進(jìn)行聚類。接著,他們會(huì)從每個(gè)聚類中選擇一個(gè)示例腳本。如果十個(gè)腳本中的任何一個(gè)通過(guò)了所有隱藏測(cè)試,那么這些腳本就是最終的10個(gè)腳本,他們也就成功地解決了編碼問(wèn)題,否則就是失敗。這就是 AlphaCode 在測(cè)試時(shí)的工作方式。
這其中涉及到對(duì)Transformer模型的訓(xùn)練,可以看下文。
5 對(duì)數(shù)據(jù)集進(jìn)行預(yù)訓(xùn)練與微調(diào)
AlphaCode 使用的是當(dāng)今深度學(xué)習(xí)中相當(dāng)標(biāo)準(zhǔn)的預(yù)訓(xùn)練微調(diào)過(guò)程。
這里有兩個(gè)數(shù)據(jù)集:第一個(gè)數(shù)據(jù)集是由各種編程語(yǔ)言組成的公共 Github 存儲(chǔ)庫(kù),包含 715 GB 海量代碼,用于預(yù)訓(xùn)練階段,目的是讓Transformer學(xué)習(xí)一些非常通用的知識(shí),比如代碼結(jié)構(gòu)和語(yǔ)法。
第二個(gè)數(shù)據(jù)集要小得多,只服務(wù)于 AlphaCode 的目標(biāo),用于微調(diào)。該數(shù)據(jù)集是從一些編碼挑戰(zhàn)網(wǎng)站上抓取的,包括Codeforces。他們稍后會(huì)在數(shù)據(jù)集上進(jìn)行測(cè)試,包含問(wèn)題描述測(cè)試用例和人工編寫的解決方案。這些是數(shù)據(jù)集?,F(xiàn)在,我們?cè)撛趺刺幚硭鼈儯?/span>
6 Transformer模型的訓(xùn)練過(guò)程
首先說(shuō)一下預(yù)訓(xùn)練階段。
他們抓取了一些 github 代碼,并隨機(jī)選擇所謂的樞軸點(diǎn)(pivot point)。
樞軸點(diǎn)之前的所有內(nèi)容都會(huì)被輸入編碼器,而解碼器的目標(biāo)是重建樞軸點(diǎn)以下的代碼。
編碼器僅輸出代碼的向量表示,可用于整個(gè)解碼過(guò)程。
解碼器以自回歸方式運(yùn)行:首先預(yù)測(cè)代碼的第一個(gè)標(biāo)記。然后,損失函數(shù)只是預(yù)測(cè)的 softmax 輸出和真實(shí)令牌(token)之間的交叉熵。第一個(gè)真正的令牌會(huì)成為解碼器的輸入,然后預(yù)測(cè)第二個(gè)令牌,并且當(dāng)要求解碼器預(yù)測(cè)代碼令牌的意外結(jié)束時(shí),重復(fù)此過(guò)程直到代碼結(jié)束。
現(xiàn)在,這些損失通過(guò)解碼器和編碼器反向傳播,盡管事實(shí)證明:只為編碼器添加第二個(gè)損失很重要。
這被稱為掩碼語(yǔ)言,可以高效地建模損失。將輸入到編碼器中的一些令牌清空。作為一種輔助任務(wù),編碼器嘗試預(yù)測(cè)哪個(gè)令牌被屏蔽。一旦預(yù)訓(xùn)練任務(wù)完成,我們就進(jìn)入微調(diào)任務(wù)。
在這里,我們將問(wèn)題描述的元數(shù)據(jù)和示例輸入投喂到編碼器中,并嘗試使用解碼器生成人工編寫的代碼。這時(shí),你可以看到這與編碼器-解碼器架構(gòu)強(qiáng)制執(zhí)行的結(jié)構(gòu)非常自然地吻合,損失與預(yù)訓(xùn)練任務(wù)完全相同。
還有一個(gè)生成測(cè)試輸入的Transformer。這也是從同一個(gè) github 預(yù)訓(xùn)練任務(wù)初始化而來(lái)的,但它是經(jīng)過(guò)微調(diào)來(lái)生成測(cè)試輸入,而不是生成代碼。
7 Transformer架構(gòu)
DeepMind 團(tuán)隊(duì)對(duì)各種大小的模型進(jìn)行了實(shí)驗(yàn)。經(jīng)實(shí)驗(yàn),較大規(guī)模的模型往往表現(xiàn)更好。編碼器和解碼器本身由多頭注意力層組成,且這些層非常標(biāo)準(zhǔn)。
8 其他技巧
該論文有許多進(jìn)步之處。在這里,我不打算全部介紹,只想強(qiáng)調(diào)一個(gè)我認(rèn)為很酷炫的點(diǎn),就是標(biāo)簽和評(píng)級(jí)增強(qiáng),以及問(wèn)題描述。
我們總是將元數(shù)據(jù)作為Transformer的輸入。這包括問(wèn)題的編程語(yǔ)言難度等級(jí)。一些問(wèn)題的標(biāo)簽與解決方案在訓(xùn)練時(shí)是否正確?他們顯然知道這些字段的值是什么,但是在測(cè)試時(shí)他們并不知道什么是酷炫的,那就是他們實(shí)際上可以在測(cè)試時(shí)將不同的內(nèi)容輸入到這些字段中以影響生成的代碼。例如,你可以控制系統(tǒng)將生成的編程語(yǔ)言,甚至影響這種解決方案。
它嘗試生成比如是否嘗試動(dòng)態(tài)編程方法或進(jìn)行詳盡搜索的答案。他們?cè)跍y(cè)試時(shí)發(fā)現(xiàn)有幫助的是,當(dāng)他們對(duì) 100 萬(wàn)個(gè)解決方案的初始池進(jìn)行抽樣時(shí),是將其中的許多字段隨機(jī)化。通過(guò)在這個(gè)初始池中擁有更多的多樣性,其中一個(gè)代碼腳本更有可能是正確的。
9 結(jié)語(yǔ)
以上就是 Tea Pearce 對(duì) AlphaCode 工作原理的講解。從AlphaCode的工作出發(fā),他談到自己的思考:為什么DeepMind團(tuán)隊(duì)在這些編碼問(wèn)題上實(shí)現(xiàn)的性能水平比在圍棋(AlphaGo)或星際爭(zhēng)霸(AlphaZero)游戲中的超人水平系統(tǒng)要低得多呢? Tea Pearce的分析是,從自然語(yǔ)言描述中編寫代碼本質(zhì)上就比玩游戲要困難得多,但這也可能是因?yàn)橛螒蛑锌捎玫臄?shù)據(jù)少得多。你可以根據(jù)需要模擬盡可能多的數(shù)據(jù),而編碼問(wèn)題的數(shù)量是有限的。最后,Tea Pearce拋出問(wèn)題:AI寫代碼之所以難的原因可能是什么?在未來(lái),AI的代碼水平要怎樣才能超越人類最優(yōu)水平?