Machine learning knowledge for code search
Attention机制
需要搞清楚的概念:SoftMax,Transformer
Self-Attention机制
利用Self-Attention网络进行代码搜索
基本概念
词嵌入:将自然语言中的词语(不管是在code中还是在description中)转化为一个可以包含词语信息的维度相同的向量(词向量)
本文中使用的是word2vec中的CBOW模型,使用CBOW而不是SkipGram因为CBOW模型的训练时间更短
序列嵌入:将含有语义的一段话中的词向量在尽量保持语义的情况下转化为一个code向量或者是一个查询向量俩表示一段代码(方法)和一段查询语句
在DeepCs中使用的是LSTM,而本实验用的是自注意力网络,因为LSTM本身复杂度偏高,而且不能够进行并行计算。
联合嵌入
将已经嵌入好的code和description向量进行比较配对,比较是通过查询两个向量之间的余弦相似度来实现的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DnUC4qMm-1650112618131)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648515178347.png)]
在匹配的时候要从查询数据集中随机选出一个description向量作为反向目标(query-)而query+就是要训练的这个向量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-daHyRqtI-1650112618132)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648515825055.png)]
最后的代价函数如上图所示。
Self-Attention代码查询模型介绍
主要流程示意图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xR5Zk5xV-1650112618133)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648480558820.png)]
本次适用于代码查询的Self-Attention模型被命名为SAN-CS
实现还是对于code数据集中的每一段代码(主要是每一段方法)进行训练嵌入。
首先要在词嵌入层对所有在code和discription中出现过的词根据全部的code和decription进行词嵌入,将每一个词转化为一个维度为d的向量
code嵌入
在SAN-CS模型中code需要被分成三部分分别进行嵌入最后在进行合成。
这3个部分分别是方法名、API词和token部分,API参数而token是代码段中的单词
其中方法名、参数和变量默认按照驼峰命名约定,将其拆分成有自然语义的几个单词
方法名嵌入:
方法名序列𝑆𝑛 = {𝑠1,… , 𝑠𝑖} ,其长度为I
序列中的每一个词都已经被嵌入成一个维度为d的词向量(CBOW模型)
然后将Sn通过3个随机初始化的矩阵演化成三个不同的Sn向量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ae2e8RKx-1650112618133)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648542495604.png)]
其中𝑊𝑄 ∈ R𝑑×𝑑 ,𝑊𝐾 ∈ R𝑑×𝑑 , 𝑊𝑉 ∈ R𝑑×𝑑
Q(query)是查询向量,K(key)是关键向量,V(value)是值向量
然后使用自注意力网络来获取方法名序列的语义信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bo6XQkNv-1650112618133)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648545060408.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JOP6CY60-1650112618134)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648545154886.png)]
其中Att()是一个点积注意力模型,而d是避免模型在训练阶段梯度消失的因子
最后将context向量应用于一个全连接前馈神经网络当中就可以得出我们最后的code向量v
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7u84aEau-1650112618134)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648546335918.png)]
𝑊1 ∈ R𝑑×4𝑑 , 𝑊2 ∈ R4𝑑×𝑑 , 𝑏1 ∈ R4𝑑 , 𝑏2 ∈ Rd
Relu是一个激活函数
对于API词和token的嵌入在方法上和方法名的嵌入是完全一样的。
在三个向量生成完毕之后,直接将它们拼接在一起就可以了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AqSb78sE-1650112618134)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648546613171.png)]
包括后面的对于description的嵌入也是一样的
然后就是将code的向量和discription向量产生联系:
这里需要用到代码描述注意网络(自注意力网络的一个变体)
首先同过线性运算生成出如下四个向量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9G1Etop8-1650112618135)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648548833285.png)]
然后通过代码描述注意网络生成“权重矩阵”A
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aDeZnnNA-1650112618135)(D:\大学\scientific research\程序注释\第一阶段\图片%5CUsers%5Cluosh%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1648555779315.png)]
然后乘上code和discription的向量就可以生成最后的联动位置的向量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mWW59vTX-1650112618135)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648549627353.png)]
最后对c和d进行平均池化操作获得语义向量C和D。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zfqefy9r-1650112618136)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648549750812.png)]
在以上的操作都做好之后就可以对模型进行训练了
训练采用的操作和我们之前讲的联合嵌入的机制是一样的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PcSvf9M6-1650112618136)(C:\Users\luosh\AppData\Roaming\Typora\typora-user-images\1648549906541.png)]
其中选取的d+和d-向量,在训练的时候都是要尽量使c和d+更为的相似同时使c和d-更为的不相似
最后进行预言的操作
就是在输入查询要求之后先对输入的自然语言求向量表示,然后在向量空间中利用余弦相似度查找最相近的k个code段即可
模型的训练集:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mwP5zchw-1650112618136)(D:\大学\scientific research\程序注释\第一阶段\图片%5CUsers%5Cluosh%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1648551110480.png)]
基线模型分别是:DeepCs、CARLCS-CNN、SAN-CS
评估指标:
Recall@k
计算公式如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P2UpB8NA-1650112618137)(D:\大学\scientific research\程序注释\第一阶段\图片%5CUsers%5Cluosh%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1648551283530.png)]
Recall@k表示答案在前k个检索结果的概率
NDCG
计算公式如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xJmT7WlN-1650112618137)(D:\大学\scientific research\程序注释\第一阶段\图片%5CUsers%5Cluosh%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1648551395351.png)]
NDCG表示的是答案的靠前程度,答案在引索中的位置越靠前NDCG的值越大
MRR
计算公式如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JEFz0YkB-1650112618137)(D:\大学\scientific research\程序注释\第一阶段\图片%5CUsers%5Cluosh%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1648551712240.png)]
MRR表示的查找的时间,MMR越大就表明查找需要的时间越短
具体结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Ohao8ui-1650112618138)(D:\大学\scientific research\程序注释\第一阶段\图片%5CUsers%5Cluosh%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1648552720955.png)]
还有有关DeepCs和SAN-CS的性能比较
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1qj1uPcc-1650112618138)(D:\大学\scientific research\程序注释\第一阶段\图片%5CUsers%5Cluosh%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1648553556337.png)]
找的时间,MMR越大就表明查找需要的时间越短
具体结果:
[外链图片转存中…(img-2Ohao8ui-1650112618138)]
还有有关DeepCs和SAN-CS的性能比较
[外链图片转存中…(img-1qj1uPcc-1650112618138)]