コード生成のための文法ベースの構造化CNNデコーダー

コード生成のための文法ベースの構造化CNNデコーダー

まとめ

コード生成は、プログラム記述を実行可能なプログラミング言語のソース コードにマッピングします。既存の方法は主にリカレントニューラルネットワーク (RNN) エンコーダーに依存しています。ただし、プログラムには自然言語の文よりも多くのトークンが含まれているため、RNN がこのような長いシーケンスをキャプチャするのは適していない可能性があります。本論文では、コード生成のために文法ベースの構造化畳み込みニューラル ネットワーク (CNN) を提案します。私たちのモデルは、文法規則を予測することで手続き型プログラミング言語を生成します。ツリーベースの畳み込みや事前畳み込みを含む複数の CNN モジュールを設計し、その情報は専用のアクターアクティブプーリング層によってさらに集約されます。 Hearthstone ベンチマーク データセットでの実験結果では、当社の CNN コード ジェネレーターが従来の最先端の方法よりも 5 パーセント ポイント大幅に優れていることが示されています。また、いくつかのセマンティック解析タスクに関する追加の実験では、当社のモデルの堅牢性が実証されています。また、各モデルのコンポーネントをより深く理解するために、徹底的なアブレーション テストも実行します。

導入

自然言語記述からコードを生成することは、人工知能においては困難で挑戦的なタスクです。 var アプリケーション用。たとえば、プログラマーが Python で「ファイルを開く、F1」を実行したいが、それをプログラミング言語で実装する方法がわからない場合は、コード生成を通じてターゲット コード「f=open('F1', 'r')」を取得できます。ディープラーニングのブームにより、エンコーダーとデコーダーのフレームワークは、シーケンス生成方法の一般的な組み合わせになりました。特に、リカレント ニューラル ネットワーク (RNN) はエンコーダーやデコーダーとしてよく使用され、このようなアーキテクチャはシーケンスツーシーケンス (Seq2Seq) モデルとも呼ばれます。コード生成に適用すると、プログラム記述を入力配置シーケンスとして受け取り、必要なコードを出力シーケンスとして生成します。

ディープラーニングコミュニティでは、畳み込みニューラルネットワーク (CNN) の効率性とトレーニングの容易さから、デコーダーとして使用することに研究者の関心が高まっています。さらに、プログラムは自然言語の文よりも大きく、RNN は長期の短期記憶でも大きいことがわかります。対照的に、CNN はスライディング ウィンドウ領域を通じてさまざまな場所の特徴を効果的にキャプチャできます。

この目的のために、コード生成のための文法ベースの構造化 CNN を提案します。私たちのモデルは、以前のフレームワーク作業に従って、If→exprstmtstmt などの AST の文法からルールを構築します。子ノードの順序は予測ステップを通じて生成されるため、トークンごとの生成よりも多くの契約予測が可能になります。言い換えれば、私たちのモデルは、最終的に完全なプログラムを形成する文法規則のシーケンスを予測します。

私たちのアプローチでは、文法規則の予測は主に、生成されるプログラムを指定する以前に予測された文法規則の頻度と、生成された AST の部分という 3 種類の情報に基づいています。ここで、前者はエンコーダです。後者の 2 つにより、モデルはデコーダーに対して自己回帰的になり、通常どおり、デコーダーもエンコーダーに依存します。プログラム生成に適したCNNのアーキテクチャのために、いくつかの異なるコンポーネントを設計します。(1)まず、AST構造上のスライディングウィンドウを使用したツリーベースの畳み込みのアイデアを採用します。次に、ノード内のノードの部分的な AST をトラバースするための別の CNN モジュールを設計します。どちらの CNN も、シーケンス内だけでなくツリー内でも隣接情報構造をキャプチャします。 (2)「自己回帰」を強化するために、生成するノードの祖先インストールに追加のCNNモジュールを適用し、ネットワークが特定のステップで生成する場所を認識できるようにします。 (3)CNNと相互作用するためのさまざまなメカニズムを備えた集中プーリング集約ニューラルモジュールを設計します。特に、いくつかの慎重なプーリング レイヤーのようなトロールを使用して、コード生成中にスコープ名 (関数名やメソッド名など) を考慮することが有用であることがわかりました。

