深層学習を⽤いた
コードクローン検出器のベンチマーク間精度調査◯福家範浩1 藤原裕⼠1 吉⽥則裕2 崔恩瀞3 井上克郎1
1⼤阪⼤学 2名古屋⼤学 3京都⼯芸繊維⼤学

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka Universityコードクローン（以降CC）• 同⼀，または類似したコード⽚を持つコード⽚• ソフトウェア保守を困難にする要因の1つ[例] バグ修正時の問題
コード⽚ A
コード⽚ A'

類似するバグがある可能性がある

1
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

CCとタイプ分類[6]（1/2）
Type-1（以降T1）

Type-2（以降T2）

空⽩やタブ，改⾏，コメント以外は⼀致するコード⽚対

T1に加えて変数名や関数名，変数の型が異なる
コード⽚対

元のコードint sum(int[] a){int sum = 0;
for(int i=0; i<a.length; i++){sum = sum + a[i];}return sum;}

T1︓括弧の位置
int sum(int[] a){int sum = 0;
for(int i=0; i<a.length; i++){sum = sum + a[i];}return sum;}

T2︓型・変数名
float sum(float[] b){
float sum = 0;
for(int i=0; i<b.length; i++){sum = sum + b[i];}return sum;}2
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

CCとタイプ分類[6]（2/2）
Type-3Type-4（以降T4）

T2に加えて⽂の挿⼊や削除，変更などの違いがあるコード⽚対Type-3に加えて同⼀の処理を⾏うが，構⽂上の違いがあるコード⽚対ST3（Strongly Type-3）︓70%以上，MT3（Moderately Type-3）︓50〜70%
WT3（Weakly Type-3）︓50%未満
T4︓構⽂的な異なり
元のコード
ST3︓⽂の変更
int sum(int[] a){int sum(int[] a){int sum = 0;
for(int i=0; i<a.length; i++){sum = sum + a[i];}return sum;}int sum(int[] a){int sum = 0;
for(int i=0; i<a.length; i++){sum += a[i];}return sum;}int sum = 0;
int i = 0;
while(i<a.length){sum = sum + a[i];i++;}return sum;}

ソフトウェア開発者が，数多くのコード片対から，CCを探すための検出器が提案されている
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University3

深層学習を⽤いたCC検出器• 従来の字句解析などだけでは，MT3やWT3/T4のCCの検出精度の向上は困難である• 近年，WT3/T4のCCを検出するため
CC検出器に深層学習が取り⼊れられている[例] CCLearner [2]トークンカテゴリごとの類似度を特徴として⼊⼒

4
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

深層学習モデルにおける汎化性能の問題
学習データと適⽤対象データ

学習データの性質と適⽤対象のデータの性質が異なることで，想定していた精度より悪くなる問題

汎化性能の必要性
1. センサAで取得したデータを学習データとして収集

2. 同じデータを取得することができる
センサ B/C も⽤いられる可能性
例︓メーカーやセンサのバージョンなどの違い

取得しているデータは同じ

しかし，センサ B/Cによるデータは未学習

精度を維持できるか→ 汎化性能の問題
5

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

深層学習を⽤いたCC検出器における汎化性能の問題
学習データと適⽤対象データ

学習データの性質と適⽤対象のデータの性質が異なることで，想定していた精度より悪くなる問題

汎化性能の必要性
1. 既存のある機能を持ったコードクローンを学習⽤に収集
2. 異なる特徴を持ったコード⽚に対して検出器を使う可能性
例︓プログラマの熟練度やコードの⽤途などの違い

どちらも同じくソースコード
しかし，未学習の特徴のソースコード

精度を維持できるか→ 汎化性能の問題
6

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University我々の先⾏研究[5]
深層学習を⽤いたCC検出器に対し，学習と異なるベンチマークで評価– 2つの深層学習を⽤いたCC検出器で調査– 2つのCCベンチマークを準備し、⽚⽅で学習し他⽅で評価学習と同じベンチマークで評価時より精度が低いことを確認
先⾏研究の問題

しかし，ベンチマークの特徴によって，CC検出器の精度がどのような影響を受けるか判断するには，実験結果が少ない
7

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

本研究の⽬的と概要• 深層学習を⽤いたCC検出器において汎化性能の問題があるかさらなる知⾒を得る• 深層学習を⽤いたCC検出器の検出精度にデータの性質が影響するか知⾒を得る
概要

1. 先⾏研究で使⽤した2つのベンチマークに1つ似た収集基のベンチマークを加えて調査
2. 3つの深層学習を⽤いたCC検出器について調査
3. 3つのResearch Questionを設定
8

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Research Question（RQ）（1/2）
RQ1︓学習と評価に異なるベンチマークを⽤いた場合，検出精度は維持できるか?

