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 ...
随机推荐
- spring集成rabbitMq(非springboot)
首先 , pom文件需要加入spring集成rabbitMq的依赖: <dependency> <groupId>org.springframework.amqp</gr ...
- js与html中unicode编码的使用
js中 // unicode在字符串中使用格式:\u四位编码,一定是四位,否则报错 // 显示 @ 符 console.log(`十六进制 unicode 编码 0x0040 对应的字符是:${'\u ...
- Ubuntu下安装chrome浏览器步骤
进入 Ubuntu 18.04 桌面,按下 Ctrl + Alt + t 键盘组合键,启动终端. 也可以按下 Win 键(或叫 Super 键),在 Dash 的搜索框中输入 terminal 或“终 ...
- GeneXus笔记本—获取当月的最后一天
首先获取当前日期 然后赋值为当前年月的第一天 然后加一个月 减去一天 就是当月最后一天 多用于筛选数据时的条件或者区间 我们先随便拉个页面 简单点就好 放入两个textblock 然后点击Even ...
- 2018-2-13-win10-uwp-从-Unity-创建
title author date CreateTime categories win10 uwp 从 Unity 创建 lindexi 2018-2-13 17:23:3 +0800 2018-2- ...
- IO,文件
IO 1. 定义 >在内存中存在数据交换的操作认为是IO操作,比如和终端交互 ,和磁盘交互,和网络交互等 2. 程序分类 >* IO密集型程序:在程序执行中有大量IO操作,而cpu运算较少 ...
- config.properties
# 数据库配置db.host=10.100.2.50db.port=3306db.database=paycoredb.username=rootdb.password=mysql@123db.ini ...
- java面试题最容易犯错
1. static 和 final 的用法 static 的作用从三个方面来谈,分别是静态变量.静态方法.静态类. 静态变量:声明为 static 的静态变量实质上就是全局变量,当声明一个对象时,并不 ...
- sql对表的操作
--insert into pppcopy select * from ppp //从表ppp中获取数据,并将其插入到pppcopy中,只拷贝表的数据,不拷贝表的结构(前提:表pppcopy1存在) ...
- Oracle 19C的下载和安装部署
1.官网下载zip包. 2.解压到/usr/local/oracle 目录. 3.创建用户和用户组 /usr/sbin/useradd -u oracle //用户组oracle /usr/sbin/ ...