【SIGIR 2022】面向长代码序列的 Transformer 模型优化方法,提升长代码场景性能
阿里云机器学习平台 PAI 与华东师范大学高明教授团队合作在 SIGIR2022 上发表了结构感知的稀疏注意力 Transformer 模型 SASA,这是面向长代码序列的 Transformer 模型优化方法,致力于提升长代码场景下的效果和性能。由于 self-attention 模块的复杂度随序列长度呈次方增长,多数编程预训练语言模型(Programming-based Pretrained Language Models, PPLM)采用序列截断的方式处理代码序列。SASA 方法将 self-attention 的计算稀疏化,同时结合了代码的结构特性,从而提升了长序列任务的性能,也降低了内存和计算复杂度。
论文:Tingting Liu, Chengyu Wang, Cen Chen, Ming Gao, and Aoying Zhou. Understanding Long Programming Languages with Structure-Aware Sparse Attention. SIGIR 2022
模型框架
下图展示了 SASA 的整体框架:
其中,SASA 主要包含两个阶段:预处理阶段和 Sparse Transformer 训练阶段。在预处理阶段得到两个 token 之间的交互矩阵,一个是 top-k frequency 矩阵,一个是 AST pattern 矩阵。Top-k frequency 矩阵是利用代码预训练语言模型在 CodeSearchNet 语料上学习 token 之间的 attention 交互频率,AST pattern 矩阵是解析代码的抽象语法树(Abstract Syntax Tree,AST ),根据语法树的连接关系得到 token 之间的交互信息。Sparse Transformer 训练阶段以 Transformer Encoder 作为基础框架,将 full self-attention 替换为 structure-aware sparse self-attention,在符合特定模式的 token pair 之间进行 attention 计算,从而降低计算复杂度。
SASA 稀疏注意力一共包括如下四个模块:
Sliding window attention:仅在滑动窗口内的 token 之间计算 self-attention,保留局部上下文的特征,计算复杂度为,为序列长度,是滑动窗口大小。
Global attention:设置一定的 global token,这些 token 将与序列中所有 token 进行 attention 计算,从而获取序列的全局信息,计算复杂度为,为 global token 个数。
Top-k sparse attention:Transformer 模型中的 attention 交互是稀疏且长尾的,对于每个 token,仅与其 attention 交互最高的 top-k 个 token 计算 attention,复杂度为。
AST-aware structure attention:代码不同于自然语言序列,有更强的结构特性,通过将代码解析成抽象语法树(AST),然后根据语法树中的连接关系确定 attention 计算的范围。
为了适应现代硬件的并行计算特性,我们将序列划分为若干 block,而非以 token 为单位进行计算,每个 query block 与个滑动窗口 blocks 和个 global blocks 以及个 top-k 和 AST blocks 计算 attention,总体的计算复杂度为,为 block size。
每个 sparse attention pattern 对应一个 attention 矩阵,以 sliding window attention 为例,其 attention 矩阵的计算为:
ASA 伪代码:
实验结果
我们采用 CodeXGLUE[1]提供的四个任务数据集进行评测,分别为 code clone detection,defect detection,code search,code summarization。我们提取其中的序列长度大于 512 的数据组成长序列数据集,实验结果如下:
从实验结果可以看出,SASA 在三个数据集上的性能明显超过所有 Baseline。其中 Roberta-base[2],CodeBERT[3],GraphCodeBERT[4]是采用截断的方式处理长序列,这将损失一部分的上下文信息。Longformer[5]和 BigBird[6]是在自然语言处理中用于处理长序列的方法,但未考虑代码的结构特性,直接迁移到代码任务上效果不佳。
为了验证 top-k sparse attention 和 AST-aware sparse attention 模块的效果,我们在 BigCloneBench 和 Defect Detection 数据集上做了消融实验,结果如下:
sparse attention 模块不仅对于长代码的任务性能有提升,还可以大幅减少显存使用,在同样的设备下,SASA 可以设置更大的 batch size,而 full self-attention 的模型则面临 out of memory 的问题,具体显存使用情况如下图:
SASA 作为一个 sparse attention 的模块,可以迁移到基于 Transformer 的其他预训练模型上,用于处理长序列的自然语言处理任务,后续将集成到开源框架 EasyNLP(https://github.com/alibaba/EasyNLP)中,贡献给开源社区。
论文链接:https://arxiv.org/abs/2205.13730
参考文献
[1] Shuai Lu, Daya Guo, Shuo Ren, Junjie Huang, Alexey Svyatkovskiy, Ambrosio Blanco, Colin B. Clement, Dawn Drain, Daxin Jiang, Duyu Tang, Ge Li, Lidong Zhou, Linjun Shou, Long Zhou, Michele Tufano, Ming Gong, Ming Zhou, Nan Duan, Neel Sundaresan, Shao Kun Deng, Shengyu Fu, Shujie Liu. CodeXGLUE: A Machine Learning Benchmark Dataset for Code Understanding and Generation. NeurIPS Datasets and Benchmarks 2021
[2] Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov. RoBERTa: A Robustly Optimized BERT Pretraining Approach. CoRR abs/1907.11692 (2019)
[3] Zhangyin Feng, Daya Guo, Duyu Tang, Nan Duan, Xiaocheng Feng, Ming Gong, Linjun Shou, Bing Qin, Ting Liu, Daxin Jiang, Ming Zhou. CodeBERT: A Pre-Trained Model for Programming and Natural Languages. EMNLP 2020
[4] Daya Guo, Shuo Ren, Shuai Lu, Zhangyin Feng, Duyu Tang, Shujie Liu, Long Zhou, Nan Duan, Alexey Svyatkovskiy, Shengyu Fu, Michele Tufano, Shao Kun Deng, Colin B. Clement, Dawn Drain, Neel Sundaresan, Jian Yin, Daxin Jiang, Ming Zhou. GraphCodeBERT: Pre-training Code Representations with Data Flow. ICLR 2021
[5] Iz Beltagy, Matthew E. Peters, Arman Cohan. Longformer: The Long-Document Transformer. CoRR abs/2004.05150 (2020)
[6] Manzil Zaheer, Guru Guruganesh, Kumar Avinava Dubey, Joshua Ainslie, Chris Alberti, Santiago Ontañón, Philip Pham, Anirudh Ravula, Qifan Wang, Li Yang, Amr Ahmed. Big Bird: Transformers for Longer Sequences. NeurIPS 2020
评论