论文阅读:When Deep Learning Met Code Search
发表:ESEC/FSE 2019 - CCF A
领域:代码搜索 (Code Search),深度学习 (Deep Learning)
相关链接:
- Homepage: José Cambronero、Hongyu Li *
- Paper: https://arxiv.org/abs/1905.03813
Abstract
最近有许多基于深度神经网络进行代码搜索的工作被提出。这些工作的共同点是将代码和自然语言查询嵌入到实值向量中,然后使用向量距离来近似代码和查询之间的语义相关性。现有多种学习这些嵌入的方法,包括仅依赖代码示例语料库的无监督技术,以及使用代码和自然语言描述对的对齐语料库的监督技术。有监督的目标是为查询和相应的所需代码片段生成更相似的嵌入。显然,在是否使用监督技术方面存在选择,同时也需要选择用何种网络进行监督。
本文首次系统地评估了这些选择。本文选取了目前在代码搜索领域表现最好的两个模型 CODEnn、SCS 、作者之前的工作 NCS,以及对 NCS 进行了改进的 UNIF 模型进行实验,在相同的语料库上进行训练和测试,实验结果评估表明:
- 在现有的无监督技术中添加监督可以提高性能,但不一定会提高很多;
- 结构简单的监督网络比复杂的基于序列的代码搜索网络更有效;
- 虽然通常使用 docstrings 进行有监督训练,但在 docstring 的有效性和更适合查询的监督语料库之间存在很大的差距。
1 Introduction
本文选取了四个代码搜索模型:CODEnn、SCS、NCS 和 UNIF,以下是四个模型的简要介绍:
- CODEnn: 是一种有监督的使用深度神经网络模型,用于代码搜索任务,它使用多个基于序列到序列的网络,并被证明优于其他最先进的代码搜索技术。
- SCS: 使用多个序列到序列网络的有监督神经网络代码搜索系统。
- NSC: Facebook 开发的一种用于神经代码搜索的无监督技术,它仅使用源自代码语料库的词嵌入。
- UNIF: 对 NCS 的监督扩展。 UNIF 使用基于词袋 (bag-of-word, BOW) 的网络,与基于词序列的网络相比,该网络的复杂度显着降低。
补充介绍:
- 序列到序列的模型: 是一种用于处理序列数据的模型,它可以用于语音识别,音乐生成,情感分类,机器翻译,命名实体识别等。模型的输出也可能是一个序列。例如:RNN、LSTM、CBOW 和 GGNN 等。
- 词袋模型: 最初被用在文本分类中,将文档表示成特征矢量。首先,根据语料中出现的句子分词,然后构建词袋(每一个出现的词都加进来),然后根据词袋索引构建句向量。其缺点是,得到的向量与原来文本中单词出现的顺序没有关系,仅仅是词典中每个单词在文本中出现的频率,即缺乏语义信息。
- 转其他博文链接:
序列到序列的模型
词袋模型(BOW)
本文评估了以下三个研究问题,并且给出了调查结果和一些思考。
- RQ1: 通过基于成对代码和自然语言描述的语料库的监督扩展有效的无监督代码搜索技术是否会提高性能?
- 实验结果表明,UNIF 在基准查询上的表现优于 NCS,但并不是在所有数据集上都有这种改进
- RQ2: 更复杂的网络会提高有监督神经代码搜索的性能吗?
- 实验结果表明,UNIF 是一个简单的基于词袋的网络,在基准测试中优于基于词序列的 CODEnn 和 SCS。故额外的复杂性并没有增加价值。
- RQ3: 基于 docstring 作为训练语料库进行有监督扩展,其效果如何?我们发现基于文档字符串的监督(通常是对齐语料库的自然语言组件)并不总是能提高性能,这与预期相反。?
- 实验结果表明,基于 docstring 的有监督训练并不总是能提高性能,这与预期相反。为了理解其原因,作者构建了一个与用户使用的 Qurey 同源的语料库进行有监督训练,结果显示对所有模型的有监督训练都有显著改进。