GraphCodeBERT:データフローを用いたコード表現の事前学習

プログラミング言語向けの事前学習モデルは、コード検索、コード補完、コード要約など、さまざまなコード関連タスクにおいて顕著な実証的性能向上を達成している。しかし、既存の事前学習モデルはコードスニペットをトークンのシーケンスとして扱う一方で、コードに内在する構造的特性を無視しており、この構造はコードの意味を規定する上で重要な役割を果たすため、コード理解のプロセスを強化する可能性がある。本研究では、コードの内在構造を考慮したプログラミング言語向け事前学習モデル「GraphCodeBERT」を提案する。従来の抽象構文木(AST)のような構文レベルの構造ではなく、事前学習段階でデータフロー(data flow)という意味論的構造を用いる。データフローは、変数間の「値の元はどこか」という関係を符号化する意味論的構造であり、ASTに見られる過度に深い階層構造を伴わず、シンプルかつ効率的な性質を持つ。GraphCodeBERTはTransformerアーキテクチャに基づいて構築された。マスク言語モデルという既存のタスクに加えて、構造に意識的な2つの新しい事前学習タスクを導入した。1つはコード構造のエッジを予測するタスク、もう1つはソースコードとコード構造間の表現を整合させるタスクである。効率的な実装のため、グラフ誘導型マスクアテンション関数を用いてコード構造をモデルに組み込む。本モデルはコード検索、クローン検出、コード翻訳、コード精緻化の4つのタスクで評価された。実験結果から、コード構造および新しく導入した事前学習タスクがGraphCodeBERTの性能向上に寄与し、これらの4つの下流タスクにおいて最先端(SOTA)の性能を達成することが示された。さらに、コード検索タスクにおいて、モデルがトークンレベルのアテンションよりも構造レベルのアテンションを優先する傾向があることを明らかにした。