ASE: CODEnn Reproduce
Background
第二次结对编程的任务是挑选一个用自然语言搜索相关代码片段的模型实现,并且可以提出自己的想法改进。这个任务很cool,前期做了不少调研。使用自然语言搜索相关代码片段现在是个很受关注的问题,比如Github如果能够加上这个搜索功能那么绝对是一个saving lives的黑科技。目前大家需要实现某个功能的代码时,往往选择在stackoverflow、segmentfault或者直接google找相关的内容。现在搜索引擎被污染的严重,各种垃圾回答坑害生命。(逃
目前学术界对于这个问题也挺关注的,今年出了一篇综述写的还不错,是关于codesearch相关的一个整理When Deep Learning Met Code Search。现在提出来的一些模型有code2vec, CODEnn, CodeNet, NCS以及改进版的UNIF等,github也发起了一个比赛CodeSearchNet。除了上课提到的一些method,一番调研下来发现这个问题确实很有意思。限于时间原因没有进一步尝试图神经网络的办法,不过目前关于CodeSearch Area确实没有GNN的身影(如果有相关paper欢迎留言!)
CODEnn Description
论文里给出了一个清晰的网络结构图,长成这个样子。思路其实非常的清晰,把(code, description)分别映射到向量空间里,让组成一个pair的余弦相关性更大。其中description的encoder论文里用的是RNN,而code部分的encoder的输入包含有三个部分:method name, api sequence和tokens。由于method name和api sequences都是上下文相关的,于是也都用RNN来做特征提取,而根据作者的说法,tokens是没有准确的order的,因此直接用MLP。
流程图也可以画成下面这个样子,可以看到决定模型最终效果的其实完全由codevec和descvec的训练出来的效果决定,首先通过wordembedding可以获得词向量,然后通过特征提取网络加pooling得到句子向量,这是现在NLP里的常规做法。
pros & cons
优点: 多方面的利用了code的属性来获取代码的特征,其中api的调用序列以及方法名称都是不错的attribute
缺点: 关于tokens和desc的encoder也许采用NLP里state-of-art的方法会更好,比如BERT当然模型就更难收敛了。
Reproduce
我和队友最后综合考虑决定复现CODEnn model,我们没有选择原始论文的数据集和代码来复现,因为手上没有足够的机器跑7位数的数据集。再加上老师希望我们实现python版本的codesearch模型,也是一个之后AI Coach的warm up,我和队友选择了Chao Li工程师提供的代码拿来复现。所幸之前实现的同学有一个最终结果可以拿来做参照。首先我和队友先研究了这份代码,数据集是预处理过了的大大降低了复现的难度。这里把原始论文中的RNN改成了GRU,maxpooling改成了meanpooling。训练过程中使用了tensorboard来观察loss和ACC、nDCG等指标。贴图出来可以看到,基本上已经收敛了
其中四个metric的变化过程如下:
首先我们把batch_size改为64,在第一遍training的过程中发现lr不变的情况下在超过30个epoch之后loss就比较难降下去了,而且loss已经降到了1e-3的量级。所以第二遍train的时候把lr改成了分段的形式,在loss下降到了1e-3量级的时候调小了lr,在我们的训练过程里发现lr decay确实可以获得更好的效果。但是由于时间原因也没有跑到最佳的状态,目前的复现水平如下:
datasets | acc@top5 | acc@top10 |
---|---|---|
validation set(pool=200) | 0.780680 | 0.860476 |
validation set(pool=800) | 0.600521 | 0.704167 |
test set(pool=200) | 0.783129 | 0.864014 |
test set(pool=800) | 0.600486 | 0.704618 |
与Sunzi Ping复现的水平在validation set上有点差距,test set上基本保持一致的水平(有的高有的低)。不过考虑到测试的时候是240个epoch的版本,所以应该还有上升空间。按照目前曲线拟合的情况,应该是可以超过之前的浮现效果的。(模型还在跑,待更新最新数据)
datasets | acc@top5 | acc@top10 |
---|---|---|
validation set(pool=200) | 0.806875 | 0.884375 |
validation set(pool=800) | 0.621563 | 0.726250 |
test set(pool=200) | 0.780667 | 0.860333 |
test set(pool=800) | 0.596250 | 0.711250 |
Frontend Demostration
值得一提的是,我们写了点前端代码来方便演示模型的最终效果。我们拿一些例子跑了一下,有的时候返回的结果还是挺不错的,但是对于数据集里没有覆盖到的代码返回结果就很凌乱。比如论文中有一个例子,”get the content of an input stream as a string using a specified character encoding“,测试结果如下:
再比如可以测试一下简单需求”load json":
但是还是存在大量的搜索是不大ok的,比如“make hex string into integers"
Improvement
模型可以改进的地方有这么一些,不包括已经改变的RNN to GRU, maxpooling to meanpooling。可以把description部分的RNN用BERT代替,使用预训练的word2vec或者先预训练一个embedding,然后fine tune。code部分的改进办法可以简单的使用graph embeddding使用一些ast的信息。或者加上GCN来让事情变得有趣起来(大雾)。有一个比较大的问题时,经过我们的观察其实很多docstring并非一个准确的comment,比如一些作者信息、字符画也会存在。简而言之就是大家写代码(包括很多大型开源项目)都不喜欢写很清晰准确的注释,导致没有特别好的数据集。我和队友认为把当前的CODEnn配合干净、大量、高质量的数据集,应该已经可以获得thrilling的效果了。
Accessment
我的队友是易婧玮,她是一个非常positive的人,国庆假期经常找我商量结对编程的事情。我们做过很多讨论,并且她在NLP方面比我多很多经验,在读代码复现的过程中和她合作非常愉快,能够很快的定位问题解决问题。虽然我俩都很忙,还是比较认真的完成了这次结对编程的任务。遗憾的地方是没有来得及实现我们的idea,如果能抽出时间我们很愿意做这个工作。
ASE: CODEnn Reproduce的更多相关文章
- sybase ASE 12.5版本下载地址
为便于广大爱好者方便 学习Sybase ASE数据库,我将windows平台下的(32位)Sybase ASE放到下面的位置: ASE 12.5: (8个包) http://download.csdn ...
- Sybase ASE报错:server Error: 8242, Severity: 16, State: 1
昨天上午,同事反映某系统在执行存储过程的过程中报错了,报错的信息异常如下: 05:00000:00009:2014/06/09 15:45:30.34 server Error: 8242, Seve ...
- Sybase ASE安装过程报错,无法创建数据库设备[AM fork() failed]
今天同事要搭建一套测试环境,安装开发版的SYBASE ASE 15.03 Windows平台下的,发现安装过程中到了创建数据库设备的环节就开始报错了,报错信息如下: 03/24/14 09:31:44 ...
- 关于ASE日志空间示数不正常的解决办法
最近某系统的ASE数据库出现了异常,经过各种努力,终于把数据库正常又起起来了.但是经过检查,发现在查看剩余日志空间的时候(sp_helpsegment 'logsegment'),发现显示出来 ...
- ASE中的主要数据库
Adaptive Server包括多种类型数据库: 必需数据库. “附加功能”数据库 .例子数据库 .应用数据库 1.必需数据库 master 数据库包含系统表,这些系统表中存储的数据被用来管理,有 ...
- 使用isql连接Sybase ASE数据库的常见错误及处理方式
使用isql连接Sybase ASE数据库 Sybase ASE客户端工具中有一个比较实用的命令行工具isql.利用isql可以对ASE数据库服务器进行几乎所有的管理维护工作. 下面用isql工具连接 ...
- sybase的ASE和IQ版本有什么区别
原文:ASE是sybase OLTP数据库,行式存储.IQ是Sybase OLAP和DSS的数据库,采用列式存储,适合数据仓库.数据集市等分析性应用,不符合并发压力大的联机场景.
- ASE存储过程和IQ存储过程的常见区别(附例子)
ASE存储过程和IQ存储过程的常见区别(附例子) 1 存储过程简介 存储过程(Stored Procedure)是为了完成特定的功能而汇集成一组的SQL语句集,并为该组SQL语句命名.经编译后存储在S ...
- sybase ase 重启
sybase ase 重启 https://blog.csdn.net/davidmeng10/article/details/50344305 https://blog.csdn.net/wengy ...
随机推荐
- NOIP后一波总结
我的山寨较为可靠分数为305(洛谷是真的水~显然不能用啊,果断换了一组合适的数据) 据大神们估计,得奖的分数在280, 我肯定是没有啥希望了.(我旁边的lxy同学从初二开始,每次以超分数线至少60分的 ...
- tomcat脚本
!/bin/sh # eg: tomcat.sh start xxx # proc_dir="/usr/local/xxx/tomcat-zc-web/bin" proc_name ...
- Vue小白篇 - ES6的语法
为什么要学 ES6 的语法呢? 因为 Vue 语法有很多都是 ES6(ECMAScript 6),这里推荐 [阮一峰 ECMAScript 6 入门]: http://es6.ruanyifeng.c ...
- Tkinter初体验
一.基本步骤 1.导入Tkinter模块 2.创建根窗口 3.填充组件 4.组件关联逻辑 5.进入主循环 二.Code #coding:utf-8 ''' 网关流量校验器 @author: Hongz ...
- 九、结构模式之装饰(Decorator)模式
装饰模式又叫包装模式,装饰模式以客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.装饰模式可以在不使用创造更多的子类的情况下,将对象的功能加以扩展. 装饰模式结构图如下: 其包含的角色就分为: ...
- Java网络编程:什么是Socket编程?
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 我们开发的网络应用 ...
- php7类型约束的意义
在PHP7之前,函数和类方法不需要声明变量类型,任何数据都可以被传递和返回,导致几乎大部分的调用操作都要判断返回的数据类型是否合格. 为了解决这个问题,PHP7引入了类型声明. 目前有两类变量可以声明 ...
- spring data jpa sql
CREATE TABLE cst_customer ( cust_id bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)', cust_name ...
- python--表达式形式的yield、面向过程编程、内置函数
yield的表达式形式 def init(func): def wrapper(*args, **kwargs): g = func(*args, **kwargs) next(g) return g ...
- 服务器一般达到多少QPS比较好?
每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量. 原理:每天80%的访问集中在20%的时间里,这20%时 ...