[paper note]代码生成评估模型-CodeBLEU原理分析

在这里插入图片描述

论文信息

论文标题:CodeBLEU: a Method for Automatic Evaluation of Code Synthesis

发表时间:2020年9月

论文原文:CodeBLEU: a Method for Automatic Evaluation of Code Synthesis

论文内容

摘要

评价指标对一个领域的发展起着至关重要的作用,因为它定义了区分模型好坏的标准。在代码综合领域,常用的评估指标是 BLEU 或 精确匹配,但它们是不太适合评估代码能力,因为BLEU最初是为了评估自然语言而设计的,忽略了代码的重要语法和语义;而精确匹配因太过严格,导致低估具有相同的语义逻辑的不同输出。为了解决这个问题,我们引入了一个新的自动评估指标,称为CodeBLEU。它吸收了BLEU在n-gram匹配中的优势,并进一步通过抽象语法树(AST)引入代码语法,通过数据流引入代码语义。我们通过评估CodeBLEU与程序员在三个代码合成任务(即文本生成码、代码翻译和代码优化)上分配的质量分数之间的相关系数来进行实验。实验果表明,与BLEU和精确匹配相比,我们提出的Code-BLEU可以与程序员分配的分数实现更好的相关性。

主要思路

论文主要的思想是,在BLEU算法的基础上,增加了其余的三个指标用于解决BLEU的三个问题。

  1. BLEU对每个单词都是一样的,而代码其实是有保留字和声明名称的。对于语言的保留字和声明名称(如变量名、类名等)、常量数值(字符串、数值等),其重要性远远大于普通的名称声明。在这篇论文中,引入了带权重的 BLEU 算法,将保留字的权重设置为普通词的4倍,以应对该问题。
  2. BLEU将代码作为一串普通文本进行对比,忽略了代码语法。实际上,代码作为一个人为创建的语言,具备很强的逻辑性。该论文引入了AST语法树,通过对比语法树来引入对于代码语法的评估。
  3. BLEU将代码以自然语言的形式理解,忽略了代码语义。代码作为逻辑性很强的语言,一个语义的差别,可能带来的结果却是天差地别。该模型引入了数据流,以图的形式比较数据流的相似性,将代码语义引入评估模型中。

根据上述描述,CodeBLEU的最终得分公式如下:

C o d e B L E U = α ⋅ B L E U + β ⋅ B L E U w e i g h t + γ ⋅ M a t c h a s t + δ ⋅ M a t c h d f CodeBLEU =α · BLEU + β · BLEU_{weight} + γ · Match_{ast} + δ · Match_{df} CodeBLEU=αBLEU+βBLEUweight+γMatchast+δMatchdf

典型示例

论文中给了一正一反两个示例,来证明CodeBLEU比BLEU更加准确。

  1. 反例

在这里插入图片描述

这个例子中,参考代码是将一个double类型的数据转化为int类型。而候选代码则将数据转化成了float类型。使用BLEU算法,计算出的相似度为75.43。而考虑了语法和语义的CodeBLEU则对于返回类型的差异做了惩罚扣分,最终结果为69.73。

  1. 正例

在这里插入图片描述

参考代码的逻辑和反例相同,而候选代码中,只是变量名称换了,这丝毫不影响代码的整体逻辑。如果是人工评测,我们会打100分,因为这两段代码的功能是一样的。然而BLEU算法的打分只有68.14分,而考虑语法和语义的CodeBLEU算法的得分为83.97,一定程度上修正了误判。

实现细节

加权N‑Gram匹配

原始 BLEU 比较候选和参考之间的 n 元语法,并计算匹配的 n 元语法的比率。与自然语言的词汇量庞大、词序自由相比,编程语言是人工设计的,只有“int”、“public”等少数几个关键字。将传统的BLEU直接应用到代码综合中会忽略关键字的重要性。因此,我们引入加权n‑gram匹配,为不同的n‑gram分配不同的权重,使得关键词具有更高的权重。

计算公式如下:

