深度学习遇见代码搜索,一篇论文概览神经代码搜索

11月

深度学习遇见代码搜索,一篇论文概览神经代码搜索

深度学习遇见代码搜索,一篇论文概览神经代码搜索
选自arXiv作者:Jose Cambronero等机器之心编译参加:魔王高效查找代码可以大幅提高开发者的工作效率,可是现在的代码查找作用并不尽善尽美。近期,越来越多的研讨者开端重视运用深度学习处理代码查找问题。这篇论文概述了神经代码查找技能,并提出了一种新式办法 UNIF 网络。论文地址:https://arxiv.org/pdf/1905.03813v3.pdf近期多项研讨提出运用深度神经网络和自然言语履行代码查找,这些提议的共性是:将代码和自然言语 query 转变为实在向量,并运用向量间隔近似代码和 query 之间的语义相关性。现在已有多种办法可以学习这些向量 [15, 19, 24, 26],包含仅依托代码示例语料库的无监督办法,和运用代码和自然言语描绘对语料库的监督办法。监督办法旨在生成与 query 及其对应代码段更类似的嵌入。很明显,每个研讨者都可以挑选是否运用监督技能,假如运用,ta 还可以挑选用哪种网络和练习办法。由 MIT CSAIL、Facebook、UC 伯克利研讨者协作的这篇论文初次体系性地评价了这些挑选。为此,研讨者调集了在相同的渠道、练习和评价数据上运转的多个当时最优技能的完成。为了探究网络杂乱度的规划空间,研讨者还提出了新的规划点,即对现有无监督技能增加监督信号的极小扩展变体。评价成果标明:向现有无监督技能增加监督信号可以提高功能,不过提高起伏不大;简略监督网络的代码查找作用比更杂乱的序列网络愈加高效;虽然运用文档字符串(docstrings)增加监督是常见做法,但文档字符串的作用与更贴合 query 的监督数据之间仍存在很大距离。代码查找的全体图景是什么样的?代码查找的方针是从大型代码库中检索出与开发者需求最匹配的代码段,而开发者需求经过自然言语来表达。近期学界和工业界都在测验运用深度学习完成更高档的代码查找。咱们将这类办法叫做「神经代码查找」。下表 1 展现了一些根据自然言语 query 检索到的代码段示例,从中咱们可以看出这项技能很有远景。可是,表中展现的这类 query 及其检索成果也标明,仅依托正则表达式匹配这类简略办法很难处理代码查找使命。表 1:代码查找成果示例。每一个成果都是该研讨提出的 UNIF 模型找到的 top 1 成果。GitHub 网站现有的代码查找接口对这些 query 所回来的前十个成果中都没有相关的代码段。下图 1 供给了神经代码查找的通用概览,并介绍了几种不同的办法。神经代码查找体系中的中心抽象是嵌入概念,即输入在同享向量空间内的向量表明。经过对这些嵌入核算向量类似度衡量(如余弦类似性),体系检索到与用户 query 最具语义相关性的代码段。图 1:运用嵌入进行代码查找时,query 和候选代码段都被映射至同享向量空间,二者所运用的函数别离为 E_q 和 E_c。然后,查找即相当于最大化 query 嵌入和代码嵌入之间的向量类似度衡量(如余弦类似性)。向量表明可以经过无监督办法学得,即仅运用代码,也可以经过监督办法学得,即运用代码段及其对应自然言语描绘对数据。如上图 1 所示,用于学习这些表明的模型可以大致分为无监督和有监督两类。本文探究神经代码查找技能的优势,将从 NCS 开端说起,这是一种高效的无监督神经代码查找技能。近期研讨 [15, 19] 提出了有远景的监督式神经代码查找技能:labeled CODEnn 和 SCS,它们运用源代码和文档字符串成功学得代码和自然言语嵌入。运用此类监督信号的方针是,学习可以生成与用户 query 及其对应代码更类似向量的映射。图 1 中,该方针由 Shared space 中的两条实线表明,别离表明移动 query 和适宜代码段的嵌入,使其愈加挨近。研讨奉献该研讨运用开源评价语料库对以上代码查找技能进行了试验。其间三项技能是之前研讨提出来的:NCS:Facebook 开发的无监督神经代码查找技能 [26],它仅运用从代码库中得到的词嵌入;CODEnn:近期研讨 [15] 提出的一种监督式神经代码查找技能,它运用多个序列到序列网络,功能优化当时其他最优技能。该研讨所用完成来自原作者 [16];SCS:运用多个序列到序列网络的监督式神经代码查找体系。该研讨所用完成来自原作者所著博客 [19, 20]。研讨者想要了解根据词序列的杂乱网络所起的作用,因而他们开发了一种办法,是对 NCS 技能增加监督信号得到的极小扩展变体:UNIF:NCS 技能的监督扩展。该技能运用词袋网络,其杂乱度明显低于根据词序列的网络。这一简略模型是该研讨的新奉献。神经代码查找模型一览NCS图 2:NCS 运用 fastText [7] 嵌入将代码和 query 输入转换为向量。代码句嵌入 e_c 是经过对这些无序代码嵌入履行 TF-IDF 加权均匀核算得到。query 嵌入 e_q 经过对这些无序 query 嵌入取均匀得到。UNIF图 3:UNIF 网络运用注意力 a_c 结合 token 嵌入 T_c,并输出代码句嵌入 e_c。query 嵌入 e_q 经过对这些无序 query 嵌入 T_q 取均匀得到。T_c 和 T_q 都运用 fastText 嵌入进行初始化,并在练习过程中进一步微调。CODEnn图 4:CODEnn 网络。它运用 RNN 嵌入办法名(r_1)、API 序列(r_2)和 query(r_3),运用前馈网络(MLP)嵌入代码主体 token(m_1),并将该嵌入与办法名嵌入和 API 序列嵌入结合起来,再运用另一个 MLP(m_2)。SCS图 5:SCS 运用根据代码-文档字符串的网络的编码器部分,来嵌入代码 token 序列。它别的练习了一个言语模型来处理 query token,并在代码编码器上增加一个前馈层,将代码嵌入转换为 query 嵌入(来自言语模型)。作用这部分展现了研讨成果,以及每个研讨问题的答案。问题 1:根据代码和自然言语对数据,用监督信号扩展高效无监督神经代码查找技能能否提高功能?问题 2:更杂乱的网络能否提高监督神经代码查找办法的功能?问题 3:运用文档字符串作为练习语料库的自然言语部分的监督技能作用怎么?下表 8 为以上每个问题供给了全面的功能总结:表 8:评价成果总结。

发表评论

电子邮件地址不会被公开。 必填项已用*标注