AI編程登上Science封面:AlphaCode打競(jìng)賽,三分之二賽題一遍過(guò),成績(jī)超過(guò)一半程序員
DeepMind:提供0基礎(chǔ)編程新機(jī)會(huì)
魚(yú)羊 蕭簫 發(fā)自 凹非寺
量子位 | 公眾號(hào) QbitAI
DeepMind的NS論文又新添一篇。
這回,是“信息學(xué)競(jìng)賽選手”AlphaCode,登上了最新一期Science封面。
對(duì),就是那個(gè)悄悄潛入10場(chǎng)編程比賽敲代碼,成績(jī)超過(guò)了一半人類(lèi)的編程AI。
并且就在這篇最新更新的論文中,DeepMind還首次透露了AlphaCode的“一次通過(guò)率”:66%。
也就是說(shuō),AlphaCode近三分之二的提交,都是一次AC(Accepted)的。
CMU博世人工智能中心教授J. Zico Kolter的最新評(píng)論文章也同時(shí)發(fā)表在了這一期Science上,他認(rèn)為:
AlphaCode不僅僅是復(fù)制現(xiàn)有的解決方案。
在面對(duì)以前沒(méi)見(jiàn)過(guò)的編程題時(shí),它表現(xiàn)得非常好,無(wú)論它是在多大程度上真正“理解”了這個(gè)任務(wù)。
而在DeepMind的官方推特下,還有不少人把AlphaCode同當(dāng)紅炸子雞ChatGPT聯(lián)系了起來(lái)。
有人已經(jīng)迫不及待看到兩者同臺(tái)演出:
首次通過(guò)率66%
盡管AI編程領(lǐng)域,GitHub的Copilot已經(jīng)快進(jìn)到收費(fèi)模式,甚至還和程序員們“法庭上見(jiàn)”了。
但在DeepMind看來(lái),AlphaCode還是頗有些不同之處。
一方面,編程競(jìng)賽對(duì)于AI而言本身就是比純編程更為復(fù)雜的任務(wù),關(guān)鍵是要為無(wú)法預(yù)見(jiàn)的問(wèn)題構(gòu)建解決方案。
另一方面,在架構(gòu)上,AlphaCode采用了不同的機(jī)制來(lái)編碼賽題文本。
值得一提的是,AlphaCode“打”的這10場(chǎng)編程比賽都來(lái)自Codeforces。
相比其他針對(duì)算法和數(shù)據(jù)結(jié)構(gòu)的編程比賽,Codeforces更偏好考查思維能力,這意味著AI無(wú)法僅僅通過(guò)“背題”來(lái)完成挑戰(zhàn)。
例如這是Codeforces上關(guān)于1553D問(wèn)題的描述:
有兩個(gè)字符串s和t,都是由小寫(xiě)字母組成。對(duì)于字符串s,我們從前向后掃描整個(gè)字符串。
如果按下Backspace鍵,就刪除該光標(biāo)前到上一個(gè)未刪除字符之間的所有字符。
也就是說(shuō),假設(shè)字符串s是”abcbd”,你分別在第一個(gè)位置和第四個(gè)位置按下Backspace,那么將得到字符串”bd”。
因?yàn)樵诘谝粋€(gè)光標(biāo)位置前沒(méi)有字符,所以第一次沒(méi)有動(dòng)作。第四個(gè)光標(biāo)位置前的字符是c,上一個(gè)未刪除字符是a,所以按下Backspace將刪除前三個(gè)字符”bd”。
針對(duì)這個(gè)“前提”,我們需要解決的問(wèn)題如下:
我們能否從前向后掃描一次s字符串,讓s變?yōu)閠?如果可以就輸出YES,否則輸出NO。
針對(duì)這個(gè)問(wèn)題,AlphaCode給出的解法如下:
那么,我們只需要給定輸入的字符串?dāng)?shù)量(4)和具體的字符串內(nèi)容,就能讓程序輸出對(duì)應(yīng)的結(jié)果:
第一組ababa(ba),第二組ababa(bb),第三組aaa(aaaa),第四組aababa(ababa)。
對(duì)此程序輸出的結(jié)果分別是YES、NO、NO和YES。
在做題過(guò)程中,AlphaCode的“解題思路”也不再是黑箱。
它不僅成功解決了問(wèn)題,還能將代碼和注意力高亮的對(duì)應(yīng)位置顯示出來(lái):
上述還只是AlphaCode解的其中一道題。
整體來(lái)說(shuō),在Codeforces平臺(tái)舉辦的編程比賽模擬評(píng)估中,AlphaCode在超過(guò)5000名參與者的比賽中平均排名前54.3%——擊敗了一半的選手。
并且第一次提交就通過(guò)的概率達(dá)到了66%。
AlphaCode是如何讀題寫(xiě)碼的
所以,AlphaCode究竟是憑借什么原理達(dá)成這一“戰(zhàn)果”的呢?
它仍然基于預(yù)訓(xùn)練-微調(diào)的范式打造,采用Transformer架構(gòu),其中編碼器具備“解讀能力”,解碼器則具備“寫(xiě)碼能力”。
這次發(fā)表在Science上的論文,也給出了更直觀的原理圖,并以Python作為案例,講解具體訓(xùn)練的過(guò)程。
在預(yù)訓(xùn)練(pre-training)時(shí),研究人員會(huì)先整理出GitHub上的各種代碼集,并“喂”給AlphaCode上的編碼器和解碼器。
以Python上的print(“hello”)為例,這里print()是一個(gè)常見(jiàn)的函數(shù),即“打印輸出”,”hello”則是具體需要打印輸出的內(nèi)容。
經(jīng)過(guò)預(yù)訓(xùn)練后的模型,就具備了基本的“按指令完成任務(wù)”的要求,其中編碼器負(fù)責(zé)生成指令,解碼器則負(fù)責(zé)填充剩余的部分。
在微調(diào)(fine-tuning)環(huán)節(jié),研究人員會(huì)整理出競(jìng)爭(zhēng)性編程競(jìng)賽的數(shù)據(jù)集,包括問(wèn)題和解決思路兩部分,并以GOLD與tempering作為訓(xùn)練目標(biāo),進(jìn)一步減少搜索空間。
其中,問(wèn)題以注釋#的形式交給編碼器“學(xué)習(xí)”,解決思路則交給解碼器來(lái)嘗試?yán)斫猓?/p>
微調(diào)完成后,解碼器就懂得通過(guò)編碼器生成注釋的內(nèi)容,來(lái)嘗試輸出對(duì)應(yīng)的代碼。
經(jīng)過(guò)預(yù)訓(xùn)練-微調(diào)后,就來(lái)到了最終的評(píng)測(cè)環(huán)節(jié)。
Codeforces的題目會(huì)被直接以注釋的形式交給編碼器,解碼器則嘗試輸出數(shù)百萬(wàn)個(gè)不同的程序,對(duì)它們進(jìn)行過(guò)濾和聚類(lèi)(cluster)之后,提交其中的10個(gè)程序來(lái)解決問(wèn)題。
(當(dāng)然前面也提到,有不少問(wèn)題在第一次提交后就通過(guò)了)
對(duì)于AlphaCode的出現(xiàn),有程序員調(diào)侃稱(chēng)“可以在藝術(shù)家旁邊排隊(duì)等領(lǐng)救濟(jì)糧了?!?/p>
不過(guò),DeepMind官方對(duì)于AlphaCode的定調(diào)并非“AI版程序員”,而是希望它作為一個(gè)輔助的角色出現(xiàn)在編程工作中:
我們希望它能作為軟件開(kāi)發(fā)者的助手,尤其是為0編程基礎(chǔ)的人提供寫(xiě)代碼的機(jī)會(huì)。
論文地址:
https://www.science.org/doi/10.1126/science.abq1158
參考鏈接:
[1]https://www.science.org/doi/10.1126/science.add8258
[2]https://mp.weixin.qq.com/s/wZcY_hEk_M61wTJVVIXfIg
[3]https://www.deepmind.com/blog/competitive-programming-with-alphacode