Skip to main content
QUICK REVIEW

[論文レビュー] Learning to Represent Programs with Graphs

Miltiadis Allamanis, Marc Brockschmidt|arXiv (Cornell University)|Nov 1, 2017
Software Engineering Research被引用数 47
ひとこと要約

本稿では、構文、データフロー、型階層を統合した構造的グラフとしてソースコードを表現することで、プログラム理解を向上させる手法を提案する。ゲート付きグラフニューラルネットワーク(GGNN)を用いて、文脈ベースのモデルを凌駆する意味的表現を学習し、VarNaming(32.9%の精度)およびVarMisuse(85.5%の精度)で優れた性能を発揮。RavenDB や Roslyn といったオープンソースプロジェクトにおいて、実際のバグを検出できた。

ABSTRACT

Learning tasks on source code (i.e., formal languages) have been considered recently, but most work has tried to transfer natural language methods and does not capitalize on the unique opportunities offered by code's known syntax. For example, long-range dependencies induced by using the same variable or function in distant locations are often not considered. We propose to use graphs to represent both the syntactic and semantic structure of code and use graph-based deep learning methods to learn to reason over program structures. In this work, we present how to construct graphs from source code and how to scale Gated Graph Neural Networks training to such large graphs. We evaluate our method on two tasks: VarNaming, in which a network attempts to predict the name of a variable given its usage, and VarMisuse, in which the network learns to reason about selecting the correct variable that should be used at a given program location. Our comparison to methods that use less structured program representations shows the advantages of modeling known structure, and suggests that our models learn to infer meaningful names and to solve the VarMisuse task in many cases. Additionally, our testing showed that VarMisuse identifies a number of bugs in mature open-source projects.

研究の動機と目的

  • 構文的構造やデータフロー、型階層といった深い意味的構造を無視する既存のコード表現手法の限界を是正すること。
  • プログラム意味論に関する推論を要する、新たな機械学習タスク「変数不正使用予測(VarMisuse)」を導入すること。
  • グラフベースのモデルが、多様なコードベースに一般化可能な意味的意味を持つプログラム表現を学習できることを示すこと。
  • RavenDB や Roslyn といった成熟したオープンソースプロジェクトにおいて、実際のバグを検出することで、本手法の実用的価値を検証すること。

提案手法

  • 構文的関係(例:トークンの順序)と意味的関係(例:データフロー、パラメータバインディング)をエンコードすることで、プログラムグラフを構築する。
  • データフローと型階層情報をグラフ構造に統合し、意味的信号を強化する。
  • 大規模なプログラムグラフ上でゲート付きグラフニューラルネットワーク(GGNN)を学習させ、コード要素の分散表現を学習する。
  • 学習済み表現を用いて、変数名の予測(VarNaming)およびコードのスロットにおける正しい変数の選択(VarMisuse)を実行する。
  • 290万行の実世界ソースコードから得られる大規模なグラフを処理できるよう、GGNNの学習をスケーリングする。
  • 学習済み表現のコサイン類似度を用いて、コードスニペット間の意味的類似性を分析する。

実験結果

リサーチクエスチョン

  • RQ1グラフベースのニューラルネットワークは、コードの構文的および意味的構造を効果的にモデル化でき、プログラム表現の向上に寄与するか?
  • RQ2プログラムグラフ上で学習したモデルは、使用文脈から変数名を予測できるか(VarNaming)?
  • RQ3プログラムグラフ上で学習したモデルは、構文的には正しいが意味的に誤りのある変数不正使用エラーを検出できるか?
  • RQ4学習済み表現は、コード断片間の意味的類似性をどの程度正確に捉えられるか?
  • RQ5VarMisuseモデルは、生産環境向けソフトウェアにおいて、以前に発見されていなかった実際のバグを特定できるか?

主な発見

  • 提案されたグラフベースのモデルは、より構造の薄い表現に依存するベースラインを大きく上回り、VarNamingタスクで32.9%の精度を達成した。
  • モデルはVarMisuseタスクで85.5%の精度に達し、コード内での変数意味論に関する推論能力が優れていることが示された。
  • モデルはRavenDBで3件、Roslynで3件の以前に発見されていなかったバグを検出し、開発者によって非公開で報告され、修正された。
  • 可視化結果から、モデルは意味的に意味のある表現を学習しており、異なるコードセグメントにおいても類似した変数使用(例:nullチェック)がまとめてグループ化されていることがわかった。
  • モデルは、RavenDBにおいて、バッファのサイズが「length」ではなく「size」にすべきところを無駄に「length」に設定していたメモリ非効率性を特定した。これは、微妙ではあるが明確な問題であった。
  • 本手法は、コンパイラや構文的チェックでは検出できないバグ(例:誤ったエラーメッセージ、コピーペーストエラーなど)を同定できる点で、従来の静的解析と相補的である。

より良い研究を、今すぐ始めましょう

論文設計から論文執筆まで、研究時間を劇的に削減しましょう。

クレジットカード登録不要

このレビューはAIが作成し、人間の編集者が確認しました。