北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

2018-11-25 14:40:22 来源:网络整理 作者:管理员

原标题:北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

乾明 发自 凹非寺

想象一下。

直接说你想干什么,就能生成相应的代码,会是多么“功德无量”一件事。

最直接受益的,就是程序员群体。

再也不用饱受“996”的折磨,也不用摸着不断后退的发际线而黯然神伤。

北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

现在,这一天又近了一些。

最近,有一篇论文提出了一种基于语法的结构化CNN代码生成器,用《炉石传说》(HearthStone)基准数据集进行实验的结果表明:

准确性上明显优于以前最先进的方法5个百分点。

北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

这篇论文目前已经被AAAI 2019收录。作者在论文中表示,他们是第一个成功地将CNN解码器用于代码生成的团队。

那么问题来了:

将CNN解码器用到代码生成,与之前的方法相比,到底有什么不同?

他们的模型又有什么特殊之处?效果到底好在哪?

下面,我们就来一一回答这些问题。

用CNN解码器生成代码的优势

基于自然语言描述生成代码,是挺难的一件事。

现在,通常用循环神经网络( RNN)进行序列生成,生成一首诗、进行机器翻译,都没问题。

但用在生成代码上,“麻烦”就来了。

程序中有很多结构化的信息,对程序建模很重要,但传统的Seq2Seq神经网络,并没有明确对程序结构进行建模。就比如下面这个Python的抽象语法树(AST)。

北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

其中,n3和n6两个节点应该作为父子节点紧密交互,但如果使用传统的Seq2Seq方法,就会导致他们“父子离散”,彼此远离。

为了解决这个问题,很多人都开始想各种办法。其中一个关键方法就是用卷积神经网络(CNN),毕竟人家效率高,训练也简单。

这篇论文,就是一个代表。而且是第一个成功地将CNN解码器用于代码生成的,颇具分水岭意义。

在论文中,作者也介绍说,这比原来的RNN强多了。最主要的一点就是:

输入的程序一半都比自然语言句子长得多,就算RNN有LSTM(long short-term memory)的加持,也会一直受到依赖性问题的困扰。

而CNN就不一样了,可以通过滑动窗口(slide window)有效地捕捉不同区域的特征。

那,这个模型是怎么设计的呢?

模型设计

论文中介绍的CNN,是一种基于语法的结构化CNN。模型会根据AST的语法结构规则生成代码,而且还能预测语法规则的顺序,最终构建整个程序。

那,他们是如何预测语法规则的呢?主要基于三种类型的信息:

指定要生成的程序的源序列、之前预测的语法规则和已经生成的部分AST。

第一种很好理解,是编码器的输入。后两种的任务,就是使解码器能够自回归(autoregressiveness),并且解码器也以编码器为条件。

为了让这个结构化CNN更适合于代码生成,他们还设计了几个不同的组件:

第一,基于树的卷积思想,在AST结构上应用滑动窗口。然后,设计另一个CNN模块对部分AST中的节点进行前序遍历。这两种类型的CNN不仅捕获序列中的“邻居”信息,还捕获树结构中的“邻居”信息。

第二,将另一个CNN模块应用于要生成的节点的祖先,让网络知道,在某个步骤中在哪里生成。从而增强“自回归性”。

第三,设计专门的注意力机制,将CNN的特征与不同的CNN模块进行交互。此外,作者表示,在代码生成过程中考虑范围名称(例如,函数和方法名称)是有用的,所以就使用了这样的信息当作几个池层的控制器。

于是,就得出了这样的一个模型。

北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

模型概述。虚线箭头表示注意力控制器。

这个模型,效果到底怎么样呢?

模型效果

作者用两个任务评估了模型的效果。一个是生成《炉石传说》游戏的Python代码,一个是用于语义解析的可执行逻辑形式生成。

生成《炉石传说》的Python代码

这个任务使用的是《炉石传说》基准数据集,一共包括665张不同卡牌。

输入是字段的半结构化描述,例如卡牌名、成本、攻击、描述和其他属性;

北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

要输出的是实现卡牌功能的Python代码片段。

北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

通过准确性与BLEU分数来测量模型的质量。在准确性方面,作者追踪了之前大多数研究相同的方法,根据字符串匹配计算精度(表示为StrAcc )。

