CN117634615A - 一种基于模态无关对比学习的多任务代码检索方法 - Google Patents
一种基于模态无关对比学习的多任务代码检索方法 Download PDFInfo
- Publication number
- CN117634615A CN117634615A CN202311687907.5A CN202311687907A CN117634615A CN 117634615 A CN117634615 A CN 117634615A CN 202311687907 A CN202311687907 A CN 202311687907A CN 117634615 A CN117634615 A CN 117634615A
- Authority
- CN
- China
- Prior art keywords
- code
- question
- answer
- data
- model
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 47
- 239000013598 vector Substances 0.000 claims abstract description 75
- 238000012549 training Methods 0.000 claims abstract description 45
- 238000001914 filtration Methods 0.000 claims abstract description 9
- 230000006870 function Effects 0.000 claims description 33
- 239000011159 matrix material Substances 0.000 claims description 17
- 230000011218 segmentation Effects 0.000 claims description 15
- 238000011156 evaluation Methods 0.000 claims description 14
- 238000005516 engineering process Methods 0.000 claims description 11
- 238000005070 sampling Methods 0.000 claims description 11
- 238000012512 characterization method Methods 0.000 claims description 10
- 238000007781 pre-processing Methods 0.000 claims description 9
- 238000004364 calculation method Methods 0.000 claims description 8
- 238000012545 processing Methods 0.000 claims description 6
- 238000012360 testing method Methods 0.000 claims description 6
- 230000009193 crawling Effects 0.000 claims description 3
- 238000002372 labelling Methods 0.000 claims description 3
- 238000010606 normalization Methods 0.000 claims description 3
- 238000011176 pooling Methods 0.000 claims description 3
- 230000006872 improvement Effects 0.000 description 4
- 238000011161 development Methods 0.000 description 3
- 230000018109 developmental process Effects 0.000 description 3
- 239000008186 active pharmaceutical agent Substances 0.000 description 2
- 238000003058 natural language processing Methods 0.000 description 2
- 230000000717 retained effect Effects 0.000 description 2
- 101100455978 Arabidopsis thaliana MAM1 gene Proteins 0.000 description 1
- 241001050985 Disco Species 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 238000010367 cloning Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 238000002347 injection Methods 0.000 description 1
- 239000007924 injection Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000008569 process Effects 0.000 description 1
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于模态无关对比学习的多任务代码检索方法。该方法包括:基于编程问答社区构建大规模编程问答数据集,进行数据过滤、去重操作;基于此数据集对孪生编码器网络进行模态无关的对比学习预训练,得到代码语言表示模型;以此代码语言表示模型作为初始化,在不同代码检索任务上进行有监督数据的微调得到相应的代码检索模型;利用训练后的代码检索模型对代码库进行编码构建代码表示向量索引库,将代码向量表示索引库和代码检索模型部署在计算设备上,通过对查询的流式编码和向量搜索的方式实现多任务代码检索。所述方法有效对齐了代码语言模型对代码和文本这两个模态的语义表示空间,从而在不同代码检索问答任务上表现出更好的性能。
Description
技术领域
本发明属于代码智能技术和自然语言处理技术的交叉技术领域,具体涉及一种基于模态无关对比学习的多任务代码检索方法。
背景技术
随着软件开发人员的数量的增长,利用人工智能技术来帮助软件开发人员提高开发效率的代码智能技术正在变得越来越重要。在实际开发工作中,许多程序设计人员都希望能够通过一个代码搜索系统,利用自然语言查询到之前编写的具有相似功能的代码来进行复用;当刚刚入门编程的学生在进行编程语言和编程知识的学习时,经常会遇到一些自己难以解决的问题,需要从外部获取帮助。一个著名的用于解答编程问题的例子是国外的StackOverflow社区,但此类社区往往会存在回答不够及时的问题。自动化的编程问答技术能够极大的提高开发人员的开发效率,而实现这一技术的核心是对编程语言和自然语言进行处理。
不同于生成式问答系统,基于检索式的问答系统拥有推理效率更高、时效性更强、知识更新与可扩展性更加灵活的优势。早期的代码预训练语言模型,如CodeBERT、GraphCodeBERT通常将代码检索作为一个衡量预训练模型的表征能力的一个下游任务,并未针对任务代码检索这一技术领域进行特殊的设计与改进。最近三年,随着对比学习在计算机视觉和自然语言处理领域中的表征学习的大放异彩,在代码检索这一领域出现了一些使用对比学习的新的技术。如2020年的ContraCode提出使用编译器等外部工具对代码进行扰动作为数据增强构造正例的方式来进行对比学习的预训练,在代码克隆、类型预测等任务上取得了显著的提升。2021年的UniXCoder模型也提出了使用抽象语法树作为代码的另外一种表示,进行多种表示之间的对比学习预训练,作为众多预训练任务中的一个。同时期的DISCO也提出了使用bug注入的方式进行数据增强来构造困难负例,从而提升对比学习的效果,在代码漏洞检测上取得了显著的增益。2022年的CodeRetriever提出了一种从大规模无监督代码库中构造成对的单模态和跨模态数据的方法,其主要思路是利用多个预训练好的文本和代码检索模型来进行数据的挖掘、清洗和标注。现有的方法经常针对某个具体的检索任务进行优化,而在多任务代码检索上的表现往往不够好。
发明内容
为克服现有技术在多任务代码检索上的不足,本发明提供了一种基于模态无关对比学习的多任务代码检索方法,通过模态无关对比学习的方式,来更好地对齐文本和代码这两个模态之间的语义表示空间,提升模型在多任务代码检索这一技术领域上的表现。
为达到上述目的,本发明采用的技术方案为:
通过构造大规模混合模态编程问答数据集,将不同模态的数据视为同一含义的不同外在表示,基于Transformer编码器构建孪生网络,通过在代码文本交错出现的问答对上进行对比学习式的预训练,更高效地学习代码和文本这两个模态之间的匹配信息,得到代码语言表示模型;将预训练后的代码语言表示模型作为初始化,在不同代码检索任务上的训练数据上进行微调,得到多任务代码检索模型;利用训练好的代码检索模型对代码语料库进行编码及向量化,得到代码表示向量索引库,并将代码检索模型部署在终端设备上,流式对文本查询进行编码得到文本表示向量,通过向量最大内积搜索的方式实现多任务代码检索。通过上述步骤,有效提升模型在多任务代码检索上的表现。
该方法具体步骤如下:
步骤1:通过远程监督的方式构造高质量编程问答数据集ProCQA,包括对语料库的预处理、过滤、去重;
(1)、数据预处理:利用爬虫技术从StackOverflow网站上进行原始数据的爬取和下载,以XML的格式储存;每条数据中包括网页中的结构化信息,主要分为两类,由类型标识号码所区分;类型标识号码为1代表问题数据,包括问题的标题和描述;类型标识号码为2代表答案数据,包括用户的答案;使用BeautifulSoup库对原始数据进行解析,去除文本中所包含的HTML标签,保留原始文本和代码,其中每条问题记录会有相应的被用户所认可的答案序号,每条答案数据也有相对应的问题序号;处理操作后的原始数据被整理成结构化的JSON形式,不同编程语言划分为不同的数据子集,每个子集以8:1:1的比例分为训练、验证、测试集;
(2)、数据过滤:在这类基于社交网络的编程问答社区中,许多答案的准确性难以得到保证,直接对网站上所有的问答对进行保留会对数据集的质量产生影响;本发明利用StackOverflow网站本身的一些元信息来对数据进行过滤;只有那些被问题的提出者所认可的答案被保留;考虑到过短的文本不会包含有效信息,且大部分预训练语言模型所支持的最大文本长度是有限的,如BERT支持的最长的序列长度为512,本发明将字符数超过2048的文本或字符数小于20的文本过滤掉;根据StackOverflow网站提供的问题标签信息对所爬取的数据进行分类,将不同编程语言的问答对分别整合成不同的数据集,最终保留的所有的问答对的数量在五百万左右,该数据集记为ProCQA;
(3)、数据去重:数据集中的问答对是从StackOverflow上收集的,与一些常用的评测集的来源有部分重合;为了防止数据污染问题,以确保数据集的公平性,对ProCQA进行下游评测数据的去重;三个与ProCQA同源的评测集,即CoNaLa、SO-DS、StaQC,为去重的主要对象;将这三个数据集的测试集中所有的文本查询作为候选样本,若数据集中训练样本与任意一个候选样本有重复,则从数据集中去掉这条训练样本;采用两种方式进行样本重复与否的判定;第一种方式是基于字符串匹配的去重算法;该算法会遍历训练集中每条样本,当该样本包含任意子串出现在下游评测集时,就被认为是与下游评测集有重复现象的;第二种方式是基于MinHash的模糊匹配去重算法;MinHash算法通过对一段文本中的所有n-gram构建一系列哈希函数,将其映射到一个固定长度的哈希值的集合,并将哈希集合之间的Jaccard相似系数作为两段文本重复的比例;设两段问题文本的n-gram集合所对应的哈希值集合分别为A和B,则两者之间的Jaccard相似度计算公式为:
当这一比例超出某个阈值时,就将这对样本认定为重复样本;本发明采用n=3和0.8的阈值来进行去重,使用的不同哈希函数的数量为128;结果表明,Python子集中大概有3千条样本(占总样本数的0.5%)与评测集中的文本查询有重复现象,而其他语言的子集中的重复样本占比极少;
步骤2:以基础代码语言模型GraphCodeBERT作为参数初始化,构建基于Transformer的孪生编码器网络,针对代码检索任务,在步骤1构建的不同语言的编程问答对语料库上进行模态无关的对比学习增量预训练,以获取更好的代码语言表示模型;具体包括以下几个子步骤:
(1)、从步骤1构造的不同语言的问答对数据集中进行数据采样,得到用于模型训练的批次数据B,包含n个问答对:
B={(q1,a1),(q2,a2),...,(qn,an)}
其中,qn代表第n个问题数据,an代表第n个答案数据;依据计算得到的采样分布,设共有m个数据源,不同的源对应不同的编程语言子集,每个数据源中的问答对数量分别为n1,…,nm。那么,从第i个数据源中进行采样的概率pi为:
其中,i和j为两个正整数,代表数据源的序号;
(2)、对问题和答案进行分词、特殊字符拼接、向量化预处理,作为后续代码文本表示模型的输入;给定所收集到的问题和答案对,将每段文本以UTF-8编码,再调用基于WordPiece的分词器将输入的句子切分为分词序列:
其中,q代表单个问题,a代表该问题所对应的答案,和/>分别代表着单个问题中的第k个单词和单个答案中的第l个单词,lq和la分别是单个问题和单个答案中所包含单词的个数;接着,将单个问题和单个答案的分词结果与两个特殊字符[CLS]与[SEP]拼接起来,分别得到单个问题和单个答案的输入文本序列:
其中,[CLS]代表文本序列的开始位置,[SEP]代表文本序列的结束位置;
(3)、使用基于双塔架构的代码语言模型对问题和答案分别进行编码;所述基于双塔架构的代码语言模型由两个共享参数的基础代码语言模型组成,用于获取输入的单个问题和答案的输入文本序列在句子级别的上下文表征向量,具体步骤如下:
使用代码语言模型的词表将输入文本序列X转换为单词的ID序列,并根据序列的长度,为输入文本序列设置相应长度的位置编码ID序列,将转换好的单词ID序列与位置编码ID序列输入编码器得到单词级别的上下文表征矩阵;使用基于Transformer架构的预训练代码语言模型作为双塔架构中的编码器,将单个问题的文本序列Xq输入所述代码语言模型得到最后一层的表征矩阵:
其中,d是所述代码语言模型的表征矩阵中行向量的维度,l是序列长度,代表实数空间;编码器经过多层Transformer的计算后为输入文本序列得到词级别的具有上下文信息的表征矩阵Hq,得到的表征矩阵为:
其中,分别表示与[CLS]和[SEP]所对应的上下文表征向量,/>表示问题中第i个单词所对应的上下文表征向量;
对不同单词的上下文表征向量进行平均池化(Mean Pooling),得到对整个序列的一个定长的向量表示:
类似地,我们可以得到答案文本序列的向量表示:
其中,lq和la分别代表单个问题q和单个答案a所包含单词的个数,也就是序列长度;
(4)、计算问答对相似度分数的分布,估计真实答案的概率;为了在向量空间中建模两个向量之间的语义距离,使用两个向量的余弦相似度来计算问题和答案之间的相关性:
其中,s(q,a)代表问题和答案之间的相似度,||q||2代表问题表示向量的二范数,即||a||2代表答案表示向量的二范数;
对计算得到的分数进行Softmax归一化,得到正确答案a的检索概率分布p(a|q):
其中,τ为温度系数,a'代表与问题q不匹配的答案,代表所有与问题q不匹配的答案集合,这些答案记为负样本或负例;由于整个语料库中的负样本数量太多,难以进行对所有负样本表示的动态计算,使用/>作为/>的估计;
(5)、计算改进后的近似对比学习损失,进行孪生编码器网络的训练;使用负对数似然作为训练的损失函数:
其中,n代表数据批次大小,p(a|q)代表为问题q检索到正确的答案a的概率;
在对正确答案的概率分布估计中,采取对的近似策略是使用同一批次内其他问题所对应的答案,即/>所述近似策略对应的目标函数为InfoNCE损失函数:
对负样本进行扩展,将同一批次内的不同问题也视为负样本,即所对应的对比学习损失函数为:
对称地,得到答案对问题的匹配损失函数:
将与/>中的负样本集合进行合并,得到一个更充分的负样本近似函数,这一近似策略所对应的预训练损失函数为:
在步骤1得到的编程问答数据集上进行预训练,得到代码语言表示模型;
步骤3:将步骤2中预训练好的代码语言表示模型在不同代码检索的有监督数据上进行微调,得到多任务代码检索模型;具体步骤如下:
(1)对自然语言文本和代码库中的代码对分别进行预处理,将其转化为代码语言模型词表中的单词所构成的序列,作为后续代码检索模型的输入;首先将自然语言文本t和代码c使用分词器切分成不同的单词,并与特殊字符首尾拼接,得到以下输入序列:
其中,lt和lc分别代表自然语言文本t和代码c的长度;
(2)在训练数据上进行代码检索模型的微调;对代码和文本分别调用基于Transformer的代码语言表示模型LM进行编码,得到相应的文本表示向量t与代码表示向量c:
t=MeanPooling(LM(Xt)),
c=MeanPooling(LM(Xc)).
接着使用余弦相似度来计算文本与代码向量之间的相似度:
s(t,c)=cos(t,c)
以人工标注作为标签,使用与步骤2中相似的对比学习损失函数来进行代码检索模型的微调:
其中,温度系数τ=0.01;
步骤4:将步骤3中训练得到的多任务代码检索模型应用于相应的代码检索任务,进行多任务代码检索;具体包括如下子步骤:
(1)、使用步骤3中训练好的代码检索模型对代码库中的每条代码c进行编码得到代码的表示向量c,并使用向量的二范数对其进行正则化,即:
将所有代码的表示向量存储在硬盘上,使用faiss技术构建代码表示向量索引库;
(2)、将代码检索模型部署在GPU上,进行对文本查询的流式编码处理;推理时,调用编码器得到用户文本查询t'的向量表示在正则化后的代码语料库的表示向量索引库中进行最大内积搜索检索到最相似的代码c*作为返回值:
其中,代表所有代码的集合,/>为代码c的正则后的向量表示。
本发明与现有技术相比的优点在于:
1、多任务场景下的泛化能力更强。本发明提出从StackOverflow社区构建大规模编程问答数据集,并结合从GitHub上构建的CodeSearchNet语料库进行联合预训练,使得预训练语料库中的数据分布更为多样化、覆盖面更广;同时基于每个子集中数据量大小的平方根对采样分布进行平滑,以避免不同数据量大小对模型的学习带来偏差。
2、在需要同时利用多种匹配信号的多任务代码检索上的性能更好。在本发明所使用的模态无关对比学习中,问题和答案同时包含文本和代码两种模态的信息,这种混合模态的数据结构能够使模型更高效地学习跨模态和模态内的匹配信息,从而提升多任务代码检索性能。
3、代码检索模型在训练和部署时的偏差更小。本发明通过对现有InfoNCE损失函数中的负样本估计方式进行合并,提出了一种新的对比学习策略,将传统的目标函数中的负样本数量扩大了三倍,并结合数据并行策略进一步保证了负样本的利用率,有效减小了训练和推理部署阶段的偏差。
附图说明
图1为本发明一种基于模态无关对比学习的多任务代码检索方法流程图。
具体实施方式
下面结合附图和实例对本发明进一步说明。
本发明是一种基于模态无关对比学习的多任务代码检索方法,方法如图1所示。本发明首先提出使用远程监督的方式构建大规模的弱监督编程问答数据集,并使用过滤、去重等方式保证数据质量和公平性;然后基于此数据集进行模态无关的对比学习预训练,来更好地对齐文本和代码这两个模态的语义表示空间;接着再在下游任务的有监督数据上进行微调,得到代码检索模型;将训练后的模型对代码库进行向量化,通过对查询进行流式编码和向量搜索的方式来实现多任务代码检索。本发明在三种代码检索任务上与之前的先进方法进行了对比,并表现出了良好的性能提升。
本发明所提出的基于模态无关对比学习的多任务代码检索方法,主要分为以下步骤:
步骤1:通过远程监督的方式构造高质量编程问答数据集ProCQA,包括对语料库的预处理、过滤、去重操作;
(1)、数据预处理:利用爬虫技术从StackOverflow网站上进行原始数据的爬取和下载,以XML的格式储存;每条数据中包含很多网页中的结构化信息,主要分为两类,由类型标识号码所区分。类型标识号码为1代表问题数据,包括问题的标题和描述;类型标识号码为2代表答案数据,包括用户的答案;使用BeautifulSoup库对原始数据进行解析,去除文本中所包含的HTML标签,保留原始文本和代码,其中每条问题记录会有相应的被用户所认可的答案序号,每条答案数据也有相对应的问题序号;预处理操作后的原始数据被整理成结构化的JSON形式,不同编程语言划分为不同的数据子集,每个子集以8:1:1的比例分为训练、验证、测试集;
(2)、数据过滤:在这类基于社交网络的编程问答社区中,许多答案的准确性难以得到保证,直接对网站上所有的问答对进行保留会对数据集的质量产生影响;本发明利用StackOverflow网站本身的一些元信息来对数据进行过滤;只有那些被问题的提出者所认可的答案被保留;考虑到过短的文本不会包含有效信息,而且大部分预训练语言模型所支持的最大文本长度是有限的,如BERT支持的最长的序列长度为512,本发明将字符数超过2048的文本或字符数小于20的文本进行了过滤;根据StackOverflow网站提供的问题标签信息对所爬取的数据进行分类,将关于不同编程语言的问答对分别整合成不同的数据集,最终保留的所有的问答对的数量在五百万左右,该数据集记为ProCQA;
(3)、数据去重:数据集中的问答对是从StackOverflow上收集的,与一些常用的评测集的来源有部分重合;为了防止数据污染问题,以确保数据集的公平性,对ProCQA进行下游评测数据的去重;三个与ProCQA同源的评测集,即CoNaLa、SO-DS、StaQC,为去重的主要对象;将这三个数据集的测试集中所有的文本查询作为候选样本,若数据集中训练样本与任意一个候选样本有重复,则从数据集中去掉这条训练样本;本发明采用两种方式进行样本重复与否的判定;第一种方式是基于字符串匹配的去重算法;该算法会遍历训练集中每条样本,当该样本包含任意子串出现在下游评测集时,就被认为是与下游评测集有重复现象的;第二种方式是基于MinHash的模糊匹配去重算法;MinHash算法通过对一段文本中的所有n-gram构建一系列哈希函数,将其映射到一个固定长度的哈希值的集合,并通过哈希集合之间的Jaccard相似系数来作为两段文本重复的比例;设两段问题文本的n-gram集合所对应的哈希值集合分别为A和B,则两者之间的Jaccard相似度计算公式为:
当这一比例超出某个阈值时,就将这对样本认定为重复样本;采用n=3和0.8的阈值进行去重,使用的不同哈希函数的数量为128;结果表明,Python子集中大概有3千条样本(占总样本数的0.5%)与评测集中的文本查询有重复现象,而其他语言的子集中的重复样本占比极少;
步骤2:以基础代码语言模型GraphCodeBERT作为参数初始化,构建基于Transformer的孪生编码器网络,针对代码检索任务,在步骤1构建的不同语言的编程问答对语料库上进行模态无关的对比学习增量预训练,以获取更好的代码语言表示模型;具体包括以下几个子步骤:
(1)、从步骤1构造的不同语言的问答对数据集中进行数据采样,得到用于模型训练的批次数据B,包含n个问答对:
B={(q1,a1),(q2,a2),...,(qn,an)}
其中,qn代表第m个问题数据,an代表第n个答案数据;
采样分布计算方式为:设共有m个数据源,不同的数据源对应不同的编程语言子集,每个数据源中的问答对数量分别为n1,…,am。那么,从第i个数据源中进行采样的概率pi为:
其中,i和j为两个正整数,代表数据源的序号;
(2)、对问题和答案进行分词、特殊字符拼接、向量化预处理,作为后续代码文本表示模型的输入;给定所收集到的问题和答案对,将每段文本以UTF-8编码,再调用基于WordPiece的分词器将输入的句子切分为分词序列:
其中,q代表单个问题,a代表该问题所对应的答案,和/>分别代表着单个问题中的第k个单词和单个答案中的第l个单词,lq和la分别是单个问题和单个答案中所包含词的个数;接着,将单个问题和单个答案的分词结果与两个特殊字符[CLS]与[SEP]拼接起来,分别得到单个问题和单个答案的输入文本序列:
其中,[CLS]代表文本序列的开始位置,[SEP]代表文本序列的结束位置;
(3)、使用基于双塔架构的代码语言模型对问题和答案分别进行编码;所述基于双塔架构的代码语言模型由两个共享参数的基础代码语言模型组成,用于获取输入的单个问题和答案的输入文本序列在句子级别的上下文表征,具体步骤如下:
使用代码语言模型的词表将输入文本序列X转换为单词的ID序列,并根据序列的长度,为输入文本序列设置相应长度的位置编码ID序列,将转换好的单词ID序列与位置编码ID序列输入编码器得到单词级别的上下文表征矩阵;使用基于Transformer架构的预训练代码语言模型作为双塔架构中的编码器,将单个问题的输入文本序列Xq输入该语言模型得到最后一层的向量表示,
其中,d是所述代码语言模型的表征矩阵中行向量的维度,l是序列长度,代表实数空间;编码器经过多层Transformer的计算后为单个问题的输入文本序列得到一个词级别的具有上下文信息的表征矩阵Hq,得到的表征矩阵为:
其中,分别表示与[CLS]和[SEP]对应的上下文表征向量,/>表示问题中第i个单词所对应的上下文表征向量;
对不同单词的上下文表征向量进行平均池化(Mean Pooling),得到对整个序列的一个定长的向量表示:
类似地,可以得到答案文本序列的向量表示:
其中,lq和la分别代表单个问题q和单个答案a的序列长度;
(4)、计算问答对相似度分数的分布,估计真实答案的概率;为了在向量空间中建模两个向量之间的语义距离,使用两个向量的余弦相似度来计算问题和答案之间的相关性:
其中,s(q,a)代表问题和答案之间的相似度,||q||2代表问题表示向量的二范数,即||a||2代表答案表示向量的二范数;
对计算得到的分数进行Softmax归一化,得到正确答案a的检索概率分布p(a|q):
其中,τ为温度系数,a'代表与问题q不匹配的答案,代表所有与问题q不匹配的答案集合,这些答案记为负样本或负例;由于整个语料库中的负样本数量太多,难以进行对所有负样本表示的动态计算,使用/>作为/>的估计;
(5)、计算改进后的近似对比学习损失,进行孪生编码器网络的训练;使用负对数似然作为训练的损失函数:
其中,n代表数据批次大小,p(a|q)代表为问题q检索到正确答案a的概率;
在对正确答案的概率分布估计中,采取的对的近似策略是使用同一批次内其他问题所对应的答案,即/>所述近似策略所对应的目标函数为InfoNCE损失函数:
对负样本进行进一步的扩展,将同一批次内的不同问题也视为负样本,即 所对应的对比学习损失函数为:
对称地,得到答案对问题的匹配损失函数,
将与/>中的负样本集合进行合并,得到一个更充分的负样本近似函数,这一近似策略所对应的预训练损失函数为:
在步骤1得到的编程问答数据集上进行预训练,得到代码语言表示模型;
步骤3:将步骤2中预训练好的代码语言表示模型在不同代码检索的有监督数据上进行微调,得到多任务代码检索模型;具体步骤如下:
(1)对自然语言文本和代码库中的代码对分别进行预处理,将其转化为代码语言模型词表中的单词构成的序列,作为后续代码检索模型的输入;首先将自然语言文本t和代码c使用分词器切分成不同的单词,并与特殊字符首尾拼接,得到以下输入序列:
其中,lt和lc分别代表自然语言文本t和代码c的长度;
(2)在训练数据上进行代码检索模型的微调;对代码和文本分别调用基于Transformer的代码语言表示模型LM进行编码,得到相应的文本表示向量t与代码表示向量c:
t=MeanPooling(LM(Xt)),
c=MeanPooling(LM(Xc)).
接着使用余弦相似度来计算文本与代码向量之间的相似度:
s(t,c)=cos(t,c)
以人工标注作为标签,使用与步骤2中相同的对比学习损失函数来进行代码检索模型的微调:
其中,温度系数τ=0.01;
步骤4:将步骤3中训练得到的代码检索模型应用于相应的代码检索任务,进行多任务代码检索;具体包括如下子步骤:
(1)、使用步骤3训练好的代码检索模型对代码库中的每条代码c进行编码得到代码的表示向量c,并使用向量的二范数对其进行正则化,即:
将所有代码的表示向量存储在硬盘上,使用faiss技术构建代码表示向量索引库;
(2)、将代码检索模型部署在GPU上,进行对文本查询的流式编码处理;推理时,调用编码器得到用户文本查询t'的向量表示在正则化后的代码语料库的表示向量索引库中进行最大内积搜索检索到最相似的代码c*作为返回值:
其中,代表所有代码的集合,/>为代码c的正则后的向量表示。
本发明中所提出的方法记为Multi-task Code Retrieval(MTCR)。与CodeRetriever保持一致,使用GraphCodeBERT模型来对参数进行初始化。本发明将所提出的方法在三种代码检索任务:文本-代码检索、跨语言代码检索、跨领域代码检索上分别进行实验,并与相应数据集上的最优方法进行了对比。
与之前检索式代码问答模型评估保持一致,本发明使用了三种流行的检索指标:MRR、R、MAP来对模型的检索结果进行评估。设测试集中有N个查询,检索模型允许返回前K个最相似的答案作为输出。MRR(Mean Reciprocal Rank,平均倒数排名)衡量了排名结果的整体性能,公式如下:
其中,ranki代表第i个问题的预测结果中第一个正确答案的排名。当前K个最相似的答案中不包含正确答案时,我们规定ranki→∞。
MAP(Mean Average Precision,平均精度)同时考虑了所有正确答案的排序信息。对于一个问题q,若其存在M个正确答案,平均准确率是由每个正确的答案在所有正确答案中的排序除以其在所有候选答案中的排序后进行平均得到。我们假设这M个正确答案的在所有候选答案中的排序从小到大分别为rank1,...,rankM,则:
多个查询所得AP分数的平均值即为MAP,可以反应检索模型对所有正确答案的整体检索性能:
R(Recall,召回)衡量了模型召回正确答案的能力,代表了排名前K个结果中召回的正确答案占正确答案总数的比例,公式如下:
与之前的工作一致,本发明实施中采取R@{1,5,10}的结果进行对比。
从表1中可见,在文本-代码检索这一任务上,相较于其基座模型GraphCodeBERT,本发明所提出的方法MTCR在所有编程语言上取得了显著的提升。此外,相比于之前的最好模型CodeRetriever,本发明所提出的方法也取得了平均2.1个点的提升。
表1不同模型在文本代码检索任务CodeSearchNet上的MRR对比
表2展示了不同模型在跨语言代码-代码检索任务上的性能,可以看到MTCR要显著好于之前的最好的基线模型UniXCoder。这印证了本发明中所提出的预训练方式能够更好地在不同语言的代码表示空间内进行语义层面的对齐。
表2不同模型在跨语言代码检索任务CodeNet上的MAP对比
表3衡量了不同模型在两个预训练中未见到过的编程语言上的域外泛化性能对比。GraphCodeBERT模型本身能取得比基于CodeBERT模型进行MAML的模型更好的结果。而相较于GraphCodeBERT,本发明所提出的MTCR方法在所有指标上都有显著的提升。
表3不同模型在跨领域代码检索任务上的性能对比
/>
以上对本发明所公开的一种基于模态无关对比学习的多任务代码检索方法进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,但是本领域的技术人员应当理解,这些仅是举例说明,在不背离本发明原理和实现的前提下,可以对这些实施方案做出多种变更或修改,因此,本发明的保护范围由所附权利要求书限定。
Claims (4)
1.一种基于模态无关对比学习的多任务代码检索方法,包括以下步骤:
步骤1:通过远程监督的方式构造高质量编程问答数据集ProCQA,包括对语料库的预处理、过滤、去重操作;
所述预处理操作包括:采用爬虫技术进行原始数据的爬取和下载,使用类型标识号码区分原始数据为两类,类型标识号码为1代表问题数据,包括问题的标题和描述;类型标识号码为2代表答案数据,包括用户的答案;使用BeautifulSoup库对原始数据进行解析;完成预处理操作后的原始数据被整理成结构化的JSON形式,不同编程语言划分为不同的数据子集,每个子集以8:1:1的比例分为训练、验证、测试集;
所述过滤操作包括,利用网站本身的元信息来对原始数据进行过滤,保留被问题的提出者所认可的答案;字符数超过2048的文本或字符数小于20的文本将被过滤掉;之后,将关于不同编程语言的问答对分别处理和整合成不同的数据集;
所述去重操作包括,对ProCQA进行下游评测数据的去重,采用基于字符串匹配的去重算法和基于MinHash的模糊匹配去重算法;
步骤2:以基础代码语言模型GraphCodeBERT作为参数初始化,构建基于Transformer的孪生编码器网络,并针对代码检索任务,在步骤1构建的不同语言的编程问答数据集上进行模态无关的对比学习增量预训练;具体包括以下子步骤:
(1)、从步骤1所构造的不同语言的编程问答对数据集中进行数据采样,得到用于模型训练的批次数据B,包括n个问答对:
B={(q1,a1),(q2,a2),...,(qn,an)}
其中,qn代表第n个问题数据,an代表第n个答案数据;依据计算得到的采样分布进行数据采样,设共有m个数据源,不同的数据源对应不同的编程语言的数据子集,每个数据源中的问答对数量分别为n1,…,nm,从第i个数据源中进行采样的概率pi为:
其中,i和j为两个正整数,代表数据源的序号;
(2)、对问题和答案进行分词、特殊字符拼接、向量化预处理,作为后续代码文本表示模型的输入;给定所收集到的问题和答案对,将每段文本以UTF-8编码,再调用基于WordPiece的分词器将输入的句子切分为分词序列:
其中,q代表单个问题,a代表该单个问题所对应的答案,和/>分别代表单个问题中的第k个单词和单个答案中的第l个单词,lq和la分别是单个问题和单个答案中包含单词的个数;
接着,将单个问题和单个答案的分词序列结果与两个特殊字符[CLS]与[SEP]拼接起来,得到单个问题和单个答案的输入文本序列:
其中,[CLS]代表文本序列的开始位置,[SEP]代表文本序列的结束位置;
(3)、使用基于双塔架构的代码语言模型对问题和答案分别进行编码;所述基于双塔架构的代码语言模型由两个共享参数的基础代码语言模型组成,用于获取单个问题和单个答案的输入文本序列在句子级别的上下文表征向量,具体步骤如下:
使用代码语言模型的词表将输入文本序列X转换为单词ID序列,并根据序列的长度,为输入文本序列设置相应长度的位置编码ID序列,将转换好的单词ID序列与位置编码ID序列输入编码器得到单词级别的上下文表征矩阵;使用基于Transformer架构的预训练代码语言模型作为双塔架构中的编码器,将单个问题的输入文本序列Xq输入该代码语言模型得到最后一层的表征矩阵:
其中,d是该代码语言模型的表征矩阵中行向量的维度,l是序列长度,代表实数空间;编码器经过多层Transformer的计算后为输入文本序列得到词级别的具有上下文信息的表征矩阵Hq,得到的表征矩阵为:
其中,分别表示与[CLS]和[SEP]所对应的上下文表征向量,表示问题中第i个单词所对应的上下文表征向量;
对不同单词的上下文表征向量进行平均池化MeanPooling,得到对整个序列的一个定长的向量表示:
类似地,我们可以得到答案文本序列的向量表示:
其中,lq和la分别代表单个问题q和单个答案a包含单词的个数,也就是序列的长度;
(4)、计算问答对相似度分数的分布,估计真实答案的概率;使用两个向量的余弦相似度来计算问题和答案之间的相关性:
其中,s(q,a)代表问题和答案之间的相似度,||q||2代表问题表示向量的二范数,即||a||2代表答案表示向量的二范数;
对计算得到的分数进行Softmax归一化,得到正确的答案a的检索概率p(a|q):
其中,τ为温度系数,代表所有与问题q不匹配的答案集合,a'代表与问题q不匹配的答案,/>是/>的估计;
(5)、计算改进后的近似对比学习损失,进行孪生编码器网络的训练;使用负对数似然作为训练的损失函数:
其中,n代表数据批次大小,p(a|q)代表为问题q检索到正确答案a的概率;
在对正确答案的概率分布的估计中,首先采取对的近似策略是使用同一批次内其他问题所对应的答案,即/>所述近似策略对应的目标函数为InfoNCE损失函数:
对负样本进行扩展,将同一批次内的不同问题也视为负样本,即所对应的对比学习损失函数为:
对称地,得到答案对问题的匹配损失函数:
将与/>中的负样本集合进行合并,得到负样本近似函数,对应的预训练损失函数为:
在步骤1得到的编程问答数据集上进行预训练,得到代码语言表示模型;
步骤3:将步骤2中预训练好的代码语言表示模型在不同代码检索的有监督数据上进行微调,得到多任务代码检索模型;具体步骤如下:
(1)对自然语言文本和代码库中的代码分别进行预处理,将其转化为代码语言模型词表中的单词所构成的序列,作为后续代码检索模型的输入;首先将自然语言文本t和代码c使用分词器切分成不同的单词,并与特殊字符首尾拼接,得到以下输入序列:
其中,lt和lc分别代表自然语言文本t和代码c的长度;
(2)在训练数据上进行代码检索模型的微调;对代码和文本分别调用基于Transformer的代码语言表示模型LM进行编码,得到相应的文本表示向量t与代码表示向量c:
t=MeanPooling(LM(Xt)),
c=MeanPooling(LM(Xc)).
接着使用余弦相似度来计算文本与代码向量之间的相似度:
s(t,c)=cos(t,c)
以人工标注作为标签,使用与步骤2中相似的对比学习损失函数来进行代码检索模型的微调:
其中,温度系数τ=0.01;
步骤4:将步骤3中训练得到的多任务代码检索模型应用于相应的代码检索任务,进行多任务代码检索;具体包括如下子步骤:
(1)、使用步骤3中训练好的代码检索模型对代码库中的每条代码c进行编码得到代码的表示向量c,并使用向量的二范数对其进行正则化,即:
将所有代码的表示向量存储在硬盘上,使用faiss技术构建代码表示向量的索引库;
(2)、将代码检索模型部署在GPU上,进行对文本查询的流式编码处理;推理时,调用编码器得到用户文本查询t'的向量表示在正则化后的代码语料库的表示向量索引库中进行最大内积搜索检索到最相似的代码c*作为返回值:
其中,代表所有代码的集合,/>为代码c的正则后的向量表示。
2.根据权利要求1所述的一种基于模态无关对比学习的多任务代码检索方法,其特征在于:所述步骤1中,基于编程问答社区构建大规模高质量编程问答数据集。
3.根据权利要求1所述的一种基于模态无关对比学习的多任务代码检索方法,其特征在于:所述步骤2中,利用混合模态数据进行模态无关的对比学习预训练,得到代码语言表示模型。
4.根据权利要求1所述的一种基于模态无关对比学习的多任务代码检索方法,其特征在于:所述步骤4中,将使用监督数据微调后的代码检索模型和预编码的代码表示向量索引库部署在终端计算设备上,用于流式处理查询,以及多任务代码检索。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311687907.5A CN117634615A (zh) | 2023-12-11 | 2023-12-11 | 一种基于模态无关对比学习的多任务代码检索方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311687907.5A CN117634615A (zh) | 2023-12-11 | 2023-12-11 | 一种基于模态无关对比学习的多任务代码检索方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117634615A true CN117634615A (zh) | 2024-03-01 |
Family
ID=90028723
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311687907.5A Pending CN117634615A (zh) | 2023-12-11 | 2023-12-11 | 一种基于模态无关对比学习的多任务代码检索方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117634615A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117992643A (zh) * | 2024-04-03 | 2024-05-07 | 粤港澳大湾区数字经济研究院(福田) | 代码搜索模型的训练方法、代码搜索方法及设备 |
-
2023
- 2023-12-11 CN CN202311687907.5A patent/CN117634615A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117992643A (zh) * | 2024-04-03 | 2024-05-07 | 粤港澳大湾区数字经济研究院(福田) | 代码搜索模型的训练方法、代码搜索方法及设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109840287B (zh) | 一种基于神经网络的跨模态信息检索方法和装置 | |
CN110298037B (zh) | 基于增强注意力机制的卷积神经网络匹配的文本识别方法 | |
CN107748757B (zh) | 一种基于知识图谱的问答方法 | |
CN110188272B (zh) | 一种基于用户背景的社区问答网站标签推荐方法 | |
US11874862B2 (en) | Community question-answer website answer sorting method and system combined with active learning | |
CN111159485B (zh) | 尾实体链接方法、装置、服务器及存储介质 | |
CN112699216A (zh) | 端到端的语言模型预训练方法、系统、设备及存储介质 | |
CN113297369B (zh) | 基于知识图谱子图检索的智能问答系统 | |
CN109271524B (zh) | 知识库问答系统中的实体链接方法 | |
CN112800203B (zh) | 一种融合文本和知识表征的问答匹配方法及系统 | |
CN116304066B (zh) | 一种基于提示学习的异质信息网络节点分类方法 | |
CN112328800A (zh) | 自动生成编程规范问题答案的系统及方法 | |
CN117634615A (zh) | 一种基于模态无关对比学习的多任务代码检索方法 | |
CN114661872A (zh) | 一种面向初学者的api自适应推荐方法与系统 | |
CN114691864A (zh) | 文本分类模型训练方法及装置、文本分类方法及装置 | |
CN115905487A (zh) | 文档问答方法、系统、电子设备及存储介质 | |
CN116662565A (zh) | 基于对比学习预训练的异质信息网络关键词生成方法 | |
CN111145914A (zh) | 一种确定肺癌临床病种库文本实体的方法及装置 | |
CN111881264B (zh) | 一种开放领域问答任务中长文本检索的方法和电子设备 | |
CN110390050B (zh) | 一种基于深度语义理解的软件开发问答信息自动获取方法 | |
CN116662566A (zh) | 一种基于对比学习机制的异质信息网络链路预测方法 | |
CN115858780A (zh) | 一种文本聚类方法、装置、设备及介质 | |
CN113468311B (zh) | 一种基于知识图谱的复杂问句问答方法、装置及存储介质 | |
CN115455162A (zh) | 层次胶囊与多视图信息融合的答案句子选择方法与装置 | |
CN114003773A (zh) | 一种基于自构建多场景的对话追踪方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |