Type4Py: Deep Similarity Learning-Based TypeInference for Python

Type4Py: Deep Similarity Learning-Based Type Inference for Python

Type4Py:Python中基于深度相似性学习的类型推理

摘要

动态语言(如Python和JavaScript)以静态类型换取开发人员的灵活性和工作效率。缺少静态类型可能会导致运行时异常,并且是IDE支持薄弱的主要因素。为了缓解这些问题,PEP 484为Python引入了可选的类型注释。由于现有代码库的类型更新容易出错且费力,因此提出了基于学习的方法,以实现基于现有部分注释代码库的自动类型注释。然而,对于基于学习的方法来说,在第一个建议或前几个建议中给出相关预测仍然是相当具有挑战性的。在本文中,我们提出了Type4PY,一个基于深度相似性学习的层次神经网络模型,它学习在高维空间中区分同类和异类类型,从而产生类型簇。最近邻居搜索建议了参数、变量和函数返回的可能类型的列表。定量和定性评估的结果表明,在类型预测任务中,Type4PY显著优于最先进的方法。考虑到Top-1预测,Type4PY获得了72.5%的平均倒数排名,分别比Typilus和Typewriter高10.87%和16.45%。

I. INTRODUCTION

在过去的几年中,动态类型编程语言(DPL)在软件开发人员中变得非常流行。根据IEEE频谱排名[1],Python是2019年最流行的编程语言。Python和JavaScript等动态语言允许快速原型化,这可能会缩短开发时间[2],[3]。但是,缺少静态类型通常会导致类型错误、意外的运行时错误和次优的IDE支持。另一方面,静态类型语言通常不太容易出错[4],静态类型提高了软件质量[5],并在理解未记录代码、类型错误[2]和早期错误检测[5]方面提高了软件系统的可维护性。

为了缓解动态语言的静态类型相关问题,Python社区引入了PEP 484 [6],它使开发人员能够将可选的类型注释添加到他们的Python代码库中。可选的静态类型是一个手动、繁琐且容易出错的过程[7]。可以使用静态类型推断方法[8]、[9]来推断类型注释。除了上述语言的动态特征外,静态分析过度逼近程序的行为[10]。因此,静态类型推断方法通常并不精确[11]。此外,这些方法通常分析完整的程序及其依赖关系,这使得它们对于类型推断任务来说相当慢。

受上述静态类型推断方法局限性的启发,研究人员最近利用机器学习(ML)技术预测动态语言的类型注释[12]–[15]。这些研究的实验结果表明,基于ML的类型预测方法比静态类型推断方法更精确,或者它们也可以以互补的方式与静态方法一起工作[14],[15]。尽管基于ML的类型预测方法具有优越性,但它们的类型词汇表较小且固定。这限制了它们对用户定义和稀有类型的类型预测能力。为了解决这个问题,Allamanis等人[15]最近引入了Typiclus模型,该模型不限制类型词汇表的大小。尽管Typiclus模型的性能优于其他类型词汇量较小的模型,但类型预测任务仍然相当具有挑战性,特别是对于罕见类型。此外,与静态工具不同,基于ML的类型推断方法为用户提供了一个预测列表。在第一个建议中给出正确的预测是理想的,因为开发人员倾向于通过工具使用第一个建议[16]。

基于上述讨论,在本文中,我们提出了一种基于深度相似性学习(DSL)的类型推理方法,称为Type4Py。具体而言,我们提出的方法由一个有效的分层神经网络组成,该网络将程序映射到高维特征空间,称为类型聚类。例如,在计算机视觉中,相似性学习被用来区分一个人的脸和其他人的脸,以进行验证[17]。类似地,Type4Py学习如何通过分层神经网络区分不同的类型。因此,与最先进的方法相比,我们提出的方法不仅可以处理非常大的类型词汇表,而且在最初的几条建议中给出了更相关的预测。实验结果表明,Type 4Py在前十个预测中获得74.01%的平均倒数秩(MRR),分别比TyrILUS(15)和打字机[14 ]高9.42%和14.7%。

总之,本文介绍了以下主要贡献:

Type4Py,一种新的基于DSL的类型推断方法,旨在提供更多相关的类型建议

