Skip to main content
QUICK REVIEW

[论文解读] CodeRetriever: Unimodal and Bimodal Contrastive Learning for Code Search

Xiaonan Li, Yeyun Gong|arXiv (Cornell University)|Jan 26, 2022
Topic Modeling被引用 5
一句话总结

CodeRetriever 提出了一种用于代码搜索的单模态和双模态对比学习框架,通过在 CodeSearchNet 上进行大规模预训练,利用函数级代码表示。通过无监督语义引导构建语义代码-代码对,并利用代码-文档/注释对进行双模态学习,该方法在六种编程语言的 11 个代码搜索基准测试中实现了最先进性能,覆盖多种粒度。

ABSTRACT

In this paper, we propose the CodeRetriever model, which learns the function-level code semantic representations through large-scale code-text contrastive pre-training. We adopt two contrastive learning schemes in CodeRetriever: unimodal contrastive learning and bimodal contrastive learning. For unimodal contrastive learning, we design an unsupervised learning approach to build semantic-related code pairs based on the documentation and function name. For bimodal contrastive learning, we leverage the documentation and in-line comments of code to build code-text pairs. Both contrastive objectives can fully leverage large-scale code corpus for pre-training. Extensive experimental results show that CodeRetriever achieves new state-of-the-art with significant improvement over existing code pre-trained models, on eleven domain/language-specific code search tasks with six programming languages in different code granularity (function-level, snippet-level and statement-level). These results demonstrate the effectiveness and robustness of CodeRetriever.

研究动机与目标

  • 解决基于标记的预训练在代码表示中的局限性,特别是嵌入空间中的各向异性问题和跨语言泛化能力差的问题。
  • 通过在大规模代码语料上应用对比学习,改进函数级代码语义表示。
  • 通过在语义相似的代码对上进行单模态对比学习,缓解代码嵌入中的各向异性问题。
  • 通过在双模态对比学习中利用文档和内联注释作为自然语言信号,增强代码与语义描述之间的对齐。
  • 在多样化的代码搜索场景中实现稳健性能,包括低资源和跨语言设置。

提出的方法

  • 采用双编码器架构,分别使用文本编码器和代码编码器将代码和文本映射到共享的稠密向量空间。
  • 应用单模态对比学习,使用从函数名和文档中提取的自监督语义引导正样本代码对。
  • 通过无监督方法构建代码-代码对,识别不同编程语言中功能等价的实现。
  • 利用文档和内联注释作为自然语言信号,通过双模态对比学习对齐代码与语义描述。
  • 在预训练过程中同时整合单模态和双模态对比学习目标,联合优化语义相似性和跨模态对齐。
  • 在代码-代码对构建过程中应用去噪步骤,以提高构造的正样本质量,减少正样本生成中的噪声。

实验结果

研究问题

  • RQ1在语义相似的代码对上进行单模态对比学习,能否改善函数级代码表示并减少嵌入空间中的各向异性?
  • RQ2在双模态对比学习中引入内联注释和文档作为文本信号,能否增强代码搜索的代码表示?
  • RQ3CodeRetriever 在同一功能以不同语言实现的跨语言代码搜索场景中表现如何?
  • RQ4每种对比学习组件(单模态 vs. 双模态)对代码搜索基准整体性能的贡献如何?
  • RQ5CodeRetriever 是否能泛化到低资源代码搜索场景,并在多种编程语言和代码粒度上实现一致的性能提升?

主要发现

  • CodeRetriever 在六种编程语言(包括 Python、Java 和 JavaScript)的 11 个代码搜索基准测试中实现了新的最先进性能。
  • 消融实验表明,添加经去噪处理的代码-代码对可使 CodeSearch 基准性能从 69.1 提升至 71.1,进一步引入文档到代码(72.2)和注释到代码(74.0)监督后性能进一步提升。
  • 该模型在所有评估任务中显著优于初始的 GraphCodeBERT 基线模型,证明了对比学习预训练相比掩码语言建模的有效性。
  • 在双模态对比学习中使用内联注释作为文本信号带来了最大的性能增益,表明其在捕捉细粒度代码语义方面的价值。
  • CodeRetriever 在低资源和跨语言代码搜索中表现出强鲁棒性,表明其具备在多种语言间学习统一语义表示的能力。
  • 代码-代码对构建中的去噪步骤至关重要,未经清理的样本会降低性能,凸显高质量正样本的重要性。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。