AlphaCode驚世登場(chǎng)!編程版“阿法狗”悄悄參賽,擊敗一半程序員
今天,DeepMind的“Alpha”家族再添一名新成員:
會(huì)刷編程競(jìng)賽題的AlphaCode來(lái)了!
其實(shí),AlphaCode早在幾個(gè)月前就“悄悄進(jìn)村”了,一直沒(méi)人察覺(jué)。
它默默參加了著名網(wǎng)站Codeforces最近舉行的10場(chǎng)編程比賽,成績(jī)超過(guò)了一半人類。
直到今天DeepMind才公布最終成績(jī):AlphaCode在這10場(chǎng)比賽中排名前54.3%,Elo評(píng)分1238。
更重要的是,在編程比賽這樣考察算法創(chuàng)造力的問(wèn)題中,AI終于不落下風(fēng),而這恰恰是AI過(guò)去所欠缺的。
如果把這個(gè)分?jǐn)?shù)放到過(guò)去六個(gè)月總體來(lái)看,AlphaCode的成績(jī)更為優(yōu)秀,因?yàn)樗凰⒘?0周的題目,就已經(jīng)達(dá)到了前28%用戶的水平。
Codeforces是一個(gè)由俄羅斯程序員Mikhail Mirzayanov創(chuàng)辦的編程競(jìng)賽網(wǎng)站,大約每周舉行一次名為“Codeforces Rounds”的編程比賽。
通過(guò)Codeforces的Elo評(píng)分可以衡量一位程序員的編程水平。
△ Codeforces創(chuàng)始人Mikhail Mirzayanov
當(dāng)看到AlphaCode的成績(jī)后,連創(chuàng)始人Mirzayanov都驚訝不已。
他原本對(duì)AI持懷疑態(tài)度,因?yàn)榫幊瘫荣惪简?yàn)的是發(fā)明算法的能力,這是最困難的,沒(méi)想到AlphaCode的結(jié)果完全超出了他的預(yù)期。
DeepMind發(fā)布這條消息僅半天,在Twitter上已經(jīng)有2000多次轉(zhuǎn)發(fā)、5000多點(diǎn)贊。
AlphaCode如何編程
說(shuō)了這么多,下面我們來(lái)看看AlphaCode是如何成為“編程做題家”的。
以下是Codeforces上的1553D問(wèn)題:
(鏈接:https://codeforces.com/problemset/problem/1553/D)
有兩個(gè)字符串s和t,都是由小寫字母組成。對(duì)于字符串s,我們從前向后掃描整個(gè)字符串。
如果按下Backspace鍵,就刪除該光標(biāo)前到上一個(gè)未刪除字符之間的所有字符。
例如字符串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”。
好了,現(xiàn)在問(wèn)題來(lái)了:
我們能否從前向后掃描一次s字符串, 讓s變?yōu)閠。如果可以輸出YES,否則輸出NO。
AlphaCode給出的代碼是這樣的:
t=int(input())
for i in range(t):
s=input()
t=input()
a=[]
b=[]
for j in s:
a.append(j)
for j in t:
b.append(j)
a.reverse()
b.reverse()
c=[]
while len(b)!=0 and len(a)!=0:
if a[0]==b[0]:
c.append(b.pop(0))
a.pop(0)
elif a[0]!=b[0] and len(a)!=1:
a.pop(0)
a.pop(0)
elif a[0]!=b[0] and len(a)==1:
a.pop(0)
if len(b)==0:
print("YES")
else:
print("NO")
向以上程序輸入4組字符串:
4
ababa
ba
ababa
bb
aaa
aaaa
aababa
ababa
得到的輸出是:
YES
NO
NO
YES
在這里,AlphaCode不再是黑箱。
它不僅成功解決了問(wèn)題,還能將代碼和注意力高亮的對(duì)應(yīng)位置顯示出來(lái)。
一位網(wǎng)友表示:既然AI能看得這么細(xì),那么如果能在代碼后面加入注釋就更好了。
至于更多的案例,可以去AlphaCode網(wǎng)站觀摩。
原理
DeepMind說(shuō),在Codeforces比賽中所需解決問(wèn)題的能力,已經(jīng)超出了現(xiàn)有AI系統(tǒng)的能力。
整個(gè)AlphaCode模型的流程如下:
- 用標(biāo)準(zhǔn)的語(yǔ)言建模目標(biāo)在GitHub代碼上預(yù)訓(xùn)練一個(gè)基于Transformer的語(yǔ)言模型。這個(gè)模型可以合理地代表人類編寫代碼的空間,大大減少了問(wèn)題的搜索空間。
- 在競(jìng)爭(zhēng)性編程數(shù)據(jù)集上微調(diào)模型,使用GOLD與tempering作為訓(xùn)練目標(biāo),進(jìn)一步減少了搜索空間,并利用預(yù)訓(xùn)練彌補(bǔ)了少量的競(jìng)爭(zhēng)性編程數(shù)據(jù)。
- 為每個(gè)問(wèn)題從模型中生成非常多的樣本。
- 對(duì)樣本進(jìn)行過(guò)濾,以獲得一小部分候選提交的樣本(最多10個(gè)),在隱藏的測(cè)試案例上進(jìn)行評(píng)估,方法是利用實(shí)例測(cè)試和聚類,根據(jù)程序行為挑選樣本。
總而言之,通過(guò)將大規(guī)模Transformer模型與大規(guī)模采樣和過(guò)濾相結(jié)合,DeepMind在可以解決的問(wèn)題數(shù)量方面取得了重大進(jìn)展,比之前的工作高出一個(gè)數(shù)量級(jí)。
刷題人士抵觸
正如Codeforces創(chuàng)始人所說(shuō),在編程問(wèn)題中對(duì)算法的發(fā)明創(chuàng)造是最難的。
在全球編程比賽網(wǎng)站上常年排名前幾的谷歌工程師Petr Mitrichev說(shuō):
解決編程比賽問(wèn)題是一件非常困難的事情。它既需要良好的代碼技能,也需要人類解決問(wèn)題的創(chuàng)造力。
AlphaCode不是第一個(gè)編程工具,Codex以及GitHub Copilot都給人留下了深刻的印象。
但DeepMind認(rèn)為,AlphaCode和前輩們大有不同:
最近的大規(guī)模語(yǔ)言模型展示了生成代碼的驚人能力,現(xiàn)在能夠完成簡(jiǎn)單的編程任務(wù)。然而,當(dāng)對(duì)更復(fù)雜、看不見(jiàn)的問(wèn)題進(jìn)行評(píng)估時(shí),這些模型的表現(xiàn)仍然很差,這些問(wèn)題需要解決問(wèn)題的技能,而不僅僅是將指令翻譯成代碼。
與Twitter上截然不同的是,Codeforces高手們卻多有抵觸情緒。
一位程序員認(rèn)為:“這個(gè)AI真是個(gè)菜鳥。”
因?yàn)锳lphaCode只有1238分,只相當(dāng)于一個(gè)學(xué)生水平,一個(gè)參加信息學(xué)奧賽的中學(xué)生也能刷到這個(gè)水平。
雖然DeepMind聲稱AlphaCode是為了輔助人類,但也有程序員開(kāi)始擔(dān)心了:
現(xiàn)在連刷題的世界都被AI占領(lǐng),本來(lái)這里是程序員們切磋的地方,AI應(yīng)該適可而止,給程序員們留一片凈土吧!