包含5.2K Python项目和4.2M类型注释的数据集。据我们所知,这是用于训练基于ML的类型预测模型的最大数据集。这对研究界也很有价值。

我们在GitHub  1上公开发布了Type4Py模型的实现。

1        https://github.com/saltudelft/type4py

II. RELATED WORK

Python的类型检查和推断:2014年,Python社区引入了一个类型提示提议[6],该提议描述了向Python程序添加可选的类型注释。一年后,Python 3.5发布了可选的类型注释和MyPy类型检查器[22]。这使得现有Python程序的逐步输入和验证添加的类型注释成为可能。自从引入类型提示提议以来,已经开发了其他类型检查器,例如PyType[23]、PyRight[24]和Pyre[25]。

此外,许多研究工作提出了Python的类型推断算法[8]、[26]、[27]。这些是基于静态的方法,有一套预先定义的规则和约束。如前所述,由于Python的动态特性以及静态分析对程序行为的过度近似,静态类型推断方法通常不精确[11]。

基于学习的类型推断:2015年,Rachev等人[18]提出了JSNice,这是一种概率模型,使用条件随机字段(CRF)预测JavaScript的识别名称和类型注释。JSNice的核心思想是捕获依赖关系网络中程序元素之间的关系。然而,JSNICE的主要问题是它的依赖网络不能考虑程序或函数内的广泛上下文。

徐等人[19]采用概率图模型(PGM)来预测Python变量类型。他们的方法提取了几个不确定的类型提示,如属性访问、变量名称和变量之间的数据流。虽然Xu等人的概率模型。[19]优于静态类型推理系统,他们提出的系统速度慢且缺乏可扩展性

考虑到上述JSNICE的问题,Hellendoorn等人[12]提出了DeepTyper,这是一种序列到序列的神经网络模型,在TypeScript代码的对齐语料库上进行训练。DeepTyper模型可以通过考虑更广泛的上下文来预测源代码文件中的类型注释。然而,DeepTyper对同一变量的标记级出现的预测不一致。Malik等人[13]提出了NL2Type,一种预测JavaScript函数类型注释的神经网络模型。NL2Type的基本思想是利用源代码中的自然语言信息,如标识符名称和注释。在类型注释预测任务中,NL2Type模型优于JSNICE和DeepTyper[13]。

受NL2Type模型的启发,Pradel等人[14]提出了打字机模型,该模型可以推断Python的类型注释。打字机是一种深层神经网络模型,它考虑了源代码中的代码上下文和自然语言信息。此外,打字机通过使用组合搜索策略和外部类型检查器来验证其神经模型的类型预测。为了克服DeepTyper的上述缺点,Wei等人[20]介绍了LAMBDANET,一种基于图形神经网络的TypeScript类型推断。它的主要思想是创建一个类型依赖关系图,该图链接到具有逻辑约束和上下文提示(如变量分配和名称)的类型化变量。Wei等人[20]的实验结果表明LAMBDANET优于DeepTyper。

鉴于标识符和注释等自然约束是不确定的信息来源,Pandi等人[21]提出了预测TypeScript语言类型的OptTyper。他们的方法的中心思想是从类型系统中提取确定性信息或逻辑约束,并将它们与单个优化问题中的自然约束相结合。这允许OptTyper在不违反语言的类型规则的情况下进行类型正确的预测。OptTyper已被证明优于LambdaNet和DeepTyper[21]。

到目前为止,所有讨论的基于学习的类型推断方法都使用最多1,000种类型的词汇表。这阻碍了他们推断用户定义和稀有类型的能力。为了解决这个问题,最近,Allamanis等人[15]提出了Typilus,这是一种基于图神经网络(GNN)的模型,它整合了来自多个来源的信息,如标识符、语法模式和数据流,以推断Python的类型注释。Typilus基于基于度量的学习,并学习从不同的符号中区分相似的待分类符号。然而,Typilus需要复杂的源代码分析来创建其图形表示,即数据流分析。表I总结了Type4PY与其他基于学习的方法之间的差异。

III. PROPOSED APPROACH

