首頁 >科技週邊 >人工智慧 >超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

王林
王林轉載
2023-04-30 13:19:061197瀏覽

這個12月,正當OpenAI的ChatGPT勢頭正旺時,那個曾經卷趴一半程式設計師的AlphaCode登上Science封面了!

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

論文連結:https://www.science.org/doi/10.1126/science.abq1158

#說到AlphaCode,想必大家並不陌生。

早在今年2月,它就在著名的Codeforces上,悄悄地參加了10場程式設計比賽,並一舉擊敗了半數的人類碼農。

卷趴一半碼農

我們都知道,程式設計師中非常流行這樣一種測試-程式設計競賽。

在競賽中,主要考察的就是程式設計師透過經驗進行批判性思維,為不可預見的問題創造解決方案的能力。

這體現了人類智慧的關鍵,而機器學習模型,往往很難模仿這種人類智慧。

但DeepMind的科學家們,打破了這個規律。

YujiA Li等人,使用自監督學習和編​​碼器-解碼器轉換器架構,開發出了AlphaCode。

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

AlphaCode的開發工作,還是在居家期間完成的

雖然AlphaCode也是基於標準的Transformer編解碼器架構,但DeepMind對它進行了「史詩級」的強化-

它使用基於Transformer的語言模型,以前所未有的規模生成程式碼,然後巧妙地篩選了一小部分可用的程式。

具體步驟為:

1)多問詢注意力:讓每個注意力區塊共用鍵和值的頭,並同時結合編碼器-解碼器模型,使AlphaCode的取樣速度提高了10倍以上。

2) 掩碼語言建模(MLM):透過在編碼器上加入一個MLM損失,來提高模型的解決率。

3)回火:讓訓練分佈更尖銳,從而防止過度擬合的正規化效應。

4)值調節與預測:透過區分CodeContests資料集中正確和錯誤的問題提交,來提供一個額外的訓練訊號。

5)示範性異策略學習產生(GOLD):透過將訓練的重點放在每個問題最可能的解決方案上,讓模型為每個問題產生正確方案。

結果嘛,大家都知道了。

憑藉著1238的Elo得分,AlphaCode讓自己在這10場比賽中的排名達到了前54.3%。放眼之前的6個月,這成績更是達到了前28%。

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

要知道,為了達到這個排名,AlphaCode必須「過五關斬六將」,解決融合了批判性思維、邏輯、演算法、編碼和自然語言理解相結合的種種新問題。

從結果來看,AlphaCode不僅解決了CodeContests資料集中29.6%的程式設計問題,而且其中有66%是在第一次提交時解決的。 (總提交次數限制在10次)

相比起來,傳統的Transformer模型求解率都比較低,只有個位數。

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

對於這個結果,就連Codeforces創辦人Mirzayanov都非常驚訝。

畢竟,程式設計比賽考驗的是發明演算法的能力,這一直是AI的弱項,人類的強項。

我可以肯定地說,AlphaCode的結果超出了我的預期。開始我持懷疑態度,因為即使在簡單的競賽問題中,不僅需要實施演算法,而且還需要發明演算法(這是最困難的部分)。 AlphaCode已經讓自己成為許多人類的強大對手。我迫不及待地想知道,未來會發生什麼事!

——Mike Mirzayanov,Codeforces 創辦人

所以,AlphaCode這是能搶程式設計師的飯碗了?

當然還不行。

AlphaCode還只能完成簡單的程式設計任務,如果任務變得更複雜,問題更加「不可預見」,只會將指令翻譯成程式碼的AlphaCode就束手無策了。

畢竟,1238的分數從某個角度來說,也就相當於一個初學程式的中學生菜鳥的等級。這個level,還威脅不到真正的程式設計大牛。

但毫無疑問的是,這類編碼平台的開發,會對程式設計師的生產力產生巨大的影響。

甚至,整個程式設計文化都可能會被改變:或許,以後人類只要負責制定問題就可以,而產生和執行程式碼的任務,就可以交給機器學習了。

程式設計競賽有啥難的?

我們知道,雖然機器學習在生成和理解文字方面取得了巨大進步,但是大部分AI目前仍然局限於簡單的數學和程式設計問題。

它們會做的,更多是檢索和複製現有的方案(這一點相信最近玩過ChatGPT的人都深有體會)。

那麼,讓AI學習產生正確的程序,為什麼這麼困難呢?

1.  要產生解決指定任務的程式碼,就需要在所有可能的字元序列中搜索,這是一個海量的空間,而其中只有一小部分對應有效的正確程式.

2. 、一個字元的編輯,可能會完全改變程式的行為,甚至會導致崩潰,而且每個任務都有許多截然不同的有效解決方案。

對於難度極高的程式設計比賽,AI需要理解複雜的自然語言描述;需要對以前從未見過的問題進行推理,而不是簡單地記住程式碼片段;需要掌握各種演算法和資料結構,並精確地完成可能長達數百行的程式碼。

此外,為了評估自己產生的這些程式碼,AI還需要在一套詳盡的隱藏測試上執行任務,並且檢查執行速度和邊緣情況的正確性。

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

