368 Views
May 09, 19
スライド概要
2019/04/22
Deep Learning JP:
http://deeplearning.jp/hacks/
DL輪読会資料
2019 / 04 / 22 [DL Hacks] Code Representation by Neural Network and Abstract Syntactic Tree Paths Takuya MATSUDATE, @m3yrin
緒言
Abstract ● プログラムコード 機能的な情報を埋め込む手法(code2vec, code2seq) ● プログラムコード Syntacticな情報を抽象構文木(AST) パス 紹介 集合で表現 ● (code2vec) 類似性をとらえたベクトルを生成できた ● (code2seq) 同一 を超えた コード要約(Java)とコードキャプショニング(C#) 両方で先行研究
Paper Info 1 Title “code2vec: Learning Distributed Representations of Code” (POPL 2019) Author Uri Alon (Technion), Meital Zilberstein (Technion), Omer Levy(Facebook AI Research), Eran Yahav(Technion) Links Arxiv : https://arxiv.org/abs/1803.09473 Demo etc. : https://code2vec.org/ Implementation : https://github.com/tech-srl/code2vec
Paper Info 2 Title “code2seq: Generating Sequences from Structured Representations of Code” (ICLR 2019) Author Uri Alon (Technion), Shaked Brody (Technion), Omer Levy(Facebook AI Research), Eran Yahav(Technion) Links Arxiv : https://arxiv.org/abs/1808.01400 Demo etc. : https://code2seq.org/ Implementation : https://github.com/tech-srl/code2seq
きっかけ 構造的なテキスト 構造的な情報を扱いたい ニューラル機械翻訳モデルにHTML 文章をそ まま突っ込んで玉砕 ほとんど 言語で使用可能なモデルで性能も良い 似た手法が続くかもしれない Facebook Researchが別でブログ書いてた
背景 やりたいこと プログラムコードから直接 機能について 情報を得たい (将来的に)できること (コードを入力にした)コード検索, プログラムがI/Oを実行するか プログラム 依存関係 予測, マルウェア判定 予測,
共通
手法 課題 ニューラル機械翻訳(Neural Machine Translation; NMT)で 、 プログラムコード 規約を元に分析する 難しい トークン 羅列・学習が大変 → 構造的な情報も一緒に埋め込んであげれ いい
抽象構文木(Abstract Syntactic Tree; AST) プログラムコードを抽象構文木(Abstract Syntactic Tree; AST)で表現して パス情報を埋め込む ?
抽象構文木(Abstract Syntactic Tree; AST) code2vec 論文より つづく ... ??
抽象構文木(Abstract Syntactic Tree; AST) … つまり Java AST 言語依存 表現を除去 & 木構造化 終端ノード(Terminals) 演算 引数が入る ユーザが任意に決める 非終端ノード(Nonterminals) 演算 種類が入る 全362種類
ASTパス ASTパス 2つ 終端ノード( ) +間 例え “remaining” 非終端ノード( ) 列 ... Method Call Expr Binary Expr : LE “0”
ASTパスによるコード表現 AST x_1 = v1 v2 v3 ... v_l1 v1 v2 v3 ... v_li v1 v2 v3 ... v_lk : x_i = : x_k = 生成できるASTパス 集合 ↓ (code2vec, code2seq) Code Representationとして使える!
記法に対する頑健性 やってること 同じだが記法が違う ニューラル機械翻訳モデルで 類似をうまく見れない
記法に対する頑健性 ASTパスで表すと、類似性をうまく抽出できる( ず)
言語間 拡張性 ASTに変換できてしまえ 、ど 言語でも使用できる (言語固有 モデルで ない) https://github.com/tech-srl/code2seq
code2vec: Learning Distributed Representations of Code
code2vecで 手法 : 2つ x_i = Code Representation Embedding Matrixで単純に分散ベクトルを作成しConcat v1 v2 v3 ... v_li FC Attention Code vector :
タスク(Code Summarization) Code SummarizationでEmbedding Matrixをトレーニングする 入力 : Javaメソッド本文 出力 : メソッド名
モデル とってもシンプル
学習データ Github Javaで開発されたプロジェクトから収集 データ 著者等によって公開されている https://github.com/tech-srl/code2ve c
定量的な評価(code2vec) 後述 (code2seqと一緒に)
注意重みによる推論 ASTパスに対する注意重みによって、 ど パスが推論に重要だったかを知ることができる 解釈性
学習された埋め込みによる性質 学習されたあるコードベクトル 、(コサイン距離などで)最も近いベクトルを探すと意味的に似 た名前を含む(word2vecと同じ) ベクトル 加減算が意味的な追加や削除に対応 ⬆ B - A + C ≒ D だったと こと
モデル 新出 限界 ラベルに対応できない 予測できるメソッド名 トレーニング時に現れたラベル み 比較的大規模なデータが必要 モデル 学習中に現れたシンボルごとに埋め込みを行う 変数名へ で、埋め込み行列 依存 難読化・敵対的な命名に対して脆弱 大きくなってしまう
code2seq: Generating Sequences from Structured Representations of Code
code2vecで Code Representation code2veqと 違い Encoder部分
Token Representation 終端ノード Subtokenに分割して埋め込み “arrayList” Camel case 等 規 則に照らして分割 [“array”, ”list”] 分割した単語ごとに埋 め込み & 集約 E”array” + E”list”
Path Representation 非終端ノード 系列としてLSTMで埋め込み
Combined Representation 非終端ノードと終端ノード 埋め込みベクトルをconcat v1 v2 v3 v1 v2 v3 v1 v2 v3 AST Path . . . . . . h0 v_l1 Decoder Initial Stat v_li v_lk zk Combined Repr. Attention Weight Decoder LSTM
タスク 2つ タスク・2つ 言語でトレーニング・評価 • Code Summarization → Javaで メソッド名 推測、Code2vecと同じ Summarizing Source Code using a Neural Attention Model https://www.aclweb.org/anthology/P16-1195 • Code Captioning → C# コードから、自然言語 説明文を与える。データ CodeNNデータセット
評価(Code Summarization) Baselineモデル すべて 、データセットで再トレーニングしたスコア データセットでスコアが改善
評価(Code Captioning) Baselineモデル すべて 、データセットで再トレーニングしたスコア データセットでスコアが改善
実装
実装 著者実装 code2vec : https://github.com/tech-srl/code2vec code2seq : https://github.com/tech-srl/code2seq どちらもTensorflow実装 再現実装 code2vec : いくつか存在 (Pytorchによる実装もある) code2seq : 実装しました
著者実装(code2seq) tech-srl/code2seq/model.py 基本的に seq2seqと同じ。著者実装 比較的読みやすい。
再現実装(code2seq) PyTorchを使用して再現実装をしました seq2seqをベースにEncoder部分をAST Pathを埋め込めるように実装 https://github.com/m3yrin/code2seq まだ不安定 & 大きい計算機欲しい..
Link ● プログラムコード 分散表現を作る(code2vec) https://qiita.com/m3yrin/items/b7b11ec2c7d045d07efb ● プログラムコード 機能情報を獲得するニューラルネットワークを作る (code2seq) https://qiita.com/m3yrin/items/85e01cfabe53c173df33