e4exp / paper_manager_abstract

0 stars 0 forks source link

GANCoder: An Automatic Natural Language-to-Programming Language Translation Approach based on GAN #517

Open e4exp opened 3 years ago

e4exp commented 3 years ago

本研究では,Generative Adversarial Networks (GAN)に基づく自動プログラミング手法であるGANCoderを提案する. GANは,与えられた自然言語の発話を条件として,同一の機能的かつ論理的なプログラミング言語コードを生成することができる. 生成器と識別器の間で敵対的な学習を行うことで、生成器がデータセットの分布を学習し、コード生成の品質を向上させることができます。 実験の結果、GANCoderは最先端の手法と同等の精度を達成し、プログラミング言語に対してより安定していることがわかった。

e4exp commented 3 years ago

1 はじめに

深層学習や自然言語処理(NLP)の発展に伴い,翻訳タスクや翻訳技術は大幅に向上しています。 言語を超えたコミュニケーションの問題は、十分に解決されています。 このデジタル時代において、私たちはもはや情報の受動的な受信者ではなく、データの生産者であり分析者でもあります。 私たちには、データ管理、問い合わせ、分析のスキルが必要です。 特にプログラミングは、AIの時代には必須のスキルです。 しかし、プログラミング言語を学び、データを効率的に処理するためのコードを書くには、強い専門知識と実務経験が必要です。 SQLやPythonなどのプログラミング言語は比較的簡単ですが、教育や職業上の制限から、多くの人にとって習得が難しいのが現状です。 プログラミング言語を学ぶ際のアクセス閾値を下げ、コーディングを容易にする方法は研究に値する。 本稿では、自然言語の発話からプログラミングコードを自動生成する方法を探る。 経験の浅いユーザは,実装したい内容を自然言語で記述するだけで,同じ機能を持つプログラミングコードがジェネレータ[1]を介して生成されるので,データベース管理,プログラミング,データ処理などの複雑な作業を簡単に行うことができる. 自動プログラミングは、人工知能の分野では難しい課題です。 また、強い人工知能の重要な象徴でもあります。

多くの研究者が、自然言語の発話をプログラムコードに変換する方法を長い間研究してきました。 深層学習が適用される前は、パターンマッチングが最も一般的な方法でした。 しかし、人工的なデザインテンプレートを大量に必要とすることや、自然言語表現の多様性とファジーさのために、マッチングベースの手法は柔軟性に欠け、ニーズに応えることが難しい。 また、機械翻訳の発展に伴い、統計的機械学習を用いて自動プログラミングの問題を解決しようとする研究者もいますが、2つの言語モデルの違いにより、満足のいく結果は得られていません。

近年では、データ生成の問題に対処するために、GANが提案されています。 GANの識別器と生成器の間でゲーム学習を行うことで、生成器はデータ分布をよりよく学習することができる。 本論文では、自然言語とプログラミング言語の間の翻訳を実現するGANベースのエンコーダ・デコーダフレームワークである自動プログラム生成器GANCoderを提案する。 学習段階では,自動プログラミング生成器の精度を向上させるためにGANを採用している[2]. このモデルの主な貢献は以下のようにまとめられる。

(1) 自動プログラミングタスクにGANを導入することで,GANのGeneratorとDiscriminatorの間の拮抗したゲームは,Generatorにデータのより良い分布特性を学習させることができる. (2) EncoderDecoderフレームワークを用いて,2つの言語間のエンド・ツー・エンド変換を実現する. (3) プログラムコードを生成する際にプログラミング言語の文法情報を使用することで,デコーディングのための事前知識とテンプレートを提供し,自然言語モデルとプログラミング言語モデルの間の不整合の問題を解決する. その結果、GANCoderは最先端の手法と同等の精度を達成し、異なるプログラミング言語を扱う際にも安定していることがわかった。

e4exp commented 3 years ago

image

3 モデル

3.1 GAN を用いた意味解析

自然言語の発話 X = {x1, x2, - - , xn} に基づいて,プログラムコード列 Y = {y1, y2, - - , ym} を生成できる自動プログラミングモデルを設計することを目的とする. 本研究では,GANをEncoder-Decoderの枠組みに導入し,図3に示すような新しいモデルGANCoderを提案する. GANCoderでは,生成器Gθは,自然言語の発話をプログラムコードに変換するエンコーダ-デコーダフレームワークを使用している. エンコーダーは、自然言語の発話を中間的な意味ベクトルとしてエンコードし、デコーダーは、プログラミング言語の文法情報を手がかりに、意味ベクトルをASTにデコードする。 最後に、ASTを解析してプログラムコードに変換する。 判別器は、生成器が生成したASTが自然言語の発話の意味と一致しているかどうかを判断する役割を担っている。 生成モデルGθを改良するためにGANを用いるが,GANネットワークの最適化式は次のようになる[13].

image image

ここで、Y<t = y1, y2, - - , yt-1 は、プログラム断片の最初のt - 1文字のシーケンスを表し、GrammarCF Gは、コード生成プロセスのガイダンスとなるプログラミング言語のCFG(Context-Free Grammars)を表します。 X ∼ px は、データサンプルXが実データの分布に従うことを示し、Y ∼ Gθ は、ジェネレータがデータサンプルYを生成することを示します。 GeneratorとDiscriminatorは二者択一のminimax gameを行います。 Discriminatorは、2つの分布を区別することができます。 実際には、NLPにおいて離散的なデータを生成する場合、式1は生成器に十分な勾配を与えないかもしれない。 SeqGANで提案された戦略勾配の最適化戦略にヒントを得て、自動プログラミングタスクの特性と組み合わせて、GANCoderを以下のように最適化する。

