遮盖语言建模 ( Masked Language Modeling,MLM ) 任务被广泛认为是最有效的预训练任务之一。在软件工程的代码预训练领域衍生出许多结合代码特性修改基础 MLM 的变体,例如遮蔽抽象语法树的节点以预测、仅遮蔽标识符以预测等。然而,虽然一些变体关注到了特定的代码 Token 类型,但大多数主要关注代码表示( 如标识符 ),而未区分不同的代码标记的类型,更加缺乏探索不同标记类型对 MLM 影响的系统性研究。那么,我们能肯定只有标识符可以改进代码预训练模型的性能吗?是否存在这样的证据呢?
为此,LIPLAB 博士生邹文涛开展了一项针对遮蔽不同类型代码 Token 对代码预训练模型性能影响的系统性研究。首先,提取五种代码标记类型,将它们转换为类型特定的掩蔽任务,并生成它们的组合。其次,使用各种组合去继续预训练 CodeBERT 和 PLBART,并在四个软工领域的下游任务上对继续预训练后的模型进行微调,以评估不同组合继续预训练的效果。
该研究主要回答了以下三个研究问题:
(1)按照 Token 类型开展遮蔽语言建模的预训练时,对所有的代码理解型下游任务都有相同的影响吗?实验结果表明,对于不同类型的代码理解下游任务,按照类型遮蔽Token以预训练的方式会有不同的影响,例如对缺陷检测任务的提升普遍比克隆检测任务更加明显。
(2)面对不同类型的编程语言,Token 类型感知的遮蔽语言建模预训练是否都会有效?实验结果表明确实各种编程语言的训练效果都会受益于按照 Token 类型遮蔽去预训练。反而是不同的模型可能会受益于不同的具体遮蔽方式,例如 CodeBERT 能够从遮蔽 Comment 预训练任务受益更多,而 PLBART 从遮蔽 Non-Identifier 受益更多。
(3)使用 Token 类型感知的遮蔽语言建模预训练任务是否能够帮助预训练模型在下游任务上更好的理解和处理未见过的编程语言?实验结果表明通过遮蔽特定类型的 Token 继续预训练模型能够帮助模型在下游任务上更好的理解未见过的语言,而无法帮助模型更好的生成未见过的语言。
以上结论对我们在常用的下游任务以及还未探究过的下游任务上是否采取针对特定类型 Token 的预训练任务以及如何选择特定类型开展预训练有一定的指导意义。此外,本研究还讨论了在低资源数据集的下游任务场景下、面对原始预训练任务与遮蔽特定类型 Token 相冲突的 PTM 时,如何通过遮蔽特定类型的 Token 以继续预训练模型在下游任务上达到更优的性能。
近期,上述研究工作的对应论文已被软件工程领域顶级期刊 ACM Transactions on Software Engineering and Methodology( TOSEM,CCF A类 )录用。欢迎对该类工作感兴趣的朋友持续关注LIPLAB( http://liplab.site )在代码表示学习领域的研究进展。