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

選自 arXiv

作者:孫澤宇、朱琪豪、牟力立、熊英飛、李戈、張路

機器之心編譯

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

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

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

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

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

在深度學習社區,研究人員對使用卷積網絡作爲解碼器越來越感興趣 (Gehring et al. 2017; Chaturvedi, Pandit, and Garain 2018),因爲它效率高且容易訓練。研究者進一步觀察發現,程序比自然語言語句大得多,即使是帶有長短期記憶 (Hochreiter and Schmidhuber 1997, LSTM) 單元的 RNN 也存在長期依賴問題 (Bengio, Simard, and Frasconi 1994)。而 CNN,卻能通過滑動窗口有效地捕獲不同區域的特徵。

爲此,研究者提出了一種基於語法的結構化 CNN 來用於代碼生成。他們的模型根據 AST 中的語法結構規則生成代碼,例如,If → expr stmt* stmt*就遵循了他們先前研究 (Xiong et al. 2018) 中的框架。由於子節點序列是通過一個預測步驟生成的,因此與逐個 token 生成相比,它能夠實現更緊湊的預測。換句話說,該模型預測語法規則序列,最終形成整個程序。

在他們的方法中,語法規則的預測主要基於三種類型的信息:指定生成程序的源序列,先前預測的語法規則,以及已經生成的部分 AST。在這裏,第一個信息是編碼器的輸入,後兩者使得解碼器能夠自迴歸,和以前一樣,解碼器以編碼器爲條件。

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

研究者在已有的基準數據集 HearthStone(爐石傳說)上進行了實驗(如圖 4 所示),任務是 Python 代碼生成(Ling et al. 2016),表 2 展示了該數據集的統計。實驗結果表明他們提出的基於 CNN 的代碼生成方法遠遠超越了以前的基於 RNN 的方法(如表 3 所示)。研究者還進行了擴展性的控制變量測試,表明基於語法的結構化 CNN 相比一般的 CNN 應用方法更優越(如表 4 所示)。研究者進一步在兩個語義解析任務上評估了該方法,其中目標程序比爐石傳說的更短;他們的方法依然得到了和以前的最佳方法相當的性能,表明該方法具備魯棒性(如表 5 所示)。

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

表 2:數據集統計。

表 4:控制變量測試。

論文中研究者稱,他們的研究是第一次成功使用 CNN 解碼器生成代碼的工作。表 3 展示了基於 CNN 的代碼生成結果,並與此前的業內最佳模型進行了對比。

如表中所示,新模型在準確率和 BLEU 分數方面都優於以前的所有結果。尤其是,新模型在準確率方面顯著高於此前的業內最佳模型——在字符串準確率上高出了 5%。對於手動調整的準確率來說,Yin & Neubig(2017)曾報告過大約 2% 的提升。在本文中,北大的研究者也觀察到了類似的效果,實現了 30.3% 的 Acc+分數,這證明了新方法的有效性。

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

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章