首页 今日头条 正文

如何编写最高级的代码?Facebook教你如何使用机器学习作为最漂亮的代码搜索工具。-betway官网_betway必威手机版_betway必威体育

选自Face林江国book AI Blog

作者:Sonia Kim、Hongyu Li、Satish Chandra

机器之心编译

参加:路、一鸣、思源

怎么根据文本查询快速获取代码示例,关于工程师而言是一个很影响功率的事儿。Facebook 最近提出了新式代码查找东西——神经代码搜怎么编写第一流的代码?Facebook教你怎么运用机器学习作为最美丽的代码查找东西。-betway官网_betway必威手机版_betway必威体育索(NCS)和 UNIF,别离根据无监督和监督的办法供给快速高效的代码检索。

当工程师能够轻松获取代码示例,指ot导其完结特定编程使命时,他们的作业功率会明显进步。例如,关于「怎么以编程办法封闭或躲藏安卓软键盘?」这类问题,工程师能够从 Stack Overflow 等常用网站上获取可用信息。可是当问题触及专有代码或 API(或许用不常用编程言语写的代码)时,工程师需求不同的处理怎么编写第一流的代码?Facebook教你怎么运用机器学习作为最美丽的代码查找东西。-betway官网_betway必威手机版_betway必威体育计划,由于在常用论坛上或许找不到这方面的答案。


为了处理这个需求,Facebook 开发了一个代码查找东西——神经代码查找(Neural Code Search,NCS),该东西运用天然言语处理(NLP)和信息检索(IR)技能直接处理源代码文本。该东西接纳天然言语作为查询(query),并回来从代码库中直接检索到的相关代码段。这儿的条件是能够获取大型代码库,然后更有或许查找到与开发者提出的查询相关的代码绝世高手在都市段。


Facebook 介绍了两种可用模型:


  • NCS:结合天然言语处理和信息检索技能的无监督模型;

  • UNIF:NCS 的扩展,当练习进程中有好的监督数据时,UNIF 运用监督神经网络模型来提高功能。


运用 Facebook AI 开源东西(包括 fastText、FAISS、PyTorch),NCS 和 UNIF 将天然言语查询和代码段标明为向量,然后练习一个网络,使语义附近的代码段和查询的向量标明在向量空间中互相挨近。运用这些怎么编写第一流的代码?Facebook教你怎么运用机器学习作为最美丽的代码查找东西。-betway官网_betway必威手机版_betway必威体育模型,咱们能够从代码库中直接寻觅代码段,然后高效处理工程师的问题。为了点评 NCS 和 UNIF,Facebook 运用了新创立的数据集(包括 怎么编写第一流的代码?Facebook教你怎么运用机器学习作为最美丽的代码查找东西。-betway官网_betway必威手机版_betway必威体育Stack Overflow 上的揭露查询和对应的代码段答案)。成果标明,这两个模型能够正确答复该数据会集的问题,如:


  • 怎么封闭/躲藏安卓软键盘?

  • 怎么在安卓中将位图转换为可画的?

  • 怎么删去一整个文件夹及其内容?

  • 怎么处理 back button?


NCS 的功能标明,相对简略的办法能够很好地处理源代码;UNIF 的功能标明,简略的监督学习办法能够在有可用标示数据时,供给明显的额定收益。当这些模型与其他 Facebook 构建体系(如 Aroma 和 Getafix)结合时,这个项目能够为工程师供给可扩展且不断增加的 ML 东西包,协助他们更高效地写代码、办理代码。


NCS 怎么运用嵌入向量


NCS 模型运用嵌入(接连向量标明)来捕捉程序语义(即代码段的目的)。当进行恰当核算时,这些嵌入能够将语义附近的实体在向量空间中拉近间隔。


如下图示例所示,关于怎么封闭/躲藏安卓软键盘有两个不同的办法。由于它们同享类似的语义,因而即便它们代码行不完全相同,它们在向量空间中的方位互相挨近。


上图标明语义附近的代码段在向量空间中间隔较为挨近。


Facebook 运用这个概念构建 NCS 模型。全体而言,在模型生成进程中,每个代码段以办法级粒度嵌入到向量空间中。一旦模型构建完结,给定的查询句子就会映射到相同的向量空间中,那么向量间隔就可用于估量代码段与查询的崔露妮相关程度。


下图展现了模型生成和查找检索流程:


上图展现了 NCS 的整个模型生成和查找检索进程。


模型生成


