e4exp / paper_manager_abstract

0 stars 0 forks source link

Cascaded Fast and Slow Models for Efficient Semantic Code Search #688

Open e4exp opened 2 years ago

e4exp commented 2 years ago

自然言語によるセマンティックコード検索の目的は、自然言語のクエリを用いて、固定された候補のセットから意味的に関連するコードスニペットを取り出すことです。 既存のアプローチは、実用的なセマンティックコード検索システムに向けて十分な効果も効率もありません。 本論文では、高速モデルと低速モデルをカスケード接続した、効率的で正確なセマンティックコード検索フレームワークを提案する。 このフレームワークでは、高速変換エンコーダモデルを学習して、高速検索のためのスケーラブルなインデックスを最適化し、続いて低速の分類ベースの再ランキングモデルを学習して、高速検索の上位K件の結果のパフォーマンスを向上させる。 2つの別々のモデルを導入する際の高いメモリコストをさらに削減するために,パラメータを共有する1つのトランスフォーマー・エンコーダーに基づいて,高速モデルと低速モデルを共同で学習することを提案する. 提案したカスケード方式は、効率的でスケーラブルであるだけでなく、CodeSearchNetベンチマークにおいて、従来の最先端の結果であるMRR0.713に対して、平均MRR(mean reciprocal ranking)スコア0.7795(6つのプログラミング言語間)という最先端の結果を達成しました。

e4exp commented 2 years ago

1 INTRODUCTION

ソフトウェア開発者の生産性を向上させるツールの構築は、最近、深層学習の研究コミュニティで注目を集めています。 自然言語処理の進歩と並行して、CodeBERT (Feng et al., 2020b)、CodeGPT (Lu et al., 2021)、CodeX (Chen et al., 2021)、PLBART (Ahmad et al., 2021)、CodeT5 (Wang et al., 2021b)のような事前に学習された言語モデル(LM)が、プログラミング言語を含む理解と生成のタスクのために提案されています。 Chenら(2021)の12BパラメータのCodeXやAustinら(2021)の137BパラメータのLMのようなコード生成に関する最近の研究では、大規模な自己回帰言語モデルを用いて、GPT-C(Svyatkovskiy et al., 2020)のような以前の生成モデルが達成できたものをはるかに超えて、自然言語の記述から複数行のコードを生成する印象的な能力を示しています。

しかし、このような優れた性能は、モデルから多くのサンプルを抽出し、それらが正しいかどうかを機械的にチェックできることが前提となっていることが多い。 この設定は、実際にはそうでないことが多いでしょう。 また、コード生成モデルには、セキュリティ上の問題(脆弱なコードや不整合なコードが生成される可能性)があり、その採用は困難です。 このような現状を踏まえ、開発者を支援するツールを構築する際に、コード検索システムは魅力的な代替手段となります。 効率的な実装により、単一のクエリに対するコード検索は、大規模なLMを用いてコードを生成するよりも、ほとんどの実用的なインデックスサイズではるかに高速になります。 コード生成とは対照的に、コード検索では、結果の品質をはるかに制御できる可能性があります

インデックスエントリを事前に検証することができます。 コード検索システムでは、新しいインスタンスをエンコードしてインデックスを拡張するだけで済むため、トレーニング後に追加データを活用することも容易です。 コード検索システムは、内部にプロプライエタリなコードを持つ組織にとって特に価値のあるものです。 ソースコードデータを検索用に内部でインデックス化することで、冗長性を防ぎ、プログラマの生産性を高めることができる。 Xuら(2021)の最近の研究では、コード生成システムとコード検索システムの有効性を理解するために、開発者を対象に調査を行っています。 その結果、この2つのシステムは補完的な役割を果たしており、開発者は複雑な機能を扱う際には生成よりも検索モジュールを好むことがわかり、より優れたコード検索システムの必要性が提唱されている。

コード検索へのニューラルアプローチ(Sachdev et al., 2018; Guo et al., 2021; Ye et al., 2016; Gu et al., 2018)では、クエリとコードを独立して同じセマンティック空間の密な表現にエンコードする。 そして、検索は、これらの密なベクトルの表現上の類似性(コサインまたはユークリッド距離に基づく)を用いて実行される。 直交的なアプローチでは、クエリとコードを共同でエンコードし、コードが与えられたクエリに答えるかどうかを予測するバイナリ分類器としてセマンティックコード検索システムをトレーニングする(Lu et al., 2021; Huang et al., 2021)。 このアプローチでは、モデルは、各候補コードシーケンスとペアになったクエリを処理します。 直感的には、このアプローチは、クエリとコードの間のクロス情報を鮮明にするのに役立ち、エンコーダベースのシーケンス表現間の単純な類似性メトリックよりも、2つのモダリティ(自然言語とプログラミング言語)間のマッチング関係をキャプチャするためのより良い代替手段である。

