首次成功用CNN自动生成代码:北大研究者搞定了炉石传说

姓名:刘畅 学号:15020199045

转自:https://zhuanlan.zhihu.com/p/50916001

【嵌牛导读】:如果人工智能可以自动生成代码,程序员们就能减少很多工作压力(失业是不可能失业的)。

【嵌牛鼻子】:人工智能,代码 , 炉石传说

【嵌牛提问】:如果机器可以生成代码,程序员真的不会失业吗?

北大研究者最近提出了使用卷积神经网络(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 个百分点;我们通过另外几个实验在若干语义分析任务上验证了模型的鲁棒性。为了更好地理解模型的每个部分,我们还进行了深入的控制变量测试。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容