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。

流程图也可以画成下面这个样子,可以看到决定模型最终效果的其实完全由codevecdescvec的训练出来的效果决定,首先通过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的更多相关文章

  1. sybase ASE 12.5版本下载地址

    为便于广大爱好者方便 学习Sybase ASE数据库,我将windows平台下的(32位)Sybase ASE放到下面的位置: ASE 12.5: (8个包) http://download.csdn ...

  2. Sybase ASE报错:server Error: 8242, Severity: 16, State: 1

    昨天上午,同事反映某系统在执行存储过程的过程中报错了,报错的信息异常如下: 05:00000:00009:2014/06/09 15:45:30.34 server Error: 8242, Seve ...

  3. Sybase ASE安装过程报错,无法创建数据库设备[AM fork() failed]

    今天同事要搭建一套测试环境,安装开发版的SYBASE ASE 15.03 Windows平台下的,发现安装过程中到了创建数据库设备的环节就开始报错了,报错信息如下: 03/24/14 09:31:44 ...

  4. 关于ASE日志空间示数不正常的解决办法

        最近某系统的ASE数据库出现了异常,经过各种努力,终于把数据库正常又起起来了.但是经过检查,发现在查看剩余日志空间的时候(sp_helpsegment 'logsegment'),发现显示出来 ...

  5. ASE中的主要数据库

    Adaptive Server包括多种类型数据库: 必需数据库. “附加功能”数据库 .例子数据库 .应用数据库 1.必需数据库 master 数据库包含系统表,这些系统表中存储的数据被用来管理,有 ...

  6. 使用isql连接Sybase ASE数据库的常见错误及处理方式

    使用isql连接Sybase ASE数据库 Sybase ASE客户端工具中有一个比较实用的命令行工具isql.利用isql可以对ASE数据库服务器进行几乎所有的管理维护工作. 下面用isql工具连接 ...

  7. sybase的ASE和IQ版本有什么区别

    原文:ASE是sybase OLTP数据库,行式存储.IQ是Sybase OLAP和DSS的数据库,采用列式存储,适合数据仓库.数据集市等分析性应用,不符合并发压力大的联机场景.

  8. ASE存储过程和IQ存储过程的常见区别(附例子)

    ASE存储过程和IQ存储过程的常见区别(附例子) 1 存储过程简介 存储过程(Stored Procedure)是为了完成特定的功能而汇集成一组的SQL语句集,并为该组SQL语句命名.经编译后存储在S ...

  9. sybase ase 重启

    sybase ase 重启 https://blog.csdn.net/davidmeng10/article/details/50344305 https://blog.csdn.net/wengy ...

随机推荐

  1. JS事件循环(Event Loop)机制

    前言 众所周知,为了与浏览器进行交互,Javascript是一门非阻塞单线程脚本语言. 为何单线程? 因为如果在DOM操作中,有两个线程一个添加节点,一个删除节点,浏览器并不知道以哪个为准,所以只能选 ...

  2. 2018-2-13-关于Host(主机)

    title author date CreateTime categories 关于Host(主机) lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 ...

  3. device tree DTB DTC 相互转换

    DTB --> DTS ./dtc -I dtb -O dts *.dtb -o *.dts DTS -> DTB ./dtc -I dts -O dtb -o test.dtb test ...

  4. CUDA学习之二:shared_memory使用,矩阵相乘

    CUDA中使用shared_memory可以加速运算,在矩阵乘法中是一个体现. 矩阵C = A * B,正常运算时我们运用 C[i,j] = A[i,:] * B[:,j] 可以计算出结果.但是在CP ...

  5. 修改jquery默认的$

    一.使用JQuery.noConflict() 该方法的作用就是让Jquery放弃对$的所有权,将$的控制权交还给prototype.js,因为jquery.js是后引入的,所以最后拥有$控制权的是j ...

  6. SQL Server 2014 各版本介绍

    SQL Server 2014 各版本介绍 目前,SQL Server 2014 分为主要版本和专业版. 在选择版本的时候可以根据您具体的需要进行抉择,如果你需要一个免费的数据库管理系统,那么就选择 ...

  7. java版扫雷

    package com.titian.bean; import java.awt.CardLayout; import java.awt.Point; public class Grid { char ...

  8. Andrdoid中对应用程序的行为拦截实现方式之----从Java层进行拦截

    致谢: 感谢 简行之旅的这篇blog:http://blog.csdn.net/l173864930/article/details/38455951,这篇文章是参考这篇blog的进行一步一步操作的, ...

  9. 最新最全最详细的MacOS 10.14 Mojave黑苹果安装教程

    图文教程知乎地址:点击打开链接 视频教程B站地址:点击打开链接 微信公众号 地 址:点击打开链接 准备工作(工具包及镜像在后边) 一个8G以上的U盘(有的U盘标的是8G,实际只有7.X,实际容量小于7 ...

  10. Linux 应用程序编程基础

    一个计算机应用程序在内存中可以分成两个部分:存放代码的代码段和存放数据的数据段.代码段存放用户编写的代码;数据段存放栈和堆. 相关内存管理函数 #include <stdlib.h> vo ...