RQの答えが分かることによるメリット
深層学習を⽤いたCC検出器を使う時，汎化性能の問題が⽣じるのかどうか知⾒を得ることが出来る

RQ2︓学習と評価に異なるベンチマークを⽤いた
場合，CCのタイプと検出精度は関係しているか?
RQの答えが分かることによるメリット
CCのタイプと汎化性能に関係がある場合，CC検出器の学習法改善のための情報になると考えられる

9
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Research Question（RQ）（2/2）
RQ3︓競プロを基にしたベンチマーク同⼠で学習と評価を⾏うことで，検出精度は維持できるか?
RQの答えが分かることによるメリット
類似するデータに対して精度が維持出来る場合，類似する学習データを作成する動機になる※競プロ︓競技プログラミング
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University10概要:汎化性能の分析深層学習を⽤いた複数の検出器について，複数のベンチマークを⽤いて性能を評価– 深層学習を⽤いたCC検出器• CCLearner[2]• ASTNN[3]• CodeBERT[4]– ベンチマークトークンカテゴリごとの類似度
AST-based Neural Network
BERT系• BigCloneBench[6]（BCB） OSS等
• Google Code Jam[7]（GCJ）競技プログラミング• CodeNet[17]（CN）競技プログラミング

11
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

CCLearner
ソースコード中のトークンのカテゴリごとの類似度を特徴量とした深層学習モデル– 特徴量を出す⽅法

1. ソースコードをトークンごとに分割
2. トークンを8つのカテゴリに分類
3. カテゴリごとの類似度を特徴量とする– 従来の検出器より検出精度が向上し，広い範囲のCCを検出可能
int sum ( int [ ] a ) { intsum = 0 ; for ( int i = 0 ;i < a . length ; i ++ ){ sum = sum + a [ i ] ; }return sum ; }トークン列
ソースコード表現

C1: 〇〇，××
C2: △△
C3: ☆☆
…

トークンのカテゴリ分類

C1: 0.88…
C2: 0.52…
C3: 0.73…
…

カテゴリごとの類似度

深層学習モデル12

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

ASTNN
抽象構⽂⽊（以降AST）をベクトル化して特徴量とした深層学習モデル– ASTのベクトル化の⼿順

1. トークンをベクトル化
2. 1でのベクトルを⽤いて ステートメントをベクトル化
3. 2でのベクトルを⽤いて ASTをベクトル化

…

…

…

…

– 従来の検出器より検出精度が向上し，さらに広い範囲のCCを検出可能
ステートメント… ツリーベクトル…

…

ASTを作成ノードをベクトル化

…
…
…

GRU

ASTのベクトルを取得…

ASTのベクトル

深層学習モデルDepartment of Computer Science, Graduate School of Information Science and Technology, Osaka University

13

CodeBERT
近年，⾃然⾔語処理分野で多く使われている
BERTをソースコードに適⽤した深層学習モデル– CodeBERTは，教師なし事前学習による汎⽤⾔語モデルとして公開されている– コード⽚対を2⽂とみなして連続で⼊⼒し，CCか⾮CCかを出⼒するタスクでﬁne-tuning（再学習）– 従来の検出器より検出精度が向上し，さらに広い範囲のCCを検出可能
int sum ( int [ ] a ) { intsum = 0 ; for ( int i = 0 ;i < a . length ; i ++ ){ sum = sum + a [ i ] ; }return sum ; }int sum ( int [ ] a ) { intsum = 0 ; for ( int i = 0 ;i < a . length ; i ++ ){ sum = sum + a [ i ] ; }return sum ; }

コード⽚1

コード⽚2

汎⽤⾔語モデルに対してCC検出タスクでさらに学習

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

14本調査に⽤いたベンチマーク• オープンソースソフトウェアのソースコード– BigCloneBench• 競技プログラミングの解答ソースコード– Google Code Jam，CodeNet の2種競技プログラミングの解答ソースコード同⼠は類似していると考えられる

15
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

ベンチマーク（BCB）
オープンソースソフトウェアのソースコード– BCB• Svajlenko らによって作成された Java ソースコードの⼤規模ベンチマーク [6]• ⼤規模データである IJaDataset 2.0の中から特定の機能のソースコードをマイニング，⼈⼿でタイプ等のラベル付け• BCBには複数のバージョンがあり，CC検出器によってもデータの抽出数に違い

16
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

ベンチマーク（GCJ・CN）
競技プログラミングの解答ソースコード
同じ設問に対する解答は，同⼀の処理を⾏うが構⽂的に異なるT4のCCとして構成– GCJ• 既存研究で Google Code Jamから収集されたもの[7]• CC︓約275,000，⾮CC︓約275,000– CN• AtCoderやAIZU Online Judge（以降 AOJ）から収集[17]• 本調査ではAOJのコードをGCJに近い設問数，CC数取得• CC︓約276,000，⾮CC︓約276,000

