【論文共有】深層学習とコード検索の出会い

ディープラーニングがコード検索と出会ったとき [ESEC/FSE 2019]

ホセ・カンブロネロMIT CSAIL USA
Honyu Li Facebook, Inc. 米国
SeohhyunKim Facebook,Inc. 米国
KoushikSenカリフォルニア大学バークレー校 EECS 部門 米国
SatishChandra Facebook,Inc. アメリカ合衆国

最近、自然言語コード検索にディープ ニューラル ネットワークを使用する提案が複数あります。これらの提案に共通するのは、コードと自然言語クエリを実際のベクトルに埋め込み、ベクトル距離を使用してコードとクエリ間の意味論的な相関関係を近似することです。これらの埋め込みを学習するには、コード例のコーパスのみに依存する教師なし手法や、ペアのコードと整列された自然言語記述のコーパスを使用する教師あり手法など、さまざまな方法があります。この監視の目的は、クエリおよび対応する必要なコード スニペットにより類似した埋め込みを生成することです。
明らかに、監督技術を使用するかどうか、どの方法を使用するか、監督にどのネットワークとトレーニングを使用するかについては選択肢があります。この記事では、まずこれらのオプションを体系的に評価します。この目的を達成するために、私たちは共通のプラットフォーム、トレーニングおよび減価評価コーパス上で最先端の実装をコンパイルします。ネットワークの複雑さにおける設計空間を探索するために、既存の教師なし手法を最小限の教師あり手法に拡張するための新しい設計ポイントも導入します。
私たちの評価では、1. 既存の教師なし手法に教師を追加するとパフォーマンスが向上しますが、必ずしも大幅に向上するとは限りません; 2. 単純な教師ありネットワークは、複雑なシーケンスベースのコード検索ネットワークよりも効果的です; 3. ドキュメントの教師あり docstring を使用するのが一般的ですが、ただし、ドキュメント文字列とクエリにより適した教師付きコーパスの有効性の間には、かなりのギャップがあります。

結論: コード検索タスクに対する教師あり学習、メソッド、ネットワークの影響を体系的に評価し、既存の教師なし手法を最小限の教師あり手法に拡張するための新しい設計ポイントを提案します。

序章

概要

図 2 は、ニューラル コード検索の概要とさまざまな手法の概要を示しており、この論文で詳しく説明します。ニューラル コード検索システムの中心的な抽象化は、共有ベクトル空間における入力のベクトル表現である埋め込みの概念です。これらの埋め込みに対してコサイン類似度などのベクトル類似度測定を計算することにより、検索ではユーザー クエリに意味的に関連するコード スニペットを取得できます。たとえば、図 2 では、「ハッシュマップをどのように探索すればよいですか?」というクエリが、1 つの可能な手法 (NCS) によってベクトルにマッピングされています。候補コード スニペットも、同じ手法を使用してベクトルにマッピングされます。
ここに画像の説明を挿入
候補コード スニペットは、ベクトルの類似性を使用してランク付けできます。ニューラル コード検索における重要な課題は、ベクトルの類似性が意味論的な関連性と一致する方法でこれらの埋め込みを学習する方法です。図 2 に示すように、これらの表現を学習するために使用されるモデルは、教師なしカテゴリと教師ありカテゴリに大まかに分類できます。ニューロテクノロジーの利点の探求では、以前に構築した効率的な教師なしニューラル コード検索手法である NCS から始めます [29]。NCS が有望な結果を示したので、追加の設計強化によってこのベースラインを改善できる可能性を実験したいと考えました。特に、最近の研究 [15, 20] では、それぞれ CODEnn と SCS と名付けられた有望な教師ありニューラル コード検索技術が提案されており、ソース コードとドキュメント文字列のコーパスを使用してコードと自然言語の埋め込みを学習することに成功しています。
この監視の目的は、ユーザーのクエリに対してより類似したベクトルを生成するマッピングと、それに対応する必要なコードを学習することです。図 2 では、この目標は実線の矢印で示されており、教師ありモデルを使用してマップされた場合に、クエリと正しいコード フラグメントの埋め込みがより近くに移動します。

選択できるテクノロジが非常に多い中、コード検索ソリューションを設計および展開しようとしている人は、どのように情報に基づいた選択を行うのでしょうか? たとえば、規制は良いアイデアのように聞こえますが、規制データを取得するオーバーヘッドと比較して、どの程度のメリットがあるでしょうか?どうでしょうか? より複雑なネットワーク (パラメータが多い) は、この論文で紹介する単純なネットワーク (図 2 の UNIF、後述) と比較して、どのくらいの価値をもたらしますか? docstring を使用したモデル監視は、次のような場合にパフォーマンスを制限する可能性がありますか?モデルは実際のユーザーのクエリに適用されますか? この研究では、これらのトレードオフを定量的に理解することを試みます。この目的を達成するために、上記のコード検索手法に基づいて実験を定式化します。

