重现基线模型

我们选择了 code2vec 模型进行复现。该模型由 Uri Alon 等作者于 2018 年提出。

模型思路:

从代码与普通语言相比的特殊性入手,首先,对于输入的代码段,作者考虑到尽管很多 NLP 任务中都是将输入的文本作为序列处理的,但是代码段中代码的先后顺序和自然语言中文字的先后顺序的重要性是不同的,代码中更讲究结构,而先后顺序不一定有很大作用。所以作者通过构建抽象代码树来利用代码段语法的结构信息。抽象代码树是编译原理中非常重要的一种结构,将代码中的元素用边连为一棵语法树。在编译代码时,要先将代码转换为对应的代码树,明晰代码各元素的关系,然后才能在代码树上继续编译。将代码树作为输入比直接拿代码作为输入能得到更多更深层的信息。这样,一个代码段就可以用它对应的代码树中的 paths 和 names 来表示了。将代码树中每个 path 做 embedding 并利用一个全连接层进行压缩,并经过一个非线性激活函数后,利用 attention 机制将各个 path 做一个加权求和,得到这个代码段的 embedding,利用这个 embedding 去做一些数学运算就可以去做预测等任务了。下面对各个阶段的操作做简单说明:

a. 利用antlr 4通过遍历parse tree建立代码树,代码树中每个路径<x1, p, x2>视为一个context,其中x1,x2表示终止符,p表示路径。

b. 将代码树中每个context做embedding,也就是对<x1,p,x2>的embedding做一个拼接。这三个元素的embedding是随机初始化后在网络中训练得到的。

c. 通过一个全连接层对b中三个embedding拼接得到的结果通过一个3d * d的权重矩阵做压缩,这个权重矩阵是在网络中学习的。

d. 给每个context不同的attention,加权求和后得到整个代码段的embedding。attention也是在网络中学习的。

训练网络中,我们的ground truth就是正确的tag,向量表示中就是只在正确tag的位置为1,其余为0,训练的目标就是最小化我们的预测向量(每个tag有对应的可能性值)和ground truth的交叉熵。

模型优劣:

模型的结构实际总体借鉴了NLP的CBOW模型,将function或者method转换成语义树的结构应该比直接将代码parse成词汇能保留更多的语义信息,应该可以提高编码器的性能。但这样相当于一个强假设,且将线性数据变成了图结构数据,使得数据的处理难度也加大了。

复现结果:

我们设置了 epochs=6,使用了数据集 java-small。在网上找到了一个日本团队复现的结果,在同数据集上结果对比:

model P R F1
ours 46.48 35.75 40.41
others 50.64 37.40 43.02

可能是训练时长不够的原因,比该日本团队的结果稍差一点,但大致上可以认为是完成了模型复现。

在复现的最初,我找到了网上的一组源代码数据,曾经尝试从提取代码树开始一点一点处理数据,但是由于源代码处理某些细节比较困难,而时间太短,处理失败了。所以最终还是利用了论文公开的处理好的数据。数据处理好后,复现实际上就比较容易了。按照论文将model 建好就可以开始 train 了。


模型改进

  1. 现在的模型是将每条 path 都做 embedding,但有些 path 会 share 一些部分。我们可以去掉这些 share 的部分。利用attention机制,给非重合部分更大的权重,可以做更细粒度的embedding。

  2. 对于这个模型对没见过的 label 无法预测的问题,可以借鉴 NLP 里的 copy mechanism,但是跟NLP不同的是,代码段里能copy过来的东西不一定有用,没有太多有意义的单词,这对输入数据就有要求。

由于时间的原因,我们没有实现这两点改进。


对伙伴的评价

我的结对伙伴是吴紫薇。由于我们两个都没有太多的实验时间,所以一共只进行了两次线下 sync,大部分工作是在线上交流的。由于我对机器学习相关知识并不是非常熟悉,理解不深,紫薇同学为我讲解了很多相关知识与思路,令我收益颇丰。这是一次很开心的合作。