Python コード生成用の確立されたベンチマーク データセット Hearthstone で実験を実施しました。実験結果によると、CNN ベースのコード ジェネレーターのパフォーマンスは、従来の RNN 方式を大幅に上回っています。さらに、ターゲット プログラムが Hearthstone よりも短い Mantic 解析タスクでこのアプローチを評価します。このアプローチは、従来の最先端の方法と同等の結果も達成し、このアプローチの堅牢性を実証しています。私たちは広範囲にわたるアブレーションテストを実施し、文法ベースの構造化 CNN が単純な CNN よりも優れたパフォーマンスを発揮することを示しています。

モデル

図 2 はネットワークの全体構造を示しています。まず文法ベースのコード生成プロセスについて説明し、次に各モジュールを詳しく紹介します。

構文ベースのコード生成

プログラムの説明を入力として与えられた場合、私たちのタスクは、その説明に準拠した実行可能コードを生成することです。従来の Seq2Seq モデルでは、プログラムは、順番に生成されるトークン シーケンス x1、x2、···、xT として表すことができます。

あるいは、有効なプログラムは抽象構文木 (AST) を使用して表現することもできます。リーフノードは、x 端末、x1、x2、···、xT として表されるシンボルです。非リーフノードは非終端記号 n1、···、nN であり、それぞれがプログラムの抽象コンポーネント (If ブロックなど) を表します。さらに、親ノードpから派生した子ノードn1,···,nkは、いくつかの文法規則rを適用することによって取得され、p→n1···nkと表記されます。私たちの研究では、トレーニング セットを調べることによって、異なるリーフ ノードのユーザー定義変数が個別の文法規則として扱われます。深さ優先順にツリーをトラバースし、最初に遭遇した非終端記号に対して、それを拡張するためにどのルールを使用する必要があるかを予測します。言い換えれば、確率的プログラムの分解は

一般的なプログラミング言語には個別の AST ノードよりも多くの文法規則が含まれていますが、文法ベースの生成では、規則 p→c1···ck の単一の予測によって子ノード c1,···,ck が配置されるため、よりコンパクトになります。さらに、生成されたプログラムは構文的に正しいことが保証されます。このセクションの残りの部分では、文法規則を予測するための CNN エンコーダー/デコーダー モデルを紹介します。

CNNへの入力

モデルへの入力は、生成されるプログラムを指定する記述です。カードのコード生成 Hearthstone では、入力は図 4 に示すカードの名前、属性、説明を含む半構造化データです。意味解析などの他のタスクの場合、入力は自然量指定子文になることがあります。

正式には、抽出された特徴は計算できる。

ここで、W(enc,l)はエンコーダCNNの畳み込み重み、sはs=(k−1)/2で計算され、kはウィンドウサイズ(実験では2に設定)、l=1,···,LはCNNの深層層を表します。特に、y(enc,0)は入力埋め込みx(enc)です。 c(enc, l) = 偶数レイヤーの場合は 1、奇数レイヤーの場合は 0 となり、このレイヤーを接続する次のショートカットがあるかどうかを示します。最初と最後の単語にはゼロパディングを実行します。

ルールを予測するCNN

私たちは以前のすべてのルールを追跡し、この情報を抽出するためのディープニューラルネットワークを構築します。

r1、...、rn-1 を以前に予測されたルールとします。これらを実数値ベクトル r1,···,rn-1 として埋め込みます。埋め込みはランダムに初期化され、バックラーニングによって伝播できます。ショートカット接続を備えたディープCNNモジュールを適用して、r1、···、rn-1の注釈を定期的に埋め込み、特徴yを抽出します。

予測された文法規則は、生成された(部分的な)プログラムをコンパクトな方法で完全に指定するため、正確なコード生成に役立ちます。

ただし、手順の詳細/図によるビューは提供されないため、デコーダーには事前に指定された自己回帰ルールのみが提供されます。この問題を緩和するために、以下のようにデコーダー部分の AST を強化します。

部分的なASTのCNN

AST の構造的、文化的情報を取得するためのディープ CNN モジュールを設計します。ツリーベースの畳み込み層、プレパストラバーサル畳み込み層、および次の文法規則が適用される場所をネットワークに通知するツリーパス CNN サブモジュールが含まれています。