p n = ∑ C ∈ C a n d i d a t e s ∑ i = 1 l µ n i ⋅ C o u n t c l i p ( C ( i , i + n ) ) ∑ C ′ ∈ C a n d i d a t e s ∑ i = 1 l µ n i ⋅ C o u n t ( C ′ ( i , i + n ) p_n =\frac{\sum_{C∈Candidates}^{}\sum_{i=1}^{l}µ^i_n·Count_{clip}(C(i, i + n))}{\sum_{C^{'}∈Candidates}^{}\sum_{i=1}^{l}µ^i_n·Count(C^{'}(i, i + n)} pn=CCandidatesi=1lµniCount(C(i,i+n)CCandidatesi=1lµniCountclip(C(i,i+n))

其中n表示n‑gram的长度,C(i, i + n)是从位置i到位置i + n的n‑gram, C o u n t c l i p ( C ( i , i + n ) ) Count_{clip}(C(i, i + n)) Countclip(C(i,i+n))是最大值候选代码和一组参考代码中同时出现的 n 元语法的数量。 µ 表示不同关键字或 n‑gram 的权重。在本文中,关键词的μ是其他标记权重的5倍。同样的,参考BLEU,也使用了惩罚因子,规避算法对短结果的偏向。

B P = { 1  if  c > r e 1 − r c  if  c ≤ r BP=\begin{cases}1 & \text{ if } c>r \\ e^{1-\frac{r}{c} } & \text{ if } c\le r \end{cases} BP={1e1cr if c>r if cr

其中c是候选代码的长度,r是有效参考语料库的长度。最终加权 n-Gram 语法匹配得分计算如下:

B L E U w e i g h t = B P ⋅ e x p ( ∑ n = 1 N ω n log ⁡ P n ) BLEU_{weight} = BP · exp(\sum_{n=1}^{N} \omega _n \log_{P_n}) BLEUweight=BPexp(n=1NωnlogPn)

在这篇的论文中,关键字仅在 unigram(单个词语)中考虑,因此 N 和 ω n \omega_n ωn 等于 1。请注意,需要为每种编程语言预定义一个关键字列表。

语法AST匹配

除了序列级匹配之外,论文还通过匹配语法树结构来考虑CodeBLEU中的语法信息。与自然语言不同,编程语言具有自然的树结构,例如抽象语法树(AST)。 AST 是编程语言抽象语法结构的树表示。我们可以获得tree‑sitter解析结果中的所有子树,然后通过比较候选子树和参考子树来计算准确性。在 AST 中,每个节点表示源代码中出现的一个构造。AST 的叶子代表函数的名称和所有变量。然而,我们只是想使用代码的语法结构,命名并不重要,因此我们省略了原始 AST 树中的所有叶子节点。

计算句法 AST 匹配算法公式如下:

M a t c h a s t = C o u n t c l i p ( T c a n d ) / C o u n t ( T r e f ) Match_{ast} = Count_{clip}(T_{cand})/Count(T_{ref}) Matchast=Countclip(Tcand)/Count(Tref)

其中 C o u n t ( T r e f ) Count(T_{ref}) Count(Tref)是参考子树的总数, C o u n t c l i p ( T c a n d ) Count_{clip}(T_{cand}) Countclip(Tcand)是与参考子树匹配的候选子树的数量。这个分数可以从语法的角度评估代码质量,因为诸如 token 缺失、数据类型错误之类的语法错误可以通过它们 AST 之间的差异来捕获。

语义数据流匹配

在编程语言中,源代码的语义与变量之间的依赖关系高度相关。以下图为例,功能是计算一个数组的平均值。尽管候选项和引用之间的差异很微妙(返回 y → 返回 x),但它们的语义完全不同。然而,加权 n 元语法匹配和句法 AST 匹配仍然给出了很高的分数,因为这两个部分代码具有相同的 AST,并且它们的 token 高度重叠。因此,论文还考虑了CodeBLEU中的语义信息。使用数据流将源代码表示为图,其中节点表示变量,边表示每个变量值的来源。与 AST 不同,下图中两个代码的数据流不同,因为它们的返回值分别来自 x 和 y。这样的语义图可以用来测量候选和参考之间的语义匹配。

在这里插入图片描述

基于上述,计算语义数据流匹配分数分为三个步骤。

步骤1: 获取候选和参考的数据流图。基于 AST,我们首先利用叶子来识别变量序列,表示为 V = {v0, v1, …, vm}。

然后我们将每个变量作为图的一个节点,一条有向边 = vi , vj从vi到vj表示第 j 个变量的值来自第 i 个变量。图 G© = (V ; E) 用于表示代码 C 的变量之间的关系,如图 1 中的红色箭头所示。

步骤2: 标准化数据流项。为了简单和统一,我们忽略变量位置并标准化它们的名称。我们收集数据流项中的所有变量并将它们重命名为 var_i,其中 i 是所有数据流项中出现的变量的顺序。

步骤3: 计算语义数据流匹配分数为:

M a t c h d f = C o u n t c l i p ( D F c a n d ) / C o u n t ( D F r e f ) Match_{df} = Count_{clip}(DF_{cand})/Count(DF_{ref}) Matchdf=Countclip(DFcand)/Count(DFref)

其中 C o u n t ( D F r e f ) Count(DF_{ref}) Count(DFref) 是参考数据流的总数, C o u n t c l i p ( D F c a n d ) Count_{clip}(DF_{cand}) Countclip(DFcand) 是和参考数据流匹配的候选数据流数量。

实验过程

对三个代码合成任务进行了实验,即文本到代码(Java)、代码翻译(从Java到C#)和代码细化(Java)。这些任务的先前工作使用 BLEU 或完全匹配进行评估。在本文中,将以提出的CodeBLEU作为评估指标,看看CodeBLEU是否更合理。对于每个任务,计算 Pearson 相关系数,以检查 CodeBLEU 给出的分数与程序员分配的分数(人类评估分数)之间的相关性。详细的实验过程,可以查看论文原文,这里不赘述。

结论

主要结果主要结果如下表所示。

在这里插入图片描述

在此表中,计算了 BLEU 分数、精确匹配分数、CodeBLEU分数,人类评分四个分数。注意前三项指标范围从0到100,最后一个范围是从 1(非常差)到 5(非常好)。

超参设置

论文尝试了不同情况下的超参数,并记录最终的CodeBLEU得分;再计算该得分与人类评分结果的相关性,最终确定了表现最优的超参数设定。

在这里插入图片描述

参数设置如下:

在这里插入图片描述

由上图和上表可知,最优的超参设置为:

α , β , γ , δ = 0.1 , 0.1 , 0.4 , 0.4 α, β, γ, δ = 0.1, 0.1, 0.4, 0.4 α,β,γ,δ=0.1,0.1,0.4,0.4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/582324.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大厂常见算法50题-替换空格

专栏持续更新50道算法题,都是大厂高频算法题,建议关注, 一起巧‘背’算法! 文章目录 题目解法一 String类replace方法解法二 遍历替换总结 题目 解法一 String类replace方法 String类自带的replace,方法传入两个char类型的参数,分…

分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测

分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测 目录 分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现CNN-GRU…

蓝牙低能耗安全连接 – 数值比较

除了 LE Legacy 配对之外,LE Secure Connections 是另一种配对选项。 LE 安全连接是蓝牙 v4.2 中引入的增强安全功能。它使用符合联邦信息处理标准 (FIPS) 的算法(称为椭圆曲线 Diffie Hellman (ECDH))来生成密钥。对于 LE 安全连接&#xff…

【Stream流基础篇】Java中的函数、函数对象、函数接口和方法引用及转换

什么是函数 在数学中,函数是这样定义的:它是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x…

pytorch中的过拟合和欠拟合

基本概念 我们知道,所谓的神经网络其实就是一个复杂的非线性函数,网络越深,这个函数就越复杂,相应的表达能力也就越强,神经网络的训练则是一个拟合的过程。   当模型的复杂度小于真实数据的复杂度,模型表…

GMSSL编译iOS

一、GMSSL-2.x 国密SDK源码下载,对GMSSL库进行编译生成对应的静态库。执行如下命令: cd到SDK源码目录 cd /Users/xxxx/Downloads/GMSSLV2-master查看SDK适用环境 ./config上图中错误解决方法 使用文本编辑器打开SDK目录下Configure、test/build.info、…

【STM32F407+CUBEMX+FreeRTOS+lwIP之UDP记录】

STM32F407CUBEMXFreeRTOSlwIP之UDP记录 基本信息cubemx配置GPIONVICRCCSYSETHFREERTOSlwIP UDP(SOCKET)效果 UDP广播(SOCKET)效果 UDP组播(SOCKET)cubemx注意以下ethernetif.c效果 可参考正点原子和野火的手…

深度学习论文:Local Feature Matching Using Deep Learning: A Survey

深度学习论文: Local Feature Matching Using Deep Learning: A Survey Local Feature Matching Using Deep Learning: A Survey PDF: https://arxiv.org/pdf/2401.17592 1 概述 近年来,深度学习模型的引入引发了对局部特征匹配技术的广泛探索。本文旨在全面概述局…

go语言实现简单ngnix样例

目录 1、代码实现样例: 2、postman调用ngnix,转发: 1、代码实现样例: package mainimport ("bytes""encoding/json""io""log""net/http""net/http/httputil""…

防止核心研发数据流失:管理者跳槽怎么办?

在高速发展的科技行业中,核心研发数据是企业最宝贵的资产之一。然而,当高层管理人员或核心技术人员因跳槽等原因离开公司时,他们可能会无意中或有意地携带走企业的核心研发数据,这对于任何企业来说都是一个巨大的风险。为了有效地…

Vue---组件

Vue—组件 目录 Vue---组件定义组件全局组件局部组件 组件通讯***重点***父子通信之父传子(props)父子通信之子传父($emit)ref属性($refs) 动态组件插槽命名插槽 定义组件 全局组件 vue2中template只能传…

ArcGIS小技巧—基于点数据的密度分析(含练习数据)

关于空间点数据的密度分析,Arcgis Map中提供了基础的点密度分析和核密度分析。核密度分析可以通过手动设置搜索半径,调整密度分布的合理性。 但有时由于实际工作的需要,我们需要对研究范围做特定划分,比如根据格网规则划分做密度…

Flask框架进阶-Flask流式输出和受访配置--纯净详解版

Flask流式输出🚀 在工作的项目当中遇到了一种情况,当前端页面需要对某个展示信息进行批量更新,如果直接将全部的数据算完之后,再返回更新,则会导致,前端点击刷新之后等待时间过长,开始考虑到用进…

电脑录制视频快捷键,一键开启录屏新时代(干货)

“最近尝试录制一些电脑上的操作视频,用来制作教学教程。不过,每次录制都要通过菜单或搜索来打开录屏软件,实在是有些繁琐。有没有人知道哪些电脑录制视频的快捷键呀?或者有没有通用的快捷键设置方法?” 在当今数字时…

CMake+qt+Visual Studio

#使用qt Creator 创建Cmake 项目,使用Cmake Gui 生成sln 工程,使用Visual Studio 开发 ##使用qt Creator 创建CMake项目 和创建pro工程的步骤一致,只是在选择构建系统的步骤上选择CMake,接下来步骤完全相同 工程新建完成之后,构建cmake 项…

PE文件(三)节表作业

本次作业以notepad进行演示,如下是其在硬盘上的内存 1.手动解析节表 由标准pe头可知,一共由7个节也就是7个节表,可选pe头的大小是0X00F0,即240字节大小 根据上述我们所获取的信息,找到节表的首地址为0x01F8 .text …

微服务:Nacos注册中心

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Nacos注册中心 一、服务注册与发现1.启动Nacos…

Vite proxy-rewrite 属性详解

在前端开发中,为了避免跨域问题,我们会在vite.config.ts 中配置如下问题 rewrite: 由于不了解Nginx的知识,这个属性一直困扰着我,这个重写有啥用,加和不加有啥影响 server: {host: 0.0.0.0,proxy: {/api: {target: ht…

手机通讯录删除了怎么恢复?这里几个方法超快找回!

当我们不小心删除了手机通讯录中的联系人,或者手机丢失导致通讯录信息丢失,恢复通讯录就变得非常重要了。手机通讯录删除了怎么恢复?我们该如何快速找回这些重要的联系人信息呢?下面我们将介绍2种简单易行的方法,帮助您…

Spark核心名词解释与编程

Spark核心概念 名词解释 1)ClusterManager:在Standalone(上述安装的模式,也就是依托于spark集群本身)模式中即为Master(主节点),控制整个集群,监控Worker。在YARN模式中为资源管理器ResourceManager(国内…