多种编程语言的学习迁移

互联不一般哥 2024-03-31 20:55:09

Learning Transfers over Several Programming Languages

RAZAN BALTAJI1, SAURABH PUJAR2, LOUIS MANDEL2, MARTIN HIRZEL2, LUCA BURATTI2,AND LAV R. VARSHNEY1, 1 University of Illinois at Urbana-Champaign, USA 2IBM, USA

引用

Baltaji R, Pujar S, Mandel L, et al. Learning Transfers over Several Programming Languages[J]. arXiv preprint arXiv:2310.16937, 2023.

论文:https://arxiv.org/abs/2310.16937

摘要

本文探讨了大型语言模型在编程语言领域的应用,特别是针对低资源编程语言的挑战。目前,许多编程语言缺乏标记样本,使得传统的LLMs难以发挥作用。作者提出了跨语言迁移学习的概念,通过从源语言中获取数据来提高模型在目标语言上的性能。他们进行了大量实验,使用基于变压器的LLM和11到41种编程语言,探讨了跨语言迁移在不同语言对上的效果、如何选择最佳源语言、预测迁移性能的语言对特征,以及这些特征如何影响具体任务的表现。

1 引言

大型语言模型 (LLM) 利用软件的自然性在许多软件工程任务来实现最先进的性能,例如缺陷检测、克隆检测和代码翻译等。然而,到目前为止,这些模型主要是在编程语言上进行训练和评估的拥有大量公开可用的代码,而不是资源匮乏的代码。编程语言用于关键和战略应用程序可能有很多代码仅存在于私有存储库中,因此会被忽略。COBOL,它支持许多关键的金融应用程序,并且总共可能有超过 7750 亿行代码,由于缺乏开放可用性而导致资源匮乏。与 Fortran 类似,它用于重要的高性能和科学计算领域。尽管它们很受欢迎,但 Rust 等开始出现的新语言还是资源匮乏。由于许可原因,其他语言(例如 R)可能资源匮乏。除了由于大语言模型的代表性不足,组织必须经常在培训上花费大量资源软件开发人员自己使用他们几乎没有经验的低资源语言。这增加了维护此类软件的成本,还可能抑制创新。这就需要最先进的人工智能增强软件开发人员使用这些低资源语言的能力的工具。事实上,大语言模型正在用于提高软件开发人员生产力的工具,还可以帮助迁移或现代化通过支持代码翻译将项目从一种编程语言转换为另一种编程语言。

最近的工作表明了迁移学习的可能性:利用一种编程语言的数据以弥补目标编程语言中数据的缺乏。最近的另一项工作开发了几个相似性度量来决定可以使用哪种高资源编程语言数据集增加其他一些语言的微调数据。然而,之前的工作最多使用了 6 种语言,没有一种其中可以被认为是真正的低资源。此外,编程语言之间的相似性概念尚未得到充分审查:需要更多的研究来对有效性做出可靠的主张。为了克服这些缺点,我们检查了 4 种任务和更多语言从源语言组合到目标语言组合的可迁移性。图 1 给出了我们方法的高级概述广泛的实证研究。从左到右,我们从一个预训练的 LLM 开始,该 LLM 在以下代码中看到了未标记的代码:几种编程语言。接下来,对于四个任务中的每一个,对于每种源语言都有适当数量的为该任务标记训练数据,我们对 LLM 进行微调。对于每种目标语言,都有适当数量的为任务标记测试数据评估微调的 LLM 并测量其性能。例如图1通过标签分类任务来说明这一点,使用 C 作为源语言,Rust 作为目标语言,得出的 F1 分数为 0.48。对四个不同的任务及其所有源语言和目标语言执行此操作组合产生四个不同的热图。

图1:方法的高级概述

作为我们的第一个研究问题 (RQ1),我们询问学习一般如何跨编程语言迁移通过探索这些热图。作为我们的第二个研究问题(RQ2),我们问是否可以预测排名之前实验的热图中的源语言仅使用语言对的特征根据语言对特征和真实目标标签训练性能预测模型热图。例如,在图 1 中,标签分类任务的性能预测模型可能预测语言对 ⟨C, Rust⟩ 的 F1 分数为 0.47。考虑到LLM的培训成本,绩效预测模型对于指导数据采集工作和决定如何使用计算资源非常有用。最后,作为我们的第三个研究问题(RQ3),我们寻求软件工程对特征的洞察影响可移植性的编程语言。为此,我们衡量语言对的重要性先前实验的预测模型中的特征。

