IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 《GraphCodeBERT: Pre-Training Code Representation With Data Flow》论文笔记 -> 正文阅读

[人工智能]《GraphCodeBERT: Pre-Training Code Representation With Data Flow》论文笔记

论文来源:ICLR-2021
论文链接https://arxiv.org/abs/2009.08366(看时间,应该是2020发在了arxiv上,2021被ICLR录用)

?

?主要贡献:

?可以说是在CodeBERT的基础上引入了结构信息和两个新的预训练任务。
?1.提出了GraphCodeBERT,是第一个利用了代码语义结构信息来学习代码特征表示的预训练模型。(通过data flow来获得语义结构信息而不是AST)

?2.除了MLM预训练任务,还引入了2个新的能够从source code和data flow中学习代码表示的跟代码结构相关的预训练任务。

?3.GraphCodeBERT在4个下游任务上达到了SOTA的性能,同时证明了代码结构信息的引入和2个新的预训练任务的引入能够改善模型的性能。

?注:
?4个下游任务如下:

1.code search
2.clone detection
3.code translation
4.code refinement

?且实验表明在code search任务中,相比于token-level attention,模型更偏向于structural-level attention。

?

?背景&相关工作:

?现有的一些代码预训练模型,只是将代码看做由token组成的序列,而忽略了代码的内在结构信息,而这些重要的代码语义结构信息能够加强代码理解的过程。

?相关工作部分具体看论文,主要介绍了2个部分的相关工作:
?1.编程语言方面的预训练模型
?如CodeBERT、C-BERT、GPT-C等模型。

?2.引入了代码结构信息的神经网络模型
?如基于AST的语言模型、将代码表示为图结构,用图神经网络去推理的模型等。

?然后这些引入了结构信息的模型都是对于特定的任务从头去开始训练的,并没有使用预训练模型,而论文的模型则是利用了代码的结构语义信息去预训练学习代码的表示。
?

?Data Flow:

?data flow是一个图,图上的节点代表变量,边表示这些变量的值来自哪里。不像AST,data flow在相同的源代码的不同的抽象语法下是一样的。AST是提取了代码的syntactic-level结构信息,而data flow提取代码的semantic-level信息。
?同时,data flow有助于模型考虑离的很远距离但是使用了相同的变量或函数引起的长期依赖关系。
?例如下图的代码中有好几个地方都有x,通过提取到的data flow后,我们可以知道,x11会更加注意x7和x9而不是x3。
在这里插入图片描述
?data flow的提取流程:
在这里插入图片描述
?就是利用tree-sitter工具提取AST,然后根据AST和AST的叶子节点来获得变量序列。然后把有关系的变量之间连起来作为data flow的边。
?【注:这里用到的解析工具是tree-sitter。该解析工具支持论文中提到的6种编程语言,打破了ANTLR的限制。】
?

?GraphCodeBERT结构:

在这里插入图片描述
?模型结构其实就是BERT的结构,由多层transformer层构成,但是其中的注意力机制有变化,论文为引入代码结构信息,做了点小修改。

?为了适应更多的下游任务。输入包含了代码的注释文档、代码、代码的结构信息。
?输入表示如下,跟BERT处理一样,也是用[CLS]作为头部,[SEP]作为分隔符:
??????X = {[CLS], W, [SEP], C, [SEP], V }。
?对于每个token,输入向量都是由token embedding和position embedding相加构成。而对于变量token则使用特殊的position embedding来指示其是data flow中的节点。

?模型用公式表示如下:
?也就是transformer里面的公式,经过多头注意力,然后经过2层前馈NN,然后LN处理:
在这里插入图片描述

那么具体的,注意力的计算就是如下公式:
在这里插入图片描述
?其实就是将上一层的输出H经过3个线性层映射为QKV矩阵。而原来transformer里的注意力计算里是没有M的,这篇论文为引入结构信息就在这里加了M,这个M是这个模型的重点。
?

?Graph-Guided Masked Attention:

?🚀下面根据我对transformer和论文的理解,来讲讲这个M矩阵:
?M矩阵是一个mask矩阵,维度是(|X|, |X|),元素m_ij即代表第i个token和第j个token有没有关系,有关系则为0,没关系那就负无穷咯。为啥呢?因为经过负无穷经过softmax就变成了0了。
?这里我把transformer论文的公式复制过来,理清一下思路,如下:
在这里插入图片描述

?其实红色圈住的是一个注意力得分矩阵,他的0、1维度也是token的数量。这样这个矩阵的元素就是各token之间的注意力了。因为每个token都有一个query和key向量,那么用当前token的query向量去和别的token的key向量做内积,再用根号dk缩放经过softemax就是当前token对别的token的注意力得分,上面只是用矩阵的形式表示了。
?【最后把注意力得分当成权重,对每个token的value向量进行加权和就是self-attention层的输出】。

?M矩阵,它是和上面公式里圈住的注意力得分矩阵相同维度的。所以这里加个M矩阵,那么没有关系的部分是负无穷,加上绿色圈住的部分那肯定还是负无穷,所以咯,经过softmax就变为0了,相当于这部分没关系的信息被屏蔽了(也就是通过加上负无穷,让当前token的query向量注意不到别的无关token的key向量)。而有关系的0值加上去,绿色圈住的公式部分就不变。

?M矩阵公式如下:
在这里插入图片描述
?E集合是代表变量与变量的关系边的集合,而E’集合则是代表变量和code token的关系边的集合。当然如果query向量和key向量都是属于代码文档部分对应的或者代码token部分对应的,那肯定要保留。因为我们要处理的是data flow里的相关信息,即变量和变量,变量和code token。

?

?预训练任务:

1.MLM(Masked Language Modeling)
?数据是代码文档和代码。
?像BERT一样,随机选择15%的token,其中80%用 [mask] token代替,10%不变,10%用随机token。

2.Edge Prediction
?这个预训练任务时为了从data flow中学到表示信息。
?数据是data flow里的变量序列。
?从data flow随机采样20%的节点,作为集合Vs。通过在前面讲解的M矩阵里加上负无穷来mask掉它的变量与变量之间的信息,然后因为经过GraphCodeBERT是每个变量token都会得到一个向量表示对吧,将这些得到的向量两两之间进行内积,然后经过sigmoid映射到(0,1)之间得到的每个值(也就是下面公式中的p_eij),其实这个值就相当于每个变量token之间是否存在依赖关系的概率了。

?损失函数如下,好像就是交叉熵loss的样子:
(E_mask就是被mask掉的边的集合。同时,作者采样了和正样本相同数量的负样本。)
在这里插入图片描述
?其中,Ec如下,也就是所有的被mask掉的节点和变量token之间的关系边的集合。
在这里插入图片描述
【注X代表笛卡尔积:在这里插入图片描述

3.Node Alignment
?这个预训练任务是为了学习source code和data flow之间的隐式对齐表示,也就是data flow中的变量对应source code中的哪个部分。如下图的箭头:
在这里插入图片描述
?那么做法也和Edge Prediction一样,从data flow中随机采样20%节点,然后在M矩阵中mask掉和其相关的位置。然后也是内积啊、sigmoid操作得到两者是否存在依赖关系的概率。也采样了和正样本相同数量的负样本。
?损失函数如下:
在这里插入图片描述
?以上就是关于模型结构原理以及预训练任务的讲解,就是主要的就是M矩阵。

?

?实验部分:

?也就是在4个下游任务上进行fine-tuning咯,和其他一些模型对比,达到了SOTA的性能:

1.code search
2.clone detection
3.code translation
4.code refinement

?然后还进行了
?1.消融实验:在6种编程语言上测试分别测试

?2.Node-vs. Token-level Attention

?3.Comparison between AST and Data Flow

?4.Case study:输入代码文档和代码,对比GraphCodeBERT有无使用data flow时对于给定的文档是否能够很好的描述代码的含义,验证data flow能够加强代码的理解过程。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:36:04  更:2021-08-12 16:36:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 20:36:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码