为了生成模型,NCS 有必要抽取单词,构建词嵌入,然后构建文档嵌入。(这儿「文档」指办法体(method body)。


抽取怎么编写第一流的代码?Facebook教你怎么运用机器学习作为最美丽的代码查找东西。-betway官网_betway必威手机版_betway必威体育单词


NCS 从源代码中刘媛媛抽取单词,并履行分词,生成词的线性序列。


为了生成能标明办法体的向量,Facebook 将源代码看作文本,从以下句法类中抽取单词:办法称号、办法调用、枚举值、字符串文本和注释。然后根据规范英语规范(如空格、标点)和代码相关标点(如下划线命名法和驼峰命名法)履行分词。例如上图中,关于办法体(或办法名)「pxToDp」,源代码可作为以下单词的调集:「converts pixel in dp px to dp get resources get display metrics」。


关于代码库中的每个办法体,咱们都能够用这种办法对源代码履行分词,并为每个词学习一个嵌入。之后,从每个办法体中抽取的单词列表类似一个天然言语文档。


构建词嵌入


Facebook 运用 fastText 为词汇语料库中的一切单词构建词嵌入。fastText 运用一个两层神经网络核算向量标明,该网络能够在大型语料库上以无监督办法练习。详细来讲,Facebook 运用 skip-gram 模型,运用方针 token 的嵌入来猜测固定窗口巨细中的上下文 token 的嵌入。如上例所示,给出嗨文 token「dp」的嵌入、窗口巨细为 2,skip-gram 模型学习猜测 token「pixel,」、「in,」、「px,」、「to.」的嵌入。其方针是学习嵌入矩阵 ,其间 |V_c| 标明语料库巨细,d 标明词嵌入的维度,T 的第 k 行标明 V_c 中第 k 个单词的嵌入。


在该矩阵中,假如两个向量标明对应的单词常常呈现在类似语境,则这两个向量标明间隔较近。Facebook 运用该出题的逆出题协助界说语义联络:向量间隔挨近的单词应该语义相关性较高。这在天然言语处理中叫作「散布假定」(distributional hypothesis),源文本相同适用于这一概念。


构建文档嵌入向量


下一步是运用办法体中的单词将其全体目的表达出来。为此,研讨人员核算了办法体中一切词语的词嵌入向量的加权均匀值。这被称为是文档嵌入。



公式中,d 标明办法体的词语调集,v_w 是词 w 的词嵌入,运用 fastText 处理。C 是包括一切文档的语料,u 是归一化函数。


研讨人员运用词频-逆文档频率(TF-IDF),为给定文档中的给定词语分配权重。这一过程旨在着重文档中最为重要的词语,即假如一个词在文档中呈现频率很高,则它的权重很高,但假如它在语料库中的多个文档中都有呈现,则该词汇会遭到赏罚。


在这一步之后,研讨人员给语料库中每个办法体的文档向量标明一个索引数字。模型生成果完结了。


查找检索


查找查询能够用天然言语表达,例如「封闭/躲藏软键盘」或「怎么树立一个没有标题的对话框」。研讨人员运用相同的办法对查询和源代码履行分词斗罗大陆txt,且运用相同的 fastText 词嵌入矩阵 T。研讨人员简略地核算了词向量标明的均匀值,树立一个查询句子的文档嵌入,词表外的词被放弃。研讨运用规范的类似度查找算法 FAISS,用于寻觅和查询的余弦类似度最挨近的文档向量,并回来 top n 个成果。(此外还有一些练习后排序,概况拜见:https://dl.acm.org/citation.cfm?id=3211353)


两个办法体和查询被映射在相同的向量空间中,且方位较为挨近。这说匡威美国官网明查询和这两个办法体在语义上类似,且相关。


试验成果


研讨人员运用 Stack Overflow 问题测验 NCS 的功能。运用标题作为查询,以及答案中的一个代码段作为抱负的代码答复。给定一个查询,研讨人员点评模型能否在 top 1、5 或 10 个答复上从 GitHub 库房调集中抽取正确的代码段。研讨人员还供给了均匀排序倒数(MRR)分数,用于衡量 NCS 能否在第 n 个成果回来正确的答案。


在 287 个问题中,NCS 能在 top 10 个成果内正确答复 175 个问题,大约是全体数据集的 60%。研讨人员同时比照了 NCS 和其他传统信息检索算法的体现,如 BM25。如下图所示,NCS 的功能优于 BM25。



下面是 NCS 答复很好的一个问题示例:「从 app 中翻开安卓商场」,NCS 回来的第一个答案如下所示:

private void showMarketAppIn() {  try {    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + BuildConfig.APPLICATION_ID)));  } catch (ActivityNotFoundException e) {    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id="                + BuildConfig.APPLICATION_ID)));  }}


UNIF:监督式办法


NCS 的关键在于词嵌入。由于 NCS 是无监督模型,它有许多优势。首要,它能够直接从查找语料中学习,练习很快、很简略。NCS 假定查询中的词和源代码中抽取的词有着相同的域,由于查询和代码段被映射在相同的向量空间中。但是,现实不一定总是这样。


例如,「Get free space on internal memory」里,没有一个词出乔丹卡佛现在以下代码段中。研讨人员想完结的是将查询词「free space」映射到下列代码中的单词「available」。

File path = Environment.getDataDirectory();StatFsogous stat = new StatFs(path.get怎么编写第一流的代码?Facebook教你怎么运用机器学习作为最美丽的代码查找东西。-betway官网_betway必威手机版_betway必威体育Path());long blockSize = stat.getBlockSize();long availableBlocks = stat.getAvailableBlocks();return Formatter.formatFileSize(this, availableBlocks * blockSize);


根据包括 14005 个 Stack Overflow 帖子的数据集,Facebook 研讨人员剖析了查询词和源代码中词语的堆叠状况。他们发现,查询中有 13,972 个仅有字,其间只要不到一半(6072撩心为上 个词)在源代码中呈现了。这阐明,假如一个查询包括源代码没有的词,则 NCS 模型无法有效地检索正确的办法。这一成果促进研讨人员进一步探究监督学习模型,以将查询词映射到源代码中。



Facebook 研讨人员决议测验 UNIF。这是一个监督模型,根据 NCS 进行了细小的扩展,用于衔接天然言语和源代码。在这个模型中,研讨人员运用监督学习练习词嵌入矩阵 T,生成两个嵌入矩阵 T_c 和 T_q,别离对应代码 token 和查询 token。此外,研讨人员还用根据注意力的权重机制替换了代码 token 嵌入向量的 TF-IDF 权重机制。


UNIF 模型作业原理


研讨人员在与练习 NCS 相同的 (c, q) 数据点调集中练习 UNIF,c、q 别离标明代码 token 和查询 token。模型架构标明如下:


T_q ∈ R^|V_q|d 和 T_c ∈ R^|Vc |d 是两个嵌入矩阵,别离映射每个天然言语描绘单词和代码 token 到向量,向量长度为 d(V_q 是天然言语查询语料,V_c 是代码语料)。这两个矩阵运用相同的初始权重 T 初始化,并别离在练习中进行修正(对应 fastTe石萱xt)。


为了将离散的代码 token 向量结合为一个文档向量,研讨人员运用注意力机制核算加权均匀值。注意力权重 a_c ∈ R^d,是一个 d 维向量,从练习中学得,并替代了原有的 TF-IDF 权重。给定一个代码词袋嵌入向量 {e_1, ....., e_n},每个 e_i 的注意力权重 a_i 如下:



文档向量经过和注意力权重相乘后的词嵌入向量相加得到:



为了创立查询文档向量 e_q,研讨人员求得每个查询词嵌入向量的均匀,这和 NCS 的办法相同。在练习进程中,模型从规范的反向传达中学习参数 T_q、T_c、a_c。


UNIF 网络结构图示。


检索作业和 NCS 共同。给定一个查询,运用上述办法将其标明为文档向量,然后运用 FAISS 寻觅和查询的余弦类似度最附近的文档向量。(原则上,UNIF 能够从后处理排序中获益,正如 NCS 那样。


UNIF迷你车 和 NCS 的作用比照


研讨人员比照了 NCS 和 UNIF 在 Stack Overflow 评测数据集上的体现。点评办法是模型能否用 top1、top5、top10 成果正确地答复此查询,点评运用 MRR 分数。下表阐明,比较 NCS,UNIF 明显进步了答复问题的数量。



如此惊人的查找功能阐明,假如供给适宜的练习语料,监督模型能够完结这项使命。例如,查找查询是「怎么退出运用并展现主菜单?」,NCS 会回来:

public void showHomeScreenDialog(View view) {  Intent nextScreen相片康复 = new Intent(getApplicationContext(),赫章可乐火把节 HomeScreenActivity.class);  startActivity(nextScreen);}


而 UNIF 供给了更相关的代码:

public世界上最丑的人 void clickExit(MenuItem item) {  Intent intent=new Intent(Intent.ACTION_MAIN);  intent.addCategory(Intent.CATEGORY_HOME);  intent.setFlags(Intent.FLAG_朱门绣卷ACTIVITY_NEW_TASK);  metr.stop();  startActivity(intent);&nb天火鹰弓sp; finish();}


另一个比如是发问:「怎么取得 ActionBar 的高度?」,NCS 模型会回来:

public int getActionBarHeight() {  return mActionBarHeight;  }

UNIF 回来相关的代码:

public static int getActionBarHeightPixel(Context context) {  TypedValue tv = new TypedValue();  if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {    return TypedValue.complexToDimensionPixelSize(tv.data,              context.getResources().getDisplayMetrics());  } else if (context叶育青.getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) {    return TypedValue.complexToDimensionPixelSize(tv.怎么编写第一流的代码?Facebook教你怎么运用机器学习作为最美丽的代码查找东西。-betway官网_betway必威手机版_betway必威体育data,              context.getResources().getDisplayMetrics());  } else {    return 0;  }} 


更多关于 UNIF 的功能状况,能够参阅论文:https://arxiv.org/abs/1905.03813。


原文链接:https://ai.facebook.com/blog/neural-code-search-ml-based-code-search-using-natural-language-queries/



文为机器之心编译,转载请联络本大众号取得授权

✄------------------------------------------------

参加机器之心(全职记者 / 实习生):hr@jiqizhixin.com

投稿或寻求报导:content@jiqizhixin.com

广告 & 商务协作:bd@jiqizhixin.com