总的来说,本文的贡献如下:

使用大预言模型评估多种语言(包括低资源语言)和任务的成对可迁移性。开发一种方法来识别不同目标语言的最佳迁移语言任务。表征可预测给定可转移性的编程语言对的特征任务。

2 实验设置

如图1所示,给定一项任务,我们的实验方法首先针对每个源微调模型单独的语言,然后在所有目标语言上测试每个微调模型。我们应用了这个方法到四项任务,其中源语言的数量从6种到22种不等,总共有58个微调模型。然后,每个模型在11到43种语言上进行评估,进行1808次实验。所有结果均呈现在图2 的(a)–(d)。本节详细介绍了我们方法的各个方面,包括关于数据、软件工程任务和大型语言模型。

2.1 基础数据集

这项工作中研究的四个任务源自两个大型多语言代码数据集:CodeNet和XCodeEval。 CodeNet是可用于编程语言的最广泛的数据集之一。它包含约1400万个代码样本,总共5亿行代码,涉及55种不同的编程方式资源丰富和资源匮乏的语言。它源自在线法官网站上托管的问题和数据集包含以许多不同的编程语言提交的这些问题。数据集来了具有代码分类和代码相似性的基准。XCodeEval是来自另一个包含2500万个样本的在线评判网站,与CodeNet不同。编程语言有11种,其中只有少数他们可能资源匮乏。该数据集的主要特点是它配备了基于执行的评估框架和几个不同的基准:来自分类(标签分类和编译分类)到生成(程序合成、自动程序修复和代码翻译)。

2.2 任务

为了研究学习如何在编程语言之间迁移,我们探索了两种类型的任务:分类(编译分类、标签分类、克隆检测)和生成(代码细化)。对于分类任务,我们通过基于类标签的词汇来预测标签最终的解码器隐藏状态。我们使用BLEU分数用于评估生成任务和F1分数用于评估分类任务。

(1) 编译分类:多语言二元分类任务。给定语言L的代码C,任务是确定C是否编译而没有错误。

(2) 标签分类:多语言多标签分类任务。给定语言L的代码C,任务是预测与编写程序所需的潜在算法技术相对应的一组标签(例如,2-sat、二分搜索)。

(3) 克隆检测:多语言二元分类任务。给定两个语言代码示例C1和C2,任务是检测两个样本是否是IV型克隆(语义相似)。到生成数据集后,我们将以下过程应用于 CodeNet数据集。给定所有组合语言L中所有问题的解决方案,我们将正样本(克隆)识别为接受的对同一问题的解决方案,其他问题作为反面例子。为了平衡正样本跨问题,我们确保不同语言的正样本比例为 0.15。

(4) 代码优化:生成性综合任务。给定语言L中的错误代码C,任务是生成对应的固定代码。我们在CodeNet上使用以下过程生成数据集解决方案:通过顺序插入、删除或替换不同的标记来修改每个样本不同代币类型的固定比率的类型。

图2(a):迁移分数热度图,克隆检测:21 种源语言 × 41 种目标语言。指标:F1 分数

图2(b):代码优化:20 种源语言 × 38 种目标语言。指标:BLEU 分数

2.3 数据采样

考虑到不同语言对应的数据集大小的变化,我们遵循德弗里斯等人的抽样程序。我们首先使用不同样本数量的数据集对模型进行微调 N={10K,30K,50K,70K,100K}。根据语言L的训练示例NL的可用性,我们随机上采样N<NL的语言和N>NL的下采样语言。我们进一步选择源语言基于与基线模型相比的相对性能。我们针对不同的任务选择以下样本量:50K 用于标签分类,70K用于代码细化,100K用于克隆检测和代码细化。

图2(c):标签分类:11种源语言×11种目标语言。指标:F1 分数

2.4 模型

我们的实验框架基于CodeT5-base(220M参数)。Code-T5是一个开源模型,经过多种编程语言的预训练。由于其编码器-解码器性质,它可以轻松支持两者具有良好性能的代码生成和代码理解任务。此外,其相对较小的尺寸使得它非常适合我们的实验设置,该设置需要63个微调模型,每个模型都进行大量推理运行。

3 实验评估

3.1 实验设置

研究问题。在本文中,我们研究以下研究问题:

RQ1:对于跨不同语言对的给定任务,跨语言迁移效果如何?

RQ2:给定任务和目标语言,我们应该如何选择源语言以获得最佳性能?

RQ3:语言对的哪些特征可以预测迁移性能,以及它是如何预测的取决于给定的任务?

图2(d):编译分类:6种源语言×11种目标语言。指标:F1 分数

3.2 转移分析

为了探索 RQ1,我们对源编程和目标编程的每种组合进行了广泛的实验语言。源编程语言是用于微调模型的语言(样本位于训练数据),目标编程语言是用于评估模型的语言(样本位于测试数据)。源语言和目标语言的这种组合可以导致两种微调:和跨语言。单语微调是当源语言和目标语言相同时,跨语言是当它们不同时。所有单语言和跨语言实验都在热图2(a)–(d)中表示,每项任务一个。本小节尝试根据任务依赖性提取一般见解以及源语言和目标语言依赖性。考虑到我们的任务和数据集,我们还确定哪些语言是最难的目标语言以及最好的源语言。

图3:跨任务不同采样策略的测试指标

对于标签分类。然而,对于所有任务,平均跨语言分数远高于零样本分数。这表明学习在所有任务、所有编程语言中都能很好地进行跨语言微调。

源语言和目标语言依赖性。可迁移性的另一个重要决定因素是以下因素的组合:源语言和目标语言。正如可以预期的那样,对于大多数情况下的单语表现,其中来源和目标相同,优于源语言和目标语言不同的跨语言性能。图3显示克隆检测的平均单语得分为0.91,代码细化的平均单语得分为0.98,而他们的跨语言得分平均值为0.78和0.75。对于较困难的任务,分数会下降,但关系会保持不变。编译分类和标签分类的单语得分分别为0.78和0.51,而跨语言得分分数分别为0.66和0.47。克隆检测、代码细化、标签分类的平均zero-shot分数编译分类任务分别为 0.49、0.28、0.01 和 0.49。当在零样本分数的背景下观察时,所有任务我们都可以看到,在缺乏单语言训练的情况下,跨语言微调确实有帮助。这也是表明对于许多缺乏足够微调样本的语言,跨语言微调要比zero-shot好得多。

目标语言依赖性。表1和表2表明可移植性还取决于目标编程语言。一些目标编程语言在单语言性能方面表现良好,但在跨语言性能方面却很差。跨多个任务的一个例子是 C++,它可以被认为是低资源的可转移性。对于标签分类的克隆检测、代码优化、C++ 的语言内性能分别为 0.95、0.99 和 0.46,而对于相同的任务,其跨语言性能分别为 0.79、0.81和 0.41。 Java是跨任务和跨语言具有更一致的语言内和跨语言可转移性的语言示例因此可以认为比C++相对更具可移植性。Java的语言得分为0.95、0.99和克隆检测、代码细化和标签分类的得分为 0.45,相同任务得分为0.86、0.84和0.42。

表1:所有任务通用的目标语言的分数分布

表2重点关注未出现在源代码中的目标语言,这些语言被视为低资源语言在我们的数据集中。在低资源目标语言中,用于克隆检测和代码优化、Dart、TypeScript、Lua可以被认为是可移植性较高的,平均得分为0.87和0.79、0.82和0.83、0.81和0.76。Vim的平均得分为0.69、0.67,COBOL的克隆检测和代码平均得分为0.72、0.74细化可以被认为是可移植性相对较低的语言。对于编译分类有是一组较小的语言,可以被认为是低资源。我们观察到平均分数变化较小在不同的来源中,最高的是 Rust,为 0.66,最低的是 C,为 0.64。用于标签分类没有低资源目标语言。对于资源匮乏的语言,我们发现跨语言培训非常重要在所有语言和任务中都比zero-shot更好。

最可转移的源语言。在这四项任务中,我们有 6 种常见的源语言。这些分别是 Javascript、C、Kotlin、Java、C++ 和 Python。为了确定最佳源语言,我们计算了平均值所有目标语言中每项任务的每种语言的得分。然后我们对源语言进行排名根据这些平均分数(从最高到最低)对每项任务进行评估。然后我们计算了每个的平均排名这些常见的源语言。结果显示在表4中,我们发现最好的源语言,在所有任务和目标语言中,依次为 Kotlin、Javascript、Java、Python 和 C(平均排名相同)最后是C++。 Kotlin 成为性能最好的源语言令人惊讶,因为它不经常被讨论预训练LLM的背景。

