超級編程AI登上Science封面! AlphaCode程式設計大賽卷趴一半程式設計師
這個12月,正當OpenAI的ChatGPT勢頭正旺時,那個曾經卷趴一半程式設計師的AlphaCode登上Science封面了!
論文連結:https://www.science.org/doi/10.1126/science.abq1158
#說到AlphaCode,想必大家並不陌生。
早在今年2月,它就在著名的Codeforces上,悄悄地參加了10場程式設計比賽,並一舉擊敗了半數的人類碼農。
卷趴一半碼農
我們都知道,程式設計師中非常流行這樣一種測試-程式設計競賽。
在競賽中,主要考察的就是程式設計師透過經驗進行批判性思維,為不可預見的問題創造解決方案的能力。
這體現了人類智慧的關鍵,而機器學習模型,往往很難模仿這種人類智慧。
但DeepMind的科學家們,打破了這個規律。
YujiA Li等人,使用自監督學習和編碼器-解碼器轉換器架構,開發出了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%。
要知道,為了達到這個排名,AlphaCode必須「過五關斬六將」,解決融合了批判性思維、邏輯、演算法、編碼和自然語言理解相結合的種種新問題。
從結果來看,AlphaCode不僅解決了CodeContests資料集中29.6%的程式設計問題,而且其中有66%是在第一次提交時解決的。 (總提交次數限制在10次)
相比起來,傳統的Transformer模型求解率都比較低,只有個位數。
對於這個結果,就連Codeforces創辦人Mirzayanov都非常驚訝。
畢竟,程式設計比賽考驗的是發明演算法的能力,這一直是AI的弱項,人類的強項。
我可以肯定地說,AlphaCode的結果超出了我的預期。開始我持懷疑態度,因為即使在簡單的競賽問題中,不僅需要實施演算法,而且還需要發明演算法(這是最困難的部分)。 AlphaCode已經讓自己成為許多人類的強大對手。我迫不及待地想知道,未來會發生什麼事!
——Mike Mirzayanov,Codeforces 創辦人
所以,AlphaCode這是能搶程式設計師的飯碗了?
當然還不行。
AlphaCode還只能完成簡單的程式設計任務,如果任務變得更複雜,問題更加「不可預見」,只會將指令翻譯成程式碼的AlphaCode就束手無策了。
畢竟,1238的分數從某個角度來說,也就相當於一個初學程式的中學生菜鳥的等級。這個level,還威脅不到真正的程式設計大牛。
但毫無疑問的是,這類編碼平台的開發,會對程式設計師的生產力產生巨大的影響。
甚至,整個程式設計文化都可能會被改變:或許,以後人類只要負責制定問題就可以,而產生和執行程式碼的任務,就可以交給機器學習了。
程式設計競賽有啥難的?
我們知道,雖然機器學習在生成和理解文字方面取得了巨大進步,但是大部分AI目前仍然局限於簡單的數學和程式設計問題。
它們會做的,更多是檢索和複製現有的方案(這一點相信最近玩過ChatGPT的人都深有體會)。
那麼,讓AI學習產生正確的程序,為什麼這麼困難呢?
1. 要產生解決指定任務的程式碼,就需要在所有可能的字元序列中搜索,這是一個海量的空間,而其中只有一小部分對應有效的正確程式.
2. 、一個字元的編輯,可能會完全改變程式的行為,甚至會導致崩潰,而且每個任務都有許多截然不同的有效解決方案。
對於難度極高的程式設計比賽,AI需要理解複雜的自然語言描述;需要對以前從未見過的問題進行推理,而不是簡單地記住程式碼片段;需要掌握各種演算法和資料結構,並精確地完成可能長達數百行的程式碼。
此外,為了評估自己產生的這些程式碼,AI還需要在一套詳盡的隱藏測試上執行任務,並且檢查執行速度和邊緣情況的正確性。
(A)問題1553D,中等難度評分為1500;(B)AlphaCode產生的問題解決方案
就拿這個1553D問題來說,參賽者需要找到一個方法,使用一組有限的輸入將一串隨機重複的s和t字母轉換成另一串相同的字母。
參賽者不能只是輸入新的字母,而必須使用「退格」指令刪除原始字串中的幾個字母。賽題具體如下:
對此,AlphaCode給出的解決方案如下:
並且,AlphaCode的「解題思路」也不再是黑箱,它還能顯示程式碼和注意力高亮的位置。
AlphaCode的學習系統
#參加程式設計比賽時,AlphaCode面臨的主要挑戰是:
#(i)需要在巨大的程式空間中搜索,(ii)只能獲得約13,000個用於訓練的範例任務,以及(iii)每個問題的提交數量有限。
為了回應這些問題,AlphaCode整個學習系統的建構分為三個環節,預訓練、微調、取樣與評估,如上圖所示。
預訓練
#在預訓練階段,利用在GitHub收集的715GB人類碼農的程式碼快照,對模型進行預訓練,並使用交叉熵next-token預測損失。在預訓練過程中,隨機地將程式碼檔案分成兩部分,將第一部分當作編碼器的輸入,並訓練模型去掉編碼器產生第二部分。
這種預訓練為編碼學習了一個強大的先驗,使隨後的特定任務的微調能夠在一個更小的資料集上進行。
微調
#在微調階段,在一個2.6GB的競爭性程式設計問題資料集上對模型進行了微調和評估,資料集是DeepMind創建的,命名為CodeContests公開發布。
CodeContests資料集中包括問題以及測試案例。訓練集包含13,328個問題,每個問題平均有922.4個提交答案。驗證集和測試集分別包含117個和165個問題。
在微調過程中,將自然語言的問題陳述編碼為程式註釋,以使其看起來與預訓練期間看到的檔案更加相似(其中可以包括擴展的自然語言註釋),並使用相同的next-token預測損失。
取樣
為了選出10個最好的樣本進行提交,採用過濾和聚類的方法,利用問題陳述中包含的例子測試來執行樣本,並刪除未能通過這些測試的樣本。
透過過濾篩除了近99%的模型樣本,再對剩下的候選樣本進行聚類,在一個單獨的transformer模型產生的輸入上執行這些樣本,並將在產生的輸入上產生相同輸出的程式歸為一類。
然後,從10個最大的聚類中各挑選一個樣本來提交。直觀地說,正確的程序行為相同,並形成大的聚類,而不正確的程序的失敗方式是多種多樣的。
評估
上圖所示為在10@k指標上,模型性能是如何隨著更多的樣本量和計算量而變化的。從對採樣結果的效能評估來看,研究人員得出了以下4點結論:
#1. 解決率隨著更大的樣本量而呈對數線性擴展;
2. 更好的模型在比例曲線上有較高的斜率;
#3. 解決率與更多的計算量呈對數線性比例;
4. 樣本選擇對解決率的擴展至關重要。
純粹的「資料驅動」
#毫無疑問,AlphaCode的提出,代表了機器學習模型在發展上已經邁出了實質的一步。
有趣的是,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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