有时候,几个生成的程序使用了不同的变量名,但功能是正确的,这就需要人为去调整。并用Acc +表示人为调整的精度。

最后,用BLEU值评估生成的代码的质量。

结果如下图所示:

北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

在准确性和BLEU分数方面,都优于之前的所有模型。StrAcc比之前最好的模型高出了5个百分点。经过人为调整后的Acc+达到了30.3%,增加了3个百分点,之前的模型最好的效果提高了2%。

作者认为,这显示了他们方法的有效性。至于之前的模型跟他们的模型在BLEU分数上的相似性,作者解释道,代码生成还是要看细节。

语义解析任务

在语义解析任务中,使用的两个语义解析数据集( ATIS和JOBS ),其中输入是自然语言句子。ATIS的输出是λ演算形式,而对于JOBS,输出的是Prolog形式。

北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

在这两个数据集中,论文中提出的模型并没有展现出什么优势。

北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

作者在论文中表示,这可能是因为语义解析的逻辑形式通常很短,因此,RNN和CNN都可以生成逻辑形式。

不过,这个实验也证明了用CNN进行代码生成的普遍性和灵活性。毕竟,整个模型基本上是为长程序设计的,在语义解析方面也很好。

关于作者

按照署名顺序,作者分别为孙泽宇、朱琪豪、牟力立、熊英飞、李戈、张路,其中其中熊英飞为通讯作者。作者单位为北京大学信息科学技术学院。

北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

传送门

论文:

https://arxiv.org/abs/1811.06837

GitHub:

https://github.com/zysszy/GrammarCNN

显示全文
为您推荐
水烟和普通香烟的区别,味道不一样(原料有差别)
水烟和普通香烟的区别,味道不一样(原料有差别)

对于水烟,相信大家都知道,它是一种起源于中东地区的烟草制品,抽的时候是用水烟袋吸食。见过水烟的朋友,都知道它跟普通香烟是有很大差别的,接下来就随小编一起去看看水烟和普通香烟的区别。...

发布时间:2023-10-04 10:00:13

揭秘中国最诡异罗布泊双鱼玉佩,人类被复制成镜像人/真相
揭秘中国最诡异罗布泊双鱼玉佩,人类被复制成镜像人/真相

【导读】 揭秘中国最诡异罗布泊双鱼玉佩,人类被复制成镜像人/真相,下面是小编为你收集整理的,希望对你有帮助!老一辈的人都听说过罗布泊双鱼玉佩事件,被定为中国机密事件,网上关于双鱼玉佩的消息少之又少。参加考察的生物学家彭加木也无故失踪,该事件发生后新疆出现了很多倍复制的镜像人,也就是被复制的人!我国把双鱼玉佩......

发布时间:2023-10-04 09:01:13

白酒能和红牛一起喝吗,不能(两者同食会损害心脏)
白酒能和红牛一起喝吗,不能(两者同食会损害心脏)

白酒很多人都会喝,红牛则是一种功能饮料,喝了提神醒脑,这两者是可能碰到一起的。而在生活中,有些东西是不能同食的,否则有害身体健康。那么,白酒能和红牛一起喝吗?对此,就由小编为大家解惑。...

发布时间:2023-10-04 09:00:08

解析月球上不生锈的纯铁,7年未生锈(月球上没氧气)
解析月球上不生锈的纯铁,7年未生锈(月球上没氧气)

【导读】 解析月球上不生锈的纯铁,7年未生锈(月球上没氧气),下面是小编为你收集整理的,希望对你有帮助!在地球上不生锈的纯铁是前所未闻的事情,只要有氧气无论多好的铁都会被氧化。但在宇宙中有一个不生锈的纯铁,那就是月球上。在月球上放置7年的纯铁都未生锈,科学家对此作出了解析吗,一起来看看。月球上不生锈的纯......

发布时间:2023-10-04 08:01:13

火龙果正确的存放方法,阴凉处存放半月(冰箱冷藏一月以上)
火龙果正确的存放方法,阴凉处存放半月(冰箱冷藏一月以上)

