重现基线模型

我们选择了 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. Java实验报告(一)

    1.水仙花数 public class test1{ public static void main(String[] args){ for(int num=100;num<1000;num++ ...

  2. 2016青岛区域赛.Coding Contest(费用流 + 概率计算转换为加法计算)

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  3. 极*Java速成教程 - (4)

    Java语言基础 多态 多态是面向对象的一大重要特性,如果说封装是隐藏一个类怎么做,继承是确定一系列的类做什么,那多态就是通过手段去分离做什么和怎么做. 向上转型与收窄 在开发者将一类事物封装成类以后 ...

  4. FHJ学长的心愿 QDUOJ 数论

    FHJ学长的心愿 原题链接,点我进去 题意 给你一个数N,让你求在\[C^{0}_{n} \ C^{1}_{n}\ C^{2}_{n}\ \dots \ C^{n}_{n}\]中有几个组合数是奇数. ...

  5. 题解 CF1140D 【Minimum Triangulation】

    题意:求将一个n边形分解成(n-2)个三边形花费的最小精力,其中花费的精力是所有三角形的三顶点编号乘积的和(其中编号是按照顶点的顺时针顺序编写的) 考虑1,x,y连了一个三角形,x,y,z连了一个三角 ...

  6. [LeetCode] 84. 柱状图中最大的矩形

    题目链接 : https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 题目描述: 给定 n 个非负整数,用来表示柱状图中各个柱 ...

  7. 结构体指针,C语言结构体指针详解

    结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针. 指向结构体变量的指针 前面我们通过“结构体变量名.成员名”的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针. 前面讲过,& ...

  8. php手动实现ip2long和long2ip

    php手动实现ip2long和long2ip /** * 测试 */ public function testipAction() { $ip = '10.58.101.175'; echo ip2l ...

  9. 01.AutoMapper 之约定(Conventions)

    转载(https://www.jianshu.com/p/d4c472d95da4)   约定(Conventions) 条件对象映射器 条件对象映射器根据源类型和目标类型之间的条件生成新类型映射. ...

  10. 小程序中页面兼容h5标签的解析

    有时候当小程序向后台拿数据是一篇html标签的文章时,把它放进小程序会发现很多标签就不兼容,如果要一个个改又很麻烦,有没有方法可以很快地兼容html标签呢? 有个工具可以做到:wxParse 下载了它 ...