NCS: Facebook によって開発されたニューラル コード検索のための教師なし手法 [29]。コードのコーパスからの単語埋め込みのみを使用します。
CODEnn: ディープ ニューラル ネットワークを使用したコード検索に関する最近の論文 [15] の教師付き手法。複数のシーケンスツーシーケンス ベースのネットワークを使用し、他の最先端のコード検索手法よりも優れたパフォーマンスを発揮することが示されています。著者らによって提供された実装を使用します [16]。
SCS: 複数のシーケンス間ネットワークを使用した教師ありニューラル コード検索システム。私たちはブログ投稿 [20、21] で著者によって提供された実装を使用します。
UNIF: 私たちが独自に作成した、基盤となる NCS テクノロジーの監視付き拡張機能。UNIF は、単語シーケンス ベースのネットワークよりも大幅に複雑でない、バッグオブワード ベースのネットワークを使用します。この単純なモデルは、この論文の新たな貢献です。

ここに画像の説明を挿入

貢献

(1) これは、同じプラットフォーム上で実行され、同じコーパスを使用して評価された最近のニューラル コード検索システムを比較した最初の論文であると考えられます。
(2) 我々は、ニューラル コード検索システムのスペクトルにおける新しい設計ポイントを提案します。UNIF は、NCS の拡張であり、監視の追加は最小限であり、それ以外は何もありません。
(3) 私たちの発見は、UNIF がいくつかのより複雑なネットワーク設計 (CODEnn および SCS) および NCS (教師なし技術) よりも優れているということです。さらに、監視で使用されるアライメント コーパスの選択は非常に重要です。理想化されたトレーニング コーパスは、教師ありテクニックが優れたパフォーマンスを提供できることを示し、典型的なコードとドキュメント文字列アライメント コーパスでのトレーニングを強調しています。すぐに目に見えるパフォーマンスの違いはありません。

方法

NCS

NCS [29] では、ニューラル コード検索の一般的な概念にちなんで名付けられた特定の手法である埋め込み関数E c E_cEcE q E_qEqfastText[7] (word2vec[27] と同様) と、TF-IDF などの従来の情報検索技術のトークンレベルの埋め込みの組み合わせを使用して実装されます。したがって、この手法では従来のディープ ニューラル ネットワークや教師ありトレーニングは使用されません。NCS は、埋め込み行列t ∈ R ∣ V c ∣ × dt ∈ R^{|V_c| × d} を計算します。tRVc× d、ここで∣ V c ∣ |V_c|Vc∣ は、エンコードされたトークン語彙のサイズです。dddはラベル埋め込みに選択される次元です、TTてっき__k行目_kワードV c V_cVc埋め込まれたもの。
NCS は、次に示すように、同じ埋め込み行列をコード スニペットとクエリに適用します。c = { c 1 , … , cn } c = \{c_1, …, c_n\} とします。c={ c1c}q = { q 1 , … , qm } q = \{q_1, …, q_m\}q={ q1qメートル} は、コード スニペットとクエリをそれぞれトークンのマルチセットとして表します (つまり、順序は区別されません)。NCS は、埋め込みベクトルのバッグ{ T [ c 1 ] , … , T [ cn ] } \{T[c_1], …, T[c_n]\} を生成します{ T [ c1] T [ c]}はコードの断片です、{ T [ q 1 ] , … , T [ qm ] } \{T[q_1], …, T[q_m]\}{ T [ q1] T [ qメートル]} はクエリ、T [ w ] T[w]T[w] 是token w w 行列 T にwのベクトルを埋め込みます。コードトークン埋め込みパッケージを単一のコードベクトルec e_c
に結合するにはec, NCS は、対応する TF-IDF 重みによって重み付けされた一意のマーカー セットの埋め込みを合計します。TF-IDF の重みは、コード フラグメントで頻繁に発生するトークンの重みを増やし、すべてのコード コーパスにわたってグローバルに頻繁に発生するトークンの重みを減らすことを目的としています。

ここに画像の説明を挿入

UNIF: NCS の監視付き拡張機能