使用C 中的chrono庫可以讓你更加精確地控制時間和時間間隔,讓我們來探討一下這個庫的魅力所在吧。 C 的chrono庫是標準庫的一部分,它提供了一種現代化的方式來處理時間和時間間隔。對於那些曾經飽受time.h和ctime折磨的程序員來說,chrono無疑是一個福音。它不僅提高了代碼的可讀性和可維護性,還提供了更高的精度和靈活性。讓我們從基礎開始,chrono庫主要包括以下幾個關鍵組件:std::chrono::system_clock:表示系統時鐘,用於獲取當前時間。 std::chron

DMA在C 中是指DirectMemoryAccess,直接內存訪問技術,允許硬件設備直接與內存進行數據傳輸,不需要CPU干預。 1)DMA操作高度依賴於硬件設備和驅動程序,實現方式因係統而異。 2)直接訪問內存可能帶來安全風險,需確保代碼的正確性和安全性。 3)DMA可提高性能,但使用不當可能導致系統性能下降。通過實踐和學習,可以掌握DMA的使用技巧,在高速數據傳輸和實時信號處理等場景中發揮其最大效能。

在C 中處理高DPI顯示可以通過以下步驟實現:1)理解DPI和縮放,使用操作系統API獲取DPI信息並調整圖形輸出;2)處理跨平台兼容性,使用如SDL或Qt的跨平台圖形庫;3)進行性能優化,通過緩存、硬件加速和動態調整細節級別來提升性能;4)解決常見問題,如模糊文本和界面元素過小,通過正確應用DPI縮放來解決。

C 在實時操作系統(RTOS)編程中表現出色,提供了高效的執行效率和精確的時間管理。 1)C 通過直接操作硬件資源和高效的內存管理滿足RTOS的需求。 2)利用面向對象特性,C 可以設計靈活的任務調度系統。 3)C 支持高效的中斷處理,但需避免動態內存分配和異常處理以保證實時性。 4)模板編程和內聯函數有助於性能優化。 5)實際應用中,C 可用於實現高效的日誌系統。

在C 中測量線程性能可以使用標準庫中的計時工具、性能分析工具和自定義計時器。 1.使用庫測量執行時間。 2.使用gprof進行性能分析,步驟包括編譯時添加-pg選項、運行程序生成gmon.out文件、生成性能報告。 3.使用Valgrind的Callgrind模塊進行更詳細的分析,步驟包括運行程序生成callgrind.out文件、使用kcachegrind查看結果。 4.自定義計時器可靈活測量特定代碼段的執行時間。這些方法幫助全面了解線程性能,並優化代碼。

交易所內置量化工具包括:1. Binance(幣安):提供Binance Futures量化模塊,低手續費,支持AI輔助交易。 2. OKX(歐易):支持多賬戶管理和智能訂單路由,提供機構級風控。獨立量化策略平台有:3. 3Commas:拖拽式策略生成器,適用於多平台對沖套利。 4. Quadency:專業級算法策略庫,支持自定義風險閾值。 5. Pionex:內置16 預設策略,低交易手續費。垂直領域工具包括:6. Cryptohopper:雲端量化平台,支持150 技術指標。 7. Bitsgap:

在MySQL中,添加字段使用ALTERTABLEtable_nameADDCOLUMNnew_columnVARCHAR(255)AFTERexisting_column,刪除字段使用ALTERTABLEtable_nameDROPCOLUMNcolumn_to_drop。添加字段時,需指定位置以優化查詢性能和數據結構;刪除字段前需確認操作不可逆;使用在線DDL、備份數據、測試環境和低負載時間段修改表結構是性能優化和最佳實踐。

如何實現鼠標滾動事件穿透效果?在我們瀏覽網頁時,經常會遇到一些特別的交互設計。比如在deepseek官網上,�...
