【ASE模型组】Hint::neural 模型与case study
模型
基于搜索的提示系统
我们的系统用Pycee针对语法错误给出提示。然而,对于语法正确、结果错误的代码,我们需要另外的解决方式。因此,我们维护一些 (错误代码, 相应提示) 的数据,该数据可以由我们预先给定,也会在网站运行过程中请用户标注。当用户出现错误时,搜索与用户错误代码相似的已有错误代码,并给出相应提示。
为了计算代码之间的相似度,我们需要采用code embedding技术,即将一段代码编码为高维空间中的向量。
CodeSearchNet
今年,GitHub和Weights&Biases携手推出了一项新赛事 CodeSearchNet,旨在推动语义代码搜索的相关研究。CodeSearchNet语料库的数据取自GitHub上的开源项目,经过了充分的预处理。其中包含了约600万种函数,取自Go,Java,JavaScript,PHP,Python和Ruby这六种编程语言的开源代码,以及大量用于查询的自然语言及其标注。其中,用于查询的自然语言获取自Bing搜索引擎的常见搜索语句,标注由专家人工标注所得。
为了更好地评判不同的code searching方法,CodeSearchNet还公开了baseline模型代码 repo,并设立了leaderboard,其中包含大量预训练模型。因此,我们可以采用表现良好的预训练模型对代码计算embedding,从而计算相似度并进行匹配。
Baseline模型
Baseline模型包含code encoder \(E_c\)与query encoder \(E_q\)两部分,将代码与查询文本投射到同一个高维向量空间中。
训练过程中,训练数据包括大量code and text pair: \((c_i, q_i)\)。通过最大化\(E_c(c_i)\)与\(E_q(q_i)\)的余弦相似度,使得代码\(c_i\)与文本\(q_i\)的embedding尽可能相似。
Code Encoder
由于我们只使用code encoder部分,因此下面只讲解code encoder。
首先,模型将代码转换为token序列。为了避免空格、空白换行等问题对tokenize产生影响,模型利用parso]()解析代码的AST,并遍历AST、将各个叶子结点对应的值结合为token序列。如下列代码:
n = int(input())
d = dict()
for i in range(1, n + 1):
d[i] = i*i
print(d)
被tokenize为如下序列:'n', '=', 'int', '(', 'input', '(', ')', ')', 'd', '=', 'dict', '(', ')', 'for', 'i', 'in', 'range', '(', '1', ',', 'n', '+', '1', ')', ':', 'd', '[', 'i', ']', '=', 'i', '*', 'i', 'print', '(', 'd', ')';token序列经过BPE编码得到BPE code序列。
接着,模型对序列中的每个BPE code计算一个embedding。Embedding计算方法包括:
- Neural Bag of Words:每个BPE code被投影到一个embedding上
- Bidirectional RNN
- 1D Convolutional Neural Network
- Self-Attention:使用multi-head attention
最后,通过pooling方式将embedding序列合并为一个embedding;可用的pooling方法包括max / mean pooling与weighted sum pooling。
我们使用的模型为leaderboard第一个模型,即Neural Bag of Words + weighted sum pooling。我们用模型的code encoder计算用户错误代码embedding \(\vec{x}\)与已有错误代码的embedding \(\vec{c}_i, i=1,2,...,N\),选择与用户错误代码cosine similarity最大的已有错误代码,返回相应提示。
Case study
Code Embedding
模型的vocabulary大小为10000,其中包括5000个单词和5000个BPE code。计算vocabulary中,部分单词之间cosine similarity如下:
| word 1 | word 2 | cosine similarity |
|---|---|---|
| for | while | 0.1801 |
| try | except | 0.1785 |
| open | while | -0.2296 |
可以看出,含义相似的单词(如for和while都表示循环)embedding较为相似。而try、except虽然含义不相似,但功能十分相关,因此相似度也较高。而基本无关的单词(如open和while)相似度很低。
代码相似度计算
考虑以下四段代码,分别为题目的正确解法1、正确解法2、与解法2类似的错误3、与错误3相同的错误4.计算其两两cosine similarity:
def fact(x):
if x == 0:
return 1
return x * fact(x - 1)
x = int(input())
print(fact(x))
x = int(input())
out = 1
for xx in range(1, x + 1):
out *= xx
print(out)
x = input()
out = 1
for xx in range(1, x + 1):
out *= xx
print(out)
inp = input()
out = 1
for i in range(1, inp + 1):
out *= i
print(out)
计算得cosine similarity如下:
| code 1 | code 2 | code 3 | code 4 | |
|---|---|---|---|---|
| code 1 | - | 0.9854 | 0.9835 | 0.9716 |
| code 2 | - | - | 0.9995 | 0.9861 |
| code 3 | - | - | - | 0.9859 |
| code 4 | - | - | - | - |
由于各个代码片段较短,各个code embedding都比较相似。
【ASE模型组】Hint::neural 模型与case study的更多相关文章
- Detection of Glacier Calving Margins with Convolutional Neural Networks: A Case Study
利用Unet结构对landsat数据进行冰川裂缝提取,结构如下:训练集很小只有123张152*240图片
- 吴恩达《深度学习》-第五门课 序列模型(Sequence Models)-第一周 循环序列模型(Recurrent Neural Networks) -课程笔记
第一周 循环序列模型(Recurrent Neural Networks) 1.1 为什么选择序列模型?(Why Sequence Models?) 1.2 数学符号(Notation) 这个输入数据 ...
- 从信用卡欺诈模型看不平衡数据分类(1)数据层面:使用过采样是主流,过采样通常使用smote,或者少数使用数据复制。过采样后模型选择RF、xgboost、神经网络能够取得非常不错的效果。(2)模型层面:使用模型集成,样本不做处理,将各个模型进行特征选择、参数调优后进行集成,通常也能够取得不错的结果。(3)其他方法:偶尔可以使用异常检测技术,IF为主
总结:不平衡数据的分类,(1)数据层面:使用过采样是主流,过采样通常使用smote,或者少数使用数据复制.过采样后模型选择RF.xgboost.神经网络能够取得非常不错的效果.(2)模型层面:使用模型 ...
- 产生式模型(生成式模型)与判别式模型<转载>
转自http://dongzipnf.blog.sohu.com/189983746.html 产生式模型与判别式模型 产生式模型(Generative Model)与判别式模型(Discrimiti ...
- OSI模型与TCP/IP模型基础
一.OSI七层模型 OSI(Open System Interconnection),OSI是一个开放性的通行系统互连参考模型,是一个协议规范.OSI七层模型是一种框架性的设计方法 ,建立七层模型的主 ...
- 硬件内存模型到 Java 内存模型,这些硬核知识你知多少?
Java 内存模型跟上一篇 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的,希望你没它们搞混,特别是在面试的时候,搞混了的话就会答非所问,影响你的面试成绩,当然也许你 ...
- padding标准盒模型和怪异盒子模型
我们都知道padding是为块级元素设置内边距 但是在使用过程中,我们却会遇到一些问题.padding的标准盒模型和怪异盒模型 padding盒子模型 我们通过demo来讲这个问题,用文字干讲第一没意 ...
- eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结
eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...
- 标准盒模型与IE盒模型之间的转换
首先上图,这两张很明显可以看出IE盒模型和标准盒模型之间的差别. 当然今天不是去细细追究两种模型具体是怎么去计算布局的,那个很多文章已经已经有过了,不再重复.以前刚开始学习盒模型的时候,就学到的是IE ...
随机推荐
- ElasticSearch——索引生命周期管理
从ES6.6开始,Elasticsearch提供索引生命周期管理功能,索引生命周期管理可以通过API或者kibana界面配置,详情参考[index-lifecycle-management] 本文仅通 ...
- Java中使用队列Queue
示例代码: Queue<Integer> queue = new LinkedList<Integer>(); for (int i = 1; i <= 100; i + ...
- 使用 ServiceStack.Text 序列化 json的实现代码
相信做 .net 开发的朋友经常会遇到 json 序列化这样的需要,今天发篇文章总结下自己使用ServiceStack.Text 来序列化 json.它的速度比 Newtonsoft.Json 快很多 ...
- iOS-AVPlayer使用
1引入AVFoundation.framework框架 2引入头文件<AVFoundation/AVFoundation.h>,并拖入需要播放的视频文件 代码如下: 自定义播放的View, ...
- iOS-UIImageView和UIImage
UIImage self.imageView.contentMode = UIViewContentModeCenter;// 图片的内容模式 [self.imageView setFrame:CGR ...
- idea取消terminal控制台的显示内容大小限制
mac /Applications/IntelliJ IDEA.app/Contents/bin/idea.properties idea.cycle.buffer.size=1024修改为不限制大小 ...
- 【c# 学习笔记】接口
一.什么是接口 接口 可以理解为对一组方法声明进行的同一命名,但这些方法没有提供任何实现.也就是说,把一组方法声明在一个接口中,然后继承于该接口的类都 需要实现这些方法. 例如,很多类型(比如int ...
- 【miscellaneous】基于gstreamer的实时转码
目标是实现一个实时转码,可用于IPTV提供节目源.相关工作在ubuntu操作系统下进行.需要对源代码进行修改的时候,直接采用apt-get source命令获取源代码,根据需要进行修改,然后安装,这样 ...
- CNN-3: VGGNet 卷积神经网络模型
1.VGGNet 模型简介 VGG Net由牛津大学的视觉几何组(Visual Geometry Group)和 Google DeepMind公司的研究员一起研发的的深度卷积神经网络,在 ILSVR ...
- 剑指offer56:删除链表中重复的结点,排序的链表中,删除重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
1 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处 ...