电竞比分网-中国电竞赛事及体育赛事平台

分享

AlphaCode到底強在哪兒?清華博士后十分鐘視頻詳細解析

 長沙7喜 2022-02-16
機器之心報道
編輯:張倩
AlphaCode 到底是怎么練成的?
春節(jié)期間,DeepMind 的編程版 AlphaGo——AlphaCode 一度火到刷屏。它可以編寫與普通程序員水平相媲美的計算機程序,在 Codeforces 網(wǎng)站的 10 項挑戰(zhàn)中總體排名前 54.3%,擊敗了 46% 的參賽者。

圖片


這一成績給程序員群體帶來了不小的壓力,仿佛紡織工被紡織機淘汰的歷史正在重演。

那么,AlphaCode 是如何做到如此強大的?在最近的一個 YouTube 視頻中,清華大學朱軍門下博士后 Tim Pearce 詳細解析了 AlphaCode 的系統(tǒng)架構、「解題」原理、訓練流程等內(nèi)容。

原視頻地址:https://www./watch?v=YjsoN5aJChA

AlphaCode 到底做了什么?

前面提到,DeepMind 的研究者將 AlphaCode 放在 Codeforces 挑戰(zhàn)中進行了測試。Codeforces 是一個在線編程的平臺,里面有各種各樣的編程題目,各種各樣的比賽。它類似于國際象棋中使用的 Elo 評級系統(tǒng),每周分享編程挑戰(zhàn)和問題排名。不同于編程人員在打造商業(yè)應用程序時可能面臨的任務,Codeforces 的挑戰(zhàn)更加獨立,需要對計算機科學中的算法和理論概念有更廣泛的了解,一般是結合邏輯、數(shù)學和編碼專業(yè)知識的非常專業(yè)的難題。

圖片


下圖展示了其中一個賽題的例子,包含賽題描述、輸入輸出示例等內(nèi)容,挑戰(zhàn)者的任務就是根據(jù)這些內(nèi)容寫出一段代碼,使得其輸出符合要求。

圖片


以下是 AlphaCode 寫出的代碼:

圖片


對于 AlphaCode 來說,這還只是中等難度的挑戰(zhàn)。

在類似的十項挑戰(zhàn)中,研究者將賽題輸入 AlphaCode。然后,AlphaCode 生成大量可能的答案,并通過運行代碼和檢查輸出來篩選這些答案,就像人類競爭對手一樣。AlphaCode 論文的聯(lián)合負責人 Yujia Li 和 David Choi 表示:「整個過程是自動的,無需人工選擇最佳樣本?!?/span>

為什么 AlphaCode 那么厲害?

下圖是 AlphaCode 的概念圖。這是一個精心設計的系統(tǒng),主要構建塊是基于 Transformer 的語言模型。但從本質(zhì)上來說,沒有一個單獨的組件是全新的。

圖片


「考場」上的 AlphaCode

我們先來看一下上述系統(tǒng)在測試時是如何工作的。

在解決編碼問題時,AlphaCode 使用了一個非常具體的協(xié)議(protocol),這個協(xié)議決定了整個系統(tǒng)的 pipeline。協(xié)議規(guī)定,他們可以無限制地使用示例測試用例,因為這些是作為問題的一部分給出的。但在提交給隱藏測試用例時,他們將提交版本數(shù)限制在了 10 次以內(nèi)(至多 10 次)。

在測試時,AlphaCode 經(jīng)歷了三個階段。

圖片


在第一個階段,他們使用一個大型 Transformer 模型,該模型將問題描述示例測試和一些關于問題的元數(shù)據(jù)都放在一個字符串中作為輸入。然后,他們從這個模型中采樣,生成大量的潛在解決方案。所以第一個階段得到的是 100 萬套可能的代碼腳本。

在第二個階段,他們用示例測試用例測試了得到的 100 萬套代碼,其中 99% 的代碼都沒有通過測試,可以直接排除。這就將可行的代碼套數(shù)降到了 1000 個左右(具體數(shù)量取決于題目的難度)。

在第三個階段,他們使用了第二個 Transformer 模型。該模型將問題描述作為輸入,但它并沒有試圖生成代碼來解決問題,而是生成測試用例輸入(每個問題對應 50 個輸入)。也就是說,他們并沒有選擇生成輸入和輸出對,而是生成了一些與問題相關的實際輸入。所以模型可能要生成字符串、二進制數(shù)或數(shù)列(具體生成形式取決于問題類型)。