次に、NCS 技術の教師あり最小限の拡張である UNIF を紹介します。このモデルでは、教師あり学習を使用して、初期トークン埋め込み行列ttを変更します。t を生成し、それぞれコード トークンとクエリ トークンのT c T_cTc t q t_q tqまた、コードトークン埋め込みの TF-IDF 重み付けを、学習されたアテンションベースの重み付けスキームに置き換えます。この拡張されたアプローチを Unified Embedded (UNIF) と呼びます。
コードスニペットの整列されたコーパスとその自然言語記述がトレーニングに利用できることを前提としています。このコーパスを( c , q ) (c, q)と表します。( c q )、ここでcccはトークン パッケージc 1 , … , cn c_1, …, c_nc1cコードスニペットとqqからq は、対応する自然言語記述からのトークンのセットです。
関数E c E_cEcE q E_qEqの構造は次のとおりです。T q ∈ R ∣ V q ∣ × d T_q ∈ R^{| V_q | × d} とします。TqRVq× dおよびT c ∈ R ∣ V c ∣ × d T_c ∈ R^{|V_c| × d}TcRVc× d は、自然言語記述 (特に docstring とクエリ) の各単語とコード トークンを長さddにマッピングする 2 つの埋め込み行列です。dのベクトル。両方の行列は同じ初期重みTTTはトレーニング中に個別に初期化および変更されます。
コード フラグメントごとに、埋め込みベクトルのセット{ T c [ c 1 ] , . . . , T c [ cn ] } \{T_c[c_1],...,T_c[c_n]\} を取得します。{ Tc[ c1] ... Tc[ c]}、同様に、各説明qqqでは、クエリ トークンの埋め込みを単一のベクトルに組み合わせて単純な平均を計算します。NCS には単純な平均化も存在し、実験的にはそれが注意ベースの重みよりも優れていることがわかりました。
コード トークン ベクトルの各セットを、対応するエンティティのセマンティクスをキャプチャする単一のコード ベクトルに結合するには、アテンション メカニズムを使用して加重平均を計算します。注意の重みac ∈ R d a_c ∈ R^dあるcRdはddですd次元ベクトルはトレーニング中に学習されます。ac a_cあるcNCS の TF-IDF 重みと学習された同等の機能として機能します。

ここに画像の説明を挿入

ここに画像の説明を挿入

コード

UNIF と同様に、CODEnn [15] もニューラル ネットワークを使用してE c E_cをペアリングします。EcE q E_qEqモデリングが実行され、教師あり学習が採用されますが、使用されるネットワークはより複雑で深いものになります。私たちはオリジナルの作成者の命名法にこだわり、このモデルを CODEnn (Code description Embedded Neural Network の略) と呼びます。コード スニペットをトークンのバッグとして扱う代わりに、CODEnn は、コード スニペットを含むメソッドの名前、コード スニペット内の API 呼び出しのシーケンス、およびコード スニペット内のトークンのバッグから単語シーケンスを抽出します。メソッド名から単語シーケンスを抽出するには、メソッド名をキャメルケースとスネークケースに分割します。
メソッド名シーケンスと API シーケンスは、2 つの独立した双方向長期短期メモリ (bi-LSTM) ネットワークへの入力として機能します。メソッド名と API シーケンスに 2 つの独立した LSTM を適用した後、CODEnn は 2 つの隠れ状態シーケンスを取得します。CODEnn は、このような隠れ状態の各シーケンスを合計して、単一のベクトルを取得します。要約すると、CODEnn は最大プーリング関数を使用します。
コードラベル付きバッグ内の各トークンは、フィードフォワード高密度ニューラル ネットワークへの入力として個別に供給され、出力ベクトルは最大プールされます。最終的なコードの埋め込みは、これら 3 つのベクトル (LSTM からの 2 つとフィードフォワード ネットワークからの 1 つ) を連結し、要約ベクトルなどを生成する高密度ニューラル ネットワークに供給することによって行われます。
CODEnn は、双方向 LSTM を使用して関数E q E_qを実装します。Eq、ドキュメント文字列内で見つかったコード フラグメントの一連の記述を入力として受け取り、E q E_qを生成します。Eq図 5 は、アーキテクチャの概要を示しています。

SCS

GitHub のデータ サイエンス チームによって記述および実装された、コード検索用の別の教師ありシーケンスベースのディープ ニューラル ネットワークを紹介します [20]。私たちはこのモデルを SCS (Semantic Code Search の略) と呼びます。LSTM ネットワーク [26] は、トレーニング コーパス内の docstring の言語モデル [32] を学習します。このモデルを使用して、自然言語を埋め込み、自然言語入力が与えられた確率を計算できます。
最後のモジュールは、コード トークンのシーケンスが与えられた場合にクエリの埋め込みを予測するための変換 (フィードフォワード層の形式で) を学習します。この変換を学習するために、モジュールは docstring モデルのコードからエンコーダーへの部分を取得し、そのレイヤーをフリーズし、コード シーケンス入力と、言語モデルを使用して生成された対応するクエリ埋め込みでネットワークをトレーニングします。最後のトレーニング段階では、エンコーダー層を数エポックの間フリーズ解除することでネットワーク全体を微調整します。SCS は、コードからドキュメント文字列へのモデルのこの微調整されたエンコーダー部分をE c E_cとして使用します。Ec、言語モデルをE q E_qとして使用します。Eq図 6 は、アーキテクチャの概要を示しています。

