深度学习案例教程 教案8.4代码搜索模型介绍.docx
04代码搜索模型介绍
(p19)我们来学习第四节代码搜索的模型介绍。
在我们开始训练之前,我们需要去查阅并试验一些前人的解决方案,然后通过比较,来确定我们要使用的模型。经过复现和比较,我们认为deepcodesearch这篇论文中提到的一个的叫codenn的网络,能够满足我们的要求,他的全名就是Code-DescriptionEmbeddingNewralNetwork。
我们的目的呢是,通过自然语言的查询语句来搜索对应的代码,但是自然语言和程序代码是两种异构的数据,两种语言在逻辑上、语法上存在很大差别,这种差别比中文和英文之间的差别会大很多,所以直观上找不到任何相似性,无法进行有效的搜索。于是我们需要将这两种异构的数据嵌入、或者映射到统一向量空间。比如像这样图显示的,将左边的自然语言和右边的代码都向量化,然后都映射到中间的向量空间中,如果模型训练的好,那么他映射完了之后,自然语言的向量和对应的代码向量的位置,就会很接近,就相当于相似度很高,于是就可以进行搜索对应了。
(p20)通过这样的处理之后,有相同或相似语义的自然语言查询语句,和对应的代码就会离得很近,而不相关的自然语言查询语句和代码则会离得很远,我们只要在该空间内找到距离最近的代码就可以了。
这里我们通过这个图看一下codesearch的整体系统架构,那这个圆圈就表示训练好的模型,这个模型可以把程序员代码和自然语言嵌入到同一个向量空间中。这个虚线框内,这一部分就是线下的处理过程,事先将所有的代码片段,输入到模型中,分别计算出它们的一个向量,就是代码向量,并且记录下来。也就是说,我们代码库中储存的不只是代码,还有每个代码转化后的向量。当在线查询的时候,将自然语言查询语句输入到模型中,模型可以返回对应的查询语句向量。然后与事先计算好的大量代码向量进行比较,找出相似度最高的几个向量,将这几个向量对应的原始代码片段作为查询的结果返回就可以了,那这就是我们codesearch的一个整体的系统架构,
(p21)那基于我们上面的这个思路,系统中最核心的部分就是,之前图中这个圆圈中的模型部分,它可以把程序员代码和自然语言嵌入到同一向量空间,
我们可以用这个图来表示我们的模型,它分为三个部分,
首先第一个部分呢,是代码嵌入网络,这个网络可以将代码转换为向量进行表示,代码它不仅仅是单纯的文本,里面还包括了函数名、参数、结构等相关信息,在CoNN模型中我们抽取了代码的方法名、API序列、标识符来计算代码对应的向量。
第二个,描述嵌入网络(DeNN),这个网络可以将我们查询的描述语句,转换为向量来表示。
中间这个部分,用来计算两个向向量之间的相似度,这里用的是余弦相似度
(p22)那具体模型细节我们可以看下面这张图,其中方法名、API序列、描述,都是以序列的形式存在的,我们使用循环神经网络(RNN)对其作处理。对于标识符,我们抽取的是代码片段中的单词,并做去重处理,因为不关心其顺序关系,所以只使用MLP即可。另外,图中RNN部分、池化部分以及激活函数都是有多种选择的。比如RNN部分,可以选取普通RNN或LSTM或GRU网络,并且这几种模型都支持单向和双向操作;池化部分可以选择最大池化、均值池化、求和池化等等;激活函数可以选择ReLU、正切等激活方法。
(p23)我们尝试对以上不同方法的不同组合进行比较,我们这里在小数据集上做了训练。我们选用了GitHub上的Numpy仓库的代码来做实验,比较各种参数的选择。numpy是python的一个科学计算库,提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。这是一个学习python时候非常常用的库,我们使用这个库里面的函数作为代码库。
经过模型的训练,我们绘制了这样一个折线图,横坐标表示训练的轮次,纵坐标表示平均的精度。这里绘制了多种训练组合的曲线,我们可以看到,橙色这条曲线效果较好,这条曲线名字标记为improved,他是指使用了均值池化、GRU和ReLU激活函数的训练。
以上就是代码搜索模型的相关内容。
好的,本节课我们就讲到这里。