Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

历数5年89篇研究,这篇综述告诉我们深度学习中的代码数据增强怎么样了

当今深度学习以及大模型的飞速发展,带来了对创新技术的不断追求。在这一进程中,代码数据增强技术显现出其不可忽视的价值。

最近,由蒙纳士大学、新加坡管理大学、华为诺亚方舟实验室、北京航空航天大学以及澳大利亚国立大学联合进行的对近 5 年的 89 篇相关研究调查,发布了一份关于代码数据增强在深度学习中应用的全面综述

图片

  • 论文地址:https://arxiv.org/abs/2305.19915

  • 项目地址:https://github.com/terryyz/DataAug4Code

这份综述不仅深入探讨了代码数据增强技术在深度学习领域的应用,还展望了其未来的发展潜力。作为一种在不收集新数据的情况下增加训练样本多样性的技术,代码数据增强已在机器学习研究中获得广泛应用。这些技术对于资源匮乏领域的数据驱动模型性能提升具有显著意义。

图片

然而,在代码建模领域,这一方法的潜力尚未被完全挖掘。代码建模是机器学习与软件工程交叉的新兴领域,涉及应用机器学习技术解决各种代码任务,如代码补全、代码摘要和缺陷检测。代码数据的多模态特性(编程语言和自然语言)为数据增强方法的定制带来了独特的挑战。

这份由多个顶级学术和工业机构联合发布的综述报告,不仅为我们提供了代码数据增强技术的深入洞见,还为该领域的未来研究和应用指明了方向。我们相信,这份综述将激发更多研究者对代码数据增强在深度学习中应用的兴趣,并推动这一领域的进一步探索和发展。

背景介绍

代码模型的兴起与发展:代码模型是基于大量源代码语料库训练的,能够精准地模拟代码片段的上下文。从早期采用 LSTM 和 Seq2Seq 等深度学习架构,到后来融入预训练语言模型,这些模型已经在多个源代码的下游任务中显示出了出色的性能。例如,有些模型在预训练阶段就考虑了程序的数据流,这是代码的语义层面结构,用于捕捉变量间的关系。

数据增强技术的意义:数据增强技术通过数据合成来增加训练样本的多样性,从而提高模型在各方面(如准确性和稳健性)的性能。在计算机视觉领域,例如,常用的数据增强方法包括图像裁剪、翻转和颜色调整。而在自然语言处理中,数据增强则大量依赖于语言模型,这些模型能够通过替换词汇或重写句子来改写上下文。

代码数据增强的特殊性:与图像和纯文本不同,源代码受到编程语言严格句法规则的限制,因此增强的灵活性较低。大多数代码的数据增强方法必须遵守特定的转换规则,以保持原始代码片段的功能性和语法。常见的做法是使用解析器构建源代码的具体句法树,然后转换为抽象句法树,简化表示的同时保留关键信息,如标识符和控制流语句。这些转换是基于规则的数据增强方法的基础,它们帮助模拟现实世界中更多样的代码表示,提高了代码模型通过增强数据训练的稳健性。

代码数据增强方法的深度探索

在深入探讨代码数据增强的世界中,作者将这些技术主要分为三类:基于规则的技术、基于模型的技术和示例插值技术。下面简要介绍了这些不同的分支。

基于规则的技术:许多数据增强方法利用预定规则来转换程序,同时保证不破坏语法规则和语义。这些转换包括替换变量名、重命名方法名和插入无效代码等操作。除了基本的程序语法,一些转换还考虑更深层的结构信息,如控制流图和使用 - 定义链。有一部分基于规则的数据增强技术专注于增强代码片段中的自然语言上下文,包括文档字符串和注释。

图片

基于模型的技术:一系列针对代码模型的数据增强技术旨在训练各种模型来增强数据。例如,一些研究利用辅助分类生成对抗网络(ACGAN)来生成增强程序。另一些研究则训练了生成对抗网络,以同时提升代码生成和代码搜索的能力。这些方法主要是针对代码模型特别设计的,旨在通过不同方式增强代码的表示和上下文理解。

