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 ...
随机推荐
- 对象和数据库的天然阻抗 转摘于:http://www.jdon.com/mda/oo-reltaion2.html
在“面向对象建模与数据库建模两种分析设计方法的比较”一文中我们比较了在对需求分析时两种方法的不同,所谓数据库建模分析,就是项目一开始就根据需求建立数据库模型,如数据表结构和字段等,这种错误现象大量普遍 ...
- 【学习总结】Python-3-运算符优先级
参考:菜鸟教程-Python3运算符 运算符优先级-表 特别注意:逻辑运算符内部的优先级顺序-考点!!!! END
- html input标签 要求只能输入纯数字
在input标签添加以下代码即可 oninput = "value=value.replace(/[^\d]/g,'')" <input type="text&qu ...
- ARM指令adr adrl ldr mov
ADR是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中.格式:ADR register,exper. 编译源程序时,汇编器首先计算当前PC值(当前指令位置)到exper的距 ...
- 波兰语 polish
There are several systems for encoding the Polish alphabet for computers. All letters of the Polish ...
- Java 代码规范,你应该知道的一些工具和用法(转)
转自:http://yifeng.studio/2017/06/30/coding-with-code-style/ Java 代码规范,你应该知道的一些工具和用法 2017-06-30 从事编程这个 ...
- 生成器模式Builder
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11406502.html 1. 定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的 ...
- TableStore最佳实践:轻松实现轨迹管理与地理围栏
摘要: 基于TableStore轻松实现亿量级轨迹管理与地理围栏 一.方案背景 轨迹管理系统日常生活中使用非常普遍,如外卖派送轨迹.快递物流流转.车辆定位轨迹等.该场景与地理位置管理类似,核心点与瓶颈 ...
- Cisco基础(五):配置静态NAT、配置端口映射、配置动态NAT、PAT配置、办公区Internet的访问
一.配置静态NAT 目标: 随着接入Internet的计算机数量的不断猛增,IP地址资源也就愈加显得捉襟见肘.事实上,除了中国教育和科研计算机网(CERNET)外,一般用户几乎申请不到整段的C类IP地 ...
- ARM 是什么
ARM Advanced RISC Machines. RISC 就是reduced instruction set computer 精简指令集计算机DSP digtal signal Proces ...