ここに画像の説明を挿入

表 1 に学習E c E_cを示します。EcE q E_qEq監視を使用するモデルのネットワーク詳細の概要: UNIF、CODEnn、SCS。

ここに画像の説明を挿入

実験

私たちの評価では、さまざまなデータセットとベンチマークを使用します。わかりやすくするために、次の用語を使用します。
ここに画像の説明を挿入

トレーニングコーパス

coden-java-train は、[15] の著者によって公開されたデータセットです。このコーパスは、約 1,600 万の前処理された Java メソッドと、それに対応するトレーニング用の docstring で構成されています。このデータセットには、メソッド名のシーケンス、API のシーケンス、メソッド本体トークンのセット、および docstring のシーケンスの 4 種類の入力が含まれています。さらに、メソッド名のシーケンスを API シーケンスに連結し、この連結されたシーケンスをトークンのバッグとして扱うことによって、別の入力を取得します。この派生入力は、関節力と SCS をトレーニングするために使用されます。
GitHub-Android-train は、約 26,109 の GitHub リポジトリから Android タグを収集して構築された Android 固有のコーパスです。すべてのメソッドを docstring (合計約 787,000) で取得し、これらのメソッドをトレーニング データとして使用しました。
StackOverflow-Android-Train は、StackOverflow の質問タイトルとコード スニペットの回答を収集して構築された Android 固有のトレーニング コーパスです。このデータセットは、Stack Exchange で公開されているデータ ダンプから Android でタグ付けされたすべての Stack Overflow 投稿を抽出することによって準備しました [31]。

コーパスの検索

CODEnn-Java-search: CODEnn の作成者によって公開された 400 万の固有の Java メソッド。
GitHub-Android-search: GitHub から収集された 550 万の一意の Android メソッド。このコーパスは、GitHub-Android-Train の構築に使用されたのと同じ 26,109 リポジトリから派生していますが、利用可能な docstring を持たないメソッドも含まれています。

ベンチマーククエリ

Java-50 は、元の論文から CODEnn を評価するために使用される 50 個のクエリのセットです。これらのクエリは、Stack Overflow によって投票された Java プログラミングの質問の上位 50 件に対応しています。作成者には、Java で「具体的な回答」がある質問、コードを含むスレッドで承認された回答のある質問が含まれており、重複した質問ではありません。このベンチマークで評価すると、モデルは coden-java-train でトレーニングされます。
Android-287 は、元の論文から NCS を評価するために使用される 287 個の Android 固有のクエリのセットです。質問は、次の基準に基づいてスクリプトによって選択されます: (1) 質問のタイトルにタグ「Android」および「Java」が含まれている; (2) 賛成票を投じた回答がある; (3) 一致するものが少なくとも 1 つあるGitHub Android リポジトリのコーパス の実際のコード スニペット。このベンチマークで評価する場合、特に明記されていない限り、モデルは GitHub-Android-Train でトレーニングされます。

Q1

効率的な教師なしコード検索手法を拡張すると、ペアになったコードと自然言語のコーパスに対する監視に基づいてパフォーマンスが向上しますか?
セクション 3.2 で説明したように、UNIF はトレーニング中に埋め込みを変更するための監視を追加する NCS の拡張であり、使用される TF-IDF の重みを置き換えます。コードトークンの埋め込みと学習された注意を組み合わせる。表 3 は、UNIF が Java-50 のより多くの質問に答えていることを示しています。UNIF は Android-287 のトップ 10 の回答の数を改善しますが、トップ 1 の回答のパフォーマンスはわずかに低下します。教師なし手法である NCS を教師付きで拡張すると、コード検索のパフォーマンスが向上しますが、データセットでは一貫性が向上しないと結論付けています。

ここに画像の説明を挿入

RQ2

