自動コード生成: 文献を読んで学習する「ソース コード生成のための深層学習モデル」

自動コード生成: 文献の読み取りと学習
文献名: 「ソース コード生成のためのディープ ラーニング モデル」
著者: Raymond Tiwang、Timothy Oladunni、Weifeng Xu

PS: ブロガーはこの分野に触れたばかりで、多くの内容がまだ不明瞭です。ブログ投稿の内容が間違っている場合は、批判して修正してください~


要約: N グラムなどのモデルに触発され、抽象構文ツリー (AST) を介してソース コードを分析するためのモデルが開発されています。このモデルは、深層学習ベースの長期短期記憶 (LSTM) および多層パーセプトロン (MLP) アーキテクチャに基づいて構築されています。評価を通じて、Python 言語に基づいてソース コードのトークン シーケンス (トークン) を効果的に予測できます。

1.はじめに

このモデルでは、データ セットの再現性を向上させるために 2 つの方法を使用します: 1) ソース コードから抽象構文ツリー AST を生成する; 2) ダンプ ファイルを使用する (このファイルは AST の事前順序走査です)。次に、LSTM と MLP を使用してモデルをトレーニングします。

2.関連作品

2.1 文献レビュー

私にとってより有益な情報:
1) Roos[7] は、API コードを迅速かつ正確に完成させるための N-gram 言語モデル手法を提案しました。同氏によると、このモデルはリアルタイムで動作し、コード補完の作業を数秒で完了できるという。

2) Li et. al. [13] は、コード補完を研究するためにニューラル アテンションとパイオニア ネットワークを使用しました。彼らは、プログラムの抽象構文ツリー上の構造化情報を利用できるアテンション メカニズムを開発しました。

3) Pinzberg et al. [14] は、コード生成タスクを完了するために共通の LSTM モデルを実装しました。

2.2 確率としての文

文が出現する確率を計算するにはどうすればよいですか?
文 S = 「車は速く走る」 と仮定します。単語 s1 ~ s4 は、それぞれ「the」、「car」、「runs」、「fast」です。この記事は次のように導出されます (P は確率を意味します)。
ここに画像の説明を挿入

連鎖則によれば、上記の式は次のように変形できます。
ここに画像の説明を挿入

たった今:
ここに画像の説明を挿入

ただし、式4の右半分と同様、計算が難しすぎます。したがって、マルコフ仮定に従ってこの式を単純化します。以下の部分に簡略化されます。

ここに画像の説明を挿入

3. 理論的背景

この研究は本質的に複数のカテゴリの研究であり、カテゴリの数は語彙内のさまざまなトークンの数です。この分類子は、一連の判別関数 gi(x) で表されます。このうち、i はカテゴリ、x は特徴ベクトル、gi(x) は特徴ベクトル x のあるクラス i への割り当てを表します。(ここがよく分かりません)

使用される損失関数: 使用されるカテゴリカルクロスエントロピー
活性化関数: シグモイド/ソフトマックス

4. 方法論

4.1 自然言語処理アプローチ

まず、単純な LSTM ネットワークを使用してトレーニングし、テストします。
データセット ソース: 1274 個の Python ソース コードを含む github リポジトリ。

前処理段階: ソース コードを含む個々のファイルが 1 つの大きなファイルに結合されます。データをクリーンアップし (スペースや意味のない文字を削除)、データをトークン化して固定長のシーケンスに編成します (データセットをトークン化して
固定長のシーケンスに編成します)。これらのシーケンスは、モデルの埋め込み層に供給されます。

トレーニングとテスト: 15 エポックがトレーニングされ、精度は 53.43%、損失は 3.0.82 でした。30 エポックのトレーニング、精度は 53.36%、損失は 3.3532 です。

結論: コードの次のトークンを予測するこの方法の精度は非常に低く、従来の NLP 方法がソース コードのパターン認識や知識発見において適用範囲が限られていることを示しています。

4.2 提案されたアプローチ

上記の方法の欠点を考慮して、抽象構文ツリー AST が適用されます。
データセット: 4.1 のデータセットと同じ。

データの前処理: 抽象構文ツリーを使用してデータセットを前処理します。この前処理されたデータは、語彙内のすべてのトークンの参照辞書を定義するためにロードされ、各行が 1 つのトークンであるリストに保存されます。モデルは入力として整数値のみを受け入れるため、作成者はカスタム エンコーダーを使用してトークンをエンコードします。最後に、sklearn を使用して入出力比率に分割します。

4.3 実験計画

トレーニング データ セットをサイズ n のウィンドウに分割します。各ウィンドウには n 個のトークンが含まれます。最初の n-1 個のトークンが入力として使用され、n 番目のトークンが出力として使用されます。

