覆盤AlphaCode_風聞
code2Real-有人就有江湖,有code就有bug2022-02-17 09:04
DeepMind 的編程版 AlphaGo在 Codeforces 網站的 10 項挑戰中總體排名前 54.3%,擊敗了 46% 的參賽者。
這一成績給程序員羣體帶來了不小的壓力,彷彿紡織工被紡織機淘汰的歷史正在重演。
Codeforces 是一個在線編程的平台,裏面有各種各樣的編程題目,各種各樣的比賽。它類似於國際象棋中使用的 Elo 評級系統,每週分享編程挑戰和問題排名。不同於編程人員在打造商業應用程序時可能面臨的任務,Codeforces 的挑戰更加獨立,需要對計算機科學中的算法和理論概念有更廣泛的瞭解,一般是結合邏輯、數學和編碼專業知識的非常專業的難題。
對於 AlphaCode 來説,這還只是中等難度的挑戰。
在類似的十項挑戰中,研究者將賽題輸入 AlphaCode。然後,AlphaCode 生成大量可能的答案,並通過運行代碼和檢查輸出來篩選這些答案,就像人類競爭對手一樣。整個過程是自動的,無需人工選擇最佳樣本。
在解決編碼問題時,AlphaCode 使用了一個非常具體的協議(protocol),這個協議決定了整個系統的 pipeline。協議規定,他們可以無限制地使用示例測試用例,因為這些是作為問題的一部分給出的。但在提交給隱藏測試用例時,他們將提交版本數限制在了 10 次以內(至多 10 次)。
在測試時,AlphaCode 經歷了三個階段。
在第一個階段,他們使用一個大型 Transformer 模型,該模型將問題描述示例測試和一些關於問題的元數據都放在一個字符串中作為輸入。然後,他們從這個模型中採樣,生成大量的潛在解決方案。所以第一個階段得到的是 100 萬套可能的代碼腳本。
在第二個階段,他們用示例測試用例測試了得到的 100 萬套代碼,其中 99% 的代碼都沒有通過測試,可以直接排除。這就將可行的代碼套數降到了 1000 個左右(具體數量取決於題目的難度)。
在第三個階段,他們使用了第二個 Transformer 模型。該模型將問題描述作為輸入,但它並沒有試圖生成代碼來解決問題,而是生成測試用例輸入(每個問題對應 50 個輸入)。也就是説,他們並沒有選擇生成輸入和輸出對,而是生成了一些與問題相關的實際輸入。所以模型可能要生成字符串、二進制數或數列(具體生成形式取決於問題類型)。
這種做法好在哪兒呢?如果兩個腳本為所有 50 個測試返回相同的答案,那麼它們可能使用的是相同的算法。這就可以避免浪費兩次提交機會把這兩個腳本都測試一下。所以在第二步得到 1000 套腳本後,他們就根據這 50 個生成的測試輸入的輸出對腳本進行聚類,然後從每個聚類中選出一個示例腳本,總共選出 10 個。如果這 10 個腳本中有一個通過了所有的隱藏測試,那麼他們就成功地解決了這個編程問題,否則就宣告失敗。
以上就是 AlphaCode 在測試時的工作原理,其中用到了兩個 Transformer 模型。
在測試時發現,當對最初的 100 萬個代碼腳本進行採樣時,將很多字段隨機化是非常有幫助的。因為,通過增加原始採樣池的多樣性,正確答案出現的可能性就會增加。
AI在編程問題中取得的成就遠遠不及在圍棋、《星際爭霸》等遊戲中取得的超越人類的成果。
初步猜測是因為編程問題比較難,而且數據比較難以獲取,因為在遊戲中可以無限制地產生很多模擬數據,但在編程問題上卻不能這麼做,需要有真實可運行的代碼。
真實代碼涉及兩個數據集:第一個是由各種編程語言組成的公共 GitHub 庫,用於預訓練,數據量高達 715GB;第二個是從各個編程挑戰網站(包括 codeforces)蒐集的賽題,用於微調,包括問題描述、測試用例和人類程序員編寫的答案。
換而言之,AI並不懂編程,也不會一行行寫代碼,它只是採用暴力方法篩選可能的答案。
畢竟太陽底無新事,所有的可能答案早已經存在,只是人類大腦不具備高速搜索100萬個代碼樣本的能力。
人類程序員就象使用冷兵器的武士,需要長期的訓練,才能獲得輾轉騰挪的身法,四兩撥千斤的巧勁,希望一招致敵。
AI程序員直接就上加特林機槍,先射擊再瞄準。反正是瞎貓碰上死耗子,命中率46%。
人類程序員的編程能力呈冪律分佈,每一級相差一個數量級,因此,一個好的程序員頂10個甚至100個一般的程序員。
所以AI程序員排名前54%並不是什麼非常優秀的成績,要達到實用程度,至少要排名前1%。
因為有人説,把《算法》一書搞明白,你就能超過99%的程序員。
大部分人類程序員是代碼搬運工,還沒有到拼智力的程度,被AI打敗並不是什麼丟人的事,應該感到高興,畢竟紡織工失去的只是枷鎖,命運的另一扇門正在打開。
當AI能解決99%的搬運問題後,人類不得不面對真正需要拼智力的問題,低垂的果實已經摘完,只能硬着頭皮啃硬骨頭了。
自愛因斯坦之後,基礎物理學很久沒有大的進展了,因為大多數人被20世紀快速發展帶來的非基礎性需求分散精力,二戰後除電子計算機發展迅速外,其它領域發展不盡如人意。