摘要:华为云PaaS技术创新团队基于UniXcoder模型,在公开测试数据集(CodeXGLUE)上的代码搜索任务评测结果上取得突破,在CodeXGLUE榜单上排名中第一。

本文分享自华为云社区《代码语义搜索算法哪家强?华为云UniXcoder-VESO-v1算法取得突破,问鼎CodeXGLUE榜单第一名》,作者:华为云软件分析Lab 。

按照查询语句的类型,代码搜索可以分为代码关键字搜索和代码语义搜索。代码关键字搜索主要通过索引代码实体(如类、方法、变量等),查询定位代码实体的定义及引用;代码语义搜索的目标是支持开发人员基于自然语言方式来描述代码特性,从而进行相关代码的推荐与搜索。在开发人员编程过程中帮助其查找最佳代码示例实践和库使用示例,从而开发者可以通过功能描述搜索到代码。

目前,大多数代码搜索引擎仅支持代码关键字搜索,这需要开发者了解他们正在搜索的代码,例如类名、函数名、API调用等等,这具有很大的局限性。多数用户通常通过搜索代码示例来指导他们完成特定的编码任务,他们更倾向于使用自然语言来描述待编码实现的功能,从而借鉴开源社区中已存在的相关代码片段。代码语义搜索可以支持开发人员在不知道类或函数名称的情况下使用自然语言方式来描述所需的代码功能。借助于语言模型及不同自然语言之间的映射关系,开发者甚至可以基于中文描述搜索出包含英文功能描述的代码片段。

随着语言大模型(Large Language Model, LLM)技术的发展,一系列语言大模型(如BERT [1]、XLNet [2]、GPT [3]、RoBERTa [4]等)在自然语言处理任务上取得了巨大的成功,为源代码处理任务提供了技术基础。这些模型已经应用于代码摘要和代码语义搜索,打败了以前的最先进方法。语义搜索背后的想法是将语料库中的所有条目,无论是句子、段落还是文档,都编码到向量空间中。在搜索时,查询被编码到相同的向量空间中,并找到语料库中最近的向量。这些条目应与查询具有高度的语义重叠。代码语义搜索使用编码大模型将查询及代码片段编码成向量,使得语义相关或相近的代码片段和查询在向量空间内落在相近的位置。如下图所示:

有很多算法使用不同的编码器对代码片段和查询进行编码,最新和最有希望的研究集中在通用编码器和解码器上,这些编码器和解码器使用相同的神经网络来编码所有编程语言代码片段和文本。

Salza等人 [5]基于原始BERT[1]模型,用多种编程语言代码预训练一个新的BERT模型,并用两个编码器(一个处理自然语言,另一个处理代码片段)精调该模型,首先证明了处理自然语言的基于Transformer架构的模型可以被直接应用到代码搜索任务中。

CodeBERT [6]是在自然语言和编程语言序列数据上进行训练的大型语言模型之一,它在代码搜索方面表现较为出色。此外,还发展演化出RoBERTa [4]、TreeBERT [7]、GraphCodeBERT [8]、UniXcoder [9]等在代码搜索方面表现出色的自然语言与编程语言结合训练的模型。

