2023.02.14 16:30

AI 程式師又贏了:AlphaCode 參加程式競賽66%題目一次看懂完成,成績超過一半程式設計師

ADVERTISEMENT

DeepMind 的 NS 論文又新添一篇。

這回,是“資訊學競賽選手”AlphaCode,登上了最新一期 Science 封面。

ADVERTISEMENT

對,就是那個悄悄潛入 10 場程式比賽敲程式碼,成績超過了一半人類的程式 AI。

並且就在這篇最新更新的論文中,DeepMind 還首次透露了 AlphaCode 的“一次通過率”:66%。也就是說,AlphaCode 近三分之二的提交,都是一次 AC(Accepted)的。

CMU 博世人工智慧中心教授 J. Zico Kolter 的最新評論文章也同時發表在了這一期 Science 上,他認為:「AlphaCode 不僅僅是複製現有的解決方案。在面對以前沒見過的程式題時,它表現得非常好,無論它是在多大程度上真正“理解”了這個任務。」

ADVERTISEMENT

而在 DeepMind 的官方推特下,還有不少人把 AlphaCode 同當紅炸子雞 ChatGPT 聯絡了起來。

有人已經迫不及待看到兩者同台演出:

ADVERTISEMENT

首次突破通過率 66%

儘管 AI 程式領域,GitHub 的 Copilot 已經快進到收費模式,甚至還和程式設計師們“法庭上見”了。但在 DeepMind 看來,AlphaCode 還是頗有些不同之處。

一方面,程式競賽對於 AI 而言本身就是比純程式更為複雜的任務,關鍵是要為無法預見的問題建構解決方案。

另一方面,在架構上,AlphaCode 採用了不同的機制來編碼賽題文字。

ADVERTISEMENT

值得一提的是,AlphaCode“打”的這 10 場程式比賽都來自 Codeforces

相比其他針對演算法和資料結構的程式比賽,Codeforces 更偏好考查思維能力,這意味著 AI 無法僅僅通過“背題”來完成挑戰。

例如這是 Codeforces 上關於 1553D 問題的描述:

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

如果按下 Backspace 鍵,就刪除該游標前到上一個未刪除字元之間的所有字元。」

也就是說,假設字串 s 是”abcbd”,你分別在第一個位置和第四個位置按下 Backspace,那麼將得到字串”bd”。

因為在第一個游標位置前沒有字元,所以第一次沒有動作。第四個游標位置前的字元是 c,上一個未刪除字元是 a,所以按下 Backspace 將刪除前三個字元”bd”。

針對這個“前提”,我們需要解決的問題如下:我們能否從前向後掃描一次 s 字串,讓 s 變為 t?如果可以就輸出 YES,否則輸出 NO。

針對這個問題,AlphaCode 給出的解法如下:

那麼,我們只需要給定輸入的字串數量(4)和具體的字串內容,就能讓程式輸出對應的結果:

第一組 ababa(ba),第二組 ababa(bb),第三組 aaa(aaaa),第四組 aababa(ababa)。

對此程式輸出的結果分別是 YES、NO、NO 和 YES。

在做題過程中,AlphaCode 的“解題思路”也不再是黑箱。它不僅成功解決了問題,還能將程式碼和注意力高亮的對應位置顯示出來:

上述還只是 AlphaCode 解的其中一道題。

整體來說,在 Codeforces 平台舉辦的程式比賽模擬評估中,AlphaCode 在超過 5000 名參與者的比賽中平均排名前 54.3%—— 擊敗了一半的選手。

並且第一次提交就通過的機率達到了 66%。

AlphaCode 是如何讀題寫碼的

所以,AlphaCode 究竟是憑藉什麼原理達成這一“戰果”的呢?

它仍然基於預訓練-微調的範式打造,採用 Transformer 架構,其中編碼器具備“解讀能力”,解碼器則具備“寫碼能力”。

這次發表在 Science 上的論文,也給出了更直觀的原理圖,並以 Python 作為案例,講解具體訓練的過程。

在預訓練(pre-training)時,研究人員會先整理出 GitHub 上的各種程式碼集,並“喂”給 AlphaCode 上的編碼器和解碼器。

以 Python 上的 print (“hello”) 為例,這裡 print () 是一個常見的函數,即“列印輸出”,”hello”則是具體需要列印輸出的內容。

經過預訓練後的模型,就具備了基本的“按指令完成任務”的要求,其中編碼器負責生成指令,解碼器則負責填充剩餘的部分。

在微調(fine-tuning)環節,研究人員會整理出競爭性程式競賽的資料集,包括問題和解決思路兩部分,並以 GOLD 與 tempering 作為訓練目標,進一步減少搜尋空間。

其中,問題以註釋#的形式交給編碼器“學習”,解決思路則交給解碼器來嘗試理解:

微調完成後,解碼器就懂得通過編碼器生成註釋的內容,來嘗試輸出對應的程式碼。

經過預訓練-微調後,就來到了最終的評測環節。

Codeforces 的題目會被直接以註釋的形式交給編碼器,解碼器則嘗試輸出數百萬個不同的程式,對它們進行過濾和聚類(cluster)之後,提交其中的 10 個程式來解決問題。

(當然前面也提到,有不少問題在第一次提交後就通過了)

對於 AlphaCode 的出現,有程式設計師調侃稱“可以在藝術家旁邊排隊等領救濟糧了。”

不過,DeepMind 官方對於 AlphaCode 的定調並非“AI 版程式設計師”,而是希望它作為一個輔助的角色出現在程式工作中:我們希望它能作為軟體開發者的助手,尤其是為 0 程式基礎的人提供寫程式碼的機會。

論文地址:

https://www.science.org/doi/10.1126/science.abq1158

參考連結:

本文來自量子位 (ID:QbitAI)

ADVERTISEMENT