IBM開源了5億行代碼數(shù)據(jù)集,里面最多的編程語言卻不是Python
谷歌服務(wù)包含 20 億行代碼,一輛汽車的系統(tǒng)包含 1 億行代碼——寫代碼、debug 這么大的工作量不交給 AI 來做能行?
讓 AI 自動(dòng)生成代碼,是很多開發(fā)者的夢想,近些年來,有關(guān)這一方面的研究屢見不鮮。但要想訓(xùn)練一個(gè)好用的 AI,最重要的工作或許就是找到優(yōu)質(zhì)數(shù)據(jù)。
近日,IBM 研究院發(fā)布了一個(gè)名為 CodeNet 的數(shù)據(jù)集,該數(shù)據(jù)集包含 1400 萬個(gè)代碼樣本,用于訓(xùn)練面向編程任務(wù)的機(jī)器學(xué)習(xí)模型。該數(shù)據(jù)集的主要特點(diǎn)包括:
- 迄今為止最大的編碼數(shù)據(jù)集,其中包含 4000 個(gè)問題,1400 萬個(gè)代碼樣本,50 + 種編程語言;
- 該數(shù)據(jù)集添加了注釋,包括問題描述、內(nèi)存 / 時(shí)間限制、語言、代碼通過 / error 等。
IBM 希望 CodeNet 仿效大型圖像數(shù)據(jù)集 ImageNet,并成為教軟件理解軟件開發(fā)藍(lán)圖的領(lǐng)先數(shù)據(jù)集。IBM 希望 CodeNet 可以用于訓(xùn)練具有如下功能的開發(fā)工具:
- 從一種編程語言轉(zhuǎn)換到另一種編程語言;
- 代碼推薦與補(bǔ)全;
- 代碼優(yōu)化;
- 搜索應(yīng)用程序和庫來源以查找所需例程;
- 將一種語言轉(zhuǎn)換成另一種語言;
- 識別錯(cuò)誤 / 正確的實(shí)現(xiàn)機(jī)制。
利用深度學(xué)習(xí)進(jìn)行自動(dòng)化編程
近年來,機(jī)器學(xué)習(xí)領(lǐng)域取得了令人矚目的進(jìn)步,AI 讓多種工作任務(wù)實(shí)現(xiàn)了自動(dòng)化,包括編程。但是 AI 在軟件開發(fā)中的滲透卻遇到了極大的困難。
人們在編程時(shí)通常會使用大量的有意識和潛意識思維機(jī)制發(fā)現(xiàn)新的問題并探索不同的解決方案。相比之下,大多數(shù)機(jī)器學(xué)習(xí)算法都需要定義明確的問題和大量帶有注釋的數(shù)據(jù)才能夠開發(fā)出解決相同編程問題的模型。
為了解決這一難題,研究者與開發(fā)者們已經(jīng)做出了很多努力,包括創(chuàng)建數(shù)據(jù)集和基準(zhǔn),以開發(fā)和評估「用于編程的 AI」系統(tǒng)。但是,鑒于軟件開發(fā)的創(chuàng)造性和開放性,很難為編程創(chuàng)建完美的數(shù)據(jù)集。
IBM 的研究人員試圖創(chuàng)建一個(gè)多用途的數(shù)據(jù)集,可用于訓(xùn)練各種任務(wù)的機(jī)器學(xué)習(xí)模型。CodeNet 的創(chuàng)建者將其描述為「非常大規(guī)模,多樣且高質(zhì)量的數(shù)據(jù)集,能夠加快使用 AI 編程的步伐」。該數(shù)據(jù)集包含 1400 萬個(gè)代碼樣本,共有用 55 種編程語言編寫的 5 億行代碼,其中 C++ 是樣本中使用最多的語言,Python 位居第二。這些代碼樣本是從提交給在線編程平臺 AIZU 和 AtCoder 上的近 4,000 項(xiàng)挑戰(zhàn)的提交中獲得的,代碼樣本包括這些挑戰(zhàn)的正確答案和錯(cuò)誤答案。
CodeNet 項(xiàng)目地址:https://github.com/IBM/Project_CodeNet
CodeNet 的主要特點(diǎn)之一是代碼樣本中添加了注釋。數(shù)據(jù)集中包含的每個(gè)編程挑戰(zhàn)都有一個(gè)文本說明以及 CPU 時(shí)間和內(nèi)存限制。每個(gè)代碼提交都包含十幾條信息,包括語言,提交日期,內(nèi)存占用大小,執(zhí)行時(shí)間,接受和 error 類型。為了確保該數(shù)據(jù)集在編程語言,接受和 error 類型等多個(gè)維度上保持平衡,IBM 的研究人員付出了巨大的努力。
機(jī)器學(xué)習(xí)編程任務(wù)
CodeNet 并不是訓(xùn)練機(jī)器學(xué)習(xí)模型來執(zhí)行編程任務(wù)的唯一數(shù)據(jù)集。相比于其他數(shù)據(jù)集,CodeNet 具有以下特點(diǎn):首先是數(shù)據(jù)集的規(guī)模,包括樣本數(shù)量和語言的多樣性;但更重要的是編碼樣本附帶的元數(shù)據(jù)。CodeNet 中添加的豐富注釋使其能夠適用于多種任務(wù),不再只是用于特定編程任務(wù)。
使用 CodeNet 開發(fā)用于編程任務(wù)的機(jī)器學(xué)習(xí)模型包括以下方式:
- CodeNet 可以用來進(jìn)行語言翻譯任務(wù)。由于數(shù)據(jù)集中包含的每個(gè)編程挑戰(zhàn)都包含不同編程語言的提交,因此數(shù)據(jù)科學(xué)家們可以用它來創(chuàng)建機(jī)器學(xué)習(xí)模型,將代碼從一種語言轉(zhuǎn)換成另一種語言。對于希望將舊代碼移植成新語言、使新一代程序員能夠訪問并使用新型開發(fā)工具進(jìn)行維護(hù)的人們而言,這可能很方便;
- CodeNet 還可以用來開發(fā)完成代碼推薦任務(wù)的機(jī)器學(xué)習(xí)模型開發(fā)。推薦工具既可以像完成當(dāng)前代碼行的自動(dòng)完成樣式模型一樣簡單,也可以是編寫完整函數(shù)或代碼塊的更復(fù)雜系統(tǒng)。
由于 CodeNet 擁有大量關(guān)于內(nèi)存和執(zhí)行時(shí)間指標(biāo)的元數(shù)據(jù),數(shù)據(jù)科學(xué)家也可以使用它來開發(fā)代碼優(yōu)化系統(tǒng)。或者,可以使用 error 類型的元數(shù)據(jù)來訓(xùn)練機(jī)器學(xué)習(xí)系統(tǒng),以標(biāo)記源代碼中的潛在缺陷。
CodeNet 更高級的用例是代碼生成。CodeNet 是一個(gè)豐富的問題文本描述庫,并包含對應(yīng)的源代碼。已經(jīng)有開發(fā)人員使用高級語言模型(如 GPT-3)從自然語言描述生成代碼,CodeNet 或許能夠幫助微調(diào)這些語言模型,使其在代碼生成中更加一致。
IBM 的研究人員已經(jīng)對 CodeNet 進(jìn)行了一些實(shí)驗(yàn),這些實(shí)驗(yàn)包括代碼分類、代碼相似性評估和代碼補(bǔ)全。使用的深度學(xué)習(xí)體系架構(gòu)包括簡單的多層感知器、卷積神經(jīng)網(wǎng)絡(luò)、圖神經(jīng)網(wǎng)絡(luò)、Transformer。
IBM 和 MIT-IBM Watson AI 實(shí)驗(yàn)室團(tuán)隊(duì)聯(lián)合開發(fā)了該數(shù)據(jù)集,研究中的實(shí)驗(yàn)結(jié)果顯示大多數(shù)任務(wù)都能獲得90%以上的準(zhǔn)確率。
論文地址:https://github.com/IBM/Project_CodeNet/blob/main/ProjectCodeNet.pdf
建立高效的機(jī)器學(xué)習(xí)系統(tǒng),需付出巨大努力
IBM 的工程師們進(jìn)行了大量的工作來管理 CodeNet 數(shù)據(jù)集并開發(fā)其輔助工具。
首先,研究團(tuán)隊(duì)需要從 AIZU 和 AtCoder 收集代碼樣本。二者中只有一個(gè)平臺有應(yīng)用程序接口(API),可以很容易地獲取代碼,而另一個(gè)平臺沒有易于訪問的接口,研究團(tuán)隊(duì)需要開發(fā)新工具,從平臺的網(wǎng)頁上抓取數(shù)據(jù),并將其分解成表格格式。然后研究者們需要手動(dòng)將兩個(gè)數(shù)據(jù)集合并到一個(gè)統(tǒng)一的模式中。
接下來,研究團(tuán)隊(duì)需要開發(fā)用于識別和刪除重復(fù)代碼和樣本(包含大量無效代碼,運(yùn)行時(shí)未執(zhí)行的源代碼)的工具,以清除無用數(shù)據(jù)。
此外,該研究團(tuán)隊(duì)還開發(fā)了預(yù)處理工具,使得在 CodeNet 語料庫上訓(xùn)練機(jī)器學(xué)習(xí)模型變得更容易,包括用于不同編程語言的 tokenizer、分析樹(parse tree)和用于圖神經(jīng)網(wǎng)絡(luò)的圖表征生成器。
所有這些都提醒我們,要?jiǎng)?chuàng)建高效的機(jī)器學(xué)習(xí)系統(tǒng),需要付出巨大的努力。人工智能要取代程序員還有很長的路要走。
【責(zé)任編輯:張燕妮 TEL:(010)68476606】