(A)問題1553D,中等難度評分為1500;(B)AlphaCode產生的問題解決方案

就拿這個1553D問題來說,參賽者需要找到一個方法,使用一組有限的輸入將一串隨機重複的s和t字母轉換成另一串相同的字母。

參賽者不能只是輸入新的字母,而必須使用「退格」指令刪除原始字串中的幾個字母。賽題具體如下:

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

對此,AlphaCode給出的解決方案如下:

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

並且,AlphaCode的「解題思路」也不再是黑箱,它還能顯示程式碼和注意力高亮的位置。

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

AlphaCode的學習系統

#參加程式設計比賽時,AlphaCode面臨的主要挑戰是:

#(i)需要在巨大的程式空間中搜索,(ii)只能獲得約13,000個用於訓練的範例任務,以及(iii)每個問題的提交數量有限。

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

為了回應這些問題,AlphaCode整個學習系統​​的建構分為三個環節,預訓練、微調、取樣與評估,如上圖所示。

預訓練

#在預訓練階段,利用在GitHub收集的715GB人類碼農的程式碼快照,對模型進行預訓練,並使用交叉熵next-token預測損失。在預訓練過程中,隨機地將程式碼檔案分成兩部分,將第一部分當作編碼器的輸入,並訓練模型去掉編碼器產生第二部分。

這種預訓練為編碼學習了一個強大的先驗,使隨後的特定任務的微調能夠在一個更小的資料集上進行。

微調

#在微調階段,在一個2.6GB的競爭性程式設計問題資料集上對模型進行了微調和評估,資料集是DeepMind創建的,命名為CodeContests公開發布。

CodeContests資料集中包括問題以及測試案例。訓練集包含13,328個問題,每個問題平均有922.4個提交答案。驗證集和測試集分別包含117個和165個問題。

在微調過程中,將自然語言的問題陳述編碼為程式註釋,以使其看起來與預訓練期間看到的檔案更加相似(其中可以包括擴展的自然語言註釋),並使用相同的next-token預測損失。

取樣

為了選出10個最好的樣本進行提交,採用過濾和聚類的方法,利用問題陳述中包含的例子測試來執行樣本,並刪除未能通過這些測試的樣本。

透過過濾篩除了近99%的模型樣本,再對剩下的候選樣本進行聚類,在一個單獨的transformer模型產生的輸入上執行這些樣本,並將在產生的輸入上產生相同輸出的程式歸為一類。

然後,從10個最大的聚類中各挑選一個樣本來提交。直觀地說,正確的程序行為相同,並形成大的聚類,而不正確的程序的失敗方式是多種多樣的。

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

評估

上圖所示為在10@k指標上,模型性能是如何隨著更多的樣本量和計算量而變化的。從對採樣結果的效能評估來看,研究人員得出了以下4點結論:

#1. 解決率隨著更大的樣本量而呈對數線性擴展;

2. 更好的模型在比例曲線上有較高的斜率;

#

3. 解決率與更多的計算量呈對數線性比例;

4. 樣本選擇對解決率的擴展至關重要。

純粹的「資料驅動」

#毫無疑問,AlphaCode的提出,代表了機器學習模型在發展上已經邁出了實質的一步。

有趣的是,AlphaCode並不包含關於電腦程式碼結構的明確的內建知識。

相反,它依靠一種純粹的「資料驅動」方法來編寫程式碼,也就是透過簡單地觀察大量現有程式碼來學習電腦程式的結構。

超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師

文章網址:https://www.science.org/doi/10.1126/science.add8258

#從根本上說,使AlphaCode在競爭性程式設計任務上勝過其他系統的原因歸結為兩個主要屬性:

##1. 訓練資料

2. 候選解決方案的後處理

#但電腦程式碼是一個高度結構化的媒介,程式必須遵守定義的語法,並且必須在解決方案的不同部分中產生明確的前、後條件。

而AlphaCode在產生程式碼時所採用的方法,卻和產生其他文字內容時完全一樣-一次一個token,並且只在整個程式寫完後檢查程式的正確性。

鑑於適當的資料和模型的複雜性,AlphaCode可以產生連貫的結構。然而,這個順序生成程序的最終配方被深埋在LLM的參數中,難以捉摸。

不過,無論AlphaCode是否真的能「理解」程式設計問題,它的確在程式碼競賽方面達到了人類的平均水準。

「解決程式設計競賽的問題是一件非常困難的事情,需要人類具有良好的編碼技能和解決問題的創造力。AlphaCode能夠在這一領域取得進展,給我留下了深刻的印象,我很高興看到,該模型如何利用其語句理解來生成程式碼,並引導其隨機探索以創建解決方案。」

                  -Petr Mitrichev,Google軟體工程師和世界級競技程式設計師

AlphaCode在程式設計競賽中名列前54%,展現了深度學習模式在需要批判性思維的任務中的潛能。

這些模型優雅地利用現代機器學習,將問題的解決方案表達為程式碼,這就回到幾十年前AI的符號推理根源。

而這,只是一個開始。

在未來,還會誕生更多解決問題的強大AI,或許這一天已經不遠了。

以上是超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除