【NLP】含10,000 Python问题,伯克利联合团队推出新的代码生成评价基准
毋庸置疑,編程已經發展為社會最廣泛的技能之一,與此同時,對高質量代碼的需求也隨之增加。
經過多年的學習,人類專家已經能夠將各種認知任務的抽象規范轉化為具體的程序,比如,在過去的幾年里,大規模語言模型在推廣到各種認知任務方面彰顯了其廣闊前景,包括語言推理(Linguistic inference)、常識推理(commonsense reasoning)、邏輯演繹(logical deduction)、數學(mathematics),以及對人類知識的多個領域的一般理解。
然而,大規模語言模型是否能夠可靠地編寫代碼解決方案,仍然是一個懸而未決的問題。代碼生成評估方面的工作同樣出奇的少,因此我們難以精確嚴格地評估代碼的生成性能。
考慮到語言模型的潛力和對代碼生成評估的需要,在該挑戰下,來自加州大學伯克利分校(University of California, Berkeley)的一支研究團隊,引入了一種基于自然語言規范的代碼生成基準 —— 自動編碼進度標準(APPS, Automated Programming Progress Standard)。論文題為
Measuring Coding Challenge Competence With APPS。
APPS 提供了一個精確而全面的代碼生成視圖,其評估模型的標準不僅限于編寫正確程序的能力,還包括理解任務描述和設計算法以解決實際任務的能力。
APPS 評估框架如下圖 1 所示,團隊的基準測試包含 10,000 個不同難度級別的編程問題,從簡單的入門級問題、面試級問題到競賽級不等。
如果模型在 APPS 上表現良好,則表明它具有靈活使用數據結構和編程技術的能力,以及正確理解各種任務說明,遵循并理解人的意圖的能力。
區別于先前使用 Transformer 語言模型進行代碼生成的工作,團隊的基準測試衡量了模型采用任意自然語言規范和生成滿意的 Python 代碼的能力,更具現實性和豐富性。
類似于公司評估候選軟件開發人員的過程,通過檢查在測試用例上生成的代碼來評估模型。
此外,團隊成員微調了 GitHub 和訓練集上的大型語言模型,發現隨著模型的改進,語法錯誤率呈指數級下降。例如 GPT-Neo 等最新模型,可通過大約 20% 的入門問題測試用例,因此團隊發現,機器學習模型已加入學習編寫代碼的行列。隨著未來自動代碼生成的社會意義的不斷提升,團隊開發的基準可以為跟蹤進展提供重要的度量標準。
APPS 數據集
APPS 數據集包含從不同的開放訪問編碼網站收集的問題,如 Codeforces(全球最著名的在線評測系統之一)、Kattis(算法競賽網站)等。APPS 基準測試試圖通過在不受限制的自然語言中提出編碼問題并使用測試用例來評估解決方案的正確性,以反映人類程序員是如何被評估的。
該基準總共包含 10,000 個編碼問題,為了驗證模型給出的答案,數據集包含 131,836 個測試用例和 232,444 個人類編寫的實際解決方案。其中,問題的平均長度是 293.2 words,其復雜度可能會很高。數據劃分為訓練集和測試集,各包含 5000 個問題。而在測試集中,每個問題都有多個測試用例,測試用例的平均個數為 21.2。并且每個測試用例都是為相應的問題專門設計的,有助于嚴格地評估程序的功能。
(1)APPS 數據集的創建
為了創建 APPS 數據集,團隊成員從開放訪問站點手動處理問題,在這些站點中程序員可以共享問題,包括 Codewars、AtCoder、Kattis 和 Codeforces。
問題以自然語言規范的形式提出并以不同的格式呈現。為了提高質量和一致性,團隊成員為每個問題源編寫了自定義 HTML 解析器,這允許我們在問題文本中正確格式化 LaTeX 表達式、列表和章節。必要時,可以使用 MathPix API 將方程圖像轉換為 LaTeX,并消除依賴于圖像數據的問題。
此外還使用了具有 SVD 降維和余弦相似度的 tf-idf 特征執行重復數據的刪除操作。為保證問題的高質量,團隊對數據集進行了 6 個月的不斷優化和改進。
執行和評估任意 Python 代碼是極具挑戰性的任務。在團隊獲取數據的網站上,允許人工解決方案運行任意代碼,包括公共模塊和庫的導入語句。為解決此問題,每個網站都實現了 “量身定制” 的評判系統。為此,研究特意設計了一個測試框架,其融合了多個網站的判斷功能,并還標準化了測試用例的格式。最終的期望結果是允許解決方案執行任意的 Python 代碼,并將其輸出與給定問題的測試用例進行比較。
下表 1 是用于文本和代碼之間轉換的 APPS 數據集與現有數據集的比較。與這些數據集、測試用例和自然語言問題描述相比,APPS 擁有更真實的解決方案。
(2)APPS 數據集的難度
數據集中的每個問題來源都使用單獨的難度量表來衡量。團隊將這些不同來源的問題歸結為三類。
例如,源自 Kattis 網站的問題,難度系數小于 3 的被歸類為 “入門級”,難度在 3 到 5 之間的被歸類為 “面試級”,難度大于 5 的為 “競賽級”。具體介紹如下:
l 入門級(Introductory Level):此類問題不需要復雜的算法,有 1-2 年經驗的程序員便可以回答,有 3639 個。這類問題的例子包括計算字符串中的元音數量,或返回整數列表的運行和。
l 面試級(Interview Level):此類問題會涉及算法,能達到編程技術面試中的難度水平,有 5000 個。這類問題的例子可能包括樹或圖等數據結構的問題,或者需要非平凡算法(nontrivial algorithms)的問題。
l ?競賽級(Competition Level):此類問題最具挑戰性,難度最高,達到最先進的高中和大學編程競賽的水平,包括 USACO、IOI 和 ACM 等,有 1361 個 。
(3)問題格式
為了適應廣泛的問題來源,APPS 中的問題有兩種格式:
l 基于調用格式(Call-Based Format)的問題通常提供初始入門程序(starter code),通常以函數頭的形式,并要求提供作為函數返回值的解決方案。
l 標準輸入格式(Standard Input Format)的問題通常缺少入門程序。相反地,模型只提供了問題,并且必須將其答案輸出到 STDOUT 流,例如使用 print 語句。
GPT?接受檢驗
(1)模型及微調
研究團隊使用了 GPT-2、GPT-3 和 GPT-Neo 模型。考慮到 GPT 模型自回歸的特性,其體系架構特別適用于文本生成。
然而,原始的 GPT-2 模型只接受過自然語言的訓練,因此文中使用了 Github 的代碼對其進行預訓練。坊間證據表明 GPT-3 可以生成代碼,為了確定其代碼生成能力的范圍,選用 “達芬奇”(DaVinci)模型作為最大的公開可用模型,推測其參數數量高達 1750 億。
最后,GPT-Neo 具有類似于 GPT-3 的架構,但不同之處在于,GPT-Neo 的權重是公開的,因此團隊在 APPS 的訓練集上對其進行了微調。在預訓練和微調中,團隊成員使用 AdamW 優化器,batch 大小為 256,權重衰減(weight decay)為 0.05,并微調了 10 個 epoch。在訓練大型模型時,使用 DeepSpeed 及其 ZeRO 優化器來減少內存的消耗。模型在 8 A100 GPUs 上進行微調。
(2)GPT-2 的表現如何?
圖 2 GPT-2 1.5B?模型的生成代碼情況
在上述問題上,GPT-2 1.5B 模型寫的代碼通過了全部測試用例,著實令人欣喜。請注意,在問題中給出的模型與這里的格式完全相同,這甚至意味著解析 LATEX。為了直觀起見,研究團隊從所描述的問題中排除了格式化指令。
對于基于調用格式問題,則使用以下輸入提示模型:
上述兩個提示,變量 q_str 表示問題語句的原始文本,而變量 starter_code_str 表示問題定義中給出的入門程序,如果沒有提供此代碼,則為空字符串。對于標準輸入格式問題,團隊仍然使用先前的輸入字符串提示模型,只不過將 “基于調用格式” 替換為 “標準輸入格式”。
需要注意的是,如果給出了入門程序,那么它也只是輸入的一部分。這就意味著,要使用入門程序,模型必須學會在輸出答案的開始階段復制入門程序,以獲得正確的問題。團隊發現,經過微調的模型完成此操作實屬 “小菜一碟”。
圖 3 展示了來自 GPT-2 1.5B 的示例。盡管生成的代碼沒有通過任何一個測試,但乍一看還是很合理的。
(3)度量標準
為了得到代碼生成能力的綜合評價,使用了 APPS 提供的大量測試用例和真實的解決方案。
其中,測試用例允許自動評估,即使可能的程序空間組合起來可能很大。因此,與許多其它的文本生成任務不同,不需要手動分析。團隊使用兩個度量指標 —“測試用例平均值” 和 “嚴格的準確率”,以聚合生成的代碼在測試用例上的性能,具體計算公式如下所示:
其中,??代表測試集的問題數量,??表示解決問題所生成的代碼,問題??的測試用例集為?。
通常,解決方案可以成功地通過測試用例的子集,但不能覆蓋所有的用例。這在模型評估的嚴格性上適當的留有空間,因為嚴格的準確率目前可能會掩蓋模型的改進。
(4)性能分析
下表 2 呈現了主要的實驗結果,包含通過測試用例的平均百分比、模型的嚴格準確率和難度級別。其中,‘0.1B’表示數十億的模型參數。不同于其它模型的是,GPT-3 是一種小樣本模型且未進行微調。文中作者明確表示,模型的確可以生成一些能通過測試的代碼,這也就意味著這些生成的程序沒有語法錯誤,并且可以輸出正確答案。
很明顯,對于入門級問題,GPT-Neo 表現最佳,達到近似 4% 的嚴格準確率,并且通過了大約 15% 的測試用例。
圖 5 展示了測試用例平均結果的可視化。這說明模型在代碼生成方面有了顯著的改進,定會推動代碼生成領域的研究進展。
?
研究使用了寬度為 5 的波束搜索(beam search)并評估了 5 個波束,使得每個模型在糾正問題時有五次嘗試而不是只有一次。通過這種設置,GPT-Neo 在入門級問題上的嚴格準確性超過 5%,如上圖 4 所示。
附錄中的結果顯示,排名前 5 的 GPT-2 0.1B 測試用例平均值是 10.75,排名前 1 的 GPT2 1.5B 測試用例平均值是 7.96。由此強調了簡單地對多個候選解決方案進行抽樣是顯著提高性能的有效方法。
在測試準確率上,團隊發現從 GPT-2 1.5B 到 GPT-Neo 2.7B 的性能改進要比從 GPT-2 0.1B 到 GPT-2 1.5B 的性能改進更大一些。團隊分析 GPT-Neo 性能更好的潛在原因為,GPT-Neo 在更多地 GitHub 代碼上進行了訓練,有更多的參數,或者是其具有更好地體系結構。由于模型仍然有很大的提升空間,在沒有不合理的計算資源的情況下,解決 APPS 基準測試可能需要架構或算法上的進一步改進。
在語法錯誤率上,這些錯誤會阻止程序被解釋,空格不一致,括號不平衡,冒號缺失等等。上圖 6 中可視化了語法錯誤的流行情況。GPT-3 在入門級問題上給出的答案大約有 59% 的錯誤,而相似架構的 GPT-Neo 在語法錯誤方面卻只有 3%。
在評估模型的性能上,BLEU 指標被發現是一種較差的替代評估。
為了評估 BLEU,團隊將生成的解決方案與給定問題的人類編寫的解決方案來計算其 BLEU 值;然后記錄最高的 BLEU 分數。從下圖 7 中可以觀察到,BLEU 分數隨著問題來源變得更加困難而增加,盡管在實際情況中,模型在困難的問題上表現得更糟。此外,更差的模型可能有類似或更高的 BLEU 分數。
例如,GPT-2 0.1B 在入門級、面試級和競賽級題目的 BLEU 分數分別為 26.8、29.7 和 30.2。而 GPT-Neo 2.7B 的 BLEU 分數分別為 27.1、29.1、29.3。因此,BLEU 錯誤地認為 GPT-Neo 成了一個更差的模型。
總而言之,這項研究引入了一項包含 10,000 個 Python 編程問題的基準測試 —APPS。
與先前的工作側重于從偽代碼到代碼的生成不同,本文的基準測試可以在給定的自然語言描述下,來衡量語言模型生成的 python 代碼的質量。通過利用具有質量保證,并且包括不同難度級別的成千上萬的測試用例和真實解決方案,本文創建了一個全面而嚴格的測試平臺來評估模型。團隊用 APPS 評估了最新的生成模型,發現整體性能很低。
但是,隨著模型規模的增大以及微調的引入,語法錯誤率便會呈指數趨勢下降,比如 GPT-Neo 模型。
用自然語言編寫符合規范的代碼是一項極具經濟價值的任務,如果能夠得到解決,將會帶來廣泛的社會影響。隨著模型在代碼生成方面的能力越來越強,如何跟蹤這種能力的變化將愈發重要,因為它很可能會導致自動化或惡意代碼生成等情況的出現。APPS 基準為這類進展提供了重要的手段。其數據集和實驗代碼見:github.com/hendrycks/apps。
Reference:
1、https://arxiv.org/pdf/2105.09938.pdf
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯溫州大學《機器學習課程》視頻 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【NLP】含10,000 Python问题,伯克利联合团队推出新的代码生成评价基准的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌Chrome浏览器添加新技术 可防止
- 下一篇: 终于有人把文本分类讲明白了!