より複雑なネットワークは教師ありニューラル コード検索のパフォーマンスを向上させますか?
可能な教師あり手法を選択するとき、ニューラル コード 研究システムの設計者は、CODEnn や SCS などのより複雑なアーキテクチャを組み込むことを選択することも、UNIF で使用されているようなより単純なアーキテクチャであるスキーマを優先することもできます。これに対処するために、さまざまな手法で回答されるクエリの数とその計算コストを考慮します。
まず、正しく応答されたクエリの数の観点からモデルのパフォーマンスを比較します。表 4 は、単純なバッグオブワード手法を使用した UNIF が、両方のベンチマーク クエリ セットで CODEnn および SCS よりも優れていることを示しています。どちらの場合も、CODEnn は SCS よりも優れています。

ここに画像の説明を挿入

表 5 は、各列の UNIF に対する推論時間の比率を示しているため、1.0 を超える値は、その列の推論が遅いことを示します。CODEnn や SCS などのシーケンスベースのネットワークでは、コードや自然言語入力を埋め込むのに時間がかかります。すべてのシステムはオフラインでコード スニペットを埋め込むことができ、リアルタイムでクエリを埋め込むのに必要な時間は比較的短いことに注意してください。ただし、単純な UNIF からより複雑なネットワーク (CODEnn および SCS) へのコードとクエリの埋め込みに必要な時間の相対的な増加は、これらのネットワークで実行される計算量の増加を浮き彫りにします。

ここに画像の説明を挿入

RQ3

トレーニング コーパスの自然言語コンポーネントとしての docstring に基づく監視はどの程度効果的ですか?
これまでに紹介した監視手法は、トレーニング中に同じ自然言語、つまり docstring を使用します。docstring はユーザー クエリのプロキシとして使用され、ニューラル コード検索の実践者がトレーニング用に大規模なアライメント データセットを収集できるようにします。ただし、GitHub-Android-Train でトレーニングした場合、予想に反して検索パフォーマンスが必ずしも向上するとは限りません。
表 6 は、StackOverflow-Android-Train でトレーニングすると、すべての教師ありテクニックが大幅に向上することを示しています (1 つの例外を除き、SCS を使用して回答されたクエリが上位 1 に入っています)。これは、ユーザーのクエリによりよく一致する自然言語コンポーネントを含む理想的なトレーニング コーパスへのアクセスが許可されている場合、教師あり技術が提供できる優れた検索パフォーマンスを強調しています。

ここに画像の説明を挿入

要約する

参考文献

[7] ピョートル・ボジャノフスキー、エドゥアール・グレイヴ、アルマン・ジュラン、トーマス・ミコロフ。サブワード情報を使用して単語ベクトルを強化します。Transactions of the Association for Computational Linguistics、5:135–146、2017。
[15] Xiaodong Gu、Hongyu Zhang、および Sunghun Kim。ディープコード検索。第 40 回ソフトウェアエンジニアリング国際会議議事録、933 ~ 944 ページ。ACM、2018年。
[16] Xiaodong Gu、Hongyu Zhang、Sunghun Kim。ディープ コード検索 github リポジトリ、2018 年。URL: https://github.com/guxd/deep-codesearch/#54130b6be41fc5d73c4ebb8422942a7b53ad4024
[20] Hamel Husain と Ho-Hsiang Wu。深層学習を使用して任意のオブジェクトの自然言語セマンティック検索を作成する方法、2018 年。URL:https://towardsdatascience.com/semantic-code-search-3cd6d244a39c。
[21] ハメル・フサインとホーシャン・ウー。自然言語セマンティック コード検索に向けて、2018 年。URL: https://githubengineering.com/towards-natural- languagesemantic-code-search/。
[26] スティーブン・メリティ、ニティッシュ・シリッシュ・ケスカー、リチャード・ソーチャー。LSTM 言語モデルの正規化と最適化。arXiv プレプリント arXiv:1708.02182、2017。
[27] Tomas Mikolov、Ilya Sutskever、Kai Chen、Greg S Corrado、および Jeff Dean。単語やフレーズの分散表現とその構成性。神経情報処理システムの進歩、3111 ~ 3119 ページ、2013 年。
[29] サクシャム・サクデフ、ホンユ・リー、シーフェイ・ルアン、ソヒョン・キム、コーシク・セン、サティシュ・チャンドラ。ソースコードの検索: ニューラルコード検索。機械学習とプログラミング言語に関する第 2 回 ACM SIGPLAN 国際ワークショップの議事録、31 ~ 41 ページ。ACM、2018 年。
[31] Inc. スタック交換。datastack Exchange データ ダンプ、2018 年。URL: https://archive.org/details/stackexchange。
[32] イリヤ・サツケヴァー、オリオール・ヴィニャルズ、クオック・V・ル。ニューラル ネットワークを使用したシーケンス間学習。神経情報処理システムの進歩、3104 ~ 3112 ページ、2014 年。

おすすめ

転載: blog.csdn.net/qq_33976344/article/details/130834883