【論文要約】Code-to-Code Search Based on Deep Neural Network and Code Mutation
Code-to-Code Search Based on Deep Neural Network and Code Mutation (osaka-u.ac.jp)
要旨
深層ニューラルネットワーク(DNN)は、画像ファイルのラベリング(例:物体検出)によく使用されています。ソフトウェアエンジニアリングにおけるコードフラグメントのラベリング(すなわち、コード間の検索)にも適用できますが、DNNの学習プロセスでは、各ラベルに対して多数のコードフラグメントが必要です。本論文では、DNNモデルとコードの変異に基づくコード間の検索手法を提案し、各ラベルに十分な数のコードフラグメントを生成します。予備実験では、提案手法の高い適合率と再現率が示されています。
はじめに
開発者はしばしば、他のコードフラグメントと同様の機能を提供するコードフラグメントを探しています。例えば、開発者は、より効率的で信頼性の高い実装を見つける必要があるかもしれません。また、OSSプロジェクトやStack Overflowなどの議論プラットフォームからコードフラグメントを見つけた場合、元のコードフラグメントのライセンスを特定するだけでなく、より脆弱性の少ないものを見つける必要があるかもしれません。これまでに、類似機能のコードフラグメントを探すためのコード対コードの検索手法がいくつか提案されています。
これまでに、深層ニューラルネットワーク(DNN)は、コンピュータビジョン分野での物体検出だけでなく、ソフトウェアエンジニアリング分野でのコードクローン検出にも使用されてきました。私たちの主な洞察は、ソースコードから機能に応じてコードフラグメントにラベル付けするためにDNNを使用することです。DNNによるラベリングが成功すると、その結果のラベリングはコード対コードの検索に使用できます。この洞察は、画像の部分をピクセル特性に応じてDNNでラベリングすることから得られました。
本論文では、Feed-Forward Neural Network(FFNNと呼ばれる)を使用したコードブロック検索のアプローチを提案します。私たちのアプローチは、クエリコードフラグメントに対応する類似したコードフラグメントを見つけることができます。私たちのコード検索アプローチは、STEP L(学習)とSTEP S(検索)の2つのステップで構成されています。STEP Lでは、元のソースコードから変異したソースコードフラグメントが生成され、これらのフラグメントは元のソースコードに基づいてクラスタリングされます。そのコードブロックが抽出され、その後、これらのコードブロックから特徴ベクトルが生成されます。各クラスターのこれらの特徴ベクトルには一意のラベルが付けられます。最後に、Feed-Forward Neural Network(FFNN)は、教師あり学習によって特徴ベクトルと対応するラベルからなるタプルを学習します。STEP Sでは、トレーニングされたモデルが、クエリコードフラグメントから生成された特徴ベクトルからラベルを計算し、このラベルに対応するクラスターの元のコードブロックが検索結果として得られます。ケーススタディでは、私たちのアプローチを3つのOSSシステムに適用し、その有効性を確認しました。
背景
A. クローンのための変異演算子
RoyとCordyは、クローンのための変異演算子を提案しました。これらの演算子は、元のコードフラグメントを編集して新しいコードクローンを作成します。彼らはまた、異なるタイプのコードクローンを生成するための13種類の変異演算子を定義しました。図1は、変異演算子mSDL、行内の小さな削除の適用例を示しています。図1(b)は、図1(a)に示されている元のコードフラグメントの一部を削除して作成されました。
B. Feed-Forward Neural Network
Feed-Forward Neural Network(FFNN)は広く使用されている人工ニューラルネットワークであり、内部のアーキテクチャは後続のニューロン層に組織されています。少なくとも入力層、出力層、および隠れ層から構成されています。重み値はニューロンに関連付けられており、これらの値はトレーニングプロセス中に、入力値と出力値を比較することで調整されます。トレーニングされた入力値に類似したベクトルがFFNNモデルに与えられると、トレーニングされた出力値に類似したベクトルがFFNNモデルから出力されます。図2は、8つのニューロンn00、n01、...、n21から構成される3層のFFNNモデルの例を示しています。この図では、FFNNの入力は3次元ベクトルであり、出力は2次元ベクトルです。
提案手法
本論文では、深層ニューラルネットワークとコード変異に基づくコード対コードの検索アプローチを提案します。深層学習ベースのアプローチは、2つの要素のマッピングに優れているため、入力コードフラグメントに基づいて、構文的に類似したコードフラグメントを深層ニューラルネットワークに基づいて検索します。さらに、モデルの学習に検索できなかったコードフラグメントを使用することで、これらのフラグメントを検索できるようにし、コード検索の省略や誤ったコード検索を減らすことが可能です。私たちのアプローチは、STEP L(学習)とSTEP S(検索)の2つのステップで構成されています。
A.用語の定義
条件1:メソッド本体。
条件2:if、else、for、while、do-while、またはswitchブロックの括弧のペア内のコードフラグメント。
類似度:正規化された2つのコードブロックt1、t2の類似度は次のように定義されます:
類似度(t1, t2) = 2 * |t1 ∩ t2| / (|t1| + |t2|) ここで、t1 ∩ t2 は2つのコードブロックt1とt2の共通部分を示し、|t| はtの行数を表します。類似コードブロック:構文的に同一または類似のコードブロックのペア(つまり、類似度値が0より大きいコードブロックのペア)。
類似コードブロックセット:類似コードブロックの同値類
ネガティブデータ:与えられたソースコードに類似したコードを検索する際、検索結果が得られない場合があります。本研究では、「コードの検索結果がない」というためのネガティブデータは、以下の条件を満たすコードブロックから生成されるベクトルと定義されます: 条件3:特徴ベクトルのラベルが「コードの検索結果がない」を意味する0であるコードブロック。
ポジティブデータ:本研究では、ポジティブデータは以下の条件を満たすコードブロックから生成されるベクトルと定義されます。 条件4:ターゲットプロジェクト内の特徴ベクトルのラベルが0以外であり、セクションII-Aで説明された変異演算子を適用してそれらに類似したコードブロックが作成されているコードブロック。
B.FFNNを用いたディープラーニング
このセクションでは、ディープラーニングを使用してモデルを学習するためのステップであるSTEP Lについて説明します。このステップでは、ターゲットプロジェクトからポジティブデータとネガティブデータが生成され、そのデータを使用してFFNNモデルが訓練されます。図3はSTEP Lの概要を示しています。このステップは、以下の5つのステップで構成されています:
STEP L1. 最初に、ターゲットプロジェクトからコードブロックが抽出され、次に、CCFinder [12]、Yokoiらによるトークンベースのコードクローン検出ツールおよびブロッククローン検出ツールを使用して、類似コードブロックセットSi(1 ≤ i ≤ I)が作成されます。類似コードブロックセットSiには類似コードブロックbi(j) (1 ≤ j ≤ J) が含まれます。これらのコードブロックセットからポジティブデータが生成されます。次に、ターゲットプロジェクトに含まれていないプロジェクトからコードブロックが抽出され、これらのコードブロックからネガティブデータが生成されます。
STEP L2. セクションII-Aで説明された変異演算子を使用して、類似コードブロックセットSiに含まれるコードブロックbi(j) (1 ≤ j ≤ J) に対する類似コードブロックmbi(k) (1 ≤ k ≤ K) が生成されます。このとき、変異されたコードブロックmbi(k) (1 ≤ k ≤ K) は、類似コードブロックセットSiに含まれます。
STEP L3. ポジティブデータとネガティブデータの特徴ベクトルがコードブロックbi(j)とmbi(k)から生成されます。特徴ベクトルを生成する手法は、セクションIII-B1で説明されています。
STEP L4. 類似コードブロックセットSiに属するコードブロックから生成されたポジティブデータにラベルiが与えられます。さらに、ターゲットプロジェクトにコードが含まれていないことを意味するラベル0が、コードブロックb0(l)から生成されたネガティブデータに与えられます。
STEP L5. 教師あり学習を使用して、ポジティブデータとネガティブデータ、および与えられたラベルからFFNNモデルが生成されます。
1) 特徴ベクトルの生成:ケーススタディでは、特徴ベクトルを生成する最もシンプルな手法であるBoW(Bag of Words)またはディープラーニングに基づくアプローチであるDoc2Vec [14] がSTEP L3に適用されます。
BoW:トレーニング用のポジティブデータから抽出された予約されたキーワードと識別子に基づいて特徴ベクトルが生成されます。この時、最大2文字の識別子はメタワードとして考慮されます。与えられたソースコードから特徴ベクトルが生成される場合、抽出された予約されたキーワードと識別子がトレーニング用のポジティブデータに含まれます。図4は、BoWを使用して特徴ベクトルを生成する例を示しています。Word_2はメタワードを表し、変数xとyはメタワードに対応しています。
Doc2Vec:Doc2Vec [14]は、教師なし学習に基づいて特徴ベクトルを生成するアプローチであり、自然言語を対象とするタスクにおいてその効果が実証されています。Doc2Vecを使用するためにgensim2を使用します。図5は、Doc2Vecを使用して特徴ベクトルを生成する例を示しています。
まず、トレーニング用のポジティブおよびネガティブデータのレキシカル解析がANTLR3を使用して実行されます。次に、各コードブロックのトークンが、トークン間にスペースがある1行に配置されます。最後に、これらの行によってDoc2Vecモデルがトレーニングされます。入力コードブロックのトークン間にスペースがある1行がこのモデルに与えられると、入力コードブロックの埋め込みベクトルが取得されます。
C.学習済みFFNNモデルを用いた類似コードブロックの検索
このセクションでは、類似コードブロックを検索するためのステップであるSTEP Sについて説明します。STEP Sでは、STEP L5で訓練されたFFNNモデルを使用して類似コード検索が行われます。このステップは、3つのステップで構成されています。図6は、STEP Sの概要を示しています。
STEP S1. 入力コードフラグメントを解析した後、その特徴ベクトルがSTEP L3と同じ方法で生成されます。
STEP S2. STEP S1で生成された特徴ベクトルをSTEP L5で訓練されたモデルに入力し、入力コードフラグメントのラベルが提案されます。
STEP S3. STEP S2で提案されたラベルに対応する類似コードブロックセットSxに属するコードブロックbx(j) (1 ≤ j ≤ J)が出力されます。x = 0の場合、トレーニング用のネガティブデータに似ているとモデルが示すため、コード検索結果はありません。
ケーススタディ
このセクションでは、アプローチに関するケーススタディについて説明します。このケーススタディでは、HBase 2.04、OpenSSL 0.9.1から1.1.05、FreeBSD 11.1.06から構成される3つの対象OSSのベンチマークを使用して、アプローチの精度、再現率、F値の性能を示しています。更新などによって引き起こされるクロスバージョンの類似コードブロックを使用します。評価のために、複数のバージョンのOpenSSLが使用されます。
A. ハイパーパラメータ
このケーススタディでは、Feed-Forward Neural Network(FFNN)モデルが深層学習フレームワークChainer3.4.07を使用して実装されます。ネットワークは、入力層、隠れ層、出力層の3層で構成されています。入力の次元は入力特徴ベクトルの次元であり、出力は類似コードブロックセットの種類の数です。隠れ層のユニット数は経験的に200に決定されました。出力層では、softmax関数が使用されています。
B. ケーススタディの手順
このケーススタディは、STEP E(実験)1、2、3で構成されています。
STEP E1. 各ターゲットOSSを使用してトレーニングおよび評価用のデータセットが作成されます。
STEP E2. FFNNモデルは、トレーニング用のデータセットのコードブロックでトレーニングされます。
STEP E3. 評価用のデータセットを使用して精度、再現率、F値が計算されます。
C. データセットの作成手順
STEP E1では、トレーニングおよび評価用のデータセットが以下の手順に従って作成されます。
STEP E1 (1). ターゲットOSSから類似コードブロックセットが抽出され、100以上のコードブロックが含まれるセットが選択され、モデルのトレーニングおよび評価で多くの類似コードブロックが準備されます。
STEP E1 (2). 選択されたセットの類似コードブロックの20%に変異演算子が適用され、それらから生成された特徴ベクトルがトレーニング用のポジティブデータに追加されます。対応するラベルは、以下のセクションIII-B STEP L4で各特徴ベクトルに与えられます。
STEP E1 (3). STEP E1(2)で作成されたポジティブデータと構文的に類似しないコードブロックから生成された3万個の特徴ベクトルが、トレーニング用のネガティブデータに追加されます。この時点で使用されるソースコードは、HBaseデータセットのBigCloneBenchから取得されます。OpenSSLの場合はFreeBSDから、FreeBSDの場合はOpenSSLから取得されます。
STEP E1 (4). 各ターゲットOSSから抽出されたコードブロックから生成された特徴ベクトルと、STEP E1(2)で使用されなかった類似コードブロックの80%が評価用のデータセットに追加されます。特徴ベクトルがトレーニング用のポジティブデータと類似している場合、それに対応するラベルが付与されます。そうでない場合、ラベル0が付与されます。
表Iは、各ターゲットOSSを使用して作成されたデータセット内のポジティブデータとネガティブデータの数を示しています。各ターゲットOSSに含まれるすべてのコードブロックとOpenSSLの複数のバージョンが使用されるため、評価用のデータセットにはバイアスがあります。また、トレーニング用のコードブロックと入力コードフラグメントの構文的差異の関係を調査するために、各ターゲットOSSごとにトレーニングと評価用のデータセットの類似度を変更します。Hbaseから構文的に同一のコードブロック、OpenSSLから構文的にほぼ類似するコードブロック、FreeBSDから意味的に類似するコードブロックを抽出します。
D. 検索パフォーマンスの基準
この実験では、精度、再現率、F-値が検索パフォーマンスの評価に使用されます。以下にこれらの基準を示します。
精度:これは正確さに関する基準です。この実験では、精度は評価用のポジティブデータのラベルの正しい結果の数を、モデルが計算したポジティブデータのラベルの結果の数で割ったものと定義されます。
再現率:これは包括性に関する基準です。この実験では、再現率は評価用のポジティブデータのラベルの正しい結果の数を、評価用のポジティブデータの数で割ったものと定義されます。
F-値:これは精度と再現率の合成基準です。F-値は精度と再現率の調和平均です。図7は検索パフォーマンスの計算例を示しています。この例では、モデルは5つのブロックBからFまでの類似コードブロックセットのラベルを検索結果として出力しましたが、正しい出力は3つのブロックCからEですので、精度は3/5です。また、入力として与えられたコードブロックの中で、モデルが学習した4つのブロックCからFに類似するコードブロックがありますが、正しい出力は3つのブロックCからEですので、再現率は3/4です。F-値は精度と再現率の調和平均であり、したがって2/3です。
E. 実験結果
表IIには精度、再現率、およびF値が示されています。HbaseとOpenSSLを使用した実験では再現率が1.000であり、事前に学習されたモデルは高い精度で構文的に類似したコードブロックを検索できます。
図8と図9は、成功裏に見つかったコードブロックの例を示しています。図8(b)と図9(b)のコードブロックはトレーニング用のポジティブデータとして使用されます。訓練されたモデルは、図8(a)と図9(a)から生成された特徴ベクトルが、図8(b)と図9(b)から生成された特徴ベクトルと類似していると推論しました。図8と図9の太字のテキストは、各クエリコードと検索結果との違いを示しています。
図10は、不正確な検索結果の例を示しています。これらのコードブロックは、訓練されたモデルがこれらが類似していると推論したにもかかわらず、類似していません。図10の違いは、モデルがこれらが類似していると推論するケースを引き起こす可能性があります。これに関する考慮事項は、セクションIV-Fで説明されています。
F. 議論
まず第一に、提案されたアプローチの検索パフォーマンスを考慮します。HbaseとOpenSSLを使用した実験では、再現率は1.000であり、したがって、コードブロックが入力と高い類似性を持つ場合、モデルは正しい検索結果を提案します。しかし、精度はやや低いです。精度が低い原因については、モデルがローカルな特徴に基づいてラベルを推奨する傾向があると考えています。例えば、モデルが、"List<Object> list = new Arraylist<Object>();"という文を含むコードブロックを含むデータセットで訓練され、それが対象プロジェクトに含まれている場合、そのコードブロックが全体的に構文的に異なる場合でも、モデルはしばしば、リスト型オブジェクトを作成するための文を含むコードブロックに類似していると推定します。この実験では、図10の違いが、図10(a)と(b)が類似しているという誤った推測を引き起こす可能性があります。FreeBSDを使用した実験の結果は、HBaseとOpenSSLよりも悪く、構文的により類似性の低いコードブロックを含むデータセットと、当社のアプローチは互換性がありませんでした。
G. 変異の効果のケーススタディ
このセクションでは、変異の効果のケーススタディについて説明します。モデルは、ソフトマックス関数を使用して各ラベルの確率を出力します。このケーススタディでは、変異の効果を、トレーニング用のポジティブデータの数と、トレーニングされたモデルがそのポジティブデータに似た類似コードブロックを与えられたときに出力する正しいラベルの確率との関係を調査することで説明します。
1) ケーススタディの手順:このケーススタディは、STEP M(変異の評価)1、2、3、および4で構成されます。
STEP M1. 200以上のOpenSSLのバージョンに含まれる関数fと、他のバージョンに存在する類似コードブロックfn(n = 1, 2、...、N)が選択され、構文的に類似したコードブロックが変異演算子を使用して生成されます。これらの特徴ベクトルはDoc2Vecを使用して生成され、ラベル'1'が付けられます。
STEP M2. STEP M1で作成された特徴ベクトルの一部のみがトレーニング用のポジティブデータに追加され、30000のラベル'0'が付けられたネガティブデータが用意され、モデルMaはポジティブデータとネガティブデータでトレーニングされます。aの値はa = 1、100、1000、2000、3000、4000、5000、7000、10000に変更され、9つのモデルが作成されます。
STEP M3. fに類似したコードブロックfn(n = 1, 2、...、N)から特徴ベクトルが生成され、これらは9つのモデルM1、M100、...、M10000に入力されます。
STEP M4. モデルMnが出力するラベル'1'の確率PMa(⃗fn、1)と、ポジティブデータaの数と確率PMa(⃗fn、1)との関係。
2) 実験結果:表11と図IIIは、セクションIV-G1に基づくケーススタディの結果を示しています。averageaとminaは、次の2つの式によって定義されます。これらは、⃗fn(n = 1, 2、...、N)がMaに入力されたときにモデルMaがラベル'1'の確率を計算した平均値と最小値です。
トレーニング用のポジティブデータの数aが増えるほど、averageaとminaが増加します。
3) 議論:トレーニングデータが変異を使用して作成されるアプローチは、深層学習の入門としてのMNISTなどの画像分類の問題に触発されました。この問題では、トレーニングデータを増やすために、元の画像に拡大、縮小、移動などの操作が行われ、元の画像とわずかに異なる類似画像がしばしば作成され、トレーニングデータに追加されます。私たちのアプローチでは、この考えが変異を使用してソースコードに適用されています。
このセクションのケーススタディでは、2000以上のポジティブデータを使用しているモデルは平均aが99%を超え、7000以上のポジティブデータを使用しているモデルは最小aが90%を超える結果が示されました。これらの結果から、変異を使用してトレーニングデータを増やすことは、トレーニングを進めるのに役立つことが示されています。
関連研究
コード検索とコードクローン検出は類似したタスクです。コード検索は、入力されたコード断片をクエリとして受け取り、そのクエリのコードクローンが対象プロジェクトに存在するかどうかを確認します。したがって、Ichi Trackerなどの複数のコード検索エンジンは、コード検索のためにコードクローン検出ツールを使用しています。Kamiyaらは、CCFinderというコードクローン検出ツールを開発しました。このツールは、ソースコードを解析し、ユーザー定義の名前を特殊文字に変換し、その後、閾値を超える長さのトークン文字列がコードクローンと一致するかどうかを検出します。この研究では、コンポーネントおよびファイル単位の再利用可能なソースコードを、コンポーネントに含まれるクラスのシグネチャ(クラス名、メソッドシグネチャ、フィールド名など)に基づいて検出し、コンポーネントに含まれるファイル間のJaccard係数、またはファイル間の最長共通部分列を使用しています。本論文では、深層学習に基づくコード断片の検索アプローチを提案していますが、これはコンポーネントやファイルよりも細かい粒度です。Whiteらは、ソースコードの抽象構文木から特徴ベクトルを生成し、各ベクトルのl2ノルムを計算することによるコードクローン検出のアプローチを提案しました。Guらは、「API Learning」というアプローチを提案しました。これは、機械翻訳に使用されるRNNエンコーダーデコーダーモデルを使用して、自然言語のクエリからAPI使用順の例を生成するものです。これらの研究とは異なり、私たちの研究は、深層学習に基づいて類似したコードブロックを検索することを目的としており、RNNよりも単純な構造を持つFeed-Forward Neural Networkを使用しています。
結論
本論文では、Feed-Forward Neural Network (FFNN) を使用したコード検索アプローチを提案します。学習段階では、ターゲットのソースコードからコードブロックのデータセットを生成し、変異によってそれと構文的に類似したソースコードを作成し、作成したデータセットを使用して、FFNNモデルを教師あり学習でトレーニングします。検索ステップでは、入力コード断片の特徴ベクトルに基づいてモデルが計算したラベルに対応する類似したコードブロックが出力されます。ケーススタディでは、当社のアプローチが高い精度で構文的に類似したソースコードを検索できることが示されています。今後の取り組みは以下の通りです。 ・このアプローチではFFNNのみを使用していますが、RNNなど他の深層ネットワークも使用する予定です。 ・トレーニング用の類似コードブロックセットの数を増やすことで、我々のアプローチがより大規模なプロジェクトを管理できるかどうかを評価する必要があります。
コメント
コメントを投稿