华为云PaaS技术创新团队基于UniXcoder模型,通过混淆代码片段、增加海量开源代码作为训练集、提高批尺寸等精调方法,实现了UniXcoder-VESO-v1算法,该算法在公开测试数据集(CodeXGLUE [10])上的代码搜索任务评测结果上取得突破:平均倒数排序值(MRR)达到0.58,CodeXGLUE榜单上排名中第一(如下图所示: UniXcoder-VESO-v1, 详见https://microsoft.github.io/CodeXGLUE/)。  我们将持续推进该工作的技术创新与突破,会选择合适方式披露内部技术细节,如感兴趣,欢迎持续关注我们的订阅号文章。

文章来自:PaaS技术创新Lab,PaaS技术创新Lab隶属于华为云,致力于综合利用软件分析、数据挖掘、机器学习等技术,为软件研发人员提供下一代智能研发工具服务的核心引擎和智慧大脑。我们将聚焦软件工程领域硬核能力,不断构筑研发利器,持续交付高价值商业特性!加入我们,一起开创研发新“境界”!(详情欢迎联系 mayuchi1@huawei.com;guodongshuo@huawei.com)

PaaS技术创新Lab主页链接:https://www.huaweicloud.com/lab/paas/home.html

参考文献

  • [1]. Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. NAACL-HLT (1) 2019: 4171-4186
  • [2]. Zhilin Yang, Zihang Dai, Yiming Yang, Jaime G. Carbonell, Ruslan Salakhutdinov, Quoc V. Le: XLNet: Generalized Autoregressive Pretraining for Language Understanding. NeurIPS 2019: 5754-5764
  • [3]. Tom B. Brown, Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared Kaplan, Prafulla Dhariwal, Arvind Neelakantan, Pranav Shyam, Girish Sastry, Amanda Askell, Sandhini Agarwal, Ariel Herbert-Voss, Gretchen Krueger, Tom Henighan, Rewon Child, Aditya Ramesh, Daniel M. Ziegler, Jeffrey Wu, Clemens Winter, Christopher Hesse, Mark Chen, Eric Sigler, Mateusz Litwin, Scott Gray, Benjamin Chess, Jack Clark, Christopher Berner, Sam McCandlish, Alec Radford, Ilya Sutskever, Dario Amodei: Language Models are Few-Shot Learners. NeurIPS 2020
  • [4]. Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov: RoBERTa: A Robustly Optimized BERT Pretraining Approach. CoRR abs/1907.11692 (2019)
  • [5]. Pasquale Salza, Christoph Schwizer, Jian Gu, Harald C. Gall: On the Effectiveness of Transfer Learning for Code Search. IEEE Trans. Software Eng. 49(4): 1804-1822 (2023)
  • [6]. Zhangyin Feng, Daya Guo, Duyu Tang, Nan Duan, Xiaocheng Feng, Ming Gong, Linjun Shou, Bing Qin, Ting Liu, Daxin Jiang, Ming Zhou: CodeBERT: A Pre-Trained Model for Programming and Natural Languages. EMNLP (Findings) 2020: 1536-1547
  • [7]. Xue Jiang, Zhuoran Zheng, Chen Lyu, Liang Li, Lei Lyu: TreeBERT: A tree-based pre-trained model for programming language. UAI 2021: 54-63
  • [8]. Daya Guo, Shuo Ren, Shuai Lu, Zhangyin Feng, Duyu Tang, Shujie Liu, Long Zhou, Nan Duan, Alexey Svyatkovskiy, Shengyu Fu, Michele Tufano, Shao Kun Deng, Colin B. Clement, Dawn Drain, Neel Sundaresan, Jian Yin, Daxin Jiang, Ming Zhou: GraphCodeBERT: Pre-training Code Representations with Data Flow. ICLR 2021
  • [9]. Daya Guo, Shuai Lu, Nan Duan, Yanlin Wang, Ming Zhou, Jian Yin: UniXcoder: Unified Cross-Modal Pre-training for Code Representation. ACL (1) 2022: 7212-7225
  • [10]. https://microsoft.github.io/CodeXGLUE/

点击关注,第一时间了解华为云新鲜技术~

问鼎CodeXGLUE榜单,华为云UniXcoder-VESO-v1算法取得突破的更多相关文章

  1. 王晶:华为云OCR文字识别服务技术实践、底层框架及应用场景 | AI ProCon 2019

    演讲嘉宾 | 王晶(华为云人工智能高级算法工程师王晶) 出品 | AI科技大本营(ID:rgznai100) 近期,由 CSDN 主办的 2019 中国AI 开发者大会(AI ProCon 2019) ...

  2. 华为云FusionInsight MRS:助力企业构建“一企一湖,一城一湖”

    摘要:华为云FusionInsight MRS新一代的数据湖,让大数据越用越快.越用越易.越用越稳.越用越省!让数据价值近在眼前! 10月30日,以"携手共赢·数创未来"为主题的第 ...

  3. 【转帖】2018全球公有云IaaS榜单出炉:阿里、腾讯、中国电信、金山云列前十

    2018全球公有云IaaS榜单出炉:阿里.腾讯.中国电信.金山云列前十 https://news.cnblogs.com/n/628391/ 中国电信貌似就是用的华为的技术 阿里 腾讯 华为 金山 百 ...

  4. 大型情感剧集Selenium:4_老中医教你(单/多/下拉框)选项定位 #华为云·寻找黑马程序员#

    今天讲什么 讲什么标题说了,讲selenium的单选.多选.下拉框选项定位.但其实这东西,没什么太多说的,又比较枯燥,那该怎么让这一集selenium的课程变得有趣呢?有请老中医,哈哈- 怎么样,这个 ...

  5. 1级搭建类107-Oracle 18c 单实例 FS(华为云)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...

  6. 1级搭建类106-Oracle 19c 单实例 FS(华为云)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...

  7. 推荐一款App运营工具:AYL爱盈利App榜单监控

    对包括开发者.产品运营.投资人在内的诸多移动互联网从业人员而言,国内Android应用市场和IOS应用市场的榜单变化数据时大家的必修功课之一:看看这段时间所关注的垂直领域里最火的是哪几款应用:看看竞争 ...

  8. 华为云照片的爬虫程序更新(python3.6)

    一.背景: 每年终都有一个习惯,就是整理资料进行归档,结果发现手机照片全备份在华为云里,在官网上找了一圈,没找到官方的pc工具用来同步照片. 于是找出上次写的程序,看看能不能爬到数据,然而……果然不好 ...

  9. 2017中国人工智能公司榜单发布,颠覆AT的AI独角兽全在这

    每年12月,创业邦研究中心评选并报道“中国创新成长企业100强”,这个榜单我们已经连续做了8年,是中国最有潜力的创业新贵榜,受到了业内广泛认可.从2015年开始我们发现,人工智能上榜企业明显增多,20 ...

  10. python2.7下同步华为云照片的爬虫程序实现

    1.背景 随着华为手机的销量加大,华为云的捆绑服务使用量也越来越广泛,华为云支持自动同步照片.通讯录.记事本等,用着确实也挺方便的,云服务带来方便的同时,也带来了数据管理风险.华为目前只提供一个www ...

随机推荐

  1. 14.9 Socket 高效文件传输

    网络上的文件传输功能也是很有必要实现一下的,网络传输文件的过程通常分为客户端和服务器端两部分.客户端可以选择上传或下载文件,将文件分块并逐块发送到服务器,或者从服务器分块地接收文件.服务器端接收来自客 ...

  2. JS异步任务的并行、串行,以及二者结合

    让多个异步任务按照我们的想法执行,是开发中常见的需求.今天我们就来捋一下,如何让多个异步任务并行,串行,以及并行串行相结合. 一.并行 并行是使用最多的方式,多个相互间没有依赖关系的异步任务,并行执行 ...

  3. 聊聊RNN&LSTM

    RNN 用于解决输入数据为,序列到序列(时间序列)数据,不能在传统的前馈神经网络(FNN)很好应用的问题.时间序列数据是指在不同时间点上收集到的数据,这类数据反映了某一事物.现象等随时间的变化状态或程 ...

  4. PXE批量网络装机

    PXE高效批量网络装机 系统装机的三种引导方式 1.硬盘 2.光驱(u盘) 3.网络启动 pxe 系统安装过程 加载boot loader Boot Loader 是在操作系统内核运行之前运行的一段小 ...

  5. JavaScript用策略模式消除if else 和 switch

    js程序中最常用的if else循环,如果分枝很多的的情况下难免使写出的程序又臭又长,但是根据需求又必须将这些分支处理,此时稍有经验的程序员可能会想到用switch case优化但是只是仅仅做到利于阅 ...

  6. 把 map 中的 key 由驼峰命名转为下划线

    import cn.hutool.core.util.StrUtil; /** * 把 map 中的 key 由驼峰命名转为下划线 */public HashMap<String, Object ...

  7. STM32F103 CAN通信波特率的计算方法

    前言 以下的波特率计算和实例仅针对 STM32F1系列 最近看一下CAN通信,翻出来之前做过的STM32 CAN通信的项目代码,有些概念比较模糊了,如波特率是怎么计算的. 最近接触rt-thread比 ...

  8. Vue 2.x源码学习:应用初始化大致流程

    内容乃本人学习Vue2源码的一点笔记,若有错误还望指正. 源码版本: vue: 2.6 vue-loader: 13.x vue-template-compiler: 2.6 相关学习笔记: 数据响应 ...

  9. JavaWeb项目中web.xml配置文件<servlet-class>…</servlet-class>中的路径出现问题以及服务器错误的解决办法

    问题如图 原因: 1.改变了 WEB-INF 文件夹下 lib 文件夹下 servlet-api.jar 的路径2.缺失lib文件夹下的 servlet-api.jar,没有添加到库中 解决办法: 不 ...

  10. windows Server 2008 r2 无法通过update更新的解决方法

    注意:目前windows Server系列操作系统已经完全停止支持. 1,安装 SP1补丁 KB976932 点击:微软补丁下载网站 搜索KB976932,手动下载安装. 2,安装 KB4474419 ...