示例插值技术:这类数据增强技术源自 Mixup,它通过插值输入和两个或更多实际样本的标签来操作。例如,给定计算机视觉中的二分类任务和两张分别是狗和猫的图片,这些数据增强方法可以将这两张图片的输入和它们对应的标签根据随机选择的权重混合在一起。然而,在代码领域,这些方法的应用受到独特的程序语法和功能的限制。相比于表面层次的插值,大多数示例插值数据增强方法通过模型嵌入将多个真实样例融合为单一输入。例如,有研究将基于规则的技术与 Mixup 结合,混合原始代码片段及其转换后的表示。

图片

图片

策略与技术

在实际应用中,针对代码模型的数据增强技术的设计和有效性受到多种因素的影响,例如计算成本、样本多样性和模型的稳健性。本节重点介绍了这些因素,提供了设计和优化适合的数据增强方法的洞见和技巧。

方法堆叠:在之前的讨论中,许多数据增强策略在单一工作中被同时提出,目的是增强模型的性能。通常,这种组合包括两种类型:同类型数据增强或不同数据增强方法的混合。前者通常应用于基于规则的数据增强技术,其出发点在于单一代码转换无法完全代表现实世界中多样的代码风格和实现。一些工作展示了将多种类型的数据增强技术融合可以增强代码模型的性能。例如,结合基于规则的代码转换方案和基于模型的数据增强来创建增强的语料库,用于模型训练。而另一些研究则在编程语言上增强,包括两种数据增强技术:基于规则的非关键词提取和基于模型的非关键词替换。

优化:在某些场景中,如增强稳健性和最小化计算成本,选择特定增强样例候选者至关重要。作者将这种目标导向的候选选择在数据增强中称为优化。文章主要介绍三种策略:概率性选择、基于模型的选择和基于规则的选择。概率性选择是通过从概率分布中采样进行优化,而基于模型的选择则由模型指导选择最合适的例子。在基于规则的选择中,使用特定预定的规则或启发式来选择最合适的例子。

概率性选择:作者专门选择了三种代表性的概率性选择策略,包括 MHM、QMDP 和 BUGLAB-Aug。MHM 采用 Metropolis-Hastings 概率采样方法,这是一种马尔可夫链蒙特卡洛技术,用于通过标识符替换选择对抗性示例。QMDP 使用 Q-learning 方法来战略性地选择和执行基于规则的结构转换。

基于模型的选择:采用这种策略的一些数据增强技术利用模型的梯度信息来指导增强样例的选择。一个典型的方法是数据增强 MP 方法,它基于模型损失进行优化,选择并通过变量重命名生成对抗性示例。SPACE 通过梯度上升对代码标识符的嵌入进行选择和扰动,目标是在保持编程语言的语义和语法正确性的同时最大化模型的性能影响。

基于规则的选择:基于规则的选择是一种强大的方法,它使用预定的适应度函数或规则。这种方法通常依赖于决策指标。例如,IRGen 使用基于遗传算法的优化技术和基于 IR 相似性的适应度函数。而 ACCENT 和 RA 数据增强 R 分别使用 BLEU 和 CodeBLEU 等评估指标来指导选择和替换过程,以实现最大的对抗性影响。

应用场景

在几种常见的代码场景中,数据增强方法可被直接应用。

对抗性示例用于稳健性:稳健性在软件工程中是一个关键且复杂的维度。设计有效的数据增强技术来生成对抗性示例,以识别和减轻代码模型中的漏洞,已成为近年来的一个研究热点。多个研究利用各种数据增强方法测试和增强模型的稳健性,进一步加强了代码模型的稳健性。

低资源领域:在软件工程领域,编程语言资源严重不平衡。流行的编程语言如 Python 和 Java 在开源仓库中扮演主要角色,而许多语言如 Rust 资源非常匮乏。代码模型通常基于开源仓库和论坛进行训练,编程语言资源的不平衡可能会对它们在资源匮乏的编程语言上的性能产生不利影响。在低资源领域内应用数据增强方法是一个反复出现的主题。

检索增强:在自然语言处理和代码领域,检索增强的数据增强应用越来越受到关注。这些针对代码模型的检索增强框架在预训练或微调代码模型时纳入来自训练集的检索增强示例,这种增强方法提高了模型的参数效率。

