Open e4exp opened 3 years ago
多くの分野では、入力の質を評価する批評家が存在しますが、より建設的で、悪い入力を実際に改善する修正者が望まれています。 例えば、プログラミングでは、コードアナライザやコンパイラがコードに誤りがあるかどうかを教えてくれるが、プログラマーは悪いコードの誤りを修復する必要がある。 そのため、自動コードフィクサーの開発は、プログラミングの生産性を高めるための鍵であり(Seoら、2014年)、活発な研究分野となっている(Mesbahら、2019年、Dingら、2020年、Dinellaら、2020年)。 この一般的な設定の他の例としては、特性評価者が与えられた分子の化学的特性(薬らしさなど)を改善することを目的とした分子設計(Jin et al., 2019)や、評点が与えられた文章を改善することを目的とした小論文編集(Taghipour & Ng, 2016)などがあります。 批評家が与えられたときに修正者を自動的に学習する方法(我々はcritic2fixerと呼んでいる)は、機械学習の重要な研究課題として残っている。 本研究では、コード修復の領域に焦点を当てます。 壊れたコード、修正されたコードなどのペアデータを手動でラベリングするのはコストがかかるため、フィクサーの学習は困難である。 そこで、ラベルのないデータからの学習を考えます。
具体的には、図1に示すように、(a)入力の品質を評価する批評家(コードアナライザやコンパイラ)と、(b)ラベルのないデータ(GitHubで収集された対になっていない良いコードと悪いコード)が与えられ、悪いコードを良いコードに修復するフィクサーを学習することが目的である。 コード修復に関するこれまでの研究では、良いコードにランダムまたはヒューリスティックな摂動(例えば、トークンの削除)を加え、フィクサーを学習するための合成ペアデータhperturbed code, good codeiを用意している(Pu et al., 2016; Gupta et al., 2017; Ahmed et al., 2018; Hajipour et al., 2019; Yasunaga & Liang, 2020)。 しかし、このような合成的に生成された悪例は、実際の悪例の分布とは一致しない。 例えば、図2に示すように、合成摂動はコードから恣意的に括弧を落とし、実際のプログラミングではほとんど起こらないエラーを生成することがある(図2右上;合成エラー)。 これに対して、実際の人間が書いたコードでは、入れ子の文脈で括弧を見逃すことが多い(図2中央上;人間のエラー)。 §4で示すように、このような合成データと実データの分布の不一致が、結果的に低性能をもたらします。
このギャップを埋めるために、我々は、ラベルのないデータと批評家からフィクサーを学習する新しい手法、Break-It-Fix-It (BIFI)を提案する(図3)。 BIFIは、2つの核となる洞察に基づいている。
(i) 批評家を使って、実際の悪い例でフィクサーの出力をチェックし、良い出力を学習データに加えることができる、 (ii) ブレーカーを訓練して、良い例から現実的な悪い例を生成する。
具体的には、合成ペアデータhsynthetic bad, goodiで学習された初期のフィクサーが与えられた場合、BIFIはデータ生成と学習のラウンドを通して、フィクサーとブレーカーを同時に改良します。
(1)実際の悪い例にフィクサーを適用し、出力をfixして実際のペアデータを得る、 (2)得られたデータを用いてブレーカーを学習する、 (3)学習したブレーカーを用いてコードエラーを生成し、さらにペアデータを得る、 (4)フィクサーを(1)と(3)で新たに生成したペアデータで学習する。
直感的には、このサイクルは、より多くの実際の、あるいは現実的に生成された不良コードでフィクサーを訓練し、フィクサーを初期の合成分布からコードエラーの実際の分布に適応させます。 BIFIアルゴリズムは、教師なし機械翻訳におけるバックトランスレーション(Lample et al., 2018a)に関連しており、ターゲットからソースへのモデルを使用してノイズの多いソースを生成し、ソースからターゲットへのモデルを訓練してターゲットを再構築する(例えば、我々の修復タスクにおけるバッドサイドとグッドサイドは、ソースとターゲットと見なすことができる)。 BIFIがバックトランスレーションと異なる点は、生成された例が実際にfixされているのか壊れているのかを批評家を用いて検証する点(ステップ1と3)と、壊れている人が生成した例に加えて実際の悪い例でfixerを訓練する点(ステップ4)であり、これにより生成されたペアデータの正しさと分布の一致を改善することができる。 我々の提案手法を2つのデータセットで評価する。
我々のアプローチ(BIFI)は初期フィクサーを凌駕し、GitHub-Pythonで90.5%の修復精度(絶対値で28.5%増)、DeepFixで71.7%の修復精度(絶対値で5.6%増)を得て、新たな最先端を達成した。 また、BIFIはバックトランスレーションを10%向上させています。 さらに、BIFIアルゴリズムを用いて、フィクサーとブレーカーが、より現実的なコード分布にどのように適応するかを定性的に示します(§4.3)。
ここでは,入力の品質を評価する批評家(コンパイラなど)が与えられたときに,悪い例(例えば,構文エラーのあるコード)を良い例(例えば,エラーのないコード)に変換する修正器を訓練することを目的とした修復タスクを考える. 既存の研究では、ヒューリスティックな手法(トークンの削除など)を用いて良い例を汚し、(悪い、良い)ペアからなる学習データを作成している。 しかし、このように合成されたデータで学習したフィクサーは、実際の悪い入力の分布にうまく外挿することができない。 このギャップを埋めるために、我々はBreak-It-Fix-It (BIFI)という新しい学習手法を提案する。 (i) 批評家を使って、実際の悪い入力に対する修正者の出力をチェックし、訓練データに良い(固定)出力を追加する、 (ii) ブレーカーを訓練して、良いコードから現実的な悪いコードを生成する。
これらのアイデアに基づき、BreakerとFixerを反復的に更新しながら、それらを併用してより多くのペアデータを生成します。 BIFIを2つのコード修復データセットで評価します。 GitHub-Pythonは、PythonコードのAST解析エラーを修復することを目的とした新しいデータセットであり、DeepFixは、Cコードのコンパイラエラーを修復することを目的としています。 BIFIは既存の手法よりも優れており、GitHub-Pythonでは90.5%(+28.5%)、DeepFixでは71.7%(+5.6%)の修復精度を得ることができました。 注目すべきは、BIFIがラベル付きデータを必要としないことであり、様々な修復タスクを教師なしで学習するための強力な出発点となることを期待している。