本节通过流程的不同步骤介绍Type4Py的详细信息,这些步骤在图1中建议的方法的概述中进行了说明。我们首先描述我们如何从Python源代码中提取类型提示,然后我们如何使用这些信息来训练神经模型。

A. Type hints

我们从Python源代码文件中提取抽象语法树(AST)。通过遍历AST的节点,我们可以获得类型提示,这些提示对于预测函数参数、变量和返回类型的类型很有价值。获得的类型提示基于本节中描述的自然信息、代码上下文和导入语句。

 自然信息:如前面的工作[13]、[28]所示,源代码包含有用的非正式自然语言信息,这些信息被视为类型提示的来源。在DPL中,开发人员倾向于以预期类型命名变量和函数的参数[29]。基于这一直觉,我们将标识名称作为自然信息和类型提示的主要来源。具体而言,我们提取函数名(Nf)及其参数(NARG),因为它们可能分别提供函数返回类型和函数参数类型的提示。在下文中,我们还将函数的参数表示为Narg。对于变量,我们提取它们的名称,如Nv所示。

代码上下文:我们提取函数体中参数的所有用法作为类型提示。这意味着使用参数的完整语句作为标记序列包含。类似地,我们提取变量在其当前和内部作用域中的所有用法。此外,函数中的所有返回语句都会被提取,因为它们可能包含有关函数返回类型的提示。

可见类型提示(VTH):与以前只分析直接导入[14]的工作相比,我们递归地提取给定模块中的所有导入语句及其传递依赖关系。我们为用户定义的类、类型别名和newType声明的所有导入构建依赖图。例如,如果模块A导入B.Type和C.D.E,则边(A,B.Type)和(A,C.D.E)将添加到图中。我们从foo import*扩展通配符导入,并解析具体的类型引用。我们认为已识别的类型是可见的,并将其与其完全限定的名称一起存储,以减少歧义。例如,TF.tensor和torch.tensor是不同的类型。尽管所描述的基于检查的方法比纯基于AST的分析慢,但我们的消融研究表明,VTHS显著提高了4PY型的性能(第V-A小节)。

B. Vector Representation

为了让机器学习模型从类型提示中学习,它们被表示为实值向量。向量保留了相似单词之间的语义相似性。为了捕获语义相似性,使用词嵌入技术将词映射到d维向量空间Rd。具体来说,我们首先通过应用通用自然语言处理(NLP)技术对提取的标识符和代码上下文进行预处理。该预处理步骤包括标记化、停用词删除和分类[30]。然后,我们使用Word2vec[31]嵌入来训练代码上下文和标识符标记的代码嵌入EC:W1,..,WL→RL×D,其中Wi和L分别表示单个标记和序列的长度。在下文中,我们将描述参数类型和返回类型的所有三种类型提示的向量表示。

标识符:给定参数的类型提示,参数的向量序列表示如下:

        其中,o 连接序列,S是分隔符2。对于返回类型,其向量序列表示如下:

2        分隔符是具有适当尺寸的一个向量

        最后,变量的标识符嵌入为EC(NV)。

代码上下文:对于函数参数和变量,我们将它们的用法序列连接成一个序列。类似地,对于返回类型,我们将函数的所有返回语句连接到单个序列中。为了截断长序列,我们考虑在序列中心的N个标记的窗口(默认N=7)。与标识符类似,嵌入函数EC用于将代码上下文序列转换为实值向量。

可见类型提示:给定所有源代码文件,我们构建了一个固定大小的可见类型提示词汇表。词汇表涵盖了所有可见类型出现的大部分。因为Python模块中导入的大多数可见类型都是内置的基本类型,如List、Dict及其组合。如果一个类型在可见类型词汇表之外,它将表示为一个特殊的其他类型。对于函数参数、变量和返回类型,我们创建一个大小为T的稀疏二进制向量,其元素表示一个类型。当且仅当二元向量的类型存在于词汇表中时,二元向量的元素被设置为一。否则,在二进制向量中将另一个类型设置为1。

C. Neural model