image

ここで、R(Y1:t)は生成者報酬関数を表し、生成されたプログラム断片の品質を定量化しています。 言い換えれば、自然言語の発話と生成されたプログラム断片との間の意味的な確率を表している。

image

3.2 CFGベースのGANジェネレータ

GANジェネレータの主なタスクは、自然言語の発話のセマンティクスをエンコードし、プログラミング言語のCFGに基づいて、セマンティクスをASTにデコードすることである。 ある言語から別の言語への変換は、異なる言語間の相互作用を減らすために、Encoder-Decoderモデルを使用する。 両端はそれぞれ独立してデータの処理に責任を持ち、問題の複雑さを単純化しています。 このエンド・ツー・エンドの学習フレームワークはより一般的であり、両エンドはデータの特性に応じて独自の深層学習モデルを選択することができる。 図4にGeneratorのフレームワーク図を示す。

エンコーダーは、図4に示すように、自然言語の発話のセマンティクスを符号化する役割を担っています。←-ht ,と-→htはそれぞれ自然言語記述列のt番目のユニットの隠れた状態を左から右へ、右から左へ表します。 ht = [←-ht : -→ht ].を文字の中間隠れベクトルとします。 最後の文字の中間ベクトルは、自然な発話全体の意味的な表現である。

image

デコーダは,エンコーダが生成した中間意味ベクトルを復号する. ここでは、[10]で提案されたモデルにヒントを得て、まず、プログラミング言語のCFGに基づいて、中間意味ベクトルを抽象構文木にデコードする。 CFGとASTの特性に応じて、図2(右)の抽象構文木において、非リーフノードとリーフノードの生成に対応する2種類のアクションを定義します。 論理的には、LSTMを用いて、図2(右)のように、ASTを上から下、左から右へと再帰的に構築します。 そして、この課題を、文法的な動作シーケンスの予測に変換します。 CFGに基づいて、デコード処理のためのテンプレートを生成するだけでなく、予測範囲を制約することで、探索空間を小さくして計算効率を向上させることができます。 デコーダはエンコーダと異なり、通常のLSTMを用いて状態変数を保持し、ASTを形成する。

image

ここで,「[:]」は複数のベクトル間の連結操作を表し,stはデコーダの時刻tにおける状態ベクトルを表し,異なる文法的アクションの確率は,Sof tmax(st)関数を用いて計算することができる. at-1は直前のアクションのベクトルを表し,ctは入力hX = {hx1, hx2, - - , hx|X|}に基づく状態を表す. 注目度の計算には、図4に示すようなソフトアテンションの仕組みを用いる。 そして、デコーダは時刻tの状態によって各アクションの確率を予測する。 予測されたアクション中にキャラクターが発生した場合には、PointNetを用いて自然言語記述からASTにキャラクターをコピーする[11]。 ASTを構築する過程では、Beam Searchアルゴリズムを用いて、オーバーフィッティングを回避する。 図2(右)に示すように、tiはデコードのステップを表しています。 また,図2(右)には,ノードの生成順序が明示されている.

3.3 ツリーベースの意味的GAN判別器

Generatorはプログラム断片のASTを生成することができ、判別器は生成されたASTと自然言語の発話との意味的関係の類似性を定量化する。 異なる2つの言語間の意味的類似性をどのように定量化するかは非常に難しい。 識別器では、自然言語の発話の符号化は、生成器での符号化方式をそのまま使用しており、双方向LSTMを用いて配列全体を中間的な意味ベクトルに符号化している。 プログラムの意味を符号化する場合、2つの異なる方法があります。 1つ目は、プログラムコード列を文字列として扱い、なおかつ、ジェネレータが双方向LSTMで処理するのと同じ方法です。 処理は簡単ですが、プログラムの論理や構文の情報を取り込むことはできません。 2つ目の方法は、ジェネレータが生成したASTの構造を利用して、プログラムのセマンティクスを符号化する方法です。 しかし,符号化プログラムの意味論は,ASTの生成とは多少異なる.ジェネレーターでは、ASTの構造をトップダウンで左回りに再帰的に生成するが、ディスクリミネーターでは、ASTのリーフノードからルートノードまで、AST全体をボトムアップで符号化し、最終的なベクトルをプログラム断片の意味ベクトルとして使用する。 このようにして、プログラムフラグメントの構文と論理をボトムアップで学習することができる[13,14]。 ここで,抽象構文木全体の最終的な符号化ベクトルをhrとする. すると、自然言語記述のhrと意味ベクトルhNLは次の2つに分類される。

image

ここで,Psim∈[0, 1]は,ASTが自然言語記述の意味論と一致する確率を表す. ASTはプログラミング言語のCFGに基づいて生成されるので、ASTは文法的に標準化されています。 生成されたプログラムフラグメントの意味論は、自然言語の意味論と一致する必要がある。

e4exp commented 3 years ago

5 結論

本稿では,セマンティック・プログラミングに基づく自動プログラミング手法GANCoderを提案する. GAN生成器と識別器のゲーム対決訓練を通じて,データの分布特性を効果的に学習し,コード生成の品質を向上させることができる. 実験結果によると、提案したGANCoderは最先端のコード生成モデルと同等の精度を達成することができ、安定性も優れている。 本稿で提案した手法は,単一行の自然言語記述と単一行のコードとの間の変換しか実現できない. 今後は,長い自然言語記述文と複数行のコードを変換する方法を研究する予定である.