AlphaCode驚世登場!編程版“阿法狗”悄悄參賽,擊敗一半程序員_風聞
量子位-量子位官方账号-2022-02-03 14:02
曉查 發自 凹非寺
量子位 | 公眾號 QbitAI
今天,DeepMind的“Alpha”家族再添一名新成員:
會刷編程競賽題的AlphaCode來了!
其實,AlphaCode早在幾個月前就“悄悄進村”了,一直沒人察覺。
它默默參加了著名網站Codeforces最近舉行的10場編程比賽,成績超過了一半人類。

直到今天DeepMind才公佈最終成績:AlphaCode在這10場比賽中排名前54.3%,Elo評分1238。
更重要的是,在編程比賽這樣考察算法創造力的問題中,AI終於不落下風,而這恰恰是AI過去所欠缺的。
如果把這個分數放到過去六個月總體來看,AlphaCode的成績更為優秀,因為它只刷了10周的題目,就已經達到了**前28%**用户的水平。

Codeforces是一個由俄羅斯程序員Mikhail Mirzayanov創辦的編程競賽網站,大約每週舉行一次名為“Codeforces Rounds”的編程比賽。
通過Codeforces的Elo評分可以衡量一位程序員的編程水平。

△ Codeforces創始人Mikhail Mirzayanov
當看到AlphaCode的成績後,連創始人Mirzayanov都驚訝不已。
他原本對AI持懷疑態度,因為編程比賽考驗的是發明算法的能力,這是最困難的,沒想到AlphaCode的結果完全超出了他的預期。
DeepMind發佈這條消息僅半天,在Twitter上已經有2000多次轉發、5000多點贊。

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: 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
得到的輸出是:
YESNONOYES
在這裏,AlphaCode不再是黑箱。
它不僅成功解決了問題,還能將代碼和注意力高亮的對應位置顯示出來。

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

至於更多的案例,可以去AlphaCode網站觀摩。
原理
DeepMind説,在Codeforces比賽中所需解決問題的能力,已經超出了現有AI系統的能力。
整個AlphaCode模型的流程如下:

用標準的語言建模目標在GitHub代碼上預訓練一個基於Transformer的語言模型。這個模型可以合理地代表人類編寫代碼的空間,大大減少了問題的搜索空間。
在競爭性編程數據集上微調模型,使用GOLD與tempering作為訓練目標,進一步減少了搜索空間,並利用預訓練彌補了少量的競爭性編程數據。
為每個問題從模型中生成非常多的樣本。
對樣本進行過濾,以獲得一小部分候選提交的樣本(最多10個),在隱藏的測試案例上進行評估,方法是利用實例測試和聚類,根據程序行為挑選樣本。
總而言之,通過將大規模Transformer模型與大規模採樣和過濾相結合,DeepMind在可以解決的問題數量方面取得了重大進展,比之前的工作高出一個數量級。
刷題人士牴觸
正如Codeforces創始人所説,在編程問題中對算法的發明創造是最難的。
在全球編程比賽網站上常年排名前幾的谷歌工程師Petr Mitrichev説:
解決編程比賽問題是一件非常困難的事情。它既需要良好的代碼技能,也需要人類解決問題的創造力。
AlphaCode不是第一個編程工具,Codex以及GitHub Copilot都給人留下了深刻的印象。
但DeepMind認為,AlphaCode和前輩們大有不同:
最近的大規模語言模型展示了生成代碼的驚人能力,現在能夠完成簡單的編程任務。然而,當對更復雜、看不見的問題進行評估時,這些模型的表現仍然很差,這些問題需要解決問題的技能,而不僅僅是將指令翻譯成代碼。
與Twitter上截然不同的是,Codeforces高手們卻多有牴觸情緒。
一位程序員認為:“這個AI真是個菜鳥。”

因為AlphaCode只有1238分,只相當於一個學生水平,一個參加信息學奧賽的中學生也能刷到這個水平。
雖然DeepMind聲稱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