天天看點

AlphaCode驚世登場!程式設計版“阿法狗”悄悄參賽,擊敗一半程式員

曉查 發自 凹非寺

量子位 | 公衆号 QbitAI

今天,DeepMind的“Alpha”家族再添一名新成員:

會刷程式設計競賽題的AlphaCode來了!

其實,AlphaCode早在幾個月前就“悄悄進村”了,一直沒人察覺。

它默默參加了著名網站Codeforces最近舉行的10場程式設計比賽,成績超過了一半人類。

AlphaCode驚世登場!程式設計版“阿法狗”悄悄參賽,擊敗一半程式員

直到今天DeepMind才公布最終成績:AlphaCode在這10場比賽中排名前54.3%,Elo評分1238。

更重要的是,在程式設計比賽這樣考察算法創造力的問題中,AI終于不落下風,而這恰恰是AI過去所欠缺的。

如果把這個分數放到過去六個月總體來看,AlphaCode的成績更為優秀,因為它隻刷了10周的題目,就已經達到了前28%使用者的水準。

AlphaCode驚世登場!程式設計版“阿法狗”悄悄參賽,擊敗一半程式員

Codeforces是一個由俄羅斯程式員Mikhail Mirzayanov創辦的程式設計競賽網站,大約每周舉行一次名為“Codeforces Rounds”的程式設計比賽。

通過Codeforces的Elo評分可以衡量一位程式員的程式設計水準。

AlphaCode驚世登場!程式設計版“阿法狗”悄悄參賽,擊敗一半程式員

△ Codeforces創始人Mikhail Mirzayanov

當看到AlphaCode的成績後,連創始人Mirzayanov都驚訝不已。

他原本對AI持懷疑态度,因為程式設計比賽考驗的是發明算法的能力,這是最困難的,沒想到AlphaCode的結果完全超出了他的預期。

DeepMind釋出這條消息僅半天,在Twitter上已經有2000多次轉發、5000多點贊。

AlphaCode驚世登場!程式設計版“阿法狗”悄悄參賽,擊敗一半程式員

AlphaCode如何程式設計

說了這麼多,下面我們來看看AlphaCode是如何成為“程式設計做題家”的。

以下是Codeforces上的1553D問題:

(連結:https://codeforces.com/problemset/problem/1553/D)

有兩個字元串s和t,都是由小寫字母組成。對于字元串s,我們從前向後掃描整個字元串。

如果按下Backspace鍵,就删除該光标前到上一個未删除字元之間的所有字元。

例如字元串s是”abcbd”,你分别在第一個位置和第四個位置按下Backspace,那麼将得到字元串”bd”。

因為在第一個光标位置前沒有字元,是以第一次沒有動作。第四個光标位置前的字元是c,上一個未删除字元是a,是以按下Backspace将删除前三個字元”bd”。

好了,現在問題來了:

我們能否從前向後掃描一次s字元串, 讓s變為t。如果可以輸出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:

elif a[0]!=b[0] and len(a)==1:

if len(b)==0:

print("YES")

else:

print("NO")

向以上程式輸入4組字元串:

4 ababa ba ababa bb aaa aaaa aababa ababa

得到的輸出是:

YESNONOYES

在這裡,AlphaCode不再是黑箱。

它不僅成功解決了問題,還能将代碼和注意力高亮的對應位置顯示出來。

AlphaCode驚世登場!程式設計版“阿法狗”悄悄參賽,擊敗一半程式員

一位網友表示:既然AI能看得這麼細,那麼如果能在代碼後面加入注釋就更好了。

AlphaCode驚世登場!程式設計版“阿法狗”悄悄參賽,擊敗一半程式員

至于更多的案例,可以去AlphaCode網站觀摩。

原理

DeepMind說,在Codeforces比賽中所需解決問題的能力,已經超出了現有AI系統的能力。

整個AlphaCode模型的流程如下:

AlphaCode驚世登場!程式設計版“阿法狗”悄悄參賽,擊敗一半程式員

用标準的語言模組化目标在GitHub代碼上預訓練一個基于Transformer的語言模型。這個模型可以合理地代表人類編寫代碼的空間,大大減少了問題的搜尋空間。

在競争性程式設計資料集上微調模型,使用GOLD與tempering作為訓練目标,進一步減少了搜尋空間,并利用預訓練彌補了少量的競争性程式設計資料。

為每個問題從模型中生成非常多的樣本。

對樣本進行過濾,以獲得一小部分候選送出的樣本(最多10個),在隐藏的測試案例上進行評估,方法是利用執行個體測試和聚類,根據程式行為挑選樣本。

總而言之,通過将大規模Transformer模型與大規模采樣和過濾相結合,DeepMind在可以解決的問題數量方面取得了重大進展,比之前的工作高出一個數量級。

刷題人士抵觸

正如Codeforces創始人所說,在程式設計問題中對算法的發明創造是最難的。

在全球程式設計比賽網站上常年排名前幾的谷歌工程師Petr Mitrichev說:

解決程式設計比賽問題是一件非常困難的事情。它既需要良好的代碼技能,也需要人類解決問題的創造力。

AlphaCode不是第一個程式設計工具,Codex以及GitHub Copilot都給人留下了深刻的印象。

但DeepMind認為,AlphaCode和前輩們大有不同:

最近的大規模語言模型展示了生成代碼的驚人能力,現在能夠完成簡單的程式設計任務。然而,當對更複雜、看不見的問題進行評估時,這些模型的表現仍然很差,這些問題需要解決問題的技能,而不僅僅是将指令翻譯成代碼。

與Twitter上截然不同的是,Codeforces高手們卻多有抵觸情緒。

一位程式員認為:“這個AI真是個菜鳥。”

AlphaCode驚世登場!程式設計版“阿法狗”悄悄參賽,擊敗一半程式員

因為AlphaCode隻有1238分,隻相當于一個學生水準,一個參加資訊學奧賽的中學生也能刷到這個水準。

雖然DeepMind聲稱AlphaCode是為了輔助人類,但也有程式員開始擔心了:

AlphaCode驚世登場!程式設計版“阿法狗”悄悄參賽,擊敗一半程式員

現在連刷題的世界都被AI占領,本來這裡是程式員們切磋的地方,AI應該适可而止,給程式員們留一片淨土吧!

參考連結:

[1]https://deepmind.com/blog/article/Competitive-programming-with-AlphaCode

[2]https://alphacode.deepmind.com/

[3]https://storage.googleapis.com/deepmind-media/AlphaCode/competition_level_code_generation_with_alphacode.pdf

[4]https://github.com/deepmind/code_contests

繼續閱讀