ツリーベースの CNN。まず、AST の一部にツリーベースの CNN を適用します。主な目的は、ツリー上をスライドして構造的特徴を抽出する、固定深度を持つローカル特徴検出器を設計することです。ツリーベースの CNN への入力は、次の内容を持つ部分的な AST です。生成後、各ノードは埋め込みによって表されます。次の文法規則を適用する場所を示すプレースホルダー ノードも配置します。

ノード n に親ノード p と祖先ノード g があるとします。すると、ツリーベースのCNNで抽出された特徴は次のように計算される。

ここで、W(ast)はツリーベースの畳み込みカーネル・ネルです。親や祖父母を持たないレイヤー内の最初の 2 つのノードに特別なトークンを入力します。

ツリーベースの畳み込み。より深いウィンドウがあるためですが、兄弟情報は考慮されません。これは、世代に基づく文法では一度にすべての兄弟姉妹を取得するという特定のルールに従っているため、兄弟姉妹はそれほど重要ではなく、先祖よりも率直だからです。残念ながら、扱いやすくなるにつれて深さは指数関数的に増大しますが、ツリーベースの CNN バリアントは線形に増大します。畳み込み計算に関しては、パーセプトロンと同様の相互作用を採用します。ディープツリーベースの畳み込みや ResNet などのショートカット接続は、今後の研究として検討される可能性があります。

CNN の事前順序トラバーサル。ツリーベースの CNN によって抽出されたベクトルのセットを取得し、事前入力 y(ast) を適用してトラバーサル畳み込みを実行します。つまり、AST ノードはトラバーサル前の順序になります。

単純な事前トラバーサルはツリー構造に逆変換できないことが示されます。つまり、異なるツリー構造で同じシーケンスが生成される場合があります。この問題に対処するために、事前順序トラバーサル中にバックトラッキングを追跡します。 T は AST 内のノード数であり、バックトラックによる先読みトラバーサルでは 2S 個の入力ユニットが生成されます。

ツリーベースの CNN とシーケンシャルトラバーサル CNN は異なる情報をキャプチャすることに注意してください。事前順序トラバーサルにより、AST ノード フード中に順次隣接ノードが生成され、ツリー ベースの畳み込みにより、構造的に隣接するノードの情報融合が実現します。たとえば、図 3 では、ノード n4 は n2 の子ノードです。ただし、生成後、プログラムの他の部分 (つまり、n3 と n6) では、ノード n2 と n4 は互いに近くありません。ツリーベースの畳み込みは、ノードとその祖先の特徴抽出器を直接構築し、それらの相互作用を実現します。したがって、これら 2 種類の CNN は互いに補完し合うと考えられます。

ツリーパスCNN。モデルが次の文法規則をどこに適用するかを判断するのが難しい上記の CNN のみを検討する必要があります。たとえば、ツリーベースの CNN と事前順序 CNN の場合、図 3 の n4 または n5 を展開すると、プレースホルダーはあるものの、非常によく似た特徴が生成されます。事前順序 CNN のプレースホルダーを導入します。技術的には、左端の導出に従えば、次のルールをどこに適用するかは明らかになります。しかし、そのような手がかりは暗黙的すぎるため、より明示的にモデル化する必要があります。したがって、ルートからノードへのパスを d の順序で抽出しました。たとえば、n4 を展開する場合、パスは n1、n2、n4 になります。これをツリーパス畳み込みと呼びます。

集約と注目のメカニズム

CNN は、入力と同じサイズまたは形状の特徴のセットを抽出します。コード生成のためのソフトマックス予測を容易にするために、入力サイズに関係なく、情報を 1 つまたはいくつかの固定サイズのベクトルに要約する必要があります。

従来、CNN とツリーベースの CNN には最大プーリングが使用されています。ただし、これにより、基盤となる CNN モジュールが分離され、情報集約プロセス中に通信できなくなります。そこで、CNN の注意メカニズム プールを組み込みます。本質的に、アテンション メカニズムは、候補となる特徴 (CNN によって抽出) の加重合計を計算します。ここで、重みは制御ベクトル (別の CNN モジュールの最大プーリング ベクトルなど) によって配置されます。正式には、制御ベクトル c と候補となる畳み込み特徴のセット y1,···,yD が CNN モジュールに渡されます (D は特徴ベクトルの数)。

