Facebook AI發(fā)布了一個包含編碼問題和代碼片段答案的數(shù)據(jù)集,旨在評估基于AI的自然語言代碼搜索系統(tǒng)。該版本還包括Facebook自己的幾種代碼搜索模型的基準測試結(jié)果,以及來自24,000個GitHub存儲庫的超過400萬種Java方法的訓(xùn)練語料庫。
在arXiv上發(fā)表的一篇論文中,研究人員描述了他們收集數(shù)據(jù)的技術(shù)。訓(xùn)練數(shù)據(jù)語料庫是從最受歡迎的GitHub Android代碼存儲庫中收集的,按星數(shù)排序。解析存儲庫中的每個Java文件,以標識各個方法。Facebook在培訓(xùn)代碼搜索系統(tǒng)的研究中使用了所得的語料庫。為了創(chuàng)建評估數(shù)據(jù)集,他們從Stack Overflow 的問答數(shù)據(jù)轉(zhuǎn)儲開始,僅選擇同時具有“ Java”和“ Android”的問題研究人員說:“其中,他們只保留答案被投票的問題,這些問題也與訓(xùn)練數(shù)據(jù)語料庫中確定的一種方法相匹配。結(jié)果將518個問題手動過濾為最終的287個問題。研究人員表示:
我們的數(shù)據(jù)集不僅是當(dāng)前可用于Java的最大數(shù)據(jù)集,而且還是唯一以自動化(一致)方式針對Stack Overflow的真實答案進行驗證的數(shù)據(jù)集。
Facebook最近發(fā)表了幾篇關(guān)于神經(jīng)代碼搜索的論文,這是一種用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)回答“如何”編碼問題的機器學(xué)習(xí)技術(shù)。軟件開發(fā)人員通常會使用Stack Overflow來學(xué)習(xí)如何解決特定的編碼問題,例如,如何解決 Android應(yīng)用程序中的錯誤。但是,在處理使用專有API或較不常見的編程語言的代碼時,這不是一個選擇。在這種情況下,程序員自己的組織之外的專家很少(或沒有)。相反,F(xiàn)acebook和其他公司探索了使用源代碼本身作為培訓(xùn)數(shù)據(jù)來產(chǎn)生可以回答編碼問題的自然語言處理(NLP)系統(tǒng)的想法。
去年,F(xiàn)acebook發(fā)表了一篇關(guān)于無監(jiān)督學(xué)習(xí)方法的論文,稱為神經(jīng)代碼搜索(NCS),該方法接受了從GitHub收集的數(shù)據(jù)的培訓(xùn)。該技術(shù)從源代碼中提取單詞,并學(xué)習(xí)將每個單詞映射到高維空間中的向量的嵌入。嵌入通常具有向量的性質(zhì),向量在向量空間中彼此“接近”,表示具有相似含義的詞,并且詞之間的關(guān)系可用向量算術(shù)表示。一個例子是在Wikipedia上訓(xùn)??練的word2vec模型,當(dāng)給定向量表達式“ Paris-France + Spain”時,該模型將返回“ Madrid”。
學(xué)習(xí)了嵌入之后,使用“ 詞袋 ”模型將語料庫中的每個Java方法轉(zhuǎn)換為嵌入空間中的向量;通過嵌入將代碼中的每個單詞轉(zhuǎn)換為向量,并將向量的加權(quán)總和分配給該方法作為其索引。這會將每個Java方法映射到嵌入空間中的一個點。為了回答編碼問題,通過將查詢中的每個單詞都通過嵌入轉(zhuǎn)換并產(chǎn)生加權(quán)和,可以將該問題類似地映射到嵌入空間中的某個點。問題的“答案”是Java方法,其索引最接近該點。關(guān)鍵思想是查詢和代碼都使用相同的嵌入,并且訓(xùn)練不需要在輸入數(shù)據(jù)中出現(xiàn)任何問題;它僅從源代碼中學(xué)習(xí)。
這種技術(shù)的一個缺點是它不會學(xué)習(xí)源代碼中沒有的單詞的嵌入。Facebook研究人員發(fā)現(xiàn),在Stack Overflow上,有問題的單詞中也只有不到一半的單詞包含在源代碼中。這促使研究人員通過監(jiān)督學(xué)習(xí)擴展了NCS,“以彌合自然語言單詞和源代碼單詞之間的鴻溝”。產(chǎn)生的系統(tǒng)稱為嵌入統(tǒng)一(UNIF),學(xué)習(xí)查詢詞的單獨嵌入。在此培訓(xùn)過程中,團隊使用類似于收集基準數(shù)據(jù)集的過程從Stack Overflow中提取了一組問題標題和代碼段。該訓(xùn)練數(shù)據(jù)集包含451k個問題-答案對,但都不在基準測試中。在基準上進行評估時,對這一數(shù)據(jù)進行培訓(xùn)的聯(lián)合國系統(tǒng)的性能略優(yōu)于NCS。兩種系統(tǒng)都以大約三分之一的時間作為最高結(jié)果返回“正確”答案,并以一半的時間以“前五項”結(jié)果返回“正確”答案。