コード生成の評価手法、CodeBLEU
概要
CodeBLEUは、コード生成の精度を測る自動評価指標である。
従来のBLEUスコアは自然言語処理用に開発されているため、ソースコードの構文的・意味的な特徴を反映できなかった。
CodeBELUは、コード固有の構文や意味論を取り入れ、加重n-gram一致、構文一致(AST)、およびデータフローによる意味一致の3つの視点を含めた評価を可能とする。
BELU
BLEU(Bilingual Evaluation Understudy)は、自然言語処理の機械翻訳タスクで評価指標として使われてきたスコアである。生成された候補テキスト(candidate)が参照テキスト(reference)にどれだけ一致するかをn-gramで評価する。
詳細は以下を参照。
BLEUの課題
BLEUは主に機械翻訳の評価で用いられているが自然言語向けの指標であり、プログラミング言語特有の構文構造や意味的な正確性を評価するには適していない。
論文では、以下の点でコード評価に課題があると指摘されている。
- 限定されたキーワード:自然言語と異なり、プログラム言語には特定のキーワードがあり、これが適切に使用されているかが重要である。
- 構文ツリー構造:自然言語は(言語によるが)左から右に話したり書いたりするが、コードは抽象構文木(AST)に基づいて構造化されており、単なるシーケンスではなく階層構造を持っている。
- 意味の一意性:抽象的な表現が可能な自然言語と異なり、プログラムの意味は明確である必要がある。
CodeBLEUの特徴
CodeBLEUでは、従来のBELUに加え、次の要素から総合的なスコア(0〜1)が算出される。
- 加重n-gram一致(Weighted n-gram Match)
- 構文一致(Syntactic AST Match)
- データフローによる意味一致(Semantic Data-flow Match)
なお、比率は基本的にそれぞれ0.25となる。
加重n-gram一致(Weighted n-gram Match)
元のBLEUは、2つの文章間でn-gramを比較し一致する比率を計算するが、コード生成では特定のキーワード(int
やpublic
など)が重要である。そのため、CodeBLEUではキーワードの重みが高くなるように、異なるn-gramに異なる重みを割り当てる「加重n-gram一致」が導入されている。これにより、キーワードの使用ミスが評価に影響する。
構文一致(Syntactic AST Match)
CodeBLEUは、抽象構文木(AST)を使用してコードの構文的な一致度を評価する。ASTはコードの構文構造をツリー状に表現し、各ノードがコード内の構文的な要素を表すものである。
CodeBLEUでは、候補コードと参照コードのAST間でどの程度一致しているかを確認し、構文エラーを発見する。
データフローによる意味一致(Semantic Data-flow Match)
データフローに基づいてコードの意味的な一致を評価する。データフローは、変数間の依存関係を示すグラフであり、例えば変数x
がy
から値を受け取るといった関係を表す。
次の画像では、x
とy
が異なるだけだが、実際の動作には大きく影響する。
データフロー一致度は、このように生成コードが参照コードと同じ意味を持つかを評価し、論理エラーや計算結果の違いを捕捉することができる。
実験結果
以下の3つのコード生成実験によって、CodeBLEUの有効性が確認された。
- テキストからコード生成:自然言語の説明から関数を生成。
- コード翻訳:JavaからC#など、異なる言語間でコードを翻訳。
- コード修正:バグのあるコードを修正。
これらの実験では、CodeBLEUスコアが従来のBLEUや完全一致率(EMスコア)と比べて、プログラマによる評価との高い相関を示した。
Discussion