我们提出的方法的神经模型采用分层神经网络(HNN),由两个递归神经网络(RNN)[32]组成。HNN经过充分研究,对于文本和视觉相关任务非常有效[33]–[35]。在类型预测的情况下,直观地说,HNN可以捕获标识符和代码上下文的不同方面。在神经结构中,两个RNN基于长-短期记忆(LSTM)单元[36]。在这里,我们选择了LSTMs单元,因为它们能够有效地捕获远程依赖关系[37]。此外,基于LSTM的神经模型已成功应用于NLP任务,如情绪分类[38]。在形式上,第i个LSTM单元在时间步t的输出定义如下:

 

 它具有sigmoid函数σ、当前输入向量xj、单位状态,并具有模型参数W、U、b及其循环权重、输入权重和偏差[37]。两个分层RNN允许从标识符和代码标记捕获输入序列的不同方面。然后将捕获的信息总结为两个单个向量,这些向量是从相应RNN的最后隐藏状态获得的。来自RNN的两个单个向量与可见类型提示向量串联,所得向量通过完全连接的线性层。

 在先前的工作[13],[14]中,类型预测任务被公式化为分类问题。结果,他们的神经模型的线性层输出大小为1,000的向量,其概率超过预测类型。因此,如果神经模型在训练阶段没有看到类型,则神经模型预测未知。为了解决这个问题,我们将类型预测任务公式化为深度相似性学习问题[17],[39]。通过使用DSL公式,我们的神经模型学习将参数和返回类型映射到一个真实的连续空间,称为类型簇(在[15]中也称为类型空间)。换句话说,我们的神经模型将相似的类型(例如STR)映射到它自己的类型簇中,该类型簇应该尽可能远离其他类型簇。与之前的工作[13],[14]不同,我们提出的模型在预测稀有和用户定义的类型方面更有效,因为它可以处理非常大的类型词汇表。

为了创建所描述的类型聚类,我们使用最近用于计算机视觉任务(如面部识别[40])的三元组丢失[40]函数。通过使用三联体损失,神经模型通过将样本映射到连续空间中它们自己的簇来学习区分相似样本和不相似样本。在类型预测的情况下,损失函数接受类型TA、与TA相同的类型TP以及与TA不同的类型TN。因此,给定一个正的标量裕度M,三重损失函数定义如下:

 目标函数L的目标是使TA示例更接近相似示例TP而不是TN示例。我们使用欧几里得度量来度量TA与TP和TN的距离。

在预测时,我们首先将查询示例TQ映射到类型簇。查询示例TQ可以是函数的参数或函数的返回类型。然后,我们找到查询示例TQ的KNEAREAST邻居(KNN)[41]。给定与查询示例Tq具有距离di的K个最近示例Ti,可以如下获得Tq具有类型T的概率:

        其中,I是指示函数,n是归一化常数,ε是小标量(即ε=10-10)。

IV. EVALUATION SETUP

在本节中,我们首先描述了数据集的特征以及我们提出的方法的实现细节。接下来,我们介绍评估的基线模型。最后,我们描述了用于定量测量基于ML的类型推断方法性能的评估指标。

A. Dataset

数据集包含来自GitHub的5.2K Python项目,这些项目依赖于MyPy包,即官方和最流行的Python类型检查器。直观上,这些项目更可能具有类型注释。最初,数据集有685K个源文件和869K个类型注释。在GitHub上,Python项目通常具有文件级副本[42],并且在评估未见代码样本时,代码重复对机器学习模型的性能有负面影响[43]。因此,使用我们的代码重复数据消除工具  3 ,我们从数据集中删除了大约400K个重复文件。

3        https://github.com/saltudelft/CD4Py

 类似于Allamanis等人的工作。[15]中,我们使用了一个静态类型推断工具,即Pyre[25]V0.9.0,用更多的类型注释来扩充我们以前的数据集。然而,我们注意到,我们只能使用Pyre的查询命令来推断变量的类型。根据我们的经验,查询命令无法推断参数的类型和返回类型。该命令接受文件列表并返回包含类型信息的JSON文件。

 由于Pyre的推断类型,数据集现在总共有420万个类型注释。为了演示在数据集上使用Pyre的效果,图2显示了使用/不使用Pyre的源代码文件的类型注释覆盖率百分比。在使用Pyre之后,在285,509个源代码文件中,73%的文件具有超过40%的类型注释覆盖率。