設問A
解答1

コードクローン 設問A ⾮コードクローン 設問B
解答2
解答3

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

17

ベンチマーク間での類似度調査• ベンチマークそれぞれの頻出1,000語同⼠でJaccard係数を調査– コード⽚ごとに出てくる単語をリストアップ– ベンチマーク内の何個のコード⽚にあるかカウント– 上位1,000語を取得し，Jaccard係数を調査

• 結果

0.19

GCJ

BCB
0.25

0.15

CN

競技プログラミングを基にしたベンチマーク間が⼀番類似している
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

19

評価指標
• f1

2 % 𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 % 𝑟𝑒𝑐𝑎𝑙𝑙
𝑓1 =
𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 + 𝑟𝑒𝑐𝑎𝑙𝑙 f1: 1が最⾼，0が最悪• マシューズ相関係数（MCC）

𝑡𝑝 % 𝑡𝑛 − 𝑓𝑝 % 𝑓𝑛
MCC =𝑡𝑝 + 𝑓𝑝 𝑡𝑝 + 𝑓𝑛 𝑡𝑛 + 𝑓𝑝 𝑡𝑛 + 𝑓𝑛

tp: true-positive，tn: true-negative，
fp: false-positive，fn: false-negative

MCC: 1が最⾼，-1が真逆，0が最悪正負の数

f1

MCC

不均衡

精度が悪くても数値が⾼い可能性

精度が悪いと数値は0に近い値

⼤部分を⼤部分を均衡正と予測︓約0.6
負と予測︓約0

正と予測︓約0
負と予測︓約0

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University203つのRQ• RQ1

学習と評価に異なるベンチマークを⽤いた場合，検出精度は維持できるか?

• RQ2

学習と評価に異なるベンチマークを⽤いた場合，CCのタイプと検出精度は関係しているか?

• RQ3

競技プログラミングを基にしたベンチマーク同⼠で学習と評価を⾏うことで，検出精度は維持できるか?

21
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

RQ1︓異なるベンチマークに対してOSS

競技プログラミング
GCJ（約550,000ペア）

BCB （約100,000ペア※）CN （約550,000ペア）

設問 G1

…

設問 C1

…

設問 G2

…

設問 C2

…

設問 G3

…

設問 C3

…

RQ1

T1，T2，
ST3，MT3
WT3/T4，…

…

⾮コードクローン

学習/評価
RQ1︓GCJ/BCB, CN/BCB, BCB/GCJ, BCB/CN
1. OSS等を基にしたベンチマークと，競技プログラミング（以降，競プロ）を基にしたベンチマークで学習と評価
2. 同じベンチマークを⽤いた時の精度と別のベンチマークを⽤いた時の精度で⽐較※ CCLearnerの学習︓約45,000対，CodeBERTの学習︓約900,000対 22
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

RQ1︓異なるベンチマークに対して
RQ1︓学習と評価に異なるベンチマークを⽤いた
場合，検出精度は維持できるか．
ASTNN f1

ASTNN MCC
111

0.8

0.8

0.8

0.8

0.8

0.8

0.6

0.6

0.6

0.6

0.6

0.6

0.4

0.4

0.4

0.4

0.4

0.4

0.2

0.2

0.2

0.2

0.2

0.2

000000

CodeBERT MCC

-0 .2

BC
B/
G
BC CJ
B
GC /CN
J/B
CN CB
/B
CB

-0 .2

BC
B/
G
BC CJ
B
GC /CN
J/B
CN CB
/B
CB

-0 .2

CodeBERT f1

BCB/
G
BC CJ
B
GC /CN
J/B
CN CB/B
CB

1BCB/
G
BC CJ
B
GC /CN
J/B
CN CB/BCB

1

No Data1No Data

CCLearner MCC

BCB/
G
BC CJ
B
GC /CN
J/B
CN CB/B
CB

習異なる

CCLearner f1

BC , 評B[ 価2B C ]/ G
B[ CJ2GC ]/C N
J/B
CN CB
/B
CB

学

同⼀CCLearner ，ASTNN，CodeBERTは同じベンチマークを用いて評価した場合に比べて全て精度が下がっている23→ 汎化性能が低い
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

RQ2︓CCのタイプごとの検出精度
学習

競技プログラミング
GCJ（約550,000ペア）

OSS

BCB （約100,000ペア※）CN （約550,000ペア）

設問 G1

…

設問 C1

…

設問 G2

…

設問 C2

…

設問 G3

…

設問 C3

…

評価

T1，T2，
ST3，MT3

RQ2WT3/T4，…

…

