e4exp / paper_manager_abstract

0 stars 0 forks source link

Generating Bug-Fixes Using Pretrained Transformers #394

Open e4exp opened 3 years ago

e4exp commented 3 years ago

バグの検出と修正は、ソフトウェア開発サイクルの中で最も重要でありながらも、フラストレーションのたまる作業です。 既存のバグ検出ツールは、主に静的解析器に基づいています。 静的解析器は、プログラムの実行に関する数学的論理と記号的推論に依存して、一般的なタイプのバグを検出します。 バグの修正は、通常、開発者に委ねられています。 本研究では、データ駆動型のプログラム修復アプローチであるDeepDebugを紹介します。 DeepDebugは、実世界のGitHubリポジトリから抽出されたJavaメソッドのバグを検出し、修正することを学習します。 バグパッチは、2つのステップで構成されるシーケンス対シーケンスの学習タスクである。

(i)ノイズ除去のための事前学習と、 (ii)対象となる翻訳タスクに対する教師による微調整。

ソースコードプログラムを用いた事前学習により、ゼロからの教師付き学習と比較して、発見されるパッチの数が33%向上することを示した。 また、自然言語からコードへのドメイン適応型の事前学習により、さらに32%精度が向上することを示した。 また、標準的な精度評価指標を、削除されていない修正パッチと削除のみの修正パッチに分類し、最適なモデルでは、削除されていない修正パッチを従来よりも75%多く生成できることを示しました。 先行研究とは対照的に、生のコードを生成したときに最高の結果を得ることができました。 これは、容量の小さいモデルにしかメリットがない抽象化されたコードを使った場合とは異なります。 さらに、標準的な位置埋め込みに加えて構文埋め込みを追加したり、各トークンの構文クラスを予測する補助的なタスクを追加したりすることで、微妙な改善が見られました。 Javaに焦点を当てていますが、我々のアプローチは言語にとらわれず、tree-sitterのような汎用パーサーを必要とします。

e4exp commented 3 years ago

1 はじめに

自動バグパッチの初期の成果は,一連のテスト機能を想定し,テストスイートに合格する までパッチを生成するというアプローチをとっていた. 編集は、抽象構文木(AST)の操作(ノードの削除、挿入、交換など)として行われました。 GenProg(Le Goues et al., 2012)は、これらの操作と遺伝的アルゴリズムを組み合わせて、8つのプロジェクトで10k以上のテストケースを含む510万LOCの105のバグのうち55を修正したと主張しました。 しかし、後続の論文(Qi et al., 2015)によると、主張された55件の修正のうち53件は単なるテストスイートの適切な修正であり、そのほとんどは単に削除演算子を使って生成されたものであることが判明した。 より最近の研究では、「最初にバグを修正した開発者と全く同じ修正プログラムを生成する」という、より厳しい基準を用いたパッチ生成が検討されています。 我々はPatches in the Wild (Tufano et al., 2019)のJavaデータセットを使用しています。 このデータセットは、メッセージがバグフィックスであることを示すコミットから抽出された短いメソッドで構成されています。 Copy That! (Panthaplackel et al., 2020) は、このデータセットに新しいスパンコピーのメカニズムを適用し、見事にトップ1の精度を達成しています。 SequenceR(Chen et al., 2018)は、Patches in the Wildデータセットにおいて、1行の変更のみに焦点を当てることで絞り込みと拡張の両方を行い、さらに他の手法のシグネチャを含めることで、バグのある手法以外の追加コンテキストを提供しています。 この拡張されたコンテキストにより、相対的に15%の向上が見られました。 3つのアプローチはいずれもコピーから大きな利益を得ていますが、これは固定された手法がバグのある手法と大きく重なっていることを考えると理にかなっています。 ENCORE (Lutellier et al., 2019) もまた、より多くの言語でワンラインの変更を調べていますが、バグのある行のみを入力として与え、それ以上のコンテキストは提供していません。 ある種のバグタイプでは、訓練のために何百万もの合成バグを生成することができる。 Devlinら(Devlin et al., 2017)は、Python上でRNNを訓練し、誤った比較演算子、「is」と「is not」の誤った使用、変数の誤用、忘れられた「self」アクセサを修正しています。 全体として、合成バグでは86%、現実のバグでは41%の精度を達成している。 Kanadeら(Kanade et al., 2019)は、BERT形式のモデル「CuBERT」をより大きなPythonデータセットで事前学習した後、関連する一連の合成バグで微調整を行い、90%以上の精度を達成しています。

