以及计算机编程所需的集成开发环境(IDE)的最重要功能之一。最近的研究表明,可以通过深度学习实现代码自动补全,训练数据来自于程序员使用IDE编码行为的真实数据,使软件语言模型的准确率得到显着提升。然而,对于不太流行的编程语言,通常存在可用的IDE数据集可能不足以训练模型的问题。最近,Facebook的一个研究团队在论文《Improving Code Autocompletion with Transfer Learning》中展示了迁移学习如何在非IDE、非自动完成和不同语言的示例代码序列上进行预训练,然后再对自动完成预测任务进行微调。实验结果表明,该方法在非常小的微调数据集上将精度提高了50%以上,在50k标记示例上提高了10%以上。论文链接:https://arxiv.org/pdf/2105.05991.pdf论文的贡献主要包括以下几个方面:本研究版本控制提交得到的源代码文件预训练了两个transformer软件语言模型GPT-2和BART,结果表明它们在自动完成预测方面的性能比直接使用实际IDE代码序列进行微调提高了2.18%;GPT-2模型在两个真实数据集上进行训练:程序编写期间的IDE和选择期间记录的代码完成代码序列。预训练和特定任务微调相结合,使模型的性能优于基线模型3.29%;研究表明,在Hack实例上进行预训练并在10kPython实例上进行微调的Comparingmodels,在不同编程语言上进行预训练可将准确率提高13.1%;通过在线A/B测试,该研究表明,在三个迁移学习维度(任务、领域和语言)中,自动完成工具的使用率分别增加了3.86%、6.63%和4.64%。实验设置本研究的数据集(如下表1所示)源自Facebook上的真实开发者活动。研究人员专注于两种开发语言,Hack和Python,这两种语言在Facebook拥有庞大的开发团队。在本文中,研究人员使用两个模型(均包含Transformer架构)来评估迁移学习的效果。由于本文的重点是研究迁移学习的影响,因此实验主要集中在这两个模型上,不与其他SOTA模型进行比较。实验中使用的模型包括:GPT-2:解码器transformer模型,由于transformer能够同时观察所有序列元素及其自注意力块,因此在代码预测方面实现了SOTA性能;PLBART:一种双向模型,利用编码器对代码完成点周围的上下文进行编码,并使用类似GPT-2的解码器进行自动回归生成。每个软件语言模型都经过两个阶段的训练,即预训练阶段和微调阶段。所有模型均使用NvidiaTeslaV100GPU进行训练,20个时期(融合时提前终止)。预训练和预微调学习率分别设置为5?4和5?6。研究人员评估离线和在线的模型性能。离线评估:研究人员使用10%的HackAutocompletion、PythonAutocompletion作为测试数据集。HackAutocompletion示例平均有99.5个候选建议可供选择,pythonautomplection示例平均有26.3个。候选提案列表允许将评估作为排名问题。对于每个离线测量,我们报告前1名和前3名的准确性和k=3平均倒数排名(MRR@)。MRR定义为:在线评估:这项研究旨在改善开发人员的IDE体验。虽然离线评估速度更快、成本更低,但改进必须由真实用户进行测试。在在线评估中,与来自Facebook的数千名hack开发人员进行了多次实时A/B实验。在每个实验中,开发人员被随机分配到实验组或对照组,并测量每个用户的每日完成量(DCPU)。使用此指标,A/B测试观察结果是一组(实验组或对照组)中给定开发人员在给定日期使用自动完成的次数。研究人员对每组进行实验,直到至少达到95%的统计数据。实验结果离线评估:在标记数据上微调的自动完成模型在离线和在线评估中优于没有特定任务微调的模型。在离线评估中,下表III显示微调将top-1准确率从39.73%提高到41.91%。将标记样本加入预训练(HackAll)后,top1准确率从40.25%提高到41.6%。在训练Python自动完成模型时观察到相同的趋势(表IV)。在线评估:在HackIde上训练了一个自动完成模型。实验变量在HackAutocompletion上进行了微调,而控制变量未进行微调。下表II中的实验1显示实验组的每个用户每日完成量(DCPU)增加了3.86%,p=0.0238。研究人员进行了第二个A/B实验,比较了先前实验(在HackIde上进行预训练并在HackAutocompletion上进行微调)的更好模型与在HackAutocompletion上训练但未进行预训练的模型。实验2显示了在没有预训练模型的情况下的巨大改进,实验组的DCPU增加了6.63%(p=0.017)。在线评估:研究人员进行了A/B实验,以探索预训练对代码提交的真实影响。上表II中的实验3表明,在p=0.049时,预训练模型将DCPU提高了3.62%。下面的图4显示,在HackAll上预训练的模型具有更好的性能,而与微调中使用的PythonAll示例的数量无关。当将模型限制为仅10k(top1准确率13.1%,37.11%对24.01%)和25k(top1准确率12.6%,41.26%对28.66%)时,边际影响最大。这显示了自动完成中跨编程语言的知识转移的明确证据。在HackAll上预训练并使用25k和50kPythonAll示例进行微调的模型的性能与使用50k和100kPythonAll示例从头开始训练的模型相似。这表明在用其他语言的数据集进行预训练后,需要一半的样本数。下表V显示,在微调HackAutocompletion和PythonAutocompletion后,性能分别提高了0.5%和1.34%。然而,多语言模型并没有显示出比最好的单语言模型有这种显着改进。最佳多语言模型的top-1准确率比最佳Python模型高0.53%,但比最佳Hack模型低0.02%。结合其他研究的结果并假设,随着每种语言可用示例数量的增加,跨语言组合编程语言示例的边际收益会减少。上面的表III显示,使用HackAutocompletion微调的HackCommit预训练优于HackAutocompletion,提高了3.29%top-1准确率(39.61%对36.32%)。PLBART的top-1精度提升更大(表VI):6.52%(51.06%对44.54%)。