数据集特征:表II显示了删除重复源代码文件后数据集的特征。总共有超过2M个函数,大约有3.8M个参数。此外,数据集有超过480万个变量声明。其中70.9%有类型标注。

 图3显示了我们的数据集中前10个最常见类型的频率。可以观察到,类型遵循长尾分布。不出所料,前10个最常见的类型占数据集中类型的54.9%。最后,我们将数据集按文件随机分为三组:70%训练数据、10%验证数据和20%测试数据。表III显示了三个集合中每个的数据点的数量。

预处理:在训练ML模型之前,我们执行了几个预处理步骤:

  • 数据集中不包含_str_和_len_等普通函数。这类函数的返回类型很容易预测,即__len__总是返回int,并且会使结果变得模糊。
  • 我们排除了ANY和NONE类型注释,因为它对预测这些类型没有帮助。
  • 我们执行了一个简单的类型别名解析,以使同类的类型注释保持一致。例如,我们将[ ]映射到List,{ }映射到Dict,将Text映射到str。
  • 我们解析了类型注释的限定名称。例如,Array被解析为NumPy.Array。这会使DataSet中出现的所有类型批注保持一致。
  • 与Allamanis等人[15]的工作相同,我们将嵌套级别大于2的参数化类型的组件重写为任意值。例如,我们将List[List[Tuple[int]]]重写为List[List[Any]]。

B.实施细节和环境设置

我们在Python3及其生态系统中实现了Type4Py和TypeWriter。我们使用LibSA4Py管道 (4)从AST中提取讨论过的类型提示。采用joblib软件包实现了数据处理流水线的并行化。我们使用NLTK包[44]来执行标准NLP任务,如okenization和stop work Remove。为了训练Word2Vec模型,使用了gensim软件包。对于神经模型,我们使用PyTorch框架[46]中的双向LSTM[45]来实现两个RNN。为了避免过度拟合序列集,我们对输入序列(除了可见类型)应用了退出正则化[47]。此外,我们使用Adam optimizer[48]来最小化TripleLoss函数的值。最后,我们使用HARDE[49]包执行快速和近似的最近邻搜索。神经模型的超参数值如表IV所示。对于Typilus,我们在GitHub上使用了它的公共实现[50]。

4        https://github.com/saltudelft/libsa4py

 我们在Linux(Ubuntu18.04.4 LTS)上进行了所有的实验。这台计算机有一台Intel Xeon CPU E5-2690 v4,具有24核(@2.6GHz)、128 GB RAM和两台NVIDIA GeForce GTX 1080 TIs。我们利用PyTorch框架的数据并行特性在两个GPU之间分配训练批,总VRAM为22 GB。

C. Baselines

 我们将Type4Py与Typilus[15]和Typewriter[14]进行了比较,Typilus[15]和Typewriter[14]是最新的基于ML的Python类型推断方法。考虑到表I,Type4Py具有基于HNN的神经模型,而Typilus的神经模型是基于GNN的。然而,Typilus具有与Type4Py相同的预测能力,并且对类型词汇的大小没有限制,这使得它成为比较的明显选择。与Type4PY相比,Typewriter有两个主要区别。首先,Typewriter本身是有限的,因为其类型词汇在培训时是预先定义的(即1000种类型)。其次,与Type4Py和Typilus不同,Typewriter无法预测变量的类型。

D.Evaluation Metrics 评价指标

我们通过使用最初由Allamanis等人提出的两个标准将类型预测TP与地面实况TG进行比较来测量方法的类型预测性能[15]:

精确匹配:TP和TG是完全相同的类型。

参数化类型匹配:忽略所有类型参数,仅匹配参数化类型。例如,list[str]和list[int]将被视为匹配。

[51]对于精确匹配,因为神经模型预测给定查询的类型列表。MRR指标考虑了预测的等级,这一点很突出。

