e4exp / paper_manager_abstract

0 stars 0 forks source link

MergeBERT: Program Merge Conflict Resolution via Neural Transformers #655

Open e4exp opened 2 years ago

e4exp commented 2 years ago

ソフトウェアの共同開発は,大規模なソフトウェアプロジェクトを成功させるために欠かせない,最新のソフトウェア開発ライフサイクルの一部です. 複数の開発者が同じコードラインを同時に変更すると、マージコンフリクトが発生することがあります。 このようなコンフリクトは、プルリクエストや継続的インテグレーション・パイプラインを数時間から数日にわたって停滞させ、開発者の生産性を著しく低下させます。 本論文では、トークンレベルの3ウェイ・ディファレンシングとトランスフォーマ・エンコーダ・モデルに基づいた新しいニューラル・プログラム・マージ・フレームワークであるMergeBERTを紹介します。 マージ・コンフリクト解決の制限された性質を利用して、我々は、解決シーケンスを生成するタスクを、実世界のマージ・コミット・データから抽出されたプリミティブ・マージ・パターンのセットに対する分類タスクとして再構成します。 これにより、既存の構造化プログラムやニューラルプログラムのマージツールと比較して、約2倍の性能向上を実現しています。 最後に、Java、JavaScript、TypeScript、C#の各プログラミング言語を用いた多言語環境でプログラムマージを実行し、未知の言語にもゼロショットで一般化できるという、本モデルの汎用性を示します。

e4exp commented 2 years ago

1 はじめに

共同で行うソフトウェア開発では、ファイル間の変更を追跡するために、git などのバージョン管理システムに依存しています。 ほとんどのプロジェクトでは、開発者は主にソフトウェアリポジトリのブランチで作業を行い、プルリクエストを介してコードの変更をメインブランチと定期的に同期させます(Gousios et al.、2016)。 複数の開発者が同じ行のコードに同時に変更を加えると、マージコンフリクトが発生することがあります。 Zimmermann, 2007)による4つの大規模ソフトウェアプロジェクトの実証研究によると、全マージコミットのうち最大で46%がコンフリクトを起こしています。 マージコンフリクトの解決には、構文とプログラムのセマンティクスの両方を理解する必要があり、時間がかかり、複雑で、エラーが発生しやすい作業です。 git などの最新のバージョン管理システムは,入力ファイルの非構造化ラインベースの 3 者間マージを実行するために diff3 アルゴリズムを利用しています(Smith, 1998). このアルゴリズムは,2 つのバージョンのコード A と B の,共通のベース O 上での双方向の diff を,一連の diff の「スロット」に整列させます。 各スロットでは,AまたはBのどちらかの変更点が選択される. 両方のプログラムバージョンが同じスロットで変更を導入した場合、マージコンフリクトが発生し、コンフリクトした変更を手動で解決する必要があります。 汎用性のあるプロダクションレベルのマージコンフリクト解決システムは、プログラミング言語の構文とセマンティクスを認識しつつ、プログラミング言語に関係なくあらゆるソースコードファイルを扱うことができる柔軟性を備えている必要があります。 また、特定のマージタイプやソフトウェア成果物の領域を超えて、現実世界の様々なマージコンフリクトに一般化する必要があります。

自然言語理解・生成タスクにおける変換モデルと自己教師付き事前学習の卓越した性能に触発され(Devlinら、2019年、Radfordら、2019年、Liuら、2019年、Lewisら、2019年、Raffelら、2019年。2020)だけでなく、プログラミング言語領域(Feng et al., 2020; Svyatkovskiy et al., 2020; Clement et al., 2020; Tufano et al., 2020; Ahmad et al., 2021)においても、MergeBERT:トークンレベルの3方向差分と伝達学習に基づくニューラルプログラムマージフレームワークを紹介します。 しかし、ここでは、LSTM(Hochreiter and Schmidhuber, 1997)などの他のエンコーダアーキテクチャや、Poolingformer(Zhang et al., 2021)などの効率的な変換器のバリエーションを利用することができます。 コードの各行に対して決定論的なマージ決定を行う標準的な diff3 アルゴリズムとは異なり、我々は、競合するチャンクをローカライズするのに役立つ diff3 のトークンレベルの変形を導入し、その後、最も可能性の高いプリミティブ・マージ・パターンを選択する確率的ニューラルモデルを利用します。