表2:克隆检测和代码优化常见的低资源目标语言的分数分布

表3:按任务划分的分数分布

3.3 表现预测

给定任务和目标语言,我们应该如何选择源语言以获得最佳性能?知道如何回答这个问题而不必在不同的源语言上训练多个模型可以节省很长时间和昂贵的培训。它还为研究成功地从一种语言迁移到另一种语言的重要特征提供了基础。

为了预测模型在不同任务上的性能,我们训练了一个基于梯度提升决策树(GBDT)的排名模型,对每个任务的不同源语言进行排名,并与服务器进行比较受先前作品启发,考虑单个特征或特征类别的基线启发式方法。我们表明我们的模型在预测源语言以实现最佳跨语言方面优于其他启发式方法跨不同任务转移。我们考虑表5中定义的功能。这些功能可分为四大类:

(1) 语言特征:表征语言的一般属性,如支持的范式、风格内存管理(是否有垃圾收集器)以及类型系统的特征。

(2) 句法特征:每个源语言和目标语言对的成对特征,通过重叠来衡量不同令牌类型的计数2

(3) 数据集特定特征:与问题属性相关的源特征、目标特征和成对特征与数据集中的代码示例关联。

(4) 特定于模型的特征:与所看到的语言相关的源特征、目标特征和成对特征预训练期间的模型。

3.3 特征分析

进一步解释4.1节中观察到的模式,我们调查特征的相对重要性有助于跨语言迁移。解释任务间转移的变化、转移的依赖性关于源和目标配对以及特定源支持的最佳传输需要彻底的了解不同特征如何影响迁移。我们基于决策树的排序模型的优点之一是它的可解释性。我们计算Shapley值,引入博弈论概念,广泛应用于机器学习模型预测的解释。不同特征的Shapley值显示每个特征对模型输出的相对影响。在对不同源语言进行排名的背景下在跨语言迁移中,Shapley 值可以深入了解不同特征如何促进迁移。

图4:不同排名者和相应任务的归一化折扣累积增益分数为 3 (NDCG@3) 分数 对目标语言集进行留一法 (LLO) 评估

我们根据 4.2 节中评估的排名模型计算 Shapley 值,重新调整获得的值,最后根据特征在不同任务中的平均排名重新排序。我们得到图5中的热图。我们观察到以下模式:

任务相关的特征重要性:虽然以前的工作强调特定特征的重要性跨语言迁移,缺乏对不同任务的比较限制了他们的结论。支持的跨任务分析表明了任务相关的特征重要性,不同的特征对任务的贡献不同根据任务进行跨语言迁移。例如,标签分类任务的首要功能是难度(RD),文字(O),名称(O)和操作员(O)。能够预测代码解决方案的标签需要对标签是属性的基本问题的一些知识。难度分数是另一个问题的属性。难度分数相似的问题需要相似的算法。文字、名称操作员是代码样本中使用的算法的其他指标。相比之下,最重要的克隆检测任务的功能是令牌(O),名称(O)和关键字(O)。检测克隆需要与分类标签不同的技能。更深入地理解代码语义,无论相似之处如何需要使用的算法。名称、关键字和更一般的标记的重叠是理解的关键代码的语义。

重要特征的范围:不同的任务似乎不仅关注不同的特征,而且还关注不同的特征数量。虽然标签分类和编译分类任务侧重于选择性特征,有几个功能似乎对于编译分类和代码细化任务很重要。例如,代码优化任务需要从重叠的关键字、名称等更普遍的情况中转移知识与源语言不同的标记,用于修复传输语言中的代码。而标签分类任务似乎需要较少的与问题属性相关的功能。

类别内差异:虽然不同类别似乎对模型预测有更大的影响,类别中单个功能的影响似乎因任务而异。最重要的特征是关键字 (o) 和名称 (o),在之前的工作中也对其进行了比较对源代码跨语言传输的影响。跨任务比较证实了两者的重要性。然而,与其他任务相比,一半的任务显示关键字重叠的优先级名称,而另一半则具有相反的重要性顺序。这一发现表明这两个功能都是对于跨语言迁移很重要,但优先级取决于任务。

转述:冯晟

0 阅读:0

互联不一般哥

简介:感谢大家的关注