⾮コードクローン

学習/評価
RQ2︓GCJ/BCB, CN/BCB
1. 競プロを基にしたデータセットで学習を⾏い，CCのタイプがラベル付けされたOSSを基にしたベンチマークで評価
2. CCのタイプごとに精度を調査※ CCLearnerの学習︓約45,000対，CodeBERTの学習︓約900,000対 24
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

RQ2︓CCのタイプごとの検出精度（MCC）
T1

T2

CCLearner

ST3

MT3

WT3/T4ASTNN

CodeBERT

11

1

0.8

0.8

0.8

0.6

0.6

0.6

0.4

0.4

0.4

0.2

0.2

0.2

000-0.2-0.2-0.2

GCJで学習

CNで学習

GCJで学習

CNで学習

GCJで学習 CNで学習
全て0.1未満CCLearner，ASTNNは，類似度が低いCCのタイプで精度が低下 → CCのタイプと精度の関係が強い
CodeBERTは，全てのタイプで精度はほとんど等しく低い→ CCのタイプと精度の関係が弱い
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University25

RQ3︓類似するベンチマーク間での検出精度
OSS

競技プログラミング
GCJ（約550,000ペア）
設問 G1

…

設問 G2

…

設問 G3

…

CN （約550,000ペア）
RQ3

設問 C1

…

設問 C2

…

設問 C3

…

BCB （約100,000ペア※）
T1，T2，
ST3，MT3
WT3/T4，…

…

⾮コードクローン

学習/評価
RQ3︓GCJ/CN, CN/GCJ
1. 競プロを基にしたベンチマーク間で学習と評価
2. RQ1で調べた精度と⽐較

ベンチマーク間のJaccard係数
BCB-GCJ︓0.19
BCB-CN ︓0.15GCJ-CN ︓0.25※ CCLearnerの学習︓約45,000対，CodeBERTの学習︓約900,000対 27
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

RQ3︓類似するベンチマーク間での検出精度（MCC）
学習したベンチマーク

BCB

CCLearner

評価と異なる競プロのベンチマーク

ASTNN

CodeBERT

0.6

0.6

0.6

0.4

0.4

0.4

0.2

0.2

0.2

000

-0.2

-0.2

-0.2

評価した
ベンチマーク

GCJ

CN

GCJ

CN

GCJ

CN

いずれの検出器も同じベンチマークでの評価に比べると精度が下がっている
ASTNNとCodeBERTは，RQ1に比べると検出精度が上がった
CCLearnerは，RQ1と検出精度が変わらなかった
28
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

RQまとめ（1/2）• RQ1︓学習と評価に異なるベンチマークを⽤いた場合，検出精度は維持できるか?
– 学習と異なるベンチマークで評価を⾏うと，CCLearner，ASTNN，CodeBERTいずれも精度が低い• RQ2︓学習と評価に異なるベンチマークを⽤いた場合，CCのタイプと検出精度は関係しているか?
– CCLearner と ASTNNはCCのタイプによって精度が変わり，CodeBERT では変わらない

29
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

RQまとめ（2/2）• RQ3︓競技プログラミングを基にしたベンチマーク同⼠
で学習と評価を⾏うことで，検出精度は維持できるか?
– 学習と類似するベンチマークに対して，ASTNN とCodeBERT は精度が上がり，特にCodeBERTは精度が⾼かった．CCLearner は精度が変わらなかった

30
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University考察（1/2）
3つのRQから考えられること

1. 学習データと適⽤対象が異なる場合•CCLearner，ASTNN，CodeBERT

検出されたCCが正確か確認する必要

2. コードクローンのタイプに関して•CCLearner，ASTNN
T3やT4のCCで学習しても，T1やT2は正確に検出出来るが，T3やT4の検出精度が低い→ 検出されたCCが正確か確認する必要

31
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University考察（2/2）
3つのRQから考えられること

3. 学習と適⽤対象の類似に関して••

CodeBERT，ASTNN
適⽤対象に類似するデータを作成し，学習することで検出精度を⾼められる→ 適⽤対象に類似した学習データを作成する⽅が良い

CCLearner
適⽤対象に類似するデータを作成しても検出精度を⾼めることはできない

32
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

まとめ深層学習を⽤いたCC検出器の汎化性能を分析

1. 深層学習を⽤いたCC検出器にも，汎化性能の問題があること
2. 学習と異なるベンチマークに対する精度は，CCLearner，ASTNNではCCのタイプと関係が強く，CodeBERTではCCのタイプと関係が弱い
3. ASTNN，CodeBERTは，検出対象に類似するデータで学習することで検出精度が上がる

今後の課題

OSSを基にした新たなベンチマークを作成し，OSSを基にしたベンチマーク同⼠で調査
33

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University