对比学习:对比学习是另一个代码场景中部署数据增强方法的应用领域。它使模型能够学习一个嵌入空间,在这个空间中,相似样本彼此接近,而不相似的样本则相距较远。数据增强方法被用于构造与正样本相似的样例,以提高模型在缺陷检测、克隆检测和代码搜索等任务中的性能。

文章又接着讨论了几个常见的代码任务以及评估数据集上的数据增强工作,包括克隆检测、缺陷检测和修复、代码摘要、代码搜索、代码生成和代码翻译。

挑战与机遇

作者认为代码数据增强方面面临着许多显著的挑战。然而,正是这些挑战为这一领域的新可能性和令人激动的机遇铺平了道路。

理论探讨:目前,对代码中数据增强方法的深入探索和理论理解存在明显差距。大多数现有研究集中在图像处理和自然语言领域,将数据增强视为一种应用预先存在的关于数据或任务不变性的知识的方法。转向代码时,虽然以前的工作引入了新方法或演示了数据增强技术如何有效,但它们经常忽略了特别是从数学角度来看的原因和方式。代码的离散性质使得理论讨论变得更为重要。理论讨论使大家能够从更广阔的视角理解数据增强,而不仅仅是根据实验结果。

预训练模型的更多研究:近年来,预训练的代码模型在代码领域得到了广泛应用,通过大规模语料库的自我监督积累了丰富的知识。尽管许多研究利用预训练代码模型进行了数据增强,但大多数尝试仍局限于遮罩令牌替换或微调后的直接生成。在代码领域中,利用大规模语言模型的数据增强潜力是一个新兴的研究机会。

不同于以前在数据增强中使用预训练模型的方式,这些工作开启了「基于提示的数据增强」时代。然而,在代码领域中,基于提示的数据增强探索仍然是一个相对未被触及的研究领域。

处理特定领域数据:作者重点调查了处理代码的常见下游任务的数据增强技术。然而,作者意识到在代码领域的其他特定任务数据方面仍有少量研究。例如,API 推荐和 API 序列生成可以被视为代码任务的一部分。作者观察到在这两个不同层次之间的数据增强技术存在差距,为未来工作探索提供了机会。

项目级别代码和低资源编程语言的更多探索:现有方法在函数级别代码片段和常见编程语言方面取得了足够的进展。同时,低资源语言的增强方法虽然需求更大,但却相对稀缺。在这两个方向的探索仍然有限,作者认为它们可能是有前景的方向。

缓解社会偏见:随着代码模型在软件开发中的进步,它们可能被用于开发以人为中心的应用程序,如人力资源和教育,其中偏见程序可能导致对代表性不足的人群做出不公正和不道德的决定。虽然 NLP 中的社会偏见已经得到了很好的研究并可以通过数据增强进行缓解,但代码中的社会偏见尚未受到关注。

小样本学习:在小样本场景中,模型需要实现与传统机器学习模型相媲美的性能,但训练数据极其有限。数据增强方法为这个问题提供了直接的解决方案。然而,在小样本场景中采用数据增强方法的工作还很有限。在少数样本场景中,如何通过生成高质量的增强数据为模型提供快速泛化和问题解决能力,作者觉得这是一个有趣的问题。

多模态应用:需要注意的是,仅关注函数级别的代码片段并不能准确地代表真实世界编程情况的复杂性和细微差别。在这种情况下,开发人员通常同时处理多个文件和文件夹。尽管这些多模态应用变得越来越流行,但尚未有研究对它们应用数据增强方法。挑战之一是在代码模型中有效地桥接每种模态的嵌入表示,这已在视觉 - 语言多模态任务中进行了研究。

缺乏统一:当前的代码数据增强文献呈现出一个具有挑战性的景观,其中最流行的方法通常被描绘为辅助性的。一些实证研究试图比较代码模型的数据增强方法。然而,这些工作没有利用大多数现有的先进数据增强方法。尽管存在针对计算机视觉(如 PyTorch 中的默认增强库)和 NLP(如 NL-Augmenter)的公认数据增强框架,但对于代码模型的通用数据增强技术相应库明显缺失。此外,由于现有数据增强方法通常使用各种数据集进行评估,因此很难确定其有效性。因此,作者认为通过建立标准化和统一的基准任务,以及用于比较和评估不同增强方法的有效性的数据集,将大大促进数据增强研究的进展。这将为更系统和比较性地理解这些方法的优势和局限性铺平道路。

