《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動態(tài) > 首次成功用CNN自動生成代碼:北大研究者搞定了爐石傳說

首次成功用CNN自動生成代碼:北大研究者搞定了爐石傳說

2018-11-28

如果人工智能可以自動生成代碼,程序員們就能減少很多工作壓力(失業(yè)是不可能失業(yè)的)。


北大研究者最近提出了使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)解碼器生成代碼的方法,并在《爐石傳說》數(shù)據(jù)集上進(jìn)行了測試,效果超過了此前各類業(yè)內(nèi)最佳模型。該研究的論文已被 AAAI 2019 大會接收。研究者稱,這是首個成功用 CNN 解碼器生成代碼的工作。


我們知道,程序包含對程序建模非常重要的豐富的結(jié)構(gòu)信息。然而,傳統(tǒng)的 Seq2Seq 神經(jīng)網(wǎng)絡(luò)不能直接建模程序結(jié)構(gòu)。圖 1 展示了一個 Python 抽象語法樹(AST)示例,其中的 n3、n6 兩個節(jié)點(diǎn)需要擁有父-子節(jié)點(diǎn)那樣密集的關(guān)聯(lián),但如果該樹是前序穿過序列的,彼此間就會比較遠(yuǎn)。這對 Seq2Seq 模型而言就比較困難。

微信圖片_20181128204604.jpg

圖 1:代碼的抽象語法樹(AST):init(a)。


為了解決這個問題,Dong 和 Lapata (2016) 提出了一種沿著程序的抽象語法樹生成代碼的方法,但這種生成仍然處于 token 級別。近來,更多的研究通過在每一步預(yù)測或重寫語法規(guī)則 (Xiong et al. 2018; Yin and Neubig 2017; Rabinovich, Stern, and Klein 2017) 來生成程序;因此,確保了生成的程序在語法上是正確的。當(dāng)在這些方法中使用神經(jīng)網(wǎng)絡(luò)時,RNN 被用來捕獲解碼器中預(yù)測的自回歸。


在深度學(xué)習(xí)社區(qū),研究人員對使用卷積網(wǎng)絡(luò)作為解碼器越來越感興趣 (Gehring et al. 2017; Chaturvedi, Pandit, and Garain 2018),因?yàn)樗矢咔胰菀子?xùn)練。研究者進(jìn)一步觀察發(fā)現(xiàn),程序比自然語言語句大得多,即使是帶有長短期記憶 (Hochreiter and Schmidhuber 1997, LSTM) 單元的 RNN 也存在長期依賴問題 (Bengio, Simard, and Frasconi 1994)。而 CNN,卻能通過滑動窗口有效地捕獲不同區(qū)域的特征。


為此,研究者提出了一種基于語法的結(jié)構(gòu)化 CNN 來用于代碼生成。他們的模型根據(jù) AST 中的語法結(jié)構(gòu)規(guī)則生成代碼,例如,If → expr stmt* stmt*就遵循了他們先前研究 (Xiong et al. 2018) 中的框架。由于子節(jié)點(diǎn)序列是通過一個預(yù)測步驟生成的,因此與逐個 token 生成相比,它能夠?qū)崿F(xiàn)更緊湊的預(yù)測。換句話說,該模型預(yù)測語法規(guī)則序列,最終形成整個程序。


在他們的方法中,語法規(guī)則的預(yù)測主要基于三種類型的信息:指定生成程序的源序列,先前預(yù)測的語法規(guī)則,以及已經(jīng)生成的部分 AST。在這里,第一個信息是編碼器的輸入,后兩者使得解碼器能夠自回歸,和以前一樣,解碼器以編碼器為條件。

微信圖片_20181128204624.jpg

圖 2:模型概覽,虛線箭頭表示注意力控制器。


研究者在已有的基準(zhǔn)數(shù)據(jù)集 HearthStone(爐石傳說)上進(jìn)行了實(shí)驗(yàn)(如圖 4 所示),任務(wù)是 Python 代碼生成(Ling et al. 2016),表 2 展示了該數(shù)據(jù)集的統(tǒng)計(jì)。實(shí)驗(yàn)結(jié)果表明他們提出的基于 CNN 的代碼生成方法遠(yuǎn)遠(yuǎn)超越了以前的基于 RNN 的方法(如表 3 所示)。研究者還進(jìn)行了擴(kuò)展性的控制變量測試,表明基于語法的結(jié)構(gòu)化 CNN 相比一般的 CNN 應(yīng)用方法更優(yōu)越(如表 4 所示)。研究者進(jìn)一步在兩個語義解析任務(wù)上評估了該方法,其中目標(biāo)程序比爐石傳說的更短;他們的方法依然得到了和以前的最佳方法相當(dāng)?shù)男阅?,表明該方法具備魯棒性(如?5 所示)。

微信圖片_20181128204645.jpg

圖 4:爐石傳說數(shù)據(jù)集的示例卡片,(a)輸入描述;(b)輸出程序。

微信圖片_20181128204706.jpg

表 2:數(shù)據(jù)集統(tǒng)計(jì)。

微信圖片_20181128204724.jpg

表 4:控制變量測試。


論文中研究者稱,他們的研究是第一次成功使用 CNN 解碼器生成代碼的工作。表 3 展示了基于 CNN 的代碼生成結(jié)果,并與此前的業(yè)內(nèi)最佳模型進(jìn)行了對比。


如表中所示,新模型在準(zhǔn)確率和 BLEU 分?jǐn)?shù)方面都優(yōu)于以前的所有結(jié)果。尤其是,新模型在準(zhǔn)確率方面顯著高于此前的業(yè)內(nèi)最佳模型——在字符串準(zhǔn)確率上高出了 5%。對于手動調(diào)整的準(zhǔn)確率來說,Yin & Neubig(2017)曾報(bào)告過大約 2% 的提升。在本文中,北大的研究者也觀察到了類似的效果,實(shí)現(xiàn)了 30.3% 的 Acc+分?jǐn)?shù),這證明了新方法的有效性。

微信圖片_20181128204749.jpg

表 3:新模型與此前業(yè)內(nèi)最佳模型的對比,以百分比記。在手動調(diào)整后性能大概能增加 2%(Yin and Neubig (2017))。

微信圖片_20181128204818.jpg

表 5:語義分析的準(zhǔn)確性(以百分比記)。


論文:A Grammar-Based Structural CNN Decoder for Code Generation

微信圖片_20181128204841.jpg


論文地址:https://arxiv.org/abs/1811.06837


摘要:代碼生成可以將一份程序描述映射為用一種編程語言寫成的可執(zhí)行源代碼?,F(xiàn)有的方法主要依賴于循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)作為解碼器。然而,我們發(fā)現(xiàn)程序比自然語言句子包含的 token 要多得多,因此 RNN 可能并不適合捕捉長句。本文提出了一個基于語法的結(jié)構(gòu)化卷積神經(jīng)網(wǎng)絡(luò)(CNN),用于代碼生成。我們的模型通過預(yù)測編程語言的語法規(guī)則來生成程序;我們設(shè)計(jì)了若干個 CNN 模塊,包括基于樹的卷積和前序卷積,其信息通過專用的注意力池化層進(jìn)一步聚集。在爐石傳說基準(zhǔn)數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果顯示,我們的 CNN 代碼生成器的表現(xiàn)超出之前最佳方法 5 個百分點(diǎn);我們通過另外幾個實(shí)驗(yàn)在若干語義分析任務(wù)上驗(yàn)證了模型的魯棒性。為了更好地理解模型的每個部分,我們還進(jìn)行了深入的控制變量測試。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。