このような慎重なプーリング層を基盤となる CNN に適用し、いくつかの重要な情報を制御重みベクトルとして扱います。 (1)入力記述はプログラム生成を指定し、それを用いて文法規則CNNとツリーパスCNNを制御する。特に、最大プーリング層を適用して、入力 CNN 機能を固定サイズの制御ベクトルに集約し、それを使用してアテンション ツリー パス CNN の重みを計算し、文法規則を予測します。 (2)スコープ名(関数名やメソッド名)は、その子孫についての有益な情報を提供することに注意してください。このような情報は AST ノード タイプではキャプチャされないため、スコープ名をベクトルとして埋め込み、それを使用して事前トラバーサル CNN と入力 CNN を制御します。現在のプログラム セグメントが 2 つ以上のスコープ (関数とメソッド) 内にある場合は、最も近いスコープのみがドラッグ ベクトルとして考慮されることに注意してください。コード スニペットがどの関数またはクラスにも属していない場合、スコープ埋め込みはゼロ ベクトルに設定されます。ツリーベースのレベルに加えて、CNN 機能を事前走査するために別の最大プーリング レイヤーが適用されます。私たちの経験では、これは制御範囲内での埋め込みによって、対応する AST ノードの注目度も最高ピークに達し、要約情報が不十分になるためであることがわかっています。制御ベクトルにもかかわらず、別の max-pooling-info レイヤーはさらに多くの情報を保持できます。

また、注意メカニズム設計の選択と、それが複数のモジュールを持つディープニューラルネットワークでの接続のドラッグに与える影響についても指摘します。たとえば、次の制御原則に従って、エンコーダー/デコーダー フレームワーク内の他のすべてのモジュールの入力として CNN を使用することを好みます。しかし、予備実験の結果、このような設計ではパフォーマンスが低下することがわかったため、現在のアーキテクチャを採用しました。

トレーニングと推論

すべての最大プーリング層と活性化プーリング層を連結します。これらは 2 つのパーセプトロン層に入力され、最後の層には次の文法規則を予測するためのソフトマックス活性化関数があります。

私たちのモデルは、地上手順をターゲットとすることです。私たちのモデル全体は異種かつ信頼性が高いため、すべてのパラメータは勾配ベースの更新を通じて学習されます。

推論を実行するには、入力を条件として確率を最大化する一連の文法規則を探します。再帰的に、ルール内のすべてのリーフ ノードがルールの密な予測の (部分的な) ツリーを終了する場合、それは終端記号です。私たちはビームサーチを使用してグローバル推論を近似し、実験ではビームサイズは 5 です。特定のノード タイプに対する無効なルールは推論中に考慮されません。たとえば、p1 が p2 と等しくない場合、p2→c1c2 はノード p1 に適用できません。

評価する

このセクションでは、CNN ベースのコード生成の実験結果を紹介します。私たちは、(1) Pythonでハースストーンのゲームコードを生成すること、(2) 実行可能な論理形式を生成するためのセマンティック解析という2つのタスクでアプローチを評価します。

実験 1: ハースストーンのコード生成

データセット。私たちの最初の実験は、Hearthstone と呼ばれるベンチマーク データセットの構築に基づいています。データセットには 665 種類の Hearthstone ゲームが含まれています。各データ ポイントの入力は、カード名、コスト、攻撃、説明、その他の属性などのセミフィールドの構造化された説明です。出力は、次の関数を実装する Python コード スニペットです。

索引。表 2 の Hearthstone 列には、関連するデータセットの統計がリストされています。索引。私たちは精度、BLEU スコアによって私たちの方法を評価しました。理想的には、精度は、残念ながらチューリング計算可能ではない、機能的に正しい分数プログラムの位置を考慮する必要があります。また、生成されたプログラムのいくつかは異なる変数名を使用していましたが、正しい機能を実装しており、関数呼び出しの引数名が指定されていたり指定されていなかったりすることもありました。参照手順とは異なりますが、手動検査の後では明らかに正しい手順であり、人間が調整した精度を表すために Acc を使用します。ここでは、非オブチェック アルゴリズムの不正な代替実装を実行しなかったので、Acc は依然として関数の精度の下限値となります。