根据阿拉马尼斯等人的评估方法。[15],我们认为我们在train上看到超过100次的类型是常见的或罕见的。此外,我们还定义了一组普遍存在的类型,即{str、int、list、bool、float}。这些类型属于数据集中的10种常见类型之一(见图3),并且它们被排除在公共类型的集合之外。此外,与类型4Py和Typilus不同,TypeWriter预测其类型词汇表中没有出现的预期类型是否未知。因此,为了与其他两种方法进行有效的比较,我们考虑了Typewriter在计算评价指标时的其他预测。

V. EVALUATION

为了评估和展示Type4Py的有效性,我们关注以下研究问题。

  • RQ1 每个被考虑的类型提示对Type4Py的性能有何贡献?
  • RQ2 Type4Py的一般类型预测性能是什么?
  • RQ3 在考虑不同的预测任务时,Type4Py的表现如何?
  • RQ4 就训练和推理速度而言,Type4Py的效果如何?
  • RQ5 Type4Py与其他方法在定性上如何比较?

A. Efficacy of type hints  类型提示的有效性(RQ1)

在将Type4Py与其他基线进行比较之前,研究每个所考虑的类型提示对Type4Py的整体性能的贡献是很重要的。这使我们能够选择具有最佳配置的Type4PY模型进行其余的评估。

方法:通过忽略每个考虑的类型提示,我们使用4种不同的配置来训练和评估Type4Py,即

(1)完整模型(2)w/o标识符(3)w/o代码上下文(4)w/o可见类型提示。

结果:表V显示了具有四种所述配置的4PY型的性能。首先,可以观察到所有三种类型提示都对Type4Py的性能有显著贡献。与其他两种类型提示相比,代码上下文对模型的性能影响最大。例如,当忽略代码上下文时,模型的MRR分数下降了10.47%,这是非常显著的。此外,标识符和VTH对模型的性能影响几乎相同。通过忽略标识符和VTH,模型的整体精确匹配分别下降了6.05%和5.91%。考虑到普遍存在类型的预测,Vth对Type4Py的贡献最大,而代码上下文的影响可以忽略不计。总之,我们得出结论,对于我们的类型预测模型,代码上下文是最强的类型提示。基于RQ1的结果,我们选择Type4PY完全模型进行其余的评估。

B. Type Prediction Performance .类型预测性能 (RQ2)

在本小节中,我们将我们提出的方法Type4Py与选定的基线模型在总体类型预测性能方面进行比较。

方法:模型在训练集上进行训练,测试集用于测量类型预测性能。此外,对于该RQ,我们考虑模型支持的所有推理任务,即参数、返回类型和变量。

结果:表VI显示了方法的一般类型预测性能。总的来说,基于精确匹配标准(所有类型),Type4Py的性能优于Typilus和Typewriter。具体来说,在类型预测任务中,Type4Py的表现分别比Typilus和Typewriter好7.42%和11.12%。考虑到常见类型,Typewriter的性能优于Type4Py和Typilus。这可能是由于打字机的类型词汇表被限制为1000种类型,因此它学习从非常有限的一组类型(即,包括常见类型)中进行预测。另一方面,在某些情况下,Type4Py和Typilus可能会将常见类型与罕见类型混淆,前提是两者都具有非常大的类型词汇表。

根据MRR指标,我们的Type4Py模型的性能分别比Typelus和TypeWriter高9.42%和14.7%。鉴于前10名预测,这表明Type4Py在其最初的几个建议类型中给出了更相关的预测。为了进一步支持这一说法,图4显示了Type4Py和考虑不同top-n预测的其他模型的MRR分数,即n={1,2,…,10}。可以看出,Type4Py在所有n值上的得分都比其他模型高得多。此外,考虑到Top-1预测的MRR得分,Type4Py的得分分别比Typelus和TypeWriter高10.87%和16.45%。如前所述,开发人员更可能通过工具使用第一个建议[16]。因此,重要的是,基于MLC的类型推断方法在最初的几个预测中显示出令人满意的结果。在这方面,Type4Py是更好的工具。

C. Different prediction tasks   不同的预测任务 RQ3

这里,我们将Type4Py与其他基线进行比较,同时考虑不同的预测任务,即参数、返回类型和变量。

方法:与RQ1类似,模型分别在整个训练集和测试集上进行训练和测试。然而,我们分别考虑每个预测任务,同时评估模型。