この後者のアプローチは、コード検索には有望ですが、これまでの手法では、NL-PLシーケンスペアを含むバイナリ分類タスクにこのアプローチを利用していました。 このアプローチをコード検索タスクに直接適用することは、各クエリに対して考慮すべき多数の候補があるため、現実的ではない。 検索と分類にトランスフォーマー(Vaswani et al., 2017)エンコーダベースのモデルを使用する際に、これらのアプローチの補完的な性質を図1に描いています。

image

このようなニュアンスのある分類器モデルの可能性を検索というタスクに活用するために、分類器モデルで限られた数の候補を処理するカスケード方式(CasCode)を提案します。 この制限は、エンコーダベースのアプローチを採用し、2番目の分類器ステージで処理するために、検索セットからその上位数個の候補を選ぶことによって実行される。 我々のカスケード接続されたアプローチは、CodeSearchNetベンチマークにおいて、従来の結果を大幅に上回る0.7795の平均相互ランキング(MRR)スコアという最先端の性能をもたらしました。 そこで、パラメータを共有したカスケード方式を提案しました。 この方式では、1つの変換モデルで符号化と分類の両方を行うことができます。 この方式では,メモリ使用量が大幅に削減される一方で,MRRスコア0.7700という同等の検索性能が得られる.

図2は、異なるアルゴリズムを選択した場合の推論速度とMRRのトレードオフを示しています。 ここでは、一方に(高速)エンコーダモデルを、もう一方に(低速)分類器モデルを配置しています。 CasCodeでは、分類器モデルが達成した最適なスコアに匹敵する性能を提供する一方で、必要な推論時間は大幅に短縮されており、計算機上で実現可能なものとなっています。 このコードベースは、研究目的で公開される予定です。

image

e4exp commented 2 years ago

2 BACKGROUND

コード検索へのニューラルアプローチに関する初期の研究には、教師なしの単語埋め込みを用いて文書(コードスニペット)のための表現を構築したSachdevら(2018年)があり、続いてCambroneroら(2019年)のコードとクエリのペアリングを活用した教師ありのアプローチがあった。 Fengら(2020b)は、ラベル付けされていない(そしてペアになっていない)ソースコードとドキュメントストリングでBERTスタイル(Devlinら、2019)のマスク付き言語モデルを事前にトレーニングし、テキストからコードへの検索タスクのために微調整することを提案した。

このアプローチでは、クエリ表現は推論中に事前に構築されたコード表現のインデックスと比較することができ、最も近いインスタンスが検索結果として返されます。 Miech et al. (2021) とLi et al. (2021) は、以前にテキスト-ビジュアル検索のための同様のアプローチを提案している。

Guo et al. (2021) は、自然言語とソースコードの配列のペアを活用して、テキスト-コード検索モデルを学習しています。 彼らはコントラスト学習フレームワーク(Chen et al., 2020)を採用して検索モデルを学習しており、意味的に一致する自然言語(NL)とプログラミング言語(PL)の配列の表現(バイモーダルデータセットからの正のペア)は引き合わされ、負のペア(ランダムにペアになったNLとPLの配列)の表現は押し離される。 この¨アプローチに用いられるinfoNCE損失(コントラスト損失関数の一種である(Gutmann & Hyvarinen, 2010))は以下のように定義できる。

image

ここで,fθ(xi)は,NL入力xiに対する密な表現であり,yiは対応する意味的に等価なPLシーケンスである. Nはバイモーダルデータセットのトレーニング例の数、σは温度のハイパーパラメータ、Bは現在のトレーニングミニバッチを示す。 上記のアプローチはどのようなモデルアーキテクチャにも当てはまりますが、Guoら(2021)の実験では、GraphCodeBERT(コードで事前に学習された構造認識変換エンコーダ)とCodeBERTをfθに採用しています。 このアプローチを、検索に高速なエンコーダを使用するものと呼ぶ。 推論中に、候補コードスニペットのセット C = {y1, y2, ... y|C|} が与えられ、これらは、インデックス {fθ(yj ) ∀j∈C} にオフラインでエンコードされる。 テストNLのクエリxiに対して、fθ(xi)を計算し、インデックス内の最近傍(コサイン類似度などの距離メトリックによる)に対応するCからのコードスニペットを返します。 次に、C からの正しいコードスニペット(クエリ xi に対して)に割り当てられたランク ri が、平均相互ランキング(MRR)メトリック 1 Ntest PNtest i=1 1 ri の計算に使用されます。 推論の際に必要となるのは、fθ(xi)に関連するフォワードパスとPLインデックスの最近傍探索のみであり、PLインデックス自体はオフラインで構築することができます。 これにより、このアプローチは、候補コードスニペット|C|の数が非常に多い実用的なシナリオに非常に適しています。