生成されたコードの品質は、生成されたコードが実際のコードにどれだけ近いかを計算する補助的なメトリックとしての BLEU スコアによってさらに評価されます。

全体的な結果。表 3 は、CNN ベースのコード生成と、以前の最先端モデルと比較した最先端モデルを示しています。(1) 潜在予測ネットワーク (複数のトークン レベルの予測子を備えた拡張シーケンス間モデル)、(2) SEQ2TREE (AST ベースのシーケンス間モデル)、(3) 構文ニューラル モデル (AST 構造に基づく LSTM デコーダー)、(4) 抽象文法ネットワーク (水平方向と垂直方向に 2 つの LSTM 予測ルールを構築する別の AST ベースのシーケンス間モデル)。図に示すように、当社のモデルは精度と BLEU スコアの点でこれまでのすべての結果を上回っています。特に、弦楽器に関しては、当社の精度はこれまでの最先端技術を約 5 パーセントポイント大幅に上回っています。生成されたコード例。

正確さ。手動で調整された精度 (Acc+) については、シナリオで同様の現象が観察され、30.3% の Acc+ スコアを達成し、アプローチの有効性を実証したことを報告します。興味深いことに、いくつかの以前の方法では、私たちの方法と同様の BLEU スコアを達成できますが、精度ははるかに低くなります。たとえば、ASN モデルの BLEU スコアは 79.2 ですが、これは当社のモデルの 79.6 スコアに匹敵します。ただし、ASN は 22.7% の文字列精度しか達成できないのに対し、当社の精度は 27.3% です。これは、BLEU メトリックがプログラムの類似性のみを測定するためです。以前のアプローチ (ASN など) は、適切なコードを生成しているように見えましたが、いくつかの詳細が間違っていました。したがって、BLEU スコア (以前の研究) は二次的な指標としてのみ考慮します。主な指標である精度は、私たちのアプローチが以前のモデルよりも多くのコミュニケーション計画手順を生み出すことを示しています。

アブレーションテスト。当社では、各コンポーネントの寄与を分析するために、広範囲にわたるアブレーション テストを実施しています。私たちのネットワークの開発はシンプルなベースラインから始まり、徐々に便利なコンポーネントを追加していきましたが、相対的なテストは逆の方法で実行されました。つまり、完全なモデルから始めて、コンポーネントを削除するか、適切な代替品に置き換えました。アブレーション試験の結果を表4に示します。

まず、CNN コンポーネントを LSTM ベースの RNN に置き換えて、CNN の効果を分析します。主な情報は予測された文法規則ではなく、部分的な AST に表示される年齢にあるため、このコントロール実験では、プレパス CNN を LSTM に置き換えるだけです。このような長いシーケンスに RNN を適用すると、トレーニングが困難になり、パフォーマンスが大幅に低下する可能性があります。

また、CNN の予測ルール、ツリーベースの畳み込みの通常のレイヤー、ツリーパス畳み込み、プーリング レイヤー メカニズム、マージされた範囲コントローラーなど、モデルの他のコンポーネントも分析します。上記の各コンポーネントが独自の方法でモデル全体に​​貢献し、精度が 3~6% 向上していることがわかります。これらの結果は、コード生成のタスクに適したニューラル アーキテクチャの適切なコンポーネントを設計したことを示唆しています。

実験2

データセットと設定。セマンティック解析は、自然言語の記述に基づいて論理形式を生成することを目的としています。論理形式は実行可能であり、形式言語であるため、特定のドメインのコード生成と考えることができます。ただし、セマンティック解析のスタイルは Python コード生成とは大きく異なります。私たちのモデルは主に Hearthstone データセットに基づいて開発されたため、この実験はモデルの一般化の追加評価として機能します。

私たちは、自然言語の文章を入力とする 2 つの意味解析データセットでモデルを評価します。 ATIS の出力はラムダ計算形式ですが、JOBS の場合は Prolog スタイルです。表 2 の統計から、セマンティック解析の論理形式には、Hearthstone Python コードよりも少ないノードが含まれていることがわかります。

セマンティック解析には基本的に Hearthstone と同じネットワーク層を使用しました。ネットワーク層の数は 7 です。私たちのネットワークはこのような小さなデータセットに簡単に過剰適合してしまうため、異なるノード タイプを持つ別のネットワークを構築しませんでした。さらに、変数名を複製するためのポインター ネットワークを導入します。

