-
摘要:
图文跨模态实体链接是对传统实体链接任务的扩展,其输入为包含实体的图像,目标是将其链接到文本模态的知识库实体上. 现有模型通常采用双编码器架构,将图像、文本模态的实体分别编码为向量,利用点乘计算两者的相似度,从而链接到与图像实体相似度最高的文本实体. 其训练过程通常采用基于InfoNCE损失的对比学习任务,即提高一个实体某模态与自身另一模态的向量相似度,降低与其他实体另一模态的向量相似度. 然而此模型忽视了图文2个模态内部表示难度的差异:图像模态中的相似实体,通常比文本模态中的相似实体更难以区分,导致外观相似的图像实体很容易链接错误. 因此,提出2个新的对比学习任务来提升向量的判别能力. 一个是自对比学习,用于提升图像向量之间的区分度;另一个是难负例对比学习,让文本向量更容易区分几个相似的图像向量. 在开源数据集WikiPerson上进行实验,在12万规模的实体库上,相比于采用InfoNCE损失的最佳基线模型,模型正确率提升了4.5个百分点.
Abstract:Image-text cross-modal entity linking is an extension of traditional named entity linking. The inputs are images containing entities, which are linked to textual entities in the knowledge base. Existing models usually adopt a dual-encoder architecture which encodes entities of visual and textual modality into separate vectors, then calculates their similarities using dot product, and links the image entities to the most similar text entities. The training process usually adopts the cross-modal contrastive learning task. For a given modality of entity vectors, this task pulls closer the vector of another modality that corresponds to itself, and pushes away the vector of another modality corresponding to other entities. However, this approach overlooks the differences in representation difficulty within the two modalities: visually similar entities are often more difficult to distinguish than textual similar entities, resulting in the incorrect linking of the former ones. To solve this problem, we propose two new contrastive learning tasks, which can enhance the discriminative power of the vectors. The first is self-contrastive learning, which aims to improve the distinction between visual vectors. The second is hard-negative contrastive learning, which helps a textual vectors to distinguish similar visual vectors. We conduct experiments on the open-source dataset WikiPerson. With a knowledge base of
120000 entities, our model achieves an accuracy improvement of 4.5% compared with the previous state-of-the-art model.-
Keywords:
- entity linking model /
- multi-modal /
- cross-modal /
- contrastive learning /
- visual information
-
软件系统已经成为人类社会运行的基石,贯穿于人们生活的方方面面,在企业、政府层面发挥着不可或缺的作用,并承载着各行各业的重要数据,影响着数据要素的采集、生产、存储、传输、使用、流通、删除全生命周期的安全. 然而,软件系统中存在一个无法避免的难题,即代码缺陷,不仅是人类开发者所编写的代码,随着人工智能技术的发展,由计算机所自动生成的代码中也同样存在着各种缺陷[1],包括一些编程错误、代码bug和安全漏洞[2]. 这些代码缺陷会显著影响软件系统的表现,增加软件系统开发和维护成本,危害软件系统的功能,最终危害软件系统所有用户的数据安全[3]. 为了应对软件缺陷的存在,传统方式通过人工编写补丁来修复缺陷,但这种方式不仅非常依赖于人工的专家经验,而且效率低下、成本高昂. 于是,研究者们提出了自动代码修复(automated program repair, APR)技术[4-7],通过计算机全自动化的方式为代码缺陷生成相应的补丁以修复这些缺陷.
自动代码修复技术的核心是生成高质量的能够满足代码缺陷修复需求的补丁. 根据补丁生成技术的迭代,自动代码修复技术的发展可以划分为3个阶段[5]:传统的自动代码修复技术、基于深度学习的自动代码修复技术和基于大语言模型(large language model, LLM)的自动代码修复技术. 传统的自动代码修复技术依靠遗传编程、进化计算等算法实现,无需依赖外界高质量数据集即可完成代码修复,但补丁种类局限,代码修复效率低. 基于深度学习的自动代码修复技术则借助循环神经网络等深度神经网络模型实现,能够借助海量开源代码自动化学习代码修复的规律,但难以理解逻辑复杂的缺陷代码,补丁多样性较低. 虽然文献[4-8]系统性地总结并分析当前传统的和基于深度学习的APR工作,但随着大模型技术的迅速发展,大量的工作将大模型技术应用于APR领域,以提升代码修复的效果. 这些研究发现大模型相比普通规模神经网络具备更强的代码理解能力和代码生成能力,能够修复难度更大的缺陷,生成更高效且丰富的补丁,例如VulRepair[9]借助T5大模型的自注意力机制和分词机制将安全漏洞的修复能力从23%提升至了44%. 这类基于大模型的APR的工作在目前的综述文献中基本没有体现,也缺乏系统深入的归纳分析.
在此背景下,为系统梳理目前大语言模型技术在APR领域的应用,深入探索LLM给APR带来的技术优势和未来的发展方向,本文收集了2019年1月至2024年5月涉及APR工作评级为CCF-A的国内和国际推荐会议和期刊论文. 从图1可以看出,在2021年,也即LLM刚起步的时候,已经有学者敏锐地发现利用LLM进行代码修复任务的潜力. 从2022年开始,基于大语言模型的研究数量超过了传统的APR和基于深度学习的APR论文数量,且呈现出逐年上升趋势. 可见大语言模型技术的应用已经成为未来APR研究的主流发展方向和重要推动力.
综上,本篇综述旨在系统地对目前自动代码修复领域大语言模型技术的应用进行梳理和总结. 主要贡献包括如下3个方面:
1)给出了自动代码修复技术的工作流程,结合目前基于大模型的自动代码修复研究的成果,从补丁生成算法的角度对自动代码修复技术进行了分类,总结了不同分类模式下的缺陷修复特点.
2)重点从“完形填空”和“神经机器翻译”2大自然语言处理领域的典型任务深入分析了现有自动代码修复研究进展,并对面向大语言模型的自动代码修复研究进行了对比分析与探讨.
3)结合大语言模型和自动代码修复技术发展特点,分析了现有基于大语言模型的自动代码修复研究工作存在的不足,并重点从提升自动代码修复的修复效率、提高自动代码修复的补丁质量、强化的自动代码修复的泛化能力和构建全流程的缺陷修复共4个方面探讨了基于大语言模型的自动代码修复研究面临的挑战以及未来研究方向的展望.
1. 大语言模型与自动代码修复
本节从大语言模型和自动代码修复2个方面阐述其当前的发展情况,将首先介绍大语言模型在编程语言领域的表现,和大语言模型在2种范式下于自动代码修复领域的应用,接着梳理软件缺陷的3种类别与自动代码修复的工作流程,最后将现有的3类APR方案进行深入对比和分析.
1.1 大语言模型
随着人工智能技术[10]的发展,基于大规模数据集训练出来的具有庞大参数量的人工智能大模型得到广泛应用和关注,并且在自然语言处理、计算机视觉、语音识别等许多科研领域展现出了前所未有的突出能力[11].
其中,在编程语言领域,涌现出多种代码大语言模型[12]以实现代码生成、代码修复等编程语言领域的任务.2020年,Microsoft基于GPT-2[13]大语言模型推出了第1款代码大语言模型GPT-C[14],通过使用编程语言源代码数据集进行无监督学习,使得大语言模型具有了理解、生成编程语言的能力. 其后,学者基于其他大语言模型,例如T5[15],BERT[16],推出了更多的代码大语言模型,如2020年的CodeBERT[17]、2023年的CodeT5p[18],在解决编程领域的自动代码修复、代码生成、代码翻译等问题上都取得了显著的进展.
不过由于如今大模型的规模不断增大,其训练成本也随之增大,普通的用户难以承担如此大规模的模型训练任务. 因此,目前的大模型提出了预训练模型的形式,由生产厂商将大模型先在指定的数据集上提前进行训练,使其事先具备一些任务的处理能力后再提供给用户使用. 这种预训练模式削减了模型用户在重新下载数据集、重新训练大模型上所需的时间和金钱成本,降低了大语言模型的使用门槛. 然而,虽然在经过预训练之后,大模型获得了较为强大的泛化能力,但是对特定任务的处理能力还不足. 于是,为了进一步将模型适应更为具体的不同下游任务,需要对预训练大模型开展进一步的适应性工作,具体可以分为预训练-微调和提示工程2种范式.
预训练-微调(pretrain-finetune):微调指将预训练得到的模型继续进行相关任务的训练,更新预训练得到的神经网络参数从而增强模型针对特定任务的处理能力.
提示工程(prompt engineering):提示工程指将待解决任务的描述作为输入提供给预训练模型,模型在理解输入任务的基础上激活自身现有的能力解决任务.
在自动代码修复领域,学者们借助预训练-微调和提示工程2种范式使已有的代码大语言模型具备补丁生成能力,以完成缺陷修复任务. 例如Wu等人[19]对预训练的代码大语言模型进行了Java安全漏洞修复的微调,使得原本拥有较为泛化代码能力的大模型熟悉Java安全漏洞修复的任务. 而AlphaRepair[20]借助提示工程范式将缺陷代码、缺陷位置等信息以代码提示的形式提供给预训练的代码大语言模型,大模型根据接收到的提示借助已有知识给出修复代码.
总而言之,LLM在多个领域有着可观的发展前景,特别是在APR领域,学者们借助代码大语言模型优秀的代码理解和生成能力,显著提升了生成补丁的效率和多样性,使得APR技术能够成功修复更加复杂的缺陷.
1.2 自动代码修复
APR技术能够自动地修复软件系统中的多种缺陷,当前软件缺陷可以具体分为3类[2]:编程错误(programming error)、代码bug(software bug)和安全漏洞(security vulnerability). 编程错误指开发者在编码过程中写出的错误代码,例如对某一变量执行了变量类型所支持范围之外的操作;代码bug指会导致程序功能性异常的软件缺陷,例如“if”语句中忽略了某种条件的考虑,导致本应无法通过if判断的输入通过了判断;安全漏洞指能够被攻击者利用危害系统信息安全的缺陷,例如程序向栈中某个变量写入的字节数超过了变量本身所申请的字节数,导致与其相邻栈中变量的值被改变,允许攻击者控制程序执行的流程.
图2展示了自动代码修复的工作流程,具体而言,APR工具在接收到软件缺陷的相关信息(如包含缺陷的代码、缺陷的具体位置、类型等)后,借助对代码和缺陷的理解由补丁生成技术输出缺陷代码的1个甚至多个补丁. 已有的APR方案依据补丁生成技术的不同可以分为3类[5]:传统的APR方案,基于深度学习的APR方案和基于大语言模型的APR方案. 本节将主要介绍传统的APR方案和基于深度学习的APR方案,对基于大语言模型的APR方案将进行不同修复模式的讨论,并将在第2~3节展开详细的分析.
1.2.1 传统的APR方案
在传统的自动代码修复方案中,根据方案设计的不同可以继续划分成3种方案[5]:基于搜索、基于模板和基于约束的方案.
基于搜索(search-based):基于搜索的APR方案首先借助启发式算法,如遗传编程生成一些候选的补丁组成搜索空间. 然后通过在搜索空间中利用代码搜索方法,如寻找相似度高的代码以生成修复代码[21-24]. 例如TransplantFix[21]使用了一种能感知继承关系的代码搜索方法,其在代码搜索的过程中,考虑了方法的内部特征(方法名和方法参数的类型)和外部特征(继承关系),提出了一种考虑类和对象的继承关系来更准确有效的在搜索空间中搜索代码的方法. TransplantFix借此搜索方法寻找具有相似功能的候选代码,以实现缺陷代码的修复.
基于模板(template-based):在基于模板的APR方案中补丁是借助修复模板生成的. 修复模板记录了缺陷修复的规律,能够指导APR工具按照模板的结构将缺陷代码转换成修复代码. PyTER[25],ATR[26]使用预先编好的修复模板生成候选的补丁. iFixR[27]基于kPAR[28]收集了一套修复模板,TBar[29]审计了前人的模板并总结出了一套修复模板. PraPR[30]则是通过设计了多个变异器,根据预先指定的转换规则给输入的程序做变异,从而生成修复代码.
基于约束(constraint-based):基于约束的APR方案将代码修复视为约束求解问题,其首先从缺陷代码的测试样例中提取出代码应遵循的约束条件,接着将约束应用于搜索空间的代码从而删去不满足测试样例要求的代码,删除过程结束后即获得最终的修复代码. SOSRepair[31]对此流程进行了进一步的优化,当候选的补丁违背了测试样例的约束时,其根据失败的信息总结出新的约束条件,不断向约束条件中进行补充,从而能更高效地获得修复代码.
1.2.2 基于深度学习的APR方案
受益于深度学习的发展,学者们开始尝试将深度学习模型结合进自动代码修复领域,例如卷积神经网络、循环神经网络、长短期记忆网络、生成对抗网络[32]等. 受传统方案的启发,基于深度学习的方案吸收了传统方案中的经验,认识到了传统方案中的局限. 通过从大量开源软件系统中源码的自动化学习,基于深度学习的方案具备了充足的代码知识,能够生成更加丰富、更加复杂的修复代码. 因此,基于深度学习的方案进一步提升了代码修复能力,提升了自动代码修复领域的自动化程度,使得自动代码修复工具能够更方便地适用不同语言、扩展不同缺陷类型,总体上表现出比传统的方案更优秀的修复能力.
Phoenix[33]提出了一种策略用于取代过于依赖测试样例来生成补丁的传统方案,通过借助深度学习对挖掘到的公开补丁进行学习,让机器总结出修复的策略. Dear[34]结合了长短期记忆网络神经网络和基于频谱的故障定位,形成了对多块多语句代码的修复能力. 使用卷积神经网络模型的CoCoNuT[35]将自动代码修复看作一个将缺陷代码“翻译”成正确代码的过程,设计出一个感知上下文的神经机器翻译模型. SNRepair[36]借助自注意力机制缓解了循环神经网络在处理代码时遇到的长距离依赖问题,更好地捕捉了代码中的结构信息,提升了代码修复的效率.
1.2.3 基于大语言模型的APR方案
LLM在自然语言处理领域能够处理多种任务,如完形填空、神经机器翻译、情感分类等. 而随着代码大语言模型的提出,LLM也逐渐被应用至编程语言的处理中. 在APR领域,大语言模型相较于传统方案和基于深度学习的方案展现出更强大的理解和生成能力[37].
但由于APR技术需要在理解代码和缺陷的基础上推理出修复缺陷的补丁,部分自然语言处理领域的任务,如情感分类即无法适用于代码修复. 于是现有基于LLM的APR方案将自然语言领域的2类任务迁移至了编程语言领域以完成缺陷修复的目的,即完形填空任务和神经机器翻译任务. 因此本文将基于LLM的APR分为完形填空(cloze style)模式[20]和神经机器翻译(neural machine translation, NMT)模式[38]2类. 完形填空模式的APR将代码修复任务类比成语言类测试中的完形填空题型,在完整的代码中将缺陷代码挖去,交给大语言模型预测出补丁重新填回代码块中,以此实现代码修复的目的. 神经机器翻译模式的APR将代码修复任务视为机器翻译任务,大模型学习待修复代码向修复代码转化的规则,以实现缺陷修复. 针对上述2类基于LLM的APR技术的详细分析将分别在第2~3节展开.
1.2.4 对比分析
表1总结了现有自动代码修复方案的详情,从补丁质量、支持修复缺陷的难度、开源代码资源利用、代码句法理解能力和代码语义理解能力角度对比了现有的APR方案.
表 1 自动代码修复方案详情Table 1. Detailed Information on APR Approaches方案类型 补丁质量 支持修复缺陷的难度 开源代码资源利用 代码句法理解能力 代码语义理解能力 传统的APR方案 低 低 否 低 无 基于深度学习的APR方案 中 中 是 中 低 基于大语言模型的APR方案 高 高 是 高 高 具体而言,传统的APR方案为实现自动代码修复开辟了许多新的道路,但面临着一些难以解决的问题. 比如基于搜索的APR方案面临的一大局限是补丁质量低,由于补丁生成时使用的变异算法本身存在着随机性,补丁的质量难以保证,导致搜索空间庞大. 相比之下,基于模板的APR方案一定程度上缓解了基于搜索的APR方案搜索空间过大的问题. 通过总结修复之间的相似性,提炼出来的修复模板的搜索空间远小于候选代码的搜索空间. 但基于模板的APR方案也同样面临着局限,比如学习能力欠佳,无法利用起开源代码平台如GitHub的海量代码. 这导致了其仅能依靠修复模板捕获编程语言的部分句法规则,无法感知代码语义,生成的补丁被局限在了模板之中. 基于约束的APR方案面临着类似的问题,尽管其通过约束条件缩小了搜索空间,但其也过于依赖缩小后的搜索空间,学习能力的不足使其生成的补丁也具有局限性,无法处理复杂或非常规的补丁.
基于深度学习的APR方案借助深度学习技术将大量开源代码利用起来,但所使用的深度神经网络对于代码理解能力和代码生成能力上仍然存在不足,部分复杂的语义关联很难被循环神经网络这类深度神经网络完全捕获,并且编程语言不同于自然语言,存在着更为严格的句法,因此在理解代码找出缺陷的基础上还需要保证生成的修复代码依然符合句法约束,这对此类深度神经网络来说仍然是一个挑战.
基于大语言模型的APR方案借助大模型技术将大量开源代码充分地利用起来,大模型神经网络的深度能够支持模型充分捕获编程语言中复杂的句法规则,且大模型的自注意力机制进一步提高了模型对于输入内容的理解能力,使得模型拥有了更强的代码语义感知能力. 相较于传统的APR方案和基于深度学习的APR方案,基于大语言模型的APR方案能够提供质量更高的补丁,修复难度更高的缺陷.
2. 完形填空模式的自动代码修复
完形填空模式的自动代码修复能够充分利用LLM在预训练阶段所学的代码知识和待修复代码中隐含的缺陷知识,将LLM技术更直接、快速的应用于APR领域. 因此,完形填空模式的自动代码修复成为了APR领域重要的研究方向之一. 本节将首先介绍“完形填空”任务的定义,接着深入分析在完形填空任务下APR的工作模式与优势,之后详尽梳理和对比近年完形填空模式下的APR方案以及优缺点,最终归纳了完形填空模式的APR技术所仍然面临的局限、原因和未来改进方向.
2.1 完形填空任务下的APR技术概述
“完形填空”本身是语言类测试中的一种题型,出题人将原先完整的一段文本挖去部分内容,答题人根据经过挖空的上下文重新推测出空缺处正确的内容. 类似的,在LLM领域,完形填空任务指模型根据某处空缺文本的上下文推理空缺内容的任务. 此任务重点考察大模型对上下文文本的理解能力,并且能够用于解决多种具体问题,如缺陷修复、代码生成、代码编辑[12].
完形填空任务下的APR技术首先根据缺陷定位的结果决定在代码中挖空的大致方位;接着总结出已有缺陷修复代码的变更规律,决定挖空的具体位置和数量;最后大模型根据挖空后的待修复代码片段推理出空缺处的修复代码,以此完成代码修复的任务. 完形填空模式的APR技术主要具备以下2个优点:
1)完形填空模式的APR技术能够在提示工程的范式下无需微调模型直接进行缺陷修复任务. 部分大模型,如CodeBERT经过掩码语言建模(mask language modeling, MLM)的预训练,而MLM正是受完形填空启发设计的训练任务,要求模型从经过随机挖空的输入中预测出空缺处的原始内容. 因此此类大模型无需微调就已经能直接胜任完形填空模式的任务,能够充分发挥模型在预训练阶段学习到的完形填空技巧,更快速、精准地理解完形填空模式的代码修复任务.
2)完形填空模式的APR技术能够充分利用待修复代码的缺陷上下文信息. 完形填空任务要求模型首先理解空缺内容的临近信息,再推理出空缺的具体内容. 在APR领域,缺陷代码的临近信息包含着宝贵的缺陷修复信息,直接影响着缺陷修复的效果[39]. 因此以此模式进行代码修复能够使得模型更加关注缺陷上下文,提升APR工具对缺陷代码功能和缺陷成因的理解,从而提升缺陷修复的效果.
2.2 完形填空模式的APR方案现状
在2022年,AlphaRepair[20]首次提出了以完形填空模式进行自动代码修复的方法. AlphaRepair借助人工总结归纳出缺陷修复的规律,设计了一套用于挖空的修复模板. 当接收到待修复代码时,AlphaRepair首先套用修复模板将缺陷代码挖去,接着借助CodeBERT大模型在挖空后的缺陷代码中填空,以此修复代码中的缺陷. AlphaRepair发现在代码修复过程中,bug代码本身包含一些代码修复需要使用到的重要信息(如特定的变量、修改行的类型等). 因此将bug代码行以自然语言注释的形式输入给大模型能帮助模型生成更多有效的补丁,这为后来的工作[40-41]提供了一定的指导.
在AlphaRepair之后,学者们在以下4个方面进一步完善了完形填空模式的APR技术:修复模板设计、修复模板选择、模型填空指导、更多大模型.
2.2.1 修复模板设计
修复模板由缺陷修复的代码变更规律总结而来,用于在待修复的代码中挖去缺陷代码. AlphaRepair所采用的修复模板依靠人工设计而成,种类、个数有限,这意味着AlphaRepair仅支持修复当前修复模板覆盖范围之内的缺陷. 于是,Gamma[40]和TYPEFIX[42]在此之上分别设计了能够自动归纳修复模板的方案. 在2023年,Gamma[40]不仅采用人工的方式归纳修复模板,还借助了现有的静态分析[43-44]和机器学习[45-46]的方案自动生成模板. 在2024年,TYPEFIX[42]提出了修复模板设计的新方案,其设计了一个自动化模板挖掘方法,完全取代了人工编写修复模板的步骤. TYPEFIX通过从GitHub提取出涉及修复Python类型错误(type error)的代码,把代码变更抽象和总结成修复模板. 相比于人工编写的修复模板,由此生成的修复模板具有修复较新出现、较复杂缺陷的能力,因为TYPEFIX可以自动化的从挖掘的代码中总结出修复规律,使得这些模板具有更新、更丰富的缺陷修复知识.
2.2.2 修复模板选择
AlphaRepair在借助修复模板进行代码修复的过程中,会套用全部模板用于修复任务,然而随着修复模板数量不断增加,会导致其开销不断增大. 于是,Gamma[40],TYPEFIX[42]在此之上分别设计了修复模板的选择方案. Gamma,TYPEFIX都受启发于TBar[29],借助了抽象语法树(abstract syntax tree, AST)来实现各自的方案. Gamma首先生成待修复代码的AST,接着判断AST的每个节点是否被预定义的修复模板所包含,当修复模板中包含待修复代码AST中任一节点时,修复模板即被选用. TYPEFIX不仅为待修复代码生成AST,对从GitHub公开项目提取的代码也进行AST生成,且将GitHub的AST进行聚类,通过把待修复代码的AST与经过聚类的代码AST进行比较决定选用何种修复模板. 以上2种方案能够在大量的修复模板中选择出较为合适的修复模板以供大语言模型使用,提高修复的效率和成功率.
2.2.3 模型填空指导
在选定了修复模板之后,AlphaRepair,Gamma,TYPEFIX把补丁生成的过程全部交由代码大语言模型完成,但并没有进一步根据待修复代码的语义指导模型进行缺陷修复的推理. Repilot[1]发现即使代码大语言模型经过代码有关任务的预训练,在预测补丁时所生成的部分token(模型可以理解和生成的最小意义单位)仍会丢失代码结构或代码语义的理解,导致降低模型生成补丁的质量,降低修复能力. 因此,在2023年,Repilot[1]为APR领域开辟了一个新的途径,其吸收了IDE中代码补全的思想,借助Eclipse JDT Language Server工具作为补全引擎为搜索空间进行修剪. 通过消除补全引擎所不认可的token,能够使得生成的补丁更加符合代码的语义. 这类似开发人员能够借助IDE自动补全更轻松地编程,大语言模型在进行代码修复任务时有了补全引擎的指导,不仅能够使得工具更好地判断出大模型所生成token的可行性,甚至可以主动的为当前程序进行补全. 经过Repilot实验表明,结合补全引擎进行搜索空间删减和主动代码补全,能够进一步提高所生成的补丁能成功被编译的个数和能成功修复缺陷的个数,提高模型的代码修复能力.
2.2.4 更多大模型
除去CodeBERT外,现实中存在其他经过不同任务预训练、拥有不同参数规模的大模型. 这些模型有着各自擅长的能力,但代码修复效果尚待探索. 于是,Gamma和Repilot对比了更多大模型在完形填空模式下的代码修复效果. Gamma不仅类似AlphaRepair利用CodeBERT进行实验,也进行了在完形填空模式中使用UniXCoder[47]和ChatGPT进行代码修复的实验. 由于UniXCoder也经过了MLM任务的预训练,其也可以直接被用于完形填空模式的代码修复任务. 并且从修复能力上看,CodeBERT和UniXCoder差距也较小. 但Gamma发现,在生成正确补丁的耗时上,CodeBERT需要花费远远更多的时间. 这是因为正确补丁的长度是未知的,对同一个缺陷的同一个修复模板需要提供给CodeBERT不同推理长度的设置多次运行. 而对于UniXCoder来说,其可以循环预测补丁的下一个token,直至遇到文件结尾(end of file, EOF)token终止,因此只需提供给UniXCoder待修复代码的位置其即可完成补丁的推理. Gamma也借助了自然语言的对话与ChatGPT进行交互,通过输入带有完形填空任务提示的指令使得ChatGPT理解接下来要进行的代码修复任务. 但从结果上来看,ChatGPT表现要弱于CodeBERT和UniXCoder,原因可能在于CodeBERT和UniXCoder经过MLM目标的预训练,而ChatGPT由于闭源的缘故无法确定其预训练的过程. Repilot将规模较大的InCoder大模型与相比规模较小的CodeT5[48]进行了对比,发现使用更大的模型能够提升修复能力.
2.3 小 结
表2总结了现有完形填空模式的APR方案,从模型选择、模型规模、缺陷类型、编程语言等角度对比了现有方案. 总体而言,目前的完形填空模式的自动代码修复技术主要从如何设计修复模板、如何筛选修复模板、如何指导大模型“填空”、探索更多大模型的修复效果共4个方面展开,但现有的工作较少,这是因为在完形填空模式的APR下大模型仅能借助已有知识生成补丁,无法从开源代码中学习更多代码缺陷修复的深层规律. 现有的完形填空模式的APR也仍面临着一些挑战,如仅开展了提示工程范式下的工作,方案无法泛化至多种缺陷类型、不同编程语言. 未来可以在完形填空模式下尝试MLM任务微调[49],学习更多缺陷修复的规律;或者研究不同缺陷类型、不同编程语言之间缺陷的AST是否有相关性,聚类算法是否继续有效,以提升修复方案的泛化能力.
表 2 完形填空模式的自动代码修复方案Table 2. Cloze-Style APR Approaches方案 大语言模型 模型规模 缺陷类型 语言 特点 不足 AlphaRepair[20] CodeBERT 1.25亿 bug Java
Python首个完形填空模式的代码修复方案. 修复模板仅由人为手动归纳,成本高,扩展性低;修复时套用所有的修复模板,成本高. Gamma[40] CodeBERT
UniXCoder
ChatGPT1.25亿
1.25亿
未知bug Java 修复模板由人为手动和机器自动归纳;修复时根据AST挑选模板套用. 修复代码长度固定,灵活性较低;基于提示工程的工作较为基础. Repilot[1] InCoder
CodeT567亿
2.2亿bug Java 借助代码补全引擎指导大语言模型更高效生成补丁. 代码补全引擎会对搜索空间进行删减,补全引擎的可靠性无法被完全保证. TYPEFIX[42] CodeT5 2.2亿 error Python 自动挖掘缺陷修复代码,并基于挖掘代码自动总结修复模板. 有待进一步研究能否推广至不同缺陷类型、不同编程语言的缺陷修复. 3. 神经机器翻译模式的自动代码修复
神经机器翻译模式的自动代码修复能够充分利用海量开源项目中的缺陷修复知识,学习到多类型缺陷和多编程语言缺陷的修复技巧,直接提升了LLM技术的补丁生成能力,因此神经机器翻译模式的自动代码修复成为了APR领域的一个重要研究方向. 本节将首先介绍“神经机器翻译”任务的定义,接着深入分析在神经机器翻译任务下APR的工作模式与优势,之后详尽梳理和对比近年神经机器翻译模式下APR方案以及优缺点,最终归纳了神经机器翻译模式的APR技术所仍然面临的局限、原因和未来改进方向.
3.1 神经机器翻译任务下的APR技术概述
神经机器翻译指借助神经网络实现某种语言向另一种语言翻译的过程. 类似的,在LLM领域,NMT任务旨在使模型学习输入文本和输出文本的转化关系,且不局限于自然语言之间的翻译,例如在编程语言中,NMT可以将Python代码“翻译”为Java代码、由缺陷代码“翻译”为修复代码. 此任务的重点在于模型学习到输入序列和输出序列之间的映射关系,能够用于解决代码修复、代码翻译、代码总结等具体问题.
目前,学者们也将神经机器翻译技术应用于了APR领域. 神经机器翻译任务下的APR首先借助缺陷修复数据集,如由缺陷代码和修复代码组成的缺陷-修复对(bug-fix pair, BFP)[50]给LLM进行微调,学习缺陷代码向修复代码转化的规律. 经过微调后的大模型即可根据输入的缺陷代码,结合缺陷的类别、位置等额外信息根据已学到的缺陷修复技巧推理出缺陷代码的补丁.
神经机器翻译模式的APR技术的优点在于其能够在预训练-微调范式下充分利用开源项目中的海量代码. 特别是在微调阶段,大模型能够从海量涉及缺陷修复的代码变更中学习到多种缺陷的修复规则,直接提升大模型的补丁生成能力. 相比之下,尽管完形填空模式的APR技术[42]也能利用开源项目中的海量代码,但完形填空模式的APR技术仅能学习到缺陷修复的不同位置,而缺陷修复的更深层规律,如补丁中需要借助缺陷代码的哪些上下文、如何借助上下文内容构造补丁等补丁生成能力尚未得到提升.
表3总结了完形填空模式和神经机器翻译模式的优势和缺陷. 对比可知,完形填空模式和神经机器翻译模式在APR领域各有所长,因此存在各自适用的修复场景. 1)完形填空模式的APR技术对于大模型的适应能力强,在新款大模型发布后无需过多调整即可将新模型应用于代码修复任务,能够更快速的使用版本更新、能力更强的大模型. 同时完形填空模式的APR技术对数据集的依赖程度较低,由于如今LLM和APR技术发展迅速,数据集的质量仍在不断地提升. 在现有数据集缺陷种类缺失、缺陷种类分布不均衡、缺陷信息残缺等情况下,完形填空模式的APR技术能够依然保持较为稳定的修复水平. 2)神经机器翻译模式的APR技术拥有更强的学习能力,能够借助如今丰富的开源代码资源学习到更深层的缺陷修复技巧. 在拥有模型、训练集、算力等的支持下,LLM的缺陷修复能力能够在神经机器翻译模式下得到更显著的提升.
表 3 不同代码修复模式的对比Table 3. A Comparison of Different Program Repair Modes修复模式 大模型适应能力 数据集依赖程度 学习能力 完形填空 强 低 弱 神经机器翻译 弱 高 强 3.2 神经机器翻译模式的APR方案现状
在2021年,CURE[38]首次将大模型技术加入NMT模式的APR方案. CURE对GPT进行了约404万开源方法的训练,学习了丰富的句法知识,具备了生成出类似开发者所编写源码的能力. 并且CURE将预训练得到的GPT模型添加进CoNuT[35]的NMT模型,利用CoCoNuT[35]的APR数据集进行进一步微调,使得CURE不仅学习到了正确的代码句法,也学习到了充足的代码修复知识. 缓解了当时现有NMT方案所生成的补丁不仅包含句法错误,也包含能通过编译但无法修复缺陷的代码的问题. 此外,被当时APR方案所广泛使用的词级标记(word-level tokenization)将代码中每个新出现的单词视为1个单独的token记进词表,这将导致词表规模变得巨大,对于NMT模型来说此种计算成本不可接受. CURE借助字节对编码(byte pair encoding, BPE)技术,将编程语言中的单词进一步拆分成子词,借助子词的不同排列即可表示出多种单词,从而减小了词表的规模,提高了代码修复的效率.
此后,学者们从以下5个方面进一步完善了NMT模式的APR技术:更多缺陷类型、更多编程语言、代码语义指导、项目代码感知、丰富缺陷信息.
3.2.1 更多缺陷类型
软件缺陷可以具体分为3类:代码bug、编程错误和安全漏洞[2],现有的基于大模型的APR方案对代码bug[38]和编程错误[42]的修复已表现出不错效果,但由于安全漏洞的修复不仅需要填补漏洞还需要保证修复前后程序功能性的一致,难度相较修复代码bug和编程错误大,目前少有方案涉及. 因此VulRepair[9]和VulMaster[51]将NMT模式的代码修复技术应用于了安全漏洞的修复上.
在2022年,VulRepair[9]是首个将BPE技术与大型代码语料结合进T5大模型,以实现NMT模式漏洞代码修复的方案. 其发现使用经过预训练的LLM相比先前的安全漏洞代码修复方案能够提升30%~38%的漏洞修复能力. CURE指出在APR领域使用BPE能够减小词表规模并覆盖更多的正确补丁. VulRepair在此之上发现,不论大模型模型架构如何,使用BPE都能够提升9%~14%的漏洞修复能力,将CURE的这部分工作在安全漏洞修复上进行了验证. 此外,VulRepair将代码视作无结构的自然语言文本输入给大语言模型,而VulMaster则认为这难以让模型聚焦编程语言所特有的严格结构. 因此在VulRepair之上,于2024年,VulMaster[51]在NMT模式的漏洞代码修复中首次将树形结构的代码提供给大模型进行修复. 由于当前的CodeT5等大模型无法直接处理AST等树形结构的输入,VulMaster采用深度优先算法将漏洞代码的AST转化为树节点的序列提供给大模型,提升了模型对于代码复杂结构的理解,进一步提高了漏洞修复效果.
3.2.2 更多编程语言
大部分NMT模式的APR技术将代码修复的范围限定在单种编程语言之内,因为多种编程语言的编程规律和缺陷信息难以在一次微调中由LLM学习,而LLM在多次微调后会显著遗忘先前学习到的知识. 于是,为了将代码缺陷修复推广至多种编程语言,CIRCLE[52]首次在APR领域应用终身学习实现了跨语言代码修复. 在2022年,CIRCLE通过利用T5模型持续学习跨语言的bug修复规则,借助样本重放技术和基于可塑权重巩固的正则化技术来解决持续学习中的灾难性遗忘问题,实现了一个能够同时修复多种语言(C,Java,JavaScript,Python)的代码修复方案.
3.2.3 代码语义指导
在CURE的微调模式中,模型会在缺陷代码和数据集中对应的修复代码之间进行学习,以达到模型所预测补丁和数据集中修复代码完全一致的目的. 但事实上,对于一个缺陷来说正确的修复补丁存在着无穷多种写法,强制大模型生成与数据集中补丁完全一致的修复代码会导致模型过矫正. 在2022年,RewardRepair[53]基于此问题出发,将以往使用BFP进行训练的过程称为句法训练,在句法训练之上引入了新的辨别模型. 鉴别模型根据大模型所生成补丁执行结果的好坏放缩模型训练的损失,能够实现代码语义层面的训练. RewardRepair是第一个引入补丁辨别模型对大模型进行代码语义指导的方案,以此鼓励大模型生成更多可编译、语义上等价的补丁,缓解了先前方案使用BFP训练的过矫正的问题.
3.2.4 项目代码感知
先前NMT模式的APR方案在微调过程中考虑到模型过拟合的问题,普遍将用于训练的代码和实际中待修复的代码进行分离,即先使模型在其他数据集上学习缺陷修复的通用规则,再用于修复某一特定数据集. 但SelfAPR[54]认为此类修复模式会让模型失去对待修复代码所在项目的完整感知,从而限制大模型修复的能力. 因此,在2022年,SelfAPR[54]探索了自监督学习在APR领域的应用,在待修复代码项目的旧版本代码中加入扰动以形成大量与待修复代码项目相关联的样本供模型学习. 通过此种自监督学习,SelfAPR提高了NMT模型对于待修复代码所在整体项目的综合理解,使得即使部分重要token在待修复代码中少有出现,模型也能够成功生成出此类token. 而由于SelfAPR将待修复代码在经过扰动模型的改变后才加入训练,这也一定程度上缓解了模型过拟合的问题.
3.2.5 丰富缺陷信息
CURE在微调阶段采用的数据集为BFP的形式,即由1条待修复的缺陷代码和1条对应的修复代码组成. 随着APR技术的发展,学者们发现不仅可以将每条缺陷代码提供给NMT模型,将更丰富的缺陷信息提供给模型能进一步提升模型的修复效果.
在2022年,SelfAPR[54]首次将测试执行的报错信息,如编译器的报错信息、测试样例执行的报错信息,提取总结成诊断信息加入BFP的训练当中,使得模型不仅从BFP中学习修复代码,同时能够从诊断信息中提取丰富的关于bug类型的描述,能够让模型更加对症下药. 在2023年,RAP-Gen[55]受到了开发者debug时会搜索类似代码修复案例并从相关代码的修复例子中学习修复bug的启发,设计出了一个补丁检索器,负责搜索与待修复代码有关的BFP并提供给大模型生成候选补丁. RAP-Gen是第1个提出借助检索增强生成思想提供给大模型多条修复模板的方案,以此令模型学习到与待修复代码相关的多条BFP,提高了NMT模型生成正确补丁的数量. 在2024年,VulMaster[51]首次在APR领域借助融合解码器(fusion-in-decoder, FiD)将更丰富的缺陷信息提供给NMT模型. 由于NMT模型的编码器在接收大量输入时存在着编码长度上限,VulMaster借助FiD将大量输入组合后提供给大模型,以此解决了编码器对输入长度的限制问题,在漏洞代码修复时将更丰富的漏洞知识,如漏洞类型、漏洞的典型代码、漏洞的详细分析交给大模型进行修复,提高了漏洞修复的效果.
3.3 小 结
表4总结了现有NMT模式的APR方案,从不同大模型、不同模型规模、不同缺陷类型、不同编程语言等角度对比了现有方案. 总体而言,目前NMT模式的APR技术主要从如何修复更多类别的缺陷、如何修复更多编程语言的缺陷、如何提供给LLM更专业的代码语义指导、如何使NMT模型完整地感知缺陷项目的代码、如何提供给LLM更丰富的缺陷信息共5个方面展开. 现有的神经机器翻译模式的APR也仍面临着一些挑战,如较为依赖高质量的APR数据集、部分跨语言的缺陷修复规律难以学习. 未来可以尝试在安全漏洞的缺陷修复中借助漏洞证明(proof-of-vulnerability, PoV)从语义上判断补丁是否有效,以更加精准的提升模型的漏洞修复能力;或者将跨语言修复中难以学习的特性提前归纳成统一表示,减轻模型学习的压力.
表 4 神经机器翻译模式的自动代码修复方案Table 4. NMT Style APR Approaches方案 大语言模型 模型规模 缺陷类型 语言 特点 不足 CURE[38] GPT 未知 bug Java 提出编号有效性检查技术和长度控制技术提高修复率. 对GPT进行预训练的成本高;使用的NMT模型为卷积神经网络,能力弱于基于Transformer的NMT大模型. VulRepair[9] CodeT5 2.2亿 vul C 在漏洞代码修复中引入BPE提高了修复效率和修复效果. 漏洞数据集缺少测试样例,无法对漏洞代码的语义进行判断;将漏洞代码视为文本提供给LLM,丢失了部分代码结构信息. VulMaster[51] CodeT5 2.2亿 vul C/C++ 利用融合解码器将更丰富的漏洞信息和更高级的代码表示提供给大语言模型进行修复. 漏洞数据集缺少测试样例,无法对漏洞代码的语义进行判断. CIRCLE[52] T5 2.2亿 bug Java
Python
JavaScript
C借助终身学习实现了跨语言的代码修复. 不同编程语言之间仍然存在部分特性无法被跨语言学习,会导致OOV问题. RewardRepair[53] T5 2.2亿 bug Java 引入补丁辨别模型实现了LLM语义训练. 语义训练采用的数学放缩模型较为简单,分类依据可以继续细化. SelfAPR[54] T5 2.2亿 bug
errorJava 将测试执行诊断信息添加进修复流程,提升了修复能力;利用自监督学习提升了项目代码的完整感知能力. 自监督学习设计的代码扰动引擎仅针对Java语言部分缺陷设计,有待进一步推广至更多语言. RAP-Gen[55] CodeT5 2.2亿 bug
errorJava
JavaScript在代码修复中引入检索增强生成思想提高了代码的语义和词法的感知. 补丁评价指标采用完全一致匹配,无法对补丁的语义进行评估. 4. 数据集与评价指标
数据集直接参与模型的训练和评估,数据集的质量深刻地影响着大模型的代码修复效果[19]. 评价指标是评价APR方案效果好坏的标准,量化地体现了不同APR方案在多维度上效果的差异. 数据集和评价指标是APR领域的重要组成部分,因此本节将分析和归纳现有数据集、评价指标之间的差异,供未来APR学者们对比并选择.
4.1 数据集
完形填空模式的APR和NMT模式的APR都需要数据集的参与. 数据集可以作为基准评价模型的代码修复能力,也可以作为模型的训练集帮助模型学习代码修复的相关知识. 得益于自动代码修复社区的大量研究,当前存在许多优秀的数据集.
表5中展示了本篇综述中涉及的基于LLM的APR方案所使用的数据集. 第1列列出了数据集的名称,第2, 3列分别列举了数据集所涉及的编程语言和缺陷类型,其中bug代表程序bug,vul代表安全漏洞,error代表编程错误. 第4列记录了每个数据集所包含的缺陷的数量. 第5~7列分别记录了数据集是否有测试集合、是否被作为训练集使用、是否被作为基准使用.
表 5 数据集详情Table 5. Detailed Information on Datasets数据集 语言 缺陷类型 缺陷数量 测试集合 训练集 基准 VulRepair dataset[9] C/C++ vul 8 482 无 是 是 VJBench[19] Java vul 42 有 否 是 VJBench-trans[19] Java vul 150 有 否 是 CPatMiner dataset[34] Java bug 44k 无 是 否 CoCoNuT dataset[35] C,Java,JavaScript,Python bug 24M 无 是 否 Prenner等人[39] Java,Python bug 708 215 无 是 是 LMDefects[41] Java bug,error 113 有 是 是 HumanEval-Java[50] Java bug 173 有 否 是 SelfAPR dataset[54] Java bug,error 1 039 873 有 是 否 Defects4J v1.2[56] Java bug 395 有 否 是 Defects4J v1.4.0[56] Java bug 438 有 否 是 Defects4J v2.0[56] Java bug 835 有 是 是 Recoder dataset[57] Java bug 103 585 无 是 否 BFP S[58] Java bug 58 350 无 是 是 BFP M[58] Java bug 65 454 无 是 是 QuixBugs[59] Java,Python bug 40 有 否 是 SequenceR dataset[60] Java bug 40 289 无 是 是 Tfix dataset[61] JavaScript bug 100k 无 是 是 Big Vul dataset[62] C/C++ vul 3 754 无 是 是 CVEFixes v1.0.0[63] C/C++ vul 5 495 无 是 是 ManyBugs[64] C bug 185 有 否 是 Vul4J[65] Java vul 79 有 否 是 BugAID[66] JavaScript bug 105k 无 否 是 Bugs.jar[67] Java bug 1 158 有 否 是 MegaDiff[68] Java bug 663 029 无 是 是 Bears[69] Java bug 251 有 是 否 CodRep[70] Java bug 58 069 无 是 否 TSSB-3M[71] Python bug 3M 无 是 是 ManySStuBs4J[72] Java bug 153 652 无 否 是 从编程语言和缺陷类型上来看,表中大多数都是Java语言的代码bug数据集,其中最广为使用的是Defects4J[56]数据集. 在Defects4J v1.2中收集了6个开源Java项目中共395个可复现的bug,每个bug都包含了完整的项目bug代码、项目修复代码和测试样例,且在大量方案中都被使用[1-2,20,37,40,52-53,55]. 而在Defects4J v2.0中,其共收集了来自17个开源Java项目中共835个bug. 作为一个更新、更丰富的数据集,部分自动代码修复方案[1-2,20,37,40,53-55]直面了该挑战,开始使用Defects4J v2.0来评估其对于代码修复的综合能力.
从缺陷数量上来看,数据集的规模各有不同,从40条数据到2 400万条数据不等,这和数据集的构建难度有关. 例如规模较小的Defects4J数据集中包含了bug代码更为全面的信息,包括完整的项目代码、足够的测试样例等,这在现实中是较难被获取的. 而在规模较大的数据集中,数据主要仅以BFP的形式出现. 大规模数据集依靠缺陷数量上的优势,尽管牺牲了部分完整项目的信息和测试样例,仍然能满足代码大语言模型学习代码修复模式的需求. 并且得益于代码开源平台的存在,大规模BFP数据集的构建更为简单. 以表5缺陷数量最多的CoCoNuT数据集[35]为例,其获取GitHub平台中开源项目的commit信息,根据一些代码修复的英文关键词(fix,bug,patch)筛选出涉及到代码修复的代码变更,从而构建出了一个包含大量缺陷、不同语言、不同缺陷类型的数据集.
此外,数据集还可以从是否包含测试集合、是否被作为训练集和是否被作为基准进一步讨论. 测试集合是一系列能够触发缺陷的测试样例的集合. 在自动代码修复领域,带有测试集合的数据集通常被作为基准,用来评价生成的补丁正确性. 而带有测试集合的数据集较少作为训练集出现,原因有如下2点:1)受数据集规模所制约,由于测试样例的公开程度远低于代码的开源程度,此类数据集构建的难度大,现有的数据集规模较小;2)当数据集同时作为训练集和基准时会导致模型过拟合,错误地量化模型的代码修复能力. 不带测试集合的数据集则既可以作为训练集,也可以作为基准. 这是由于BFP中包含着代码修复的丰富知识,大模型可以从中学习代码修复模式,并且此类数据集规模足够支撑划分训练集和测试集,通过对比大模型所生成的补丁与现实中修复代码的差异可以判断出补丁生成的对错.
近年也有学者在论文中贡献出了全新的数据集,以解决现有数据集在APR任务上存在的一些问题. Wu等人[19]创建了一个全新的Java安全漏洞修
复数据集. 为了消除数据集的部分代码已经在大语言模型训练时被学习过,从而对基准评价能力产生的影响,Wu等人利用代码变形技术,将漏洞代码变形成语义等价的代码,创建了评价漏洞修复能力的VJBench-trans数据集. SelfAPR[54]则基于Defects4J v2.0构造了首个大规模的带有测试集合的数据集,其使用代码扰动技术对Defects4J的项目代码进行扰动,构造出了超过100万条数据的数据集. 其利用扰动生成的一系列代码依然适用于原先Defects4J的测试集合,在没有扩大测试集合的前提下扩大了测试集合所适用的代码数量,应对了前文提及的带有测试集合数据集数据量小的难题.
4.2 评价指标
在自动代码修复领域,评价指标的作用在于量化地评价自动代码修复方案效果的好坏,目前主要存在2种不同的指标:基于执行的指标和基于匹配的指标[5],如表6所示:
基于执行的指标. 基于执行的指标涉及代码能否编译运行和能否通过测试样例,这需要代码运行环境和测试集合的参与. 编译通过率体现了大语言模型对于编程语言句法掌握的好坏. 测试样例通过率体现所生成的补丁能否从功能上修复原有的缺陷并且是否改变原来代码的功能性.
基于匹配的指标. 基于匹配的指标涉及到缺陷代码和修复代码之间的相似性. 匹配大模型所生成补丁和开发作者所编写补丁的内容是否一致可以判断补丁的正确性. 通过人工判断补丁语义上是否等价也可以用于判断补丁正确性.
总的来说,各个评价指标各有侧重. 基于执行的指标更加注重自动化程度,在有运行环境或测试集合的支撑下,可以自动化的评估补丁的准确性,但由于需要经过编译、运行测试样例,所消耗的时间相对较高. 基于匹配的指标则解决了许多开源代码缺少运行环境、缺少公开测试集合的困难. 其通过完全一致匹配牺牲部分语义上等价的补丁,以更快的速度完成评判. 也可以引入人工判断补丁的语义来较为准确的判断此类难评判代码.
5. 实证研究
自动代码修复领域中,在研究新的代码修复方案之外,也有学者进行了实证研究,将自动代码修复流程中不同实验设置对于修复能力的影响进行对比,分析了实验结果中隐含的逻辑,同样推进了自动代码修复领域的发展. 本节将近年的实证研究按照研究内容的不同分为4个类别,并分别总结了实验中的关键发现,归纳出现有实证研究对未来APR工作的指导.
5.1 大模型生成范围
Xia等人[37]进行了首个直接利用大语言模型进行自动代码修复的实证研究. 其设计了3种实验设置来比较大模型的bug修复能力:利用大语言模型生成完整的函数、根据上下文生成多行代码、根据上下文生成单行代码. 通过对比发现,大语言模型在后2种设置中能表现出优于第1种设置的代码修复能力. 原因在于对于第1种设置,生成完整的函数需要模型依靠自己的能力成功定位到缺陷,再给出合适的补丁,这对于大模型来说不仅需要强大的代码修复能力,还需要对缺陷定位任务有熟练度. 对于后2种设置,缺陷的位置已经事先定位完毕,因此模型只需根据缺陷代码的上下文生成修复代码. 这一研究结果揭示了现有LLM在APR领域的出色潜力,未来的工作可以借助LLM更丰富的缺陷相关信息,如缺陷所在项目的代码,可以使LLM熟悉缺陷项目的编程风格,进一步提升LLM的代码修复效果,或探索其他大模型,如ChatGPT以对话形式进行代码修复的效果.
5.2 大模型微调设置
Huang等人[2]对比了不同大模型在NMT模式下对软件bug、安全漏洞、编程错误的修复能力. 经过实验发现,对于全部3种缺陷大语言模型都相较于现有基于深度学习的方案表现更佳,且对更难修复的代码缺陷也具有潜力. 此外,Huang等人[2]发现,在微调过程中,不同的设计,如不同的代码抽象、代码表示和根据不同评价指标得到的大模型的选择会影响到修复的效率.Huang等人[2]也揭示了微调范式下模型修复能力受限的一些问题,如算力的限制和修复成分的不足. 这一研究为未来微调LLM进行缺陷修复提供了指导,例如可以进行轻量化微调(parameter efficient fine-tuning, PEFT),或将高级代码表示,如树或图形式的代码进行微调,以面对算力限制和修复成分不足的问题.
5.3 安全漏洞类型的缺陷修复
Wu等人[19]进行了首个大语言模型修复Java安全漏洞的实证研究,其对比了前沿的APR技术、未经微调的大模型和经过微调的大模型修复Java安全漏洞的效果. Wu等人[19]发现,前沿的APR技术和未经微调的大模型对于漏洞代码的修复能力上欠佳,表现最好的Codex仅能修复20.4%的漏洞代码. 而经过微调的大模型够修复更多的安全漏洞,这表明了大语言模型对于漏洞修复具有一定的潜力. 但经过微调后的模型仍然存在着一些问题,比如能够修复的漏洞种类较少,修复能力局限于只涉及简单修改的漏洞,对于代码句法知识学习能力不足,所生成候选补丁的编译率也较低. 未来的工作可以构造包含更多漏洞类别、规模更大的漏洞修复数据集,或在漏洞修复领域探索少样本学习的效果,提升模型对安全漏洞修复的理解.
5.4 缺陷代码的上下文窗口
Prenner等人[39]对缺陷代码的上下文展开了实证研究,将6种不同的上下文窗口位置,4种不同的上下文窗口大小进行了对比. 上下文窗口位置指缺陷代码上下文行数的比例,Prenner等人[39]在上下文窗口位置上制定了如下实验设置:仅上文、80%上文、60%上文、50%上文、40%上文、20%上文和仅下文,通过对比发现最优的窗口位置设置在不同数据集和不同的窗口大小上不一致,总的来说60%上文40%下文的设置在各个数据集上均有较优的表现;上下文窗口大小指缺陷代码上下文的行数,Prenner等人[39]在上下文窗口大小上进行了上下文各1行至上下文各28行的实验,是首个在大窗口下进行微调的工作. 通过对比发现,丰富的上下文内容能够提高模型成功修复缺陷的个数,某些在修复时需要使用上下文出现过的变量名、方法名等特定信息的缺陷能够在上下文窗口的增加下显著提升被修复率. 这一研究不仅为未来的APR方案提供了上下文实验设置的指导,也为APR数据集的发展提供了指引. 在实验中,Prenner等人[39]发现TSSB-3M和ManySStuBs4J数据集所无法提供足够的上下文内容,因此未来需要为APR数据集补充更丰富的上下文信息以提高模型修复能力.
5.5 小 结
目前在APR领域不仅有大量工作基于LLM设计代码修复的方案,也有大量对基于LLM的APR技术展开的实证研究. 现有的实证研究从大模型生成范围、大模型微调设置、安全漏洞类型的缺陷修复和缺陷代码的上下文窗口等角度分别对LLM在APR中的应用展开了分析,本节在总结出实证研究的关键发现之上,归纳出了实证研究为未来工作方向的指引.
6. 未来展望
随着LLM的迅速发展,自动代码修复技术进入了新的高速发展阶段. 通过回顾近年基于LLM的APR技术结合对实证研究的总结,我们将在本节指出对于在APR领域使用LLM的一些挑战并给出未来工作方向的展望.
6.1 提升APR修复效率
APR技术的修复效率代表缺陷被修复时所花费的时间和算力成本,更高的修复效率不仅能够节省缺陷修复的花费,扩大APR应用的覆盖范围,还能在更短的时间窗口期内修复缺陷,减小软件缺陷对系统和数据造成的危害. 在APR领域,目前影响代码修复效率的主要挑战是“未登录词”(out-of-vocabulary, OOV)问题,即当模型在推理的时候遇到了词表之外的词,难以根据现有的词表表示这类新词. 特别是,在自动代码修复领域,编程语言中变量名、方法名、类名等单词的书写自由度极高,传统的自然语言处理中的词级标记方法会导致词表规模显著增大、词与词之间、token与token之间的语义被稀释,最终使得运算成本增加,修复效率降低.
目前针对OOV问题,主流的方法是使用子词级标记来提高词表的质量,例如部分方案[2,9,38,44]使用的BPE,AlphaRepair[20]使用的字节级字节对编码(byte-level BPE, BBPE)和部分方案[52-54]使用的句子片段(sentence piece),但此类方案的泛化能力没有得到验证. 此外,CIRCLE[52]发现将APR技术推广到修复多种编程语言缺陷的时候,子词级标记也依然面临着OOV问题,无法理解与生成部分重要token.
未来在面临更大规模的代码语料时,为了提升代码修复效率,可以从以下3方面展开研究:1)词表压缩的方法. 在不影响模型性能的前提下,缩小词表的规模,进而降低运算的成本. 2)人机结合的词表设计方法. 在自动化分词的基础上,借助领域专家经验,提升词表的质量. 3)词表特征与修复效率间的实证研究. 对不同代码大模型使用的分词方案展开详细的实证研究,分析不同词表规模、不同分词策略对OOV和修复效率的影响.
6.2 提升APR补丁质量
补丁质量代表APR技术所能修复缺陷的种类和难度,更高的补丁质量能够消除缺陷为软件系统和数据要素带来的更多威胁. 随着LLM和APR技术的发展,现有的代码大语言模型已经对于处理编程语言有了超出以往的能力,且部分代码逻辑简单、代码结构简单的缺陷已经能被妥善修复. 但仍存在部分复杂的代码LLM不仅无法理解,更无法生成其中缺陷的修复补丁. 此外,代码修复任务是一个较为精细的任务,大模型的预训练任务和代码修复任务仍有较大的差距,这直接影响了大模型生成补丁的质量.
为了提升APR补丁质量,现有的工作借助AST的形式将树状代码结构提供给了CodeT5模型[51],证明了将代码的更高级结构展示给LLM能够提高复杂代码的理解能力. 但由于CodeT5不能直接处理树状结构的代码输入,目前依然需要借助树的遍历策略将AST转换成序列的形式供大模型修复,增大了模型理解代码的难度.
未来的学者们可以尝试以下4个方向以提高补丁质量:1)优化微调设计. 在预训练-微调范式下进一步优化微调的设计,除去仅将缺陷代码提供给LLM,还可以在模型微调的过程中加入更多代码修复的专业元素,比如缺陷类型、缺陷成因、缺陷触发信息等额外数据,帮助模型进一步提高补丁的质量. 2)探索提示学习. 在提示工程的基础之上探索提示学习在APR领域的潜力,缩小模型预训练任务与代码修复任务的差距. CodeT5p[18]已经证明由提示学习引出的指令微调(instruction tuning)技巧相比普通微调在处理零样本任务有着更突出的能力. 3)采用代码高级表示. 探索其余代码结构的高级表示对代码缺陷修复的影响,比如程序的控制流图(control-flow graph, CFG)或数据流图(data-flow graph, DFG)等图结构和中间表示(intermediate representation, IR)的代码表示. 4)利用感知代码结构的大模型. 探索能够直接处理树、图等输入的LLM对代码修复任务的处理能力,如GraphCodeBERT[73],AST-T5[74]等,提升LLM对复杂代码结构的感知从而提升补丁质量. 5)探索国产大模型. 探索国产大模型在APR领域的潜力,如PanGu-Coder2[75],CodeFuse[76]等. 国产大模型中使用的许多前沿学习技术有助于LLM生成更高质量的补丁,PanGu-Coder2证明强化学习技术可以利用代码调试、执行、测试、验收中的反馈信息提升LLM的代码生成能力,CodeFuse借助指令微调技术提升了LLM完成多种代码任务的能力.
6.3 强化APR泛化能力
泛化的APR指能够修复多种编程语言类型、多种缺陷类型、多个修复位置、多种代码长度的代码修复技术. 拥有更强的泛化性能够提升APR技术的扩展性和适用性,使得APR在更多系统中消除软件缺陷对数据安全造成的威胁. 现有APR方案重点解决特定缺陷种类或特定编程语言的代码修复,而忽视了代码修复工具跨缺陷、跨语言的泛化能力. 这是由于目前缺少对现有缺陷和编程语言的归纳分析,无法总结出共性的知识供LLM学习. 此外,当前被研究的缺陷被局限在了单段代码的缺陷上,即仅限1处连续代码修改的缺陷上. 对于多段代码的自动修复领域少有探索. 其首要原因是由于多段代码的修复难度要显著的高于单段代码的修复难度,导致鲜有方案能够泛化至此类任务. 并且由于当前LLM的输入长度存在限制,APR方案往往需要将缺陷代码的上下文根据长度限制截断,导致丢失部分缺陷上下文信息,无法泛化至较长代码的缺陷修复中.
目前,已有部分方案尝试提升APR技术的泛化能力,但仍面临着一些挑战. CIRCLE[52]借助终身学习得到了一个能够修复跨编程语言的APR模型,但缺陷类型限制在了代码bug之中. Huang等人[2]将多段缺陷的位置标记给大模型进行了NMT模式的多段代码缺陷修复,但发现随着缺陷待修复位置的增加,其方案的修复效果会显著地下降. Ye等人[77]将多段缺陷的修复拆分为多次单段代码修复,每次仅对1个待修复位置的代码进行修复. 其方案根据编译错误数量的减少和测试样例通过数量的增大判断单段修复在缺陷修复中的有效性. 但现实中,不是所有多段缺陷的表现都会随着单段代码的正确修复而改变,这部分缺陷在此模式下无法被成功拆分.
未来,学者们可以尝试从4个方向构建泛化的APR技术:1)归纳共性知识. 总结不同缺陷种类、不同编程语言之间的共性特征,例如XSS漏洞修复时可以在变量前加入编码函数修复,而类型错误(type error)修复时可以类似的在变量前加入强制类型转换声明修复. 将归纳的共性知识供LLM学习提高泛化能力. 2)采用更多学习策略. 结合先进的泛化能力强的模型训练方法,例如多任务学习(multi-task learning, MTL)、集成学习(ensemble learning)等,进而强化模型的泛化能力. 3)扩充修复成分. 深入地探索单段代码修复在多段缺陷中的效果,例如组合多处单段修复联合判断缺陷修复的有效性,将更多单段修复的补丁利用至多段代码修复中. 4)提高上下文价值. 将更有修复价值的上下文提供给LLM,例如借助代码切片技术[78]或程序分析技术[79]将长代码问题转化成较短代码修复.
6.4 全流程缺陷修复
在现实中完整的修复一个缺陷不仅依赖APR的补丁生成技术,也需要编程领域的其他方向配合完成,例如提供缺陷所需修复具体位置的缺陷定位技术和判断补丁是否修复缺陷、是否改变代码功能和是否带来额外缺陷的补丁评估技术等. 随着LLM技术的发展,越来越多基于LLM的APR技术被提出,大多数方案将重点放在了利用LLM进行缺陷补丁的生成上. 而LLM技术在缺陷定位技术和补丁评估技术的潜力尚待挖掘. 因此目前仍然需要从缺陷修复各个阶段进行强化,构建全流程的缺陷修复.
未来,可以尝试以下2个方向进一步强化APR的修复能力,实现全流程缺陷修复:1)提升缺陷定位效果. 进一步深入挖掘LLM的能力,将缺陷代码与运行报错等代码异常信息利用到缺陷定位领域,结合LLM实现更精准、多位置、跨缺陷类别的缺陷定位技术. 2)提升补丁评估能力. 在现有的补丁评估技术之上借助LLM生成高质量的测试样例,或借助其他程序测试技术如模糊测试或符号执行[80]判断补丁有效性.
7. 总 结
本文从数据要素安全的角度分析了软件系统和APR技术的重要性,系统性地回顾了近年APR领域的先进工作,并且对基于LLM的APR技术进行了深入的归纳分析. 根据APR的不同设计模式,我们将现有的基于LLM的APR方法分为了2类:完形填空模式和神经机器翻译模式,并且详细分析比较了每一类的技术特点、优势、发展方向. 此外,我们对现有的数据集、评价指标以及现有的实证研究进行了归纳总结. 最终我们总结了近年的文献,指出了继续借助LLM推动APR发展的挑战和未来工作方向.
作者贡献声明:许鹏宇负责文献收集和整理,以及撰写论文;况博裕负责论文修订;苏铓负责部分论文修订;付安民负责整体架构规划,以及论文修订.
-
表 1 多模态实体链接的任务设定与代表工作
Table 1 Task Settings and Representative Work of Multimodal Entity Linking
表 2 模型性能
Table 2 Performance of Models
% 评测指标 模型 实体库规模 1.3万 12万 Accuracy CLIP-Zero[34] 54.33 45.53 CLIP-InfoNCE[1] 64.03 53.87 CLIP-SC(本文) 64.81 56.96 CLIP-SC-HN(本文) 66.21 58.43 Recall@10 CLIP-Zero 78.37 67.74 CLIP-InfoNCE 86.87 76.75 CLIP-SC(本文) 87.30 77.97 CLIP-SC-HN(本文) 88.04 79.14 MRR@10 CLIP-Zero 62.28 52.79 CLIP-InfoNCE 71.78 61.36 CLIP-SC(本文) 72.40 63.92 CLIP-SC-HN(本文) 73.62 65.25 注:黑体数值表示最优结果. -
[1] Sun Wen, Fan Yixing, Guo Jiafeng, et al. Visual named entity linking: A new dataset and a baseline [C] // Proc of the Empirical Methods in Natural Language Processing. Stroudsburg, PA: ACL, 2022: 2403−2415
[2] Liu Fuxiao, Wang Yinghan, Wang Tianlu, et al. Visual news: Benchmark and challenges in news image captioning [C] // Proc of the Conf on Empirical Methods in Natural Language Processing. Stroudsburg, PA: ACL, 2021: 6761−6771
[3] Abdelnabi S, Hasan R, Fritz M. Open-domain, content-based, multi-modal fact-checking of out-of-context images via online resources [C] // Proc of the IEEE Conf on Computer Vision and Pattern Recognition. Piscataway, NJ: IEEE, 2022: 14920−14929
[4] Bouquet P, Stoermer H, Giacomuzzi D, et al. OKKAM: Enabling a Web of entities [C/OL] // Proc of the WWW Workshop I3: Identity, Identifiers, Identification, Entity-Centric Approaches to Information and Knowledge Management on the Web. New York: ACM, 2007 [2024-06-24]. https://ceur-ws.org/Vol-249/submission_150.pdf
[5] Milne D, Witten I. Learning to link with Wikipedia [C] // Proc of the 17th ACM Conf on Information and Knowledge Management. New York: ACM, 2008: 509−518
[6] Moro A, Raganato A, Navigli R. Entity linking meets word sense disambiguation: A unified approach[J]. Transactions of the Association for Computational Linguistics, 2014, 2: 231−244 doi: 10.1162/tacl_a_00179
[7] Ferragina P, Scaiella U. Tagme: On the-fly annotation of short text fragments (by Wikipedia entities) [C] // Proc of the 19th ACM Int Conf on Information and Knowledge Management. New York: ACM, 2010: 1625−1628
[8] Devlin J, Chang Mingwei, Lee K, et al. BERT: Pre-training of deep bidirectional transformers for language understanding [C] // Proc of the Annual Conf of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies. Stroudsburg, PA: ACL, 2019: 4171−4186
[9] Yamada I, Washio K, Shindo H, et al. Global entity disambiguation with BERT [C] // Proc of the Conf of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies. Stroudsburg, PA: ACL, 2022: 3264−3271
[10] Cao N, Izacard G, Riedel S, et al. Autoregressive entity retrieval [C/OL] // Proc of the 9th Int Conf on Learning Representations. OpenReview. net, 2021 [2024-06-24]. https://openreview.net/forum?id=5k8F6UU39V
[11] Logeswaran L, Chang Mingwei, Lee K, et al. Zero-shot entity linking by reading entity descriptions [C] // Proc of the 57th Annual Meeting of the Association for Computational Linguistics. Stroudsburg, PA: ACL, 2019: 3449−3460
[12] Wu L, Petroni F, Josifoski M, et al. Scalable zero-shot entity linking with dense entity retrieval [C] // Proc of the Conf on Empirical Methods in Natural Language Processing. Stroudsburg, PA: ACL, 2020: 6397−6407
[13] Moon S, Neves L, Carvalho V. Multimodal named entity disambiguation for noisy social media posts [C] // Proc of the 56th Annual Meeting of the Association for Computational Linguistics. Stroudsburg, PA: ACL, 2018: 2000−2008
[14] Zhou Xingchen, Wang Peng, Li Guozheng, et al. Weibo-mel, wikidata-mel and richpedia-mel: Multimodal entity linking benchmark datasets [C] // Proc of the 6th Knowledge Graph and Semantic Computing: Knowledge Graph Empowers New Infrastructure Construction. Berlin: Springer, 2021: 315−320
[15] Wang Sijia, Li A, Zhu Henghui, et al. Benchmarking diverse-modal entity linking with generative models [C] // Proc of the 61st Association for Computational Linguistics. Stroudsburg, PA: ACL, 2023: 7841−7857
[16] Zhang Gongrui, Jiang Chenghuan, Guan Zhongheng, et al. Multimodal entity linking with mixed fusion mechanism [C] // Proc of the 28th Int Conf on Database Systems for Advanced Applications. Berlin: Springer, 2023: 607−622
[17] Wang Xuwu, Tian Junfeng, Gui Min, et al. WikiDiverse: A multimodal entity linking dataset with diversified contextual topics and entity types [C] // Proc of the 60th Annual Meeting of the Association for Computational Linguistics. Stroudsburg, PA: ACL 2022: 4785−4797
[18] Zhang Li, Li Zhixu, Yang Qiang. Attention-based multimodal entity linking with high-quality images [C] // Proc of the 26th Int Conf on Database Systems for Advanced Applications. Berlin: Springer, 2021: 533−548
[19] Yang Chengmei, He Bowei, Wu Yimeng, et al. MMEL: A joint learning framework for multi-mention entity linking [C] // Proc of the 39th Conf on Uncertainty in Artificial Intelligence. New York: PMLR, 2023: 2411−2421
[20] Wang Peng, Wu Jiangheng, Chen Xiaohang. Multimodal entity linking with gated hierarchical fusion and contrastive training [C] // Proc of the 45th Int ACM SIGIR Conf on Research and Development in Information Retrieval. New York: ACM, 2022: 938−948
[21] Adjali O, Besançon R, Ferret O, et al. Building a multimodal entity linking dataset from tweets [C] // Proc of the 12th Language Resources and Evaluation Conf. Paris: European Language Resources Association, 2020: 4285−4292
[22] Adjali O, Besançon R, Ferret O, et al. Multimodal entity linking for tweets [C] // Proc of the 42nd European Conf on Information Retrieval. Berlin: Springer, 2020: 463−478
[23] Gan Jingru, Luo Jinchang, Wang Haiwei, et al. Multimodal entity linking: A new dataset and a baseline [C] // Proc of the 29th ACM Int Conf on Multimedia. New York: ACM, 2021: 993−1001
[24] Yang Zhishen, Okazaki N. Image caption generation for news articles [C] // Proc of the 28th Int Conf on Computational Linguistics. Stroudsburg, PA: ACL, 2020: 1941−1951
[25] Hu Anwen, Chen Shizhe, Jin Qin. Icecap: Information concentrated entity-aware image captioning [C] // Proc of the 28th ACM Int Conf on Multimedia. New York: ACM, 2020: 4217−4225
[26] Fukui A, Park D, Yang D, et al. Multimodal compact bilinear pooling for visual question answering and visual grounding [C] // Proc of the Conf on Empirical Methods in Natural Language Processing. Stroudsburg, PA: ACL, 2016: 457−468
[27] Kim J, On K, Lim W, et al. Hadamard product for low-rank bilinear pooling [C/OL]// Proc of the 4th Int Conf on Learning Representations. OpenReview. net, 2016 [2024-06-24]. https://openreview.net/forum?id=r1rhWnZkg
[28] Younes H, Cadene R, Cord M, et al. Mutan: Multimodal tucker fusion for visual question answering [C] // Proc of the IEEE Int Conf on Computer Vision. Piscataway, NJ: IEEE, 2017: 2631−2639
[29] Younes H, Cadene R, Thome N, et al. Block: Bilinear superdiagonal fusion for visual question answering and visual relationship detection [C] // Proc of the 33rd AAAI Conf on Artificial Intelligence. Palo Alto, CA: AAAI, 2019: 8102−8109
[30] Szegedy C, Ioffe S, Vanhoucke V, et al. Inceptionv4, inception-ResNet and the impact of residual connections on learning [C] // Proc of the 31st AAAI Conf on Artificial Intelligence. Palo Alto, CA: AAAI, 2017: 4278−4284
[31] Hochreiter S, Schmidhuber J. Long short-term memory[J]. Neural Computation, 1997, 9(8): 1735−1780 doi: 10.1162/neco.1997.9.8.1735
[32] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need [C] // Proc of the 31st Advances in Neural Information Processing Systems. Cambridge, MA: MIT, 2017: 6000–6010
[33] Dosovitskiy A, Beyer L, Kolesnikov A, et al. An image is worth 16×16 words: Transformers for image recognition at scale [C/OL] // Proc of the 9th Int Conf on Learning Representations. OpenReview. net, 2021 [2024-06-24]. https://openreview.net/forum?id=YicbFdNTTy
[34] Radford A, Kim J, Hallacy C, et al. Learning transferable visual models from natural language supervision [C] // Proc of the 38th Int Conf on Machine Learning. New York: PMLR, 2021: 8748−8763
[35] Liu Yinhan, Ott M, Goyal N, et al. RoBERTa: A robustly optimized bert pretraining approach [C/OL] // Proc of the 7th Int Conf on Learning Representations. OpenReview. net, 2019 [2024-06-24]. https://openreview.net/forum?id=SyxS0T4tvS
[36] Wang Feng, Liu Huaping. Understanding the behaviour of contrastive loss [C] // Proc of the IEEE/CVF Conf on Computer Vision and Pattern Recognition. Piscataway, NJ: IEEE, 2021: 2495−2504
[37] Chen Ting, Kornblith S, Norouzi M, et al. A simple framework for contrastive learning of visual representations [C] // Proc of the 37th Int Conf on Machine Learning. New York: PMLR, 2020: 1597−1607
[38] He Kaiming, Fan Haoqi, Wu Yuxin, et al. Momentum contrast for unsupervised visual representation learning [C] // Proc of the IEEE/CVF Conf on Computer Vision and Pattern Recognition. Piscataway, NJ: IEEE, 2020: 9729−9738
[39] Cao Qiong, Shen Li, Xie Weidi, et al. VGGFace2: A dataset for recognising faces across pose and age [C] // Proc of the 13th IEEE Int Conf on Automatic Face & Gesture Recognition. Piscataway, NJ: IEEE, 2018: 67−74
[40] He Kaiming, Zhang Xiangyu, Ren Shaoqing, et al. Deep residual learning for image recognition [C] // Proc of the IEEE Conf on Computer Vision and Pattern Recognition. Piscataway, NJ: IEEE, 2016: 770−778
[41] Loshchilov I, Hutter F. Decoupled weight decay regularization [C/OL] // Proc of the 7th Int Conf on Learning Representations. OpenReview. net, 2019 [2024-06-24]. https://openreview.net/forum?id=Bkg6RiCqY7
[42] Jeff J, Matthijs D, Herve J. Billion-scale similarity search with GPUs[J]. IEEE Transactions on Big Data, 2019, 7(3): 535−547
[43] Robinson J, Chuang C, Sra S, et al. Contrastive learning with hard negative samples [C/OL] // Proc of the 9th Int Conf on Learning Representations. OpenReview. net, 2021 [2024-06-24]. https://openreview.net/forum?id=CR1XOQ0UTh-
[44] Kalantidis Y, Sariyildiz M, Pion N, et al. Hard negative mixing for contrastive learning [C] // Proc of the 34th Advances in Neural Information Processing Systems. Cambridge, MA: MIT, 2020: 21798−21809
[45] Zhou Bolei, Khosla A, Lapedriza A, et al. Learning deep features for discriminative localization [C] // Proc of the IEEE Conf on Computer Vision and Pattern Recognition. Piscataway, NJ: IEEE, 2016: 2921−2929