関連する研究として、Luら(2021)は、自然言語コード検索を、クエリとコードのペアを分析して、コードがクエリに答えるかどうかを予測する問題として組み立てるベンチマーク(NL-code-search-WebQuery)を提案しています。 Huangら(2021)は、(自動的に抽出されたdocstringではなく)手動で書かれたクエリを含む新しいデータセットをリリースし、クエリとコードのペアのバイナリ分類に基づいた同様のベンチマークを提案しています。

e4exp commented 2 years ago

image

3 CASCODE

Guoら(2021)が提案したアプローチは、実用的なシナリオでは効率的ですが、クエリとコードのエンコードが独立しているため、効果が低くなります。 代わりに、クエリとコード候補を1つの変換エンコーダ内で共同でエンコードし、バイナリ分類を行うことができる。 特に、モデルは、NLとPLの配列[xi ; yj ]の連結を入力とし、この2つが意味的に一致するかどうかを予測することができます。 この二値分類設定の学習バッチは、再び二峰性データセット(意味的に一致することを示す正のペア)を用いて構築することができ、負のペア(不一致)は人工的に構築することができます。 意味的に等価なNL-PLシーケンスのペアセット{xi , yi}が与えられた場合 N i=1の場合、この学習スキームのクロスエントロピー目的関数は、次のようになります。

image

ここで、pθ(xi , yj )は、分類器が予測したように、NL配列xiがPL配列yjと意味的にマッチする確率を表す。 正のペア{xi , yi} ∀i∈Bのミニバッチがあれば、ミニバッチ内のPL配列からyj (j∈B; j != i)をランダムに選び、それをxiとペアにして負のペアとすることができます。 トランスフォーマー・エンコーダーに基づく分類器を使用する場合、自己注視層におけるNLトークンとPLトークンの間の相互作用は、このアプローチの精度を以前の(独立エンコーディング)ものよりも向上させるのに役立つ。 推論の際には、NL配列xiとCからのyjのそれぞれをペアにして、ペアが一致したときの分類器の信頼度スコアに応じて候補をランク付けすることができます。 これにはC個のフォワードパスが必要であり(それぞれがNL-PLシーケンスのジョイントであるため、前のアプローチよりも入力が長くなる)、大きな検索セットを扱う場合にはこのアプローチは実現不可能である。 ここでは、この方法を「検索に遅い分類器を用いる方法」と呼ぶ。 図1は、この2つの異なるアプローチを示している。

私たちは、CasCodeと呼ばれるカスケード方式により、高速エンコーダの速度と低速分類器の精度という2つのアプローチの強みを統合することを提案します。 図3は、私たちのアプローチの全体的な枠組みを示しています。 当社のハイブリッド戦略は、以下の方法で2つのアプローチの長所を組み合わせています。 高速エンコーダーの第1段階では、コードスニペット候補のセットCから上位K個の候補を提供します。 実際には、検索セット(|C|)のサイズは非常に大きいことが多く、実験で調査したCodeSearchNetデータセットでは4360から52660まで変化します。

image

次に、上位K個の候補が第2段階の低速分類器に渡され、それぞれがNL入力(クエリ)xiとペアになってモデルに供給されます。 与えられたペアに対して、この第2段階の分類器は、入力のNL成分とPL成分がセマンティックに一致する確率を返します。 これらを信頼度スコアとして使用し、K個の候補者のランキングを精査します。 その結果、K << |C| の場合は、高速なエンコーダベースの検索で必要とされるものに加えて、わずかな計算オーバーヘッドが追加されるだけなので、このスキームが望ましい。 Kの値が、高速エンコーダのリコールが適度に高くなるように設定されていれば、第2段階の絞り込みは、検索性能を向上させることができる。 Kはこの方式において重要なハイパーパラメータであり、非常に低いKを設定すると、第2段階の低速分類器に渡される入力セットの中で正しいスニペットを見逃す可能性が高くなり、一方、非常に高いKを設定すると、この方式は検索が不可能になる。

セクション4で説明するように、Kが10と小さいCasCodeは、ベースラインと比較して検索性能が大幅に向上しており、Kを100以上に増加させてもわずかな利益しか得られません。 2ステージモデルで発生するメモリオーバーヘッドを最小化するために、高速エンコーダと低速分類器の変換層の重みを共有することを提案します。 これは、infoNCE(LinfoNCE)とbinary cross-entropy(LCE)の共同目的を持つモデルを学習することで実現できます。 この共有モデルのパラメータ数は、separat(非共有)の場合の半分近くになりますが、推論時の計算コストは同じになります。 ただし、分類器モデル、特にエンコーダの上にある分類ヘッド(MLP)には、専用のパラメータが必要です。 このように、CasCodeのパラメータ共有型では、NLのみ、PLのみ(高速エンコーダステージ用)、NL-PL(低速分類器ステージ用)の3種類の入力を消費する変換モデルは、第2ステージのMLP層を除いて同一である。