結果。私たちはその方法を精度によって評価します。これまでのすべての研究と同様に、誤ったエラーを回避するために接続節と選言節の順序を調整する点を除いて、完全一致のスコアを計算します。 BLEU は既存の研究では使用されていないため、測定しませんでした。

表5はモデルのパフォーマンスを示しています。また、文法ベースの構造化 CNN エンコーダーは、最先端のニューラル ネットワーク LAL モデルと同様の結果を達成することもわかります。また、セマンティック解析に関しては、Hearthstone コード生成と同じことはできないことにも注意してください。これは、意味解析の論理形式が通常短く、Hearthstone のように 1/4~1/3 のトークンしか含まれていないため、RNN と CNN が論理形式の生成に適しているためと考えられます。この実験は、CNN コード モデルを主に長いプログラム (Hearthstone など) 用に作成したものですが、セマンティック解析でもうまく機能するため、一般化、パワー、柔軟性のさらなる証拠となります。

結論は

本稿では、コード生成のための文法ベースの構造化 CNN を提案します。私たちのモデルは、文法規則を指定して抽象プログラム構文ツリー (AST) を活用します。従来の RNN ベースの方法は、プログラム内のケン/ノードの数が多いため、グラム生成には適さない可能性があることに注意してください。そこで、AST 構造に基づいた CNN エンコーダー/デコーダー モデルを設計しました。 Hearthstone データセットでの主な実験では、以前の RNN ベースの方法よりも優れた結果が得られることがわかっています。 2 つの意味解析タスクに関する追加の実験により、私たちのアプローチの堅牢性が実証されました。また、モデル内の各コンポーネントの有効性を検証するために、深度アブレーション テストも実行しました。

謝辞

この記事は、南京大学ソフトウェア学院iSE研究所の2020年度修士課程学生である張静によって翻訳され、転載されました。

<<:  ファーウェイの鄭葉来氏:イノベーションと包括性、テクノロジーが産業インテリジェンスの向上を促進

>>:  JD.comのインテリジェントな顧客サービス、JD.comの11.11は再び「高い感情的知性」を実証

ブログ    
ブログ    

推薦する

...

第14次5カ年計画を見据えて、我が国のロボット産業はどこに向かっているのでしょうか?

ロボットは製造業の「至宝」とみなされています。近年、人口ボーナスの継続的な減少と自動化生産の需要の継...

インテリジェントビル通信ネットワークシステムのセキュリティ管理

セキュリティ管理は常にネットワーク管理の重要な部分であり、最も重要なリンクの 1 つです。また、ユー...

ガートナーの2020年人工知能技術ハイプサイクルを通して新たな変化を見る

ガートナーの最近の調査によると、企業の47%が流行の発生以来人工知能(AI)への投資を維持しており、...

研究のアイデアがない場合は、信頼できる機械学習のための革新的なアイデア1,000個をご紹介します。

I. はじめに1. まず話をしましょう約4〜5年前、私はカーネギーメロン大学(CMU)の博士課程の...

...

...

AIが農業用水効率の課題をどう解決するか

[[388190]] • 食糧需要が増加するにつれて、世界は水の使用を管理する必要があります。 • ...

清華大学の光電子コンピューティングにおける新たなブレークスルー:チップの性能が1万倍向上、研究がネイチャー誌でトップに

各種の大規模モデルやディープニューラルネットワークの登場により、人工知能の発展に対応し、高い計算能力...

将来展望: 2024 年の人工知能

生成型人工知能 (GenAI) ツールから AIOps の採用まで、AI の未来がどうなるかをご紹介...

...

...

機械学習翻訳の限界を説明する

機械学習による翻訳は人間のコミュニケーションに非常に有益ですが、限界もあります。機械学習は、企業に文...

AIを活用して大気汚染と戦う方法

大気汚染はほぼあらゆる場所で依然として問題となっており、地球温暖化、生物多様性の喪失、土壌劣化、淡水...

AIとコンテキスト脅威インテリジェンスが防衛戦略を変革

企業がサイバーセキュリティに対するプロアクティブなアプローチである脅威露出管理を導入するケースが増え...