這種做法好在哪兒呢?他們認為,如果兩個腳本為所有 50 個測試返回相同的答案,那么它們可能使用的是相同的算法。這就可以避免浪費兩次提交機會把這兩個腳本都測試一下。所以在第二步得到 1000 套腳本后,他們就根據(jù)這 50 個生成的測試輸入的輸出對腳本進行聚類,然后從每個聚類中選出一個示例腳本,總共選出 10 個。如果這 10 個腳本中有一個通過了所有的隱藏測試,那么他們就成功地解決了這個編程問題,否則就宣告失敗。

以上就是 AlphaCode 在測試時的工作原理,其中用到了兩個 Transformer 模型。那么這兩個模型是怎么訓練的呢

AlphaCode 的訓練

AlphaCode 的訓練分為兩個階段:預訓練和微調(diào)。這一過程涉及兩個數(shù)據(jù)集:第一個是由各種編程語言組成的公共 GitHub 庫,用于預訓練,數(shù)據(jù)量高達 715GB;第二個是從各個編程挑戰(zhàn)網(wǎng)站(包括 codeforces)搜集的賽題,用于微調(diào),包括問題描述、測試用例和人類程序員編寫的答案。

圖片


圖片


數(shù)據(jù)集有了,接下來就是訓練了。

在預訓練階段,他們會抓取 GitHub 上的一些代碼,然后隨機選擇他們所謂的「pivot point」。

圖片


pivot point 之前的所有東西都將被輸入到編碼器中,解碼器的目標則是重建 pivot point 以下的代碼。編碼器輸出代碼的向量表示,后續(xù)可用于整個解碼過程。

解碼器以自回歸的方式工作。它從預測代碼的第一個 token 開始。損失函數(shù)就是預測的 softmax 輸出和真實 token 之間的交叉熵。然后,第一個真實的 token 成為解碼器的輸入,第二個 token 隨之被預測出來。在解碼器被要求預測出一個特殊的代碼結束標記前,這種情況會一直重復下去?,F(xiàn)在,這些損失通過解碼器和編碼器反向傳播,但對于編碼器來說,增加第二個損失是非常重要的。這被稱為掩蔽語言建模損失:你將輸入到編碼器中的一些 token 留空,作為一種輔助任務,編碼器會試圖預測哪個 token 被掩蔽了。

圖片



預訓練結束之后就到了微調(diào)環(huán)節(jié)。在這個環(huán)節(jié),他們將問題描述元數(shù)據(jù)和示例的輸入輸入到編碼器中,試著用解碼器生成人類編寫的代碼。此時可以看到,這與編碼器 - 解碼器架構所規(guī)定的結構非常自然地吻合在一起。這一階段的損失與預訓練時完全相同。而且,這里也有第二個 Transformer 用來生成測試輸入。這也是由相同的 GitHub 預訓練任務初始化的,但它被微調(diào)以生成測試輸入而不是代碼。

圖片

圖片


除了上面提到的常規(guī)訓練步驟和架構,AlphaCode 還從最近的其他論文中借鑒了一些經(jīng)驗。Tim Pearce 指出了其中比較不錯的一個:

圖片



AlphaCode 的元數(shù)據(jù)調(diào)節(jié)

除了問題描述,研究者還總是將元數(shù)據(jù)作為 Transformer 的輸入,包括編程語言、問題的難度等級、關于問題的一些標簽,以及解決方案是否正確等。在訓練時,模型顯然知道這些字段的值是什么,但在測試時,它們并不知道。非常有趣的是,他們可以在測試時向這些字段中輸入不同的東西來影響生成的代碼。例如,你可以控制系統(tǒng)將要生成的編程語言,甚至影響它試圖生成的解決方案類型,比如是嘗試動態(tài)編程方法還是進行窮舉搜索。

他們在測試時發(fā)現(xiàn),當他們對最初的 100 萬個代碼腳本進行采樣時,將很多字段隨機化是非常有幫助的。因為,通過增加原始采樣池的多樣性,正確答案出現(xiàn)的可能性就會增加。

以上就是 Tim Pearce 對 AlphaCode 的全部解析。他認為,DeepMind 的團隊在這項工作中的確取得了一些進展。但他比較不解的是:為什么他們在這些編程問題中取得的成就遠遠不及他們在圍棋、《星際爭霸》等游戲中取得的超越人類的成果?Tim Pearce 初步猜測是因為編程問題比較難,而且數(shù)據(jù)比較難以獲取,因為在游戲中你可以無限制地產(chǎn)生很多模擬數(shù)據(jù),但在編程問題上卻不能這么做。

參考鏈接:
https://www./watch?v=YjsoN5aJChA
https://storage./deepmind-media/AlphaCode/competition_level_code_generation_with_alphacode.pdf

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多