开发 | 还在费心学编程?微软用深度学习 AI 帮你写代码

在过去的几十年中,无论在硬件组织还是软件架构上,计算机行业已经发生了翻天覆地的变化,各种软硬件产品的性能和用户体验均得到了显著提升。

但对程序员而言,软件编码的本质似乎并没有什么本质的改变:无论哪种编程语言,仍然需要程序员根据算法逻辑和实现步骤一步一步地手动敲入代码。虽然近几年随着编码工具的改进和编程语言的版本更新,对于程序员而言,这一过程已经相当方便了,但学习如何编程仍然是诸多计算机用户不得不面对的一道难题。

AI科技评论消息,近日,微软在论文中公布了一项最新的代码合成系统:RobustFill。它基于深度学习技术,可以根据用户指定的输入输出样例进行特征提取,然后自动合成能够实现相应功能的软件代码,大大缩减了程序员的编码工作量。

举例来说,假设用户需要编码实现如下功能:将输入的人名信息进行规范化缩写后输出。具体如下图所示,当输入人名为 “jacob daniel devlin” 时,系统应该输出 “Declin,J” 。基于 RobustFill,用户只需要提供一些简单的输入输出样例(图中前三行黑色字体),系统就能自动合成实现这一功能的软件代码,并输出正确结果(图中后三行灰色字体)。如果用户需要处理的人名有成千上万个,这就能节约大量的处理时间。

RobustFill 系统生成的代码基于 DSL(Domain Specific Language),即领域特定语言。用户并不需要理解 DSL 的编程细节,实际上,用户根本看不到 DSL 代码,而只需要关注具体的功能实现就行了。对应上述人名缩写样例,RobustFill 生成的 DSL 代码如下所示:

Concat( ToCase( GetToken( input, Type=Word, Index=-1), Type=Proper), Const(", "), ToCase( SubString( GetToken( input, Type=Word, Index=1), Start=0, End=1), Type=Proper), Const("."))

自动代码合成的难点主要有两个:

  • 一是系统可以自动合成万亿级的不同的 DSL 代码组合,如何判断哪一种是正确结果;
  • 二是用户提供的输入输出样例一般都是人工输入,难免会出现一些笔误(例如上面人名缩写的例子中,表格第二行,用户把“Useato”写成了“uesato”),系统如何避免这些笔误的不良影响。

针对这两个问题,此前的解决方案是微软 Excel 软件中的 FlashFill 系统。该系统凭借开发人员手动设置规则和启发式搜索(Heuristic Search)的方式,为用户输出特定功能的代码。但 FlashFill 系统严重弱化了 DSL 语言的扩展能力,并且需要开发者大量的人工输入,同时对人工输入的笔误也非常敏感,因此并不是最优的解决方案。

与 FlashFill 不同,在深度学习技术的支持下,RobustFill 可以利用数据驱动的方式进行代码合成,而无需开发者手动设置规则。此外,RobustFill 还使用了此前用于自然语言翻译的一种名为“attentional sequence-to-sequence neural network”(注意力序列到序列神经网络)的技术,因此才能基于用户给定的输入输出样例,自动合成代码。RobustFill 的大体结构流程如下图所示。

微软用数百万随机生成输入/输出和对应的编码来训练该系统。由于 RobustFill 能学会 DSL 的语法,微软认为它在真实数据上会有良好表现。总的来说,微软 RobustFill 在真实测试中达到了 92% 的精确度。最让人感到鼓舞的是,即便输入/输出样例包含大量噪音,RobustFill 仍能够保持高水准的精确度。

意义

在 FlashFill DSL 这样的强大函数语言上,成功地训练神经架构学习编程,是神经代码合成的一项了不起的成就。微软表示,这同时也是迈向通用 AI 的一小步。RobustFill 解决了加入可编译性( interpretability)的核心难题,并探索了用知识的符号表示连接分布式表达( connecting distributed representations with symbolic representations of knowledge)这一课题。

微软最后在官方博客宣布:

“我们正在开发这些架构的扩展,用变量和控制流来学习 DSL 中的代码,以生成更丰富的代码类。我们相信,照这个方向走下去需要我们研究、解决代码合成和归纳问题中的关键技术难关。”

via microsoft

原文发布于微信公众号 - AI科技评论(aitechtalk)

原文发表时间:2017-04-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python与爬虫

[资源分享]计算机科学速成课

推荐 程序员的你一定要看,不是程序员的也可以看看,我已经安利刚中考完的我妹妹看了(培养程序媛...)

943
来自专栏数据小魔方

R语言可视化——数据地图离散百分比填充(环渤海)

今天跟大家分享如何以百分比形式填充离散分段数据地图。 案例用环渤海三省二市的地理数据。 library(ggplot2) library(maptools) l...

2614
来自专栏好好学java的技术栈

“365算法每日学计划”:03打卡-贪心算法

自从开始做公众号开始,就一直在思考,怎么把算法的训练做好,因为思海同学在算法这方面的掌握确实还不够。因此,我现在想做一个“365算法每日学计划”。

1712
来自专栏落影的专栏

程序员进阶之算法练习(十二)

前言 题目地址在HDU,输入对应的题号即可看到题目,在百度搜索hdu+对应的题号可以看到题解。 我简单的对题目难度进行了划分: 简单题:想法题,实现简单...

3397
来自专栏后台全栈之路

《ArcGIS 地理信息系统教程》概念笔记

之前研究了 GIS,接触到了很多 GIS 的概念。因此找了《 ArcGIS 地理信息系统教程(第 4 版)》来看。书的版本比较老了,不过一些基本概念还是想通的,...

1956
来自专栏HansBug's Lab

Tyvj P1813 [JSOI2008]海战训练

P1813 [JSOI2008]海战训练 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 为了准备高层峰会,元首命令武...

34312
来自专栏CDA数据分析师

让机器猜猜你喜欢的歌手-R关联分析

作者 CDA 数据分析师 关联规则挖掘是数据挖掘中成果颇丰而且比较活跃的研究分支。采用关联模型比较典型的案例是“尿布与啤酒”的故事。在美国,一些年轻的父亲...

21110
来自专栏Spark学习技巧

基于java的中文分词工具ANSJ

ANSJ 这是一个基于n-Gram+CRF+HMM的中文分词的java实现. 分词速度达到每秒钟大约200万字左右(mac air下测试),准确率能达到96%以...

3235
来自专栏ACM算法日常

各种博弈问题

(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。

683
来自专栏听雨堂

地理坐标系与投影坐标系的区别

1、首先理解地理坐标系(Geographic coordinate system),Geographic coordinate system直译为 地理坐标...

1776

扫码关注云+社区