原文:
www.kdnuggets.com/2019/07/neural-code-facebook-uses-neural-networks.html
现如今,Google 和 StackOverflow 是每位开发者的好帮手。在进行特定项目时,开发者经常依赖外部信息来源来寻找解决方案或代码片段。然而,搜索结果通常基于元数据,而不是代码本身提供的信息。例如,如果开发者在 StackOverflow 上发布一个代码片段,它通常会包括描述和标签,以帮助将其索引以便未来搜索。该方法依赖于元数据的准确性来提供准确的搜索结果,但也忽略了可以直接从代码中推断出的信息。为了应对这一限制,Facebook AI Research(FAIR)团队一直在研究一种方法,利用自然语言处理(NLP)和信息检索(IR)直接从源代码文本中推断搜索相关信息。
FAIR 团队努力的首次成果是一个名为 Neural Code Search (NCS) 的工具,它接受自然语言查询,并从代码语料库中直接推断结果。NCS 背后的技术总结在最近发布的两篇研究论文中:
NCS 和 UNIF 两种技术背后的原理相对相似。这两种方法都依赖于代码片段的向量表示,这些向量可以用于训练模型,使语义相似的代码片段和查询在向量空间中彼此接近。这种技术能够直接使用代码片段语料库回答自然语言查询,而不依赖外部元数据。尽管 NCS 和 UNIF 两种技术相对相似,但 UNIF 通过监督模型扩展了 NCS,从而能为 NLP 查询提供更准确的答案。
其核心原理是使用嵌入生成来自代码语料库的向量表示,使得相似的代码片段在向量空间中彼此靠近。以下示例中,有两个不同的方法体,它们都涉及关闭或隐藏 Android 软件键盘(上面的第一个问题)。由于它们具有相似的语义含义,即使它们的代码行不完全相同,它们在向量空间中的表示点也彼此接近。NCS 使用方法级别的粒度在向量空间中嵌入每个代码片段。
创建向量表示的过程包括三个主要步骤:
-
提取词汇
-
构建词嵌入
-
构建文档嵌入
-
自然语言搜索检索
给定一个特定的代码片段,NCS 提取不同的语法部分,如方法名、方法调用、枚举、字符串文字和注释。这些工件随后使用标准的英语约定进行分词。对于输入语料库中的每个文档,NCS 以一种能够学习每个词的嵌入的方式对源代码进行分词。在这个步骤之后,我们为每个方法体提取的词列表类似于自然语言文档。
在词汇提取之后,NCS 继续使用 FastText 框架 构建词嵌入。在此过程中,FastText 使用一个可以在大语料库上无监督训练的两层密集神经网络计算向量表示。更具体地说,NCS 使用跳字模型,其中目标词的嵌入用于预测固定窗口大小内上下文词的嵌入。
这一阶段的最终步骤是通过提取的词嵌入表示方法体的一般意图。NCS 通过计算方法体中一组词的词嵌入向量的加权平均值来实现这一点。这个公式的结果被称为文档嵌入,用于创建每个方法体的索引,以便进行有效的搜索检索。
使用向量表示作为起点,NCS 现在可以尝试回答与代码片段相关的自然语言查询。给定自然语言查询,NCS 使用 FastText 框架遵循类似的分词过程。利用相同的 FastText 嵌入矩阵,NCS 平均词的向量表示以创建查询句子的文档嵌入;不在词汇表中的词会被丢弃。NCS 然后使用标准相似度搜索算法,FAISS 来找到与查询最接近的文档向量。
作为一种无监督技术,NCS 的优势在于可以快速简便地直接从代码语料中构建知识。然而,NCS 的主要限制之一是模型隐含地假设查询中的词汇来自与源代码中提取的词汇相同的领域,因为查询和代码片段都映射到同一向量空间。然而,许多代码语料并不传达任何相关的语义信息。例如,下面的代码片段获取内存空间中的可用块。仅通过无监督方式生成词嵌入,NCS 将无法匹配诸如“获取内部存储器上的空闲空间”这样的相关查询。
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return Formatter.formatFileSize(this, availableBlocks * blockSize);
UNIF 是对 NCS 的一种监督扩展,旨在弥合自然语言词汇与源代码词汇之间的差距。UNIF 实质上使用监督学习来修改初始的词嵌入矩阵 T,并分别为代码和查询词生成两个嵌入矩阵 Tc 和 Tq。我们还用基于学习的注意力加权方案替代了代码词嵌入的 TF-IDF 加权。这种变化实际上考虑了一些代码语料中的语义不匹配。
FAIR 团队将 NCS 和 UNIF 与最先进的信息检索模型进行了比较。使用 StackOverflow 问题的起始数据集,NCS 在各种任务中超越了流行的 BM25 模型。
同样,添加 UNIF 扩展显示了 NCS 性能的逐步提升。
NCS 和 UNIF 都提供了一种巧妙而简单的实现方法用于信息检索。以代码搜索开始是提供即时价值的一种简单方式,但 NCS 和 UNIF 背后的理念适用于许多神经搜索和信息检索场景。
原文。经许可转载。
相关:
1. 谷歌网络安全证书 - 快速进入网络安全职业的捷径。
2. 谷歌数据分析专业证书 - 提升你的数据分析能力
3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT 工作