开发 | 还在费心学编程?微软用深度学习 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 条评论
登录 后参与评论

相关文章

来自专栏逍遥剑客的游戏开发

VR下双手与物体的交互

3246
来自专栏小小挖掘机

推荐系统实战-基于用户的协同过滤

1、数据集简介 MovieLens数据集包含多个用户对多部电影的评级数据,也包括电影元数据信息和用户属性信息。 这个数据集经常用来做推荐系统,机器学习算法的测试...

4326
来自专栏数据魔术师

干货 | 到底是什么算法,能让人们如此绝望?

BOSS最近强迫小编学Tabu Search(TS) 听到这么高大上的词语后 当然是 ...... 一脸懵逼 ? 开始各种Google、度娘 搜索中却无奈发现 ...

4315
来自专栏Python小屋

Python“制作”midi音乐“两只老虎”

从网上找了很多谱子,可惜没有音乐细胞看不太懂,根据自己的理解改了好几遍,还是听不出来“两只老虎”的感觉,于是在标题上加了双引号。这样的话就只能了解本文思路了,算...

3385
来自专栏AI科技评论

ACL2016最佳论文:通过交互学习语言游戏

摘要 我们介绍了一种与构建适应性的自然语言接口有关的新型语言学习设置。它受到维特根斯坦语言游戏(Wittgenstein’s language games)的启...

2604
来自专栏程序员互动联盟

【答疑释惑第十四讲】如何学习数据结构?

疑惑一 为什么学习编程前,先要掌握计算机组成原理? 很多的学习编程的小伙伴,特别是上来就学习java的小伙伴,很多对底层语言的实现存在一种莫名的畏惧感,老是觉得...

2906
来自专栏腾讯大讲堂的专栏

微信亿级用户异常检测框架的设计与实践

月活用户越高的互联网产品,被黑产盯上的可能性就越大。本文将带你一窥究竟,微信是怎么做异常检测框架的?

1.3K8
来自专栏微信公众号:Java团长

如何学好java语言?

IT行业的朋友,应为本事就有编程语言的技术,学习Java语言不是困难的事情。所谓的懂一门语言就会其他语言。为什么这么说,应他们有一些编程的基本知识,他们知道如何...

1102
来自专栏pangguoming

JAVA智能设备基于OpenGL的3D开发技术 之AABB碰撞检测算法论述

摘要:无论是PC机的3D还是智能设备应用上,碰撞检测始终是程序开发的难点,甚至可以用碰撞检测作为衡量3D引擎是否完善的标准。现有许多3D碰撞检测算法,其中AAB...

37210
来自专栏牛客网

机器学习:2018校招面经真题网易:创业公司:

先说下楼主的情况吧。楼主统计专业本科生,无实习经历,项目也很水,两个数据分析比赛,没有名次。我估计牛客没有几个比我背景更差的了,但是最后还是拿到offer了,所...

43511

扫描关注云+社区