火龙果是一种美味又营养的水果,许多人会买回家吃,不过因为存放不当,火龙果可能很快就会坏掉。为了避免这一现象的发生,接下来就由小编为大家介绍火龙果正确的存放方法。...

发布时间:2023-10-04 08:00:09

破壁机榨橙汁怎么榨好喝
破壁机榨橙汁怎么榨好喝

【导读】 破壁机榨橙汁怎么榨好喝,下面是小编为你收集整理的,希望对你有帮助!用料:苹果1个、胡萝卜1个、血橙1个、纯净水适量。1、准备好食材,也可以按个人喜好适当增减。2、将苹果、血橙、胡萝卜去皮切片(块)。3、在破壁机的料理杯内倒入适量的纯净水。4、将准备好的食材倒入。5、......

发布时间:2023-10-04 07:01:11

蜂蜜涨瓶怎么处理,扔掉或用来做面膜(温度过高所致)
蜂蜜涨瓶怎么处理,扔掉或用来做面膜(温度过高所致)

经常喝蜂蜜,不仅能美容养颜,还具有燃烧人体能量的功效,饭后喝点蜂蜜有助于减肥,所以很多人会买蜂蜜回来喝。不过在存放蜂蜜的过程中,有时会发现蜂蜜涨瓶的现象,也就是蜂蜜变多了。那么,蜂蜜涨瓶怎么处理呢?接下来就随小编一起去了解看看。...

发布时间:2023-10-04 07:00:07

皮皮虾煮多久才熟
皮皮虾煮多久才熟

【导读】 皮皮虾煮多久才熟,下面是小编为你收集整理的,希望对你有帮助!煮皮皮虾时使用的厨具不同,煮熟的时间也不同。如果用锅煮皮皮虾,冷水入锅后小火煮15~20分钟即可,中火煮需要用8~10分钟,注意不宜用大火煮;但是如果使用高压锅,2~3分钟即可煮熟。煮皮皮虾注意事项:......

发布时间:2023-10-04 06:01:25

盖了很久的棉被怎么洗,拆被套清洗/晒棉花恢复松软
盖了很久的棉被怎么洗,拆被套清洗/晒棉花恢复松软

棉被盖久了会很脏,还可能长螨虫,为了健康我们需要及时清洗。不过洗棉被很麻烦,很多人不知道怎么做,那盖了很久的棉被怎么洗?接下来就由小编为大家解惑。...

发布时间:2023-10-04 06:00:21

居鲁士大帝的一生是怎样的?居鲁士大帝是如何拯救犹太人的?
居鲁士大帝的一生是怎样的?居鲁士大帝是如何拯救犹太人的?

【导读】 居鲁士大帝的一生是怎样的?居鲁士大帝是如何拯救犹太人的?,下面是小编为你收集整理的,希望对你有帮助!在公元前700年左右的时候,如今的伊朗高原的西部生活着两个部族,北部地区被称之为米底,南部为称之为波斯。公元前612年,米底与新巴比伦帝国联军彻底消灭了残暴的亚述帝国。从此,米底统治了伊朗和亚述,成为......

发布时间:2023-10-04 05:01:15

夏天棉被晒多长时间合适,1-2小时(中午晾晒效果好)
夏天棉被晒多长时间合适,1-2小时(中午晾晒效果好)

炎炎夏日,将棉被拿出去晒晒是很好的,这不仅能除湿,还能杀螨虫。不过晒太阳虽好,可棉被不能多晒,否则里面的纤维会受到伤害。那么,夏天棉被晒多长时间合适呢?对此,就由小编为大家解惑。...

发布时间:2023-10-04 05:00:10

BMI是什么意思:身体质量指数(越胖指数越高)
BMI是什么意思:身体质量指数(越胖指数越高)

【导读】 BMI是什么意思:身体质量指数(越胖指数越高),下面是小编为你收集整理的,希望对你有帮助!这个世界上是瘦子多还是胖子多?可能是差不多的,但是瘦永远是女生的追求,无论再瘦的女生都会希望自己再瘦一点,其实无论胖瘦,健康才是最重要的,而最近又出来了一个BMI指数,那么BMI是什么意思呢?我们一起......

发布时间:2023-10-04 04:01:11