结果:表七显示了三项考虑任务的方法的类型预测性能。一般来说,考虑到MRR分数,Type4Py在所有任务中都优于Typelus和TypeWriter。例如,考虑到可变任务,Type4Py获得了80.98%的精确匹配(所有类型),比Typelus高6.79%。同样,对于相同的任务,Type4Py的MRR分数比Typelus高8.3%。然而,关于常见类型的预测,TypeWriter在参数和返回任务中的性能优于Type4Py和Typelus。这主要有两个原因。首先,参数和返回类型合计占数据集中所有数据点的24.5%(见表III)。鉴于此,似乎Type4Py和Typelus在训练样本越多的情况下表现得更好,这从可变任务的结果中可以明显看出。第二,如前所述,打字机从1000种类型的集合中进行预测,这显然使它在预测普通类型但罕见类型方面做得更好。最后,与Typelus相比,Type4Py在辩论和返回任务中的MRR得分分别高出8.39%和12.96%。

D. Computational Efficiency 计算效率(RQ4)

在这里,我们将我们提出的方法与TypeWriter和Typelus在训练和预测速度方面进行比较。

方法:为了评估RQ4,我们测量了一个历元模型的训练速度。此外,为了测量推理速度,我们考虑单个测试批,它足够代表典型的Python项目。

结果:对于Type4Py模型,给定1.8M的训练样本,单个训练周期大约需要24分钟。如果打字机型号的训练集包含463K样本,则需要1分钟。除了样本量,训练速度的显著差异可以由两个原因解释。首先,Type4Py型号比打字机的可训练参数多得多(见表四)。其次,Type4Py是一个基于DSL的模型,因此它必须预测每个批次的三个数据点的输出(见等式2)。此外,Typilus模型在大约15分钟内完成一次训练。

考虑到推断时间,Type4Py模型预测单个测试批次(w/8192数据点5)大约在12.5秒内完成。(即,数据点平均为1.5 ms)。另一方面,打字机模型可以在不到1毫秒的时间内对单个批次进行预测。与打字机不同,我们的Type4Py方法也需要在高维空间中执行KNN搜索,这就是为什么它的推理速度相对较慢的原因。为了补偿这一点,可以降低神经模型线性层的输出维数。通过将线性层的输出维度减少到512,我们可以在总体性能降低1%到2%的情况下,为单个数据点获得少于1ms的推断时间。此外,Typilus在不到1ms的时间内进行推理,前提是其输出向量的维数为64,并且考虑到基于GNN的模型比基于biRNN的模型要快得多的事实[52]。总之,我们坚信我们提出的方法对于一般大小的Python项目的类型注释是实用的。

5        For prediction, using a larger batch size is possible as it requires less
GPU memory.   对于预测,可以使用较大的批量大小,因为它需要较少的GPU内存。

E. Qualitative Evaluation  定性评估(RQ5)

为了定性地证明Type4Py方法和基线模型的预测,我们从数据集的测试集中选择了四个不同的函数。在这里,我们的目标不是概括,而是提供一些预测示例,展示Type4Py和其他方法可以预测的类型。图5显示了代码段A、B、C和D中任务的神经模型预测。下面,我们分析了模型对所选代码段的预测。

代码片段A:Type4Py的第二个建议是完全匹配的,尽管它的第一个建议可以被认为是正确的。另一方面,提皮勒斯无法做出正确的预测。但是,它正确地预测字典的键的类型,而不是它的值。TypeWriter在其第4个建议中给出了相关预测,这与Type4Py的第一个建议相同。在本例中,函数的名称给出了预测其返回类型的强烈提示。

代码片段B:Type4Py和TypeWriter在他们的第一个建议中都正确地预测了参数src_db的类型为str,而Typelus的预测都不正确。如RQ2所示,与Typelus相比,Type4Py和TypeWriter在预测普遍存在的类型方面都具有出色的性能。

代码片段C:这里的任务是预测局部变量raw_id的类型。虽然几乎没有代码上下文,但Type4Py在其第一个建议中做出了正确的预测。Typelus将变量的类型与str混淆,str实际上是字节。 