MergeBERT は、双方向のトランスフォーマ・エンコーダ・モデルに基づいています。 本モデルにプログラミング言語の構文およびセマンティクスの基本的な知識を付与するために、2 段階の学習手順を採用しています。 (1)大量の多言語ソースコードコーパス上での教師なしのマスクされた言語モデルの予備訓練、 (2)シーケンス分類タスクのための教師ありの微調整。

前学習したエンコーダの重みを、標準的なdiff3アルゴリズムが行うすべての入力(入力プログラムの2つの双方向差分)と、編集シーケンス情報を符号化する多入力モデルアーキテクチャに転送し、それらを集約して学習しています。 エンコーダの実装には、BERT(bidirectional transformer encoder)を採用した。 双方向エンコーダである BERT は、衝突するチャンクの周囲にコードコンテキストを含めることができ、これは左から右への言語モデルに比べて重要な利点となります。

本論文の貢献度は以下の通りです。 (1 このフレームワークは、トークンレベルの差分を利用し、解決シーケンスを生成するタスクを、実世界のマージコミットデータから抽出されたプリミティブなマージパターンの集合に対する分類タスクとして定式化します。 (2)教師なしマスクド言語モデルの事前学習(第5節参照)により、何百万ものソフトウェア・ プログラムから得られたプログラムの構文やソースコード識別子の種類に関する知識を、マージ・コンフリクト解 決の下流シーケンス分類タスクに効果的に転送し、このアプローチを計算上より実現可能なものにしています。 (3) 既存のニューラルプログラムマージモデルやjsFSTMergeやJDimeのような半構造化プログラムマージツールのいくつかの限界を克服し、最先端(Dinella et al, 2021)と比較して2倍近くの改善を実現しました(第8節、第10節参照)、そして最後に。 (4)Java、JavaScript、TypeScript、C#のプログラミング言語で学習した多言語MergeBERTモデルが単言語モデルの性能にほぼ匹敵し、未見の言語にゼロショットで一般化することを実証します。

e4exp commented 2 years ago

2 動機付けとなる例

このセクションでは、MergeBERT が、従来の行レベルのマージ競合解決問題を、トークンレベルの競合領域に 関する分類タスクとしてどのように定式化するかを説明する。 図 1 は、JavaScript におけるマージ・コンフリクトの例を示している。 左側の図1(a)は、標準的な diff3 マーカー「<<<<<<< A.js」、「||||||| O.js」、「=======」および「>>>>>>> B.js」を示しており、それぞれプログラム A、ベース O、および B によって導入された競合領域を示しています。 ここで,Oはバージョン管理の履歴の中でプログラムAとBの最も共通の祖先を表す。 diff3のコンフリクト領域のプログラムテキストをAj , Bj , Ojと表記します(jはコンフリクトインデックス)。 単一のコンフリクトのみで構成されるプログラムを参照する場合は、コンフリクトインデックスを省略することができる。 すべてのマージされたプログラム・バージョンに共通する diff3 対立するチャンクの外側のプログラム・テキストを、接頭辞と接尾辞と呼び、本稿ではそれぞれ Pref と Suff と表記する。 まず、MergeBERT は、各行レベルのマージ・コンフリクト・インスタンスをトークン・レベルで表現 し(図 1(b))、簡略化されたコンフリクト領域 a ⊂ A, b ⊂ B, o ⊂ O で表現し、分類によりその解決策を予測する(図 1(c))。 ここでは、トークンレベルの差分の属性を小文字で表記します(例:suffはトークンレベルのdiff3の競合領域の接尾語)。

直感的に言うと、トークンレベルのマージでは、まず行構成のテキストをトークンのリスト(スペースと行の区切りを含む)に変換し、その結果得られたドキュメントにdiff3を適用し、マージされたドキュメントを行レベルで再構築します。 トークンレベルのマージの結果、"let x = max(y,) "という文字列全体がきれいにマージされ、プログラムの接頭辞Pref+prefの一部となり、") "が接頭辞suff+Suffの前に付加されています。 両方の編集がベースに存在する共通の行を修正するので、解決はAまたはBのいずれかの単一の行から構成されていないことを観察してください。 したがって、DeepMerge (Dinella et al., 2021) のような初期のニューラルアプローチでは、この解決策を合成することはできません。 一方、構造化されたマージ技術(jsFSTMerge (Trindade Tavares et al., 2019)など)では、コンフリクトがプログラムステートメント上に現れ、副作用が発生するため、コンフリクトを解決できません。 トークンレベルのマージでは、行内の編集をインターリーブすることができます(つまり、ある編集が他の編集と衝突しないトークンはトリビアルにマージされます)。 Aのvarからletキーワードへの編集を考えてみましょう。 このような衝突しない編集は、上記のことを示すのに十分です。 同様に,max関数の引数のトークンレベルの衝突を考えてみましょう. JavaScriptを学習した適切なモデルであれば,Bからの編集(すなわち,「11, z」)を取ることで,Aの編集の振る舞いも同様に捉えることができると容易に推測できるはずです. 提案された解決策は、MergeBERT が複雑なライン・レベルの解決策をより単純なトークン・レベルの分類 問題に変える方法について、直感的なデモンストレーションを提供します。 MergeBERT は、複数の矛盾するチャンクから構成される非自明な実世界のマージを扱うことができる。 このようなマージ・コンフリクトの例を示すために、付録に完全な例を記載します。

image

e4exp commented 2 years ago

3 背景

データ駆動型マージ Dinellaら(2021)は、データ駆動型プログラムマージ問題を、教師付き機械学習問題として紹介した。 プログラムマージはプログラムの4タプル(A,B,O,M)で構成され、

  1. ベースプログラムOは、プログラムAとBのバージョン履歴の中で最も共通の祖先であり、
  2. diff3は、(A, B, O)に適用されると、非構造化(ラインレベル)のコンフリクトを生成し、
  3. Mは開発者が解決したプログラムであり、コンフリクトはありません。

このようなプログラムとマージのセット(A, B, O,M)が与えられたとき、データ駆動型マージの目的は、merge(A, B, O)=Mとなる例のセットを最大化する関数mergeを学習することである。 さらに、プログラムは複数の非構造化コンフリクト(Aj , Bj , Oj , Mj )を持つ可能性があり、j=0. ...Nであるため,データドリブンマージでは,コンフリクト領域に対応する異なるマージタプルを独立して考慮し,(A,B,O,M)に存在するすべてのマージタプルに対して学習問題を提起することになる. また、Dinellaら(2021)は、各マージタプルの正確な解決領域を抽出するアルゴリズムを提供し、開発者が解決中の変更点を一つも落とさない非自明な解決に対応するデータセットを定義している。 さらに、シーケンス・ツー・シーケンス・エンコーダ・デコーダをベースにしたアーキテクチャを提供しています。 ここでは、マージタプルの(A、B、O)セグメントで構成されるマージ入力のエンコードに双方向ゲートリカレントユニット(GRU)を使用し、入力に存在するラインセグメントからのみ選択するように出力を制限するためにポインタメカニズムを使用しています。 入力から線分のみをコピーするという制限があるため、論文で定義したデータセットでは、トークンレベルのインターリーブを必要とするマージは考慮していません。 また、このデータセットは、単一の言語であるJavaScriptにおけるマージコンフリクトを対象としています。 一方、本論文では、これらの制限の両方に対応しています。

e4exp commented 2 years ago

4 分類タスクとしてのマージ競合解決

本研究では、マージ競合解決の制限された性質(任意のプログラム修復と比較して)を利用して、判別モデルを活用して解決シーケンスの生成タスクを実行する方法を示します。 我々は、diff3のトークンレベルのバリアントが、ラインレベルのバリアントよりも2つの有用な特性を持つことを経験的に観察しました。

(i) マージ・コンフリクトを小さなプログラム・セグメントに局所化し、コンフリクト領域のサイズを効果的に縮小することができる。 (ii) トークン・レベルでのほとんどの解決策は、aまたはbまたはoからの変更、またはaに続いてbまたはその逆の連続した構成からなる。

一方で,トークンレベルのマージでは,小さなコンフリクトが多数発生する可能性があります. このトレードオフのバランスをとるために、ラインレベルマージで生成されたラインレベルのコンフリクトから始めて、ラインレベルのコンフリクトに存在するセグメントのみをトークンレベルマージで処理します。 このようなラインレベルでの2レベルマージには、いくつかの可能性があります。

与えられたラインレベルのコンフリクト (A, B, O, R) に対して、トークンレベルのコンフリクトと解決策をシーケンス haj , bj , oj , rj ij として表します。 このようなトークンレベルの rj の多くは,(i) aj, (ii) bj, (iii) oj のみで構成されているか,(iv) aj , bj または (v) bj , aj を連結したものであることを経験的に観察しています. したがって、rjを構築する問題は、これらの可能性を予測する分類タスクとして扱うことができます。 ここで重要なのは、トークンレベルでは単純な解決戦略を予測していますが、ラインレベルでは複雑なインターリーブに変換されるということです。

もちろん、すべての行レベルのコンフリクトが、そのコンフリクトをトークンに分割することで解決されるわけではありません。 複雑な行ベースのインターリーブである解決策の中には、トークンレベルでの選択として表現できないものもあります。

4.1 基本的なマージ解決タイプ

ラインレベルの競合領域Ai , Bi , Oi , i=0...Nと、ラインレベルの競合iに対応するトークンレベルの競合領域a i j , bi j , oi jを持つマージタプル(A, B, O, M)が与えられた場合、以下の9つの基本的なマージ解決タイプを定義し、教師付き分類タスクのラベルとします。

  1. プログラムA(開発者ブランチA)で提案された変更点a i jを決議とする、
  2. 2.プログラムBで提案された変更点b i jを決議とする、
  3. 基本参照プログラムOの変更点o i jを決議とする、
  4. a i jとb i jの変更点を文字列結合して決議とする、
  5. b i jとa i jの変更点を文字列結合して決議とする(前と逆の順序)、 6.プログラムAで提案された変更点a i jのうち、基本参照プログラムOにも存在する行を除いたものを決議とする、
  6. プログラムBで提案された変更点b i jを、ベースに存在する行を除いて解決とする、
  7. a i jとb i jの変更点を文字列結合したものを、ベースに存在する行を除いて解決とする、
  8. b i jとa i jの変更点を文字列結合したものを、ベースに存在する行を除いて解決とする(前とは逆の順序)、

これらの9つの原始的なマージ解決パターンを、GitHubから得られた実世界のマージ紛争解決の分析に基づいて、データ駆動型のアプローチで特定します。 分析の結果、全マージコンフリクトの85%以上がこれらのラベルを使って表現できることがわかりました。 上記の9種類の解決方法は原始的なものですが、任意の組み合わせや行間を含む、現代のバージョン管理システムにおける実世界のマージ解決方法の大部分をカバーするのに十分な基礎を形成しています。 図2は、プログラミング言語TypeScriptのデータセットにおけるラベルの分布を示している。 左側のプロットは、標準的な(ラインレベルの)diff3のコンフリクト領域で得られたラベル分布を示しています。 このようなケースは機械学習なしで解決でき、take oursやtake theirsのマージ解決戦略で簡単に対処できると考えられます。 右の図は、トークンレベルの差分アルゴリズムで得られたラベル分布を示しています 些細なマージ解決(take Aまたはtake B)は除外されています。 トークンレベルでの "take A "マージ解決は、"take ours "または "take theirs "マージ解決戦略には対応しておらず、ラインレベルでは任意のラベルにマッピングされる可能性があり、機械学習の研究に刺激を与える非自明なマージシナリオを表しています。 ここで重要なのは、これらのプリミティブなマージ解決タイプは、入力プログラムからどのような構文構造を選択すべきかを厳密に定義したテンプレートではないということです。 例えば、「take changes proposed in program A」というラベルは、単一のコード・トークンにも、メソッドのシグネチャやボディ全体にも対応することができます。 このように、マージタイプはマージコンフリクトの表現力を制限するものではなく、コンフリクト全体の85%以上を表現することができます。

image

e4exp commented 2 years ago

5 MergeBERT:ニューラル・プログラム・マージ・フレームワーク

MergeBERTは、双方向トランスフォーマ・エンコーダ・モデルに基づくテキスト・プログラム・マージ・モデルで ある。 これは、トークンレベルの差動で抽出された競合領域と、コンテキストとしての周辺コードを与えられたシーケンス分類タスクとして、マージの競合解決に取り組みます。 MergeBERT の主要な技術革新は、プログラム・テキストを双方向変換エンコーダーでの学習に適した 入力表現に分割する方法と、分類のために様々な入力エンコーディングをプールし分類する方法にあります。 MergeBERT は、従来の 2 段階の事前学習および微調整の学習手順を利用します。 我々は、大規模な多言語ソースコードコーパス上での教師なしのマスクド・ランゲージ・モデリング(MLM)の事前トレーニングと、それに続く分類タスクのための教師ありの微調整を使用します。 微調整のために、我々は、元のプログラム O に関して対立するプログラム A および B のペアワイズに整列したトークン・シーケンスと、それに対応する編集シーケンス・ステップを符号化する多入力モデル・アーキテクチャを構築し、それらを学習のために集約します。

MergeBERT モデル・アーキテクチャの概要を図 3 に示します。 image

トークンレベルで競合するチャンク aj , bj , oj を有するマージタプル(A, B, O, M)が与えられた場合、MergeBERT は以下の条件付確率分布をモデル化する。

image

結果的には、プログラム全体では

image

ここでNは、マージタプル(A,B,O,M)におけるトークンレベルのコンフリクトの数です。

5.1 マージ・コンフリクトの表現

Dinellaら(2021年)によって示されたように、効果的なマージ表現は、AとBが元のプログラムOの編集であるという表示を提供するために「編集を認識する」必要があります。 編集の分散表現に関する先行研究(Yinら、2019年)は、標準的な決定論的diffingアルゴリズムを使用して双方向diffを計算し、結果として得られるペアワイズ・アラインメントを機械学習モデルによって消費可能なベクトルとして表現する方法を説明しています。 マージタプル(A,B,O,M)が与えられると、MergeBERTはまず、元のプログラムoのトークンに関して、相反する領域a(それぞれb)のトークンのシーケンス間の2つの双方向アライメントを計算する。 アライメントされたトークンのシーケンスの各ペアについて、第2のシーケンスを第1のシーケンスに変える方法を表す「編集シーケンス」を抽出する。

これらの編集シーケンス(∆aoと∆bo)は、次のような編集アクション(編集の種類)で構成されています:=は同等のトークンを、+は挿入を、-は削除を、↔は置換を、∅はパディングトークンとして使用されます。 これにより、4つのトークン列と2つの編集列が生成されます。(a|o, o|a, and∆ao)と(b|o, o|b, and∆bo)です。 各トークン・シーケンスは、対応するコンフリクト領域と、潜在的には周辺のコード・トークンをカバーします(詳細はセクション9を参照)。 図3に編集シーケンスの例を示します。

5.2 コンテキスト・エンコーディング

ソース・コード・ファイルの多言語データセットで、マスクされた言語モデリングの目的に従って、 双方向トランスフォーマ・エンコーダ(BERT)モデル E を事前学習します。 各ソースコードファイルでは、トークンのセットが一様にランダムにサンプリングされ、[MASK]記号に置き換えられ、モデルは元のシーケンスを再構築することを目的としています。 コード識別子の疎な性質を考慮して、語彙のサイズが大きくならないように、BPE(Byte-Pair Encoding)という教師なしのトークン化手順を利用しています(Karampatsis et al.、2020)。 コードトークンの他に、語彙には編集ステップを表す特別なシンボルと[MASK]シンボルが含まれています。 微調整の際には、編集タイプの埋め込みを導入し、トークンと位置の埋め込みとの加算を行います。 s = st +sp +se . 編集タイプの埋め込みは,モデルが編集ステップを認識するのに役立ちますが,これは事前のトレーニングでは提供されません。 詳細は図4を参照してください。 図3に示すように,事前に学習したエンコーダモデルを用いて,編集シーケンス(△aoと△bo)を型埋め込みのインデックスとして渡し,マージされたプログラムの4つのトークンシーケンス(a|o, o|a, b|o, o|b)をそれぞれ独立にエンコードする。

5.3 マージタプルの要約

標準的なシーケンス学習タスクでは、1つの入力と1つの出力シーケンスがあります。 マージ紛争解決の設定では、複数の入力プログラムと 1 つの解決策があります。 この設定での学習を容易にするために、我々は MergeBERT を多入力エンコーダー・ニューラル・ネットワークとして構築します。 このニューラル・ネットワークは、最初にトークン・シーケンス a|o、o|a、b|o、および o|b をエンコードし、次にそれらを単一の隠れた要約状態に集約します。

image

ここで、Eはコンテキスト・エンコーダであり、E(xi , ∆)はシーケンスxi∈(a|o, o|a, b|o, o|b)のそれぞれに対するエンベッディング・テンソルである。 エンコーディングとアグリゲーションの後、ソフトマックスによる線形分類層が適用される

image

結果として得られる行レベルの解像度領域は、接頭辞 pref、予測されたトークン・レベルの解像度 rj、および接尾辞 suff を連結することにより得られます。 最後に、元の行レベルとトークン・レベルの競合の間に 1 対多の対応がある場合(例については付録を参照)、MergeBERT は標準的なビームサーチを使用して、最も有望なトークン・レベル予測をデコードします。