NLPの広い分野では、私たちのタスクは、文法的誤りの修正(GEC)に最も近い精神を持っています。 CoNLLのGECリーダーボード(Ng et al., 2014)を見ると、トランスフォーマーを使ったいくつかの異なるアプローチが見られます。 Kiyanoらは、スペルミスの注入、左から右へのリランキングの適用、文レベルのエラー検出タスクの使用などのより標準的な技術に加えて、ノイズの多い逆翻訳によるデータ増強から大きな利益を得ている(Kiyono et al., 2019)。 Kanekoら(Kaneko et al., 2020)は、入力されたエンベッディングを、文法的なエラー検出(与えられたトークンが誤りであるかどうかを検出する)について微調整されたBERTによって生成されたエンベッディングと連結するseq2seqモデルを使用している(Kaneko et al. Zhaoら(Zhao et al., 2019)は、人工的なノイズの注入と補助的なトークンラベル付けタスクの使用に加えて、コピーメカニズムを適用しています。 Awasthiら(Awasthi et al., 2019)は、トークンziをi番目の場所で実行する編集操作にマッピングする、エンコーダのみのアプローチを追求しています。 彼らは大きな速度向上を確認しており、そのモデルを反復的に適用することも検討しています。

より広く展開すると、やはりBERT、BART、T5(Devlinら、2017年、Lewisら、2020年、Raffelら、2019年)のようなタスクにとらわれない様々な事前学習アプローチが、GLUE(Wangら、2018年)のような複合ベンチマークで大きな性能向上を実現している。 これらのモデルは通常、合成的に破損したテキストの大規模なコーパス上で、ノイズ除去目的を用いて事前学習されます。

一般的なバグを修正しようとする作業範囲を維持しつつ、強力なシーケンスからシーケンスへの変換器を事前にトレーニングする技術を活用しています。 まず、生のコードをテキストとして扱い、スパンマスキングという目的を用いて、4億パラメータのエンコーダ・デコーダ変換器を、GitHubから抽出した67kのJavaリポジトリで前学習し、Patches in the Wildベンチマークで微調整を行います。 具体的には, Javaのみでの事前学習, 英語で事前学習した強力なベースラインであるBARTから直接微調整を行う, BARTからのウォームスタートでさらにJavaで事前学習を行う, という3つの事前学習実験を検討した. Javaのみでの事前学習では、発見されたパッチの数が1049/12380から1392/12380と3分の1に向上し、ウォームスタートを用いた事前学習では1839/12380とさらに3分の1に向上しました。 このベンチマークで使用されている標準的なトップ1精度の指標を、非削除の修正と削除のみの修正に分けて改良し、最高のDeepDebugモデルが、従来の技術に比べて非削除の修正を75%多く生成することを示しました。 先行研究とは対照的に、小さいモデルに有利な抽象化されたコードではなく、生のコードを生成したときに最良の結果が得られています。 最後に、プログラミング言語に特有の形式的な文法を使用することで、微妙な改善が見られます。 具体的には、標準的な位置埋め込みに加えて、構文埋め込みを追加したり、各トークンの構文クラスを予測する補助タスクを追加したりして実験を行った。

e4exp commented 3 years ago

image image

image image image image image image

e4exp commented 3 years ago

10 結論と今後の課題

事前学習された変換器を用いて実世界のコードのバグを修正することを学習するデータ駆動型のプログラム修復アプローチであるDeepDebugを紹介した。 公開された英語のチェックポイントからウォームスタートし、コード上でさらに事前学習を行い、最終的にターゲットタスク上で微調整を行うという、多段階の事前学習パイプラインに従うことで、新たな技術水準を達成した。 この大規模な変換器は、抽象化されたコードで優れた性能を発揮する小規模なGRUモデルとは異なり、意味のある関数名や変数名を活用することができることを示している。 また、我々の修正が単なる削除ではなく、建設的なものであるかどうかを調査した結果、削除ではない修正を行う割合が、従来の技術よりも75%多いことが分かりました。 将来的には、複数の言語への拡張や、反復的な修正を検討したいと考えています。