代码片段D:这是一个有趣的案例,三个模型在其第一个建议(即float)中做出了相同的预测。尽管参数seconds接受浮点值,但预期的类型是Union[int,float],这分别由Typelus和TypeWriter在其第3和第7个建议中正确预测。在这个例子中,打字机的正确预测暗示了一个事实,即它的MRR分数明显低于Type4Py(见表六)。

 

 图6:R^2中学习类型簇的T-SNE图

为了定性地检查学习型集群的质量,我们从前10个频繁类型中选择了5种类型(见图3),它们是{int,list,list[str],dict,float}。给定选定的类型,我们从Type4Py和Typelus的学习类型集群中随机选择了5000个嵌入类型。接下来,我们采用了t-SNE技术[53]。它是一种降维技术,允许我们在二维空间中可视化高维嵌入类型。图6显示了所选5种类型的学习型集群的t-SNE图。总的来说,可以看出Type4Py的学习型集群具有相对较好的分离度,并且更紧凑,而Typelus在其所有选择的学习型集群之间具有实质性的重叠(见图6b)。例如,考虑到Type4Py,int和float的学习类型集群之间有一个完美的分离,而对于typelus,它们之间有明显的重叠。这补充了我们的定量评估(RQ2),该评估显示Type4Py在预测普遍存在和常见类型方面比Typelus表现更好。此外,我们观察到,对于Type4Py,list和list[str]的学习类型集群之间没有重叠,而对于typelus,情况并非如此。

VI. DISCUSSION AND FUTURE WORK

基于第五节中制定的RQ1-RQ5及其评估,我们给出以下结论:

  • 考虑到稀有类型的预测,Type4Py和Typelus都优于打字机。这可能是因为Type4Py将类型化源代码文件映射到高维空间(即类型集群)。因此,这不仅可以实现更大的类型词汇量,还可以显著改善稀有类型的预测。
  • 根据 ablation analysis  (RQ1)的结果,三个考虑的类型提示、标识符、代码上下文和VTH都是有效的,对Type4Py的性能有积极的贡献。此外,这一结果并不以牺牲普遍性为代价;我们的可见类型分析并不比像PyCharm或VSCode这样的IDE更复杂,它可以确定可用的类型,例如自动完成。
  • 我们使用Pyre[25],一种静态类型推断工具,用更多的类型注释来扩充数据集。然而,这可以被认为是一个弱监督学习问题[54],这意味着静态工具推断的类型可能有噪声或不精确,尽管有预处理步骤。这可能会影响我们的基本事实的有效性,从而影响评估结果。未来的工作可以通过使用类型检查器(例如mypy)来调查这种威胁。
  • 考虑到top-n预测性能(RQ2)的MRR分数,我们认为我们提出的方法更适合作为机器辅助工具,帮助开发人员键入Python代码库,因为Type4Py具有可接受的top-1预测性能(即72.5%的MRR分数)。为了验证这一点,我们计划在未来的工作中实现Type4Py作为现代IDE的扩展。
  • Type4Py和Typelus都无法对超出其预先定义(尽管非常大)类型簇的类型做出正确预测。例如,他们目前无法合成类型,这意味着如果可选的[Dict[str,int]]类型不存在于他们的类型集群中,他们将永远不会建议该类型。为了解决这个问题,未来的研究可以探索指针网络[55]或捕获类型系统规则的GNN模型。

VII. SUMMARY

在本文中,我们为Python提出了一个基于DSL的层次神经网络类型推理模型Type4Py。它将标识符、代码上下文和可见类型提示视为学习预测类型的特征。具体来说,神经模型学习如何在高维空间中有效地将同类类型映射到它们自己的聚类中,并且在给定类型聚类的情况下,执行K近邻搜索以推断参数、变量和函数返回类型的类型。总体而言,定量和定性评估结果表明,Type4PY模型优于其他最先进的方法。最值得注意的是,考虑到Top-1预测的MRR得分,我们提出的方法获得了显著高于Typilus和Typewriter的得分,分别高出10.87%和16.45%。这表明我们的方法在其第一个建议中给出了更相关的预测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值