実験計画は主に、データ処理段階、データ構造段階、トレーニングおよびテスト段階の 3 つの段階で構成されます。
データ処理フェーズ: ソースコード (データ) がモデルにロードされます。効率を高めるために、ロードされたファイルは大きな Python オブジェクト f に転送されます。AST は固有のファイル f から生成されます。
データ構造化フェーズ: テキストをトークンに編成し、一意のトークンごとに辞書を作成します。
トレーニングとテストのフェーズ: テキストをトレーニング データとテスト データに分割し、モデルにフィードします。

データ構造の段階がよくわかりません。論文によると、データ構造のいくつかのステップがあります: ①
トークンシーケンスを
エンコードする ②処理されたデータをロード
する ③すべての一意のトークンの参照辞書を定義する
④ファイルをトークンのシーケンスに整理してファイルを変換するトークン列の場合
⑤各行を個別のトークンに分割
ここに画像の説明を挿入

4.4 AST処理

AST で処理されたソース コードでは、ツリーの各ノードは、関係するキーワードや操作の種類に応じて、事前に決定された構造を持ちます。たとえば、リーフ ノードは通常、関数名、オブジェクト名、またはパラメーター名です。各リーフ ノードは、識別子 (id) とコンテキスト (ctx) によって識別されます。
id には文字列変数、数値リテラル、またはネイティブ関数を指定できます。ctx は実行されるタスクを名前で示します。ctx の可能な値は、Load、Store、Del などです。
ノードの構造が固定されているため、4.1 の方法よりも AST を使用した方が予測が容易です。プレーン テキスト ソース コードの代わりに AST ツリーを使用してプログラムを表現すると、プログラムの構造を簡単に予測できるため、次のトークン生成の精度が向上します。

4.4.1 RNN-LSTM 学習

以前の整数でエンコードされたトークンは、keras モデルの埋め込み層に供給されます。次に、埋め込まれた出力シーケンスが LSTM 層に供給されます。

4.4.2 MLP 学習

MLP でトレーニングを継続する

5. 結果

ここに画像の説明を挿入

図 9 に示すように、LSTM モデルの精度は 90.32%、損失は 0.3505 です。
データのトレーニングに AST ダンプを使用することに加えて、著者は正則化も使用します。L2 正則化 0.1 を使用してモデルを実行すると、過剰適合をある程度防ぐことができます。

ここに画像の説明を挿入

図 10 に示すように、正解率は 90.11%、損失は 0.314 です。

6. モデルの性能

このモデルと他のモデルの比較。
ここに画像の説明を挿入

7. 結論

主な貢献:
1. ASTLSTM/MLP コード補完モデルの設計、開発、評価。
2. トークン化された 1274 Python ソース コード。
3. NLP および Pointer Mixture Network 手法と比較して、それぞれ 69.5% および 29% 増加しました。
4. LSTM と MLP の正解率は、それぞれ 90.3% と 90.1% です。

この研究の意義は次のとおりです。
1. 従来の自然言語処理手法は、ソース コードのパターン認識や知識発見において適用範囲が限られています。
2. LSTM および MLP 学習アルゴリズムは、高いコード補完または生成精度を備えています。
3. AST-LSTM は、Python コードの補完または生成のための効果的なメカニズムです。MLP と LSTM はどちらも 90% を超える精度を持っていますが、MLP アルゴリズムよりも学習がはるかに速いため、コード補完タスクでは LSTM の方が MLP よりも優れています。

要約する

この投稿では Python コード生成を実装します。データの前処理段階では、抽象構文ツリー AST を導入してソース コードを解析し、LSTM と MLP の 2 つの手法を使用してトレーニングします。このモデルは、ソース コードのトークン シーケンス (トークン) を効果的に予測し、最終的に astunparse モジュールまたは astor を使用して、AST を 1 対 1 の通信でソース コードに変換します。

疑い

  1. 実験計画のデータ構造部分はよく理解されていません。記事内の紹介文も非常に曖昧な気がします。この部分は具体的に何をするのですか? データの前処理からトレーニングとテストに直接移行できないのはなぜでしょうか?
  2. ASTについてはまだよくわかりません。プログラムはどのようにしてコードから抽象構文ツリーに変換されるのでしょうか? AST でプリオーダー トラバーサルを実行するにはどうすればよいですか? (つまり、記事内の図 5 と図 6 はどのようにして生成されるのでしょうか?)
  3. では、この記事ではコードの拡張と生成しか実現できないのでしょうか?記述からコードまでの機能は無いのですか?(例: copilot のように、コメントを書くと、タブを入力した後に推奨コードを作成できます)

おすすめ

転載: blog.csdn.net/rellvera/article/details/129838485