软件工程 in MSRA Code Search-第二次结对编程的更多相关文章

  1. ASE code search -- 第二次结对编程作业

    baseline 复现 baseline模型 我们再这次实验中选择了deep code search方法作为了解并复现.下面介绍一下这两种方法 deep code search 模型的结构在论文中已经 ...

  2. 软件工程 in MSRA 黄金点游戏-第一次结对编程

    简单介绍 第一次结对编程,邹欣老师选择了一个博弈游戏作为题目.博弈论是一门非常有趣的学科.之前竞赛时接触的博弈论大部分都是存在均衡点/必胜策略的.像这次这种多人参与,没有完美策略,你方唱罢我登台的游戏 ...

  3. 2017-2018-2 1723《程序设计与数据结构》第九周作业 & 第二周结对编程 总结

    作业地址 第九次作业:https://edu.cnblogs.com/campus/besti/CS-IMIS-1723/homework/1878 (作业界面已评分,可随时查看,如果对自己的评分有意 ...

  4. ASE第二次结对编程——Code Search

    复现极限模型 codenn 原理 其原理大致是将代码特征映射到一个向量,再将描述文字也映射到一个向量,将其cos距离作为loss训练. 对于代码特征,原论文提取了函数名.调用API序列和token集: ...

  5. 软件工程实践2019第五次作业——结对编程的编程实现 version1.1

    1.链接 我的博客链接https://github.com/S031402112 结对同学的博客https://www.cnblogs.com/jiabingge/ 我们队创建的仓库的Github项目 ...

  6. 【ASE高级软件工程】第二次结对作业

    重现baseline 我们选择重现CODEnn模型(论文:Deep Code Search),因为它结构简单.端到端可训练,且相比其它方法拥有较高的性能. Baseline原理 为了根据给定的quer ...

  7. [BUAA软工]第二次博客作业---结对编程

    [BUAA软工]结对作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 2019年软件工程基础-结对项目作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能 ...

  8. 第二次作业:结对编程,四则运算的GUI实现

    小伙伴:201421123031 余洋 201421123044  潘志坚  题目要求: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是W ...

  9. 集大软件工程15级结对编程week1

    集大软件工程15级结对编程week1 0. 团队成员 姓名 学号 博客园首页 码云主页 孙志威 20152112307 Agt Eurekaaa 孙慧君 201521123098 野原泽君 野原泽君 ...

随机推荐

  1. Cocos2d-X网络编程(2) Cocos2d中的网络通信协议——http协议

    HTTP协议也叫超文本传输协议.是互联网广泛使用的通信协议,常用于B/S架构中. HTTP连接使用的是短连接形式,也就是"请求-响应"的方式,不仅在请求时需要先建立连接,而且需要客 ...

  2. mysql中关于 like ,not like 的用法时不能显示空值的数据(空值不参与判断,直接过滤空值)

    一般在项目中用法是(这种没办法显示空值的数据): select * from 表 where 字段 like %aaa%; 解决空值不显示(除了显示的数据外,空值数据也可以显示): select * ...

  3. CNN(卷积神经网络)原理讲解及简单代码

    一.原理讲解 1. 卷积神经网络的应用 分类(分类预测) 检索(检索出该物体的类别) 检测(检测出图像中的物体,并标注) 分割(将图像分割出来) 人脸识别 图像生成(生成不同状态的图像) 自动驾驶 等 ...

  4. 基于weui loading插件封装

    <!-- Loading.vue --> <template> <div id="loadingToast" v-if="show" ...

  5. iptables添加开放端口

    查看状态 iptables -L -n 编辑/etc/sysconfig/iptables -A INPUT -p tcp -m tcp --dport 4000 -j ACCEPT 重启 servi ...

  6. docker--docker compose 编排工具

    11 docker compose 编排工具 11.1 docker compose 介绍 根据前面所学的知识可知,想要使用Docker部署应用,就要先在应用中编写Dockerfile 文件来构建镜像 ...

  7. Kubernetes服务部署解决方案

    学习了K8S的基础知识,我们的目的就是解决我们服务的迁移,那么接下去通过几个案例来感受一下K8s部署带来的便捷与效率. 环境准备: 3个节点,然后我这边也安装了 Ingress. 部署wordpres ...

  8. Luogu P5444 [APIO2019]奇怪装置

    题目 这种题目看上去就是有循环节的对吧. 在考场上,一个可行的方式是打表. 现在我们手推一下这个循环节. 记函数\(f(t)=(((t+\lfloor\frac tB\rfloor)\%A),(t\% ...

  9. c++ Oracle OCCI 编程

    转载备忘:http://blog.sina.com.cn/s/blog_53a72add01015zj4.html 关于occi编程可以参考的链接: http://blog.itpub.net/162 ...

  10. 在cmd下用cd怎么进不了其他的盘

    你当前就是在C盘目录下的,可以切换到别的盘比如D:,然后在切换E:!然后可以切换C:,然后可以用cd\回到根目录. cd是打开文件根目录里面文件夹的,比如C:目录下可以cd Windows打开Wind ...