Open e4exp opened 3 years ago
1 はじめに
ソフトウェア開発者の人口が増加する中、自然言語クエリが与えられた場合に意味的に関連するコードを検索することで開発プロセスの生産性を向上させる自然言語コード検索は、ソフトウェア工学と自然言語処理の両方のコミュニティでますます重要になっています(Allamanis et al. 重要な課題は、自然言語クエリとコードの間の意味的類似性をどのように効果的に測定するかである。 最近では、クエリとコードを密なベクトルとして埋め込むディープニューラルネットワーク(Gu et al., 2018; Wan et al., 2019; Feng et al., 2020)を利用して、統一されたベクトル空間で意味的マッチングを行う試みがあります。 しかし、これらのモデルはほとんどが、自然言語クエリが関数のドキュメントかStack Overflowからの退屈な質問であるような疑似データセットで学習されています。 このような疑似的なクエリは、検索エンジンで頻繁に発行される実際のユーザーのクエリの分布を反映していない。 我々の知る限り、実際のユーザーのウェブクエリを含むデータセットには、Lv et al. (2015)、CodeSearchNet Challenge (Husain et al., 2019)、CodeXGLUE 2 (Lu et al., 2021)がある。 これらの3つのデータセットは、モデルテストのためにそれぞれ34、99、1,046のクエリしかありません。 この分野では、自然言語のウェブクエリとコードの間のセマンティクスをマッチングするためのディープニューラルネットワークのような統計モデルの学習をサポートするための、大量の実際のユーザーのクエリを持つデータセットが不足している。
前述の問題を解決するために,我々は,コード検索と質問応答のためのウェブ・クエリとコードのペア20,604個を,コードがクエリに答えられるかどうかを示すラベルとともに収録したデータセット,CoSQAを紹介する。 クエリはMicrosoft Bing検索エンジンの検索ログから、コードはGitHub3の関数を使用している。 このような専門的なタスクのアノテーションプロセスをスケールアップするために、潜在的なポジティブ候補ペアを精巧に選別し、各ペアを少なくとも3人のクラウドソーシング・ワーカーがアノテーションするという大規模なアノテーションを行った。 さらに、CoSQAデータセットをクエリコード・マッチングに有効活用するために、コード対比学習法(CoCLR)を提案し、学習用に人工的に生成されたインスタンスをより多く生成する。 コード質問応答とコード検索という2つのタスクで、クエリコード・マッチングの実験を行う。 コード質問応答では、同じCodeBERTモデルの性能が、CoSQAデータセットで学習した後に5.1%向上し、当社のCoCLR手法を組み込んだ後には、さらに10.5%向上することがわかりました。 さらに、コード検索に関する実験でも同様の結果が得られています。
7 結論
本論文では,Web クエリとコードのマッチング問題に注目した. このデータセットには、20,604件の実世界のWebクエリとPython関数のペアが含まれている。 CoSQAは、コード質問応答やコード検索に理想的なデータセットであることを実証する。 また、人工的に生成されたインスタンスを学習に組み込むために、CoCLRと名付けられた新しいコード対照学習法を提案する。 その結果、コード検索およびコード質問応答タスクにおいて、CoCLRを用いたモデルがベースライン・モデルを上回ることがわかった。 また、コード検索とコード質問応答のマッチングにおいて、CoCLR成分とコード成分の効果を詳細に分析しました。 このアノテーションされたCoSQAデータセットは、コード要約やコード合成など、テキストとコードの整合性が求められる他のタスクにも有用であると考えられる。
本節では、まず、クエリとコードのマッチングのためのモデルについて説明し、次に、より多くの訓練イ ンスタンスを補強するための当社のコード対照学習法(CoCLR)を示します。
本研究で使用する基本モデルは、サイアム・ネットワークであり、これは、同じアーキテクチャを持ち、 同じパラメータと重みを共有する2つ以上の同一のサブネットワークを持つ一種のニューラル・ネットワークである (Bromley et al., 1994)。 固定サイズのエンベディングを導出し、類似性を計算することで、サイアミーズネットワークシステムは、2つのテキストシーケンスの関係をモデル化するのに有効であることが証明されています(Conneau et al., 2017; Yang et al., 2018; Reimers and Gurevych, 2019)。 我々は、任意のテキストシーケンスをd次元の実数値ベクトルにマッピングするためのエンコーダとして、事前に訓練されたCodeBERT(Feng et al.、2020)を使用する。 CodeBERTは、自然言語とプログラミング言語の二峰性モデルであり、高品質なテキストとコードの埋め込みを導き出すことができる。 具体的には、12層、768次元の隠れた状態、12個の注目ヘッドを持つ双方向トランスフォーマーであるRoBERTa(Liu et al., 2019b)と全く同じアーキテクチャを共有しており、CodeSearchNetコーパス(Husain et al., 2019)上でマスクされた言語モデリングと置き換えられたトークン検出の目的で再学習されている。 各クエリqiとコードciに対して、シーケンスの前に[CLS]トークンを連結し、最後に[SEP]トークンを連結する。 そして、クエリとコードのシーケンスをCodeBERTエンコーダに送り、それぞれ文脈に応じた埋め込みを得る。 ここでは,表現として[CLS]トークンのプールされた出力を使用します。
次に、多層パーセプトロンによってクエリとコードのマッチングを行います。 Chenら(2017)とMouら(2016)に従い、クエリ埋め込みqiとコード埋め込みciを要素ごとの差分qi - ciと要素ごとの積qi x ciで連結し、続いて1層のフィードフォワード・ニューラル・ネットワークを用いて関係埋め込みを得る。
このような操作を行うことで、クエリとコードの間のクロス情報を鮮明にし、矛盾などのマッチング関係をより良く捉えることができると期待しています。 次に、関係埋め込みr (i,i)をシグモイド出力層を持つ最終的な1層パーセプトロン分類器に入れます: s (i,i) = sigmoid(W2 - r (i,i) ) 。 スコア s (i,i) は,クエリ qi とコード ci の類似性とみなすことができます. ベースとなるsiameseネットワークを学習するために,目的関数としてバイナリクロスエントロピー損失を使用します
ここでyiは(qi , ci)のラベルです。
次に、CodeBERTを使用して、コード対照学習をサイアムネットワークに組み込みます。 対照学習は、類似したオブジェクトはより近くに、類似しないオブジェクトはより遠くに置くことを強制することで、表現を学習することを目的としています。 対比学習は、類似および非類似の例を補強するために、タスク固有の帰納的バイアスを活用することをしばしば伴います。 本研究では,クエリとコードの例(qi , ci)が与えられたときに,例自体,インバッチで補強された例(qi , cj ),および書き換えられたクエリで補強された例(q 0 i , ci)に対して対比学習タスクを定義する.したがって、全体の学習目的は次のように定式化できる。
簡単な補強方法として,クエリとランダムにサンプリングされたコードを非類似とみなし,モデルによって強制的に排除するIn-Batchデータを使用する方法がある. 具体的には、n個の例 {(q1, c1),(q2, c2), ... ...} をランダムにサンプリングします。 ,(qn, cn)}をミニバッチからランダムに抽出する。 (qi , ci)に対して、クエリqiとミニバッチ内の他のN - 1個のコードをペアにし、N - 1個のペアを非類似として扱う。 問い合わせ qi とコード cj の類似度を s (i,j) とすると,IBA を用いた例の損失関数は次のように定義される.
In-batch augmentationは、ミニバッチから非類似ペアを生成するだけで、正の関係を学習するための類似ペアの増強を無視している。 この問題を解決するために、我々はクエリを書き換えることで正の例を増やすことを提案する。 ウェブ上のクエリはしばしば簡潔であり、必ずしも文法的に正しいとは限らないという特徴にヒントを得て、我々はわずかな修正を加えた書き換えられたクエリが元のクエリと同じセマンティクスを共有していると仮定する。 したがって、正のペアから書き換えられたクエリを持つ拡張ペアも正のペアとして扱うことができます。 具体的には、yi = 1のクエリqiとコードciのペアが与えられたとき、qiをq'iに書き換えるには、ランダムに単語を削除する、 ランダムに2つの単語の位置を入れ替える、ランダムに単語をコピーする、という3つの方法のいずれかを用います。 セクション6.3で示されているように、位置を切り替えることが最も性能向上に役立ちます。 増幅された正例に対しては、IBAも適用します。 したがって、QRAを用いた例の損失関数は
ここで、L 0 bとL 0 ibは、qiをq 0 iに変更するだけで、式3と式5で求められます。
自然言語によるクエリでコードを検索することは、ソフトウェア開発者の生産性を向上させるのに役立ちます。 しかし、クエリとコードの意味的なマッチングを向上させるためには、より豊富な教師付きトレーニング・リソースが必要です。 この問題を解決するために、我々はCoSQAを導入した。 このhttpのURLには、自然言語のクエリとコードのペアに対する20,604個のラベルが含まれており、それぞれが少なくとも3人の人間のアノテーターによってアノテーションされている。 さらに、クエリとコードのマッチングを強化するために、CoCLRと呼ばれる対照的な学習手法を導入する。 この手法は、人工的に生成されたトレーニング・インスタンスをより多くもたらすデータ増強装置として機能する。 同じCodeBERTモデルを使用したCodeXGLUEで評価したところ、CoSQAのトレーニングによってコード質問応答の精度が5.1%向上し、CoCLRを組み込むことでさらに10.5%向上することが示されました。
http://dataset.it/ https://github.com/Jun-jie-Huang/CoCLR