理论代码数据增强
相关数据
华为机构

华为创立于1987年,是全球领先的ICT(信息与通信)基础设施和智能终端提供商。

https://www.huawei.com/cn/
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

概率分布技术

概率分布(probability distribution)或简称分布,是概率论的一个概念。广义地,它指称随机变量的概率性质--当我们说概率空间中的两个随机变量具有同样的分布(或同分布)时,我们是无法用概率来区别它们的。

计算机视觉技术

计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。

插值技术

数学的数值分析领域中,内插或称插值(英语:interpolation)是一种通过已知的、离散的数据点,在范围内推求新数据点的过程或方法。求解科学和工程的问题时,通常有许多数据点借由采样、实验等方法获得,这些数据可能代表了有限个数值函数,其中自变量的值。而根据这些数据,我们往往希望得到一个连续的函数(也就是曲线);或者更密集的离散方程与已知数据互相吻合,这个过程叫做拟合。

语料库技术

语料库一词在语言学上意指大量的文本,通常经过整理,具有既定格式与标记;事实上,语料库英文 "text corpus" 的涵意即为"body of text"。

图像处理技术

图像处理是指对图像进行分析、加工和处理,使其满足视觉、心理或其他要求的技术。 图像处理是信号处理在图像领域上的一个应用。 目前大多数的图像均是以数字形式存储,因而图像处理很多情况下指数字图像处理。

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

生成对抗网络技术

生成对抗网络是一种无监督学习方法,是一种通过用对抗网络来训练生成模型的架构。它由两个网络组成:用来拟合数据分布的生成网络G,和用来判断输入是否“真实”的判别网络D。在训练过程中,生成网络-G通过接受一个随机的噪声来尽量模仿训练集中的真实图片去“欺骗”D,而D则尽可能的分辨真实数据和生成网络的输出,从而形成两个网络的博弈过程。理想的情况下,博弈的结果会得到一个可以“以假乱真”的生成模型。

遗传算法技术

遗传算法是计算数学中用于解决最优化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。 遗传算法通常实现方式为一种计算机模拟。对于一个最优化问题,一定数量的候选解可抽象表示为染色体,使种群向更好的解进化。

堆叠技术

堆叠泛化是一种用于最小化一个或多个泛化器的泛化误差率的方法。它通过推导泛化器相对于所提供的学习集的偏差来发挥其作用。这个推导的过程包括:在第二层中将第一层的原始泛化器对部分学习集的猜测进行泛化,以及尝试对学习集的剩余部分进行猜测,并且输出正确的结果。当与多个泛化器一起使用时,堆叠泛化可以被看作是一个交叉验证的复杂版本,利用比交叉验证更为复杂的策略来组合各个泛化器。当与单个泛化器一起使用时,堆叠泛化是一种用于估计(然后纠正)泛化器的错误的方法,该泛化器已经在特定学习集上进行了训练并被询问了特定问题。

马尔可夫链技术

马尔可夫链,又称离散时间马尔可夫链,因俄国数学家安德烈·马尔可夫得名,为状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备“无记忆”的性质:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。这种特定类型的“无记忆性”称作马尔可夫性质。

语言模型技术

语言模型经常使用在许多自然语言处理方面的应用,如语音识别,机器翻译,词性标注,句法分析和资讯检索。由于字词与句子都是任意组合的长度,因此在训练过的语言模型中会出现未曾出现的字串(资料稀疏的问题),也使得在语料库中估算字串的机率变得很困难,这也是要使用近似的平滑n元语法(N-gram)模型之原因。

小样本学习技术

人类非常擅长通过极少量的样本识别一个新物体,比如小孩子只需要书中的一些图片就可以认识什么是“斑马”,什么是“犀牛”。在人类的快速学习能力的启发下,研究人员希望机器学习模型在学习了一定类别的大量数据后,对于新的类别,只需要少量的样本就能快速学习,这就是 Few-shot Learning 要解决的问题。

生成对抗技术

生成对抗是训练生成对抗网络时,两个神经网络相互博弈的过程。两个网络相互对抗、不断调整参数,最终目的是使判别网络无法判断生成网络的输出结果是否真实。

推荐文章
暂无评论
暂无评论~