ディープラーニング
vs ランダムフォレスト
中原 啓貴 (東京⼯業⼤学)
2017年9⽉24⽇
FPGAX@ドワンゴ
内容
• 背景
• Random forest (RF)
• RFをFPGA実装するには
• 実験結果
• RFをCPU, GPU, FPGAで実装した場合
• 他の機械学習、特にConvolutional Neural Network
(CNN)と⽐較した場合
• まとめ
2
機械学習
3
⼗分な計算資源とデータ+アルゴリズムの発展
(Left): “Single-Threaded Integer Performance,” 2016
(Right): Nakahara, “Trend of Search Engine on modern Internet,” 2014
機械学習の分類
M. Warrick, “How to get started with machine learning,” PyCon2014 4
研究背景
• ビッグデータと⼗分な計算資源
• ランダムフォレスト
• 歩⾏者検出
• セグメンテーション
• ⼈体姿勢推定
• 組込みシステムでの実現
• リアルタイム処理が必要→CPUは遅い
• 電⼒制約→GPUだと消費電⼒⼤
• FPGA上に短期間に優れたランダムフォレストを実装す
るには︖
• HDL⼿書き設計は限界
5
FPGA+⾼位合成
• 実⽤的な⾼位合成ツールの普及
• Xilinx社: Vivado HLS, SDxシリーズ
• Altera社: Altera SDK for OpenCL
• 先⾏事例
• gzip 圧縮を1か⽉で完成, ⼿書きHDLと⽐較して
90%程度の性能
• ファミコン(NES)を1週間で完成, ⼿書きHDLは
3か⽉, リアルタイム動作達成
• ⼿書きHDLより10倍以上短い期間で開発
• (個⼈的な経験では)性能, ⾯積は⼿書きHDLと
⽐較して8割程度は容易に達成可能
6
⽬的: FPGA+⾼位合成で⾼性能な
ランダムフォレストを実現する⼿法の開発
Random Forest
7
分類⽊ (Decision Tree)
• 特徴マップを分類する, 弱学習器といわれる
1.00
0.53
0.29
0.00
0.09
0.63
0.71
1.00
C1
C2 C1
C
1
C2 C1
X1
X2
X2<0.53?
X2<0.29? X1<0.09?
X1<0.63? X1<0.71?
Y N
N
NN
NY
Y
Y
Y
C1
C1C2 C1C2
C1
8
分類⽊の学習
• ランダムにサンプリング
• エントロピーが最⼤になるように再帰的に分割
9
1.00
0.53
0.29
0.00
0.09
0.63
0.71
1.00
C1
C2 C1
C
1 C2 C1
X1
X2
X2<0.53?
X2<0.29? X1<0.09?
X1<0.63? X1<0.71?
Y N
N
NN
NY
Y
Y
Y
C1
C1C2 C1C2
C1
バイアスとバリアンス
• バイアス→モデルの単純さによる誤差
• バリアンス→学習データの違いによる誤差
10
バイアス︓⼤ バイアス︓⼩
バイアスとバリアンス
11
バイアス︓⼤
バリアンス︓⼩
バイアス︓⼩
バリアンス︓⼤
• バイアス→モデルの単純さによる誤差
• ノイズに強いが, 複雑な表現はできない: SVM, 最⼩2乗法
• バリアンス→学習データの違いによる誤差
• 過学習しがち, 複雑な表現可能: Neural Network, 決定⽊
→集団(アンサンブル)学習によりバリアンスを下げる
Random Forest (RF)
• アンサンブル学習の⼀種
• 複数の分類⽊(弱学習器)で構成
• クラス分類と回帰が可能
12
Tree 1 Tree 2 Tree n
C1
C2
C1
Voter
C1 (Class)
InputX1<0.53?
X3<0.71? X2<0.63?
X2<0.63? X3<0.72?
Y N
N
NN
NY
Y
Y
Y
C1
C1C2 C1C3
C1
Tree 1
Binary Decision Tree (BDT) Random Forest
...
RFのアプリケーション
• Key point matching [Lepetit et al., 2006]
• Object detector [Shotton et al., 2008][Gall et al., 2011]
• Hand written character recognition [Amit&Geman, 1997]
• Visual word clustering
[Moosmann et al.,2006]
• Pose recognition
[Yamashita et al., 2010]
• Human detector
[Mitsui et al., 2011]
[Dahang et al., 2012]
• Human pose estimation
[Shotton 2011]
13
Random Forest を FPGA に実装
14
FPGA (Field Programmable
Gate Array)
• Reconfigurable architecture
• Look-up Table (LUT)
• Configurable channel
• Advantages
• Faster than CPU
• Dissipate lower power
than GPU
• Short time design
than ASIC
15
PythonでRF
16
• Scikit-learnを使うだけ︕簡単︕
オブジェクトを宣⾔
学習
推論
開発したツールフロー
Off‐line learning by scikit‐learn (software)
Training
Dataset
scikit‐learn
Hyper
Parameter
(by Grid‐
search)
Random
Forest
Host
Code
Kernel
Code aocx
Binary
Host
PC
FPGA
Board
aoc
gcc
RF2AOC
17
(論⽂がアクセプトされれば)Xilinx版を近⽇公開予定︕
scikit-learn を使ったコード⽣成
• 内部のデータ構造にアクセス→再帰的にコード⽣成
18
Tree 1 Tree 2 Tree n
C1
C2
C1
Voter
C1 (Class)
Input
...
len(model.estimators_) … ⽊の個数
model.estimators_[i] … i番⽬の⽊にアクセス
以降, tree = model.estimators_[i] として
tree.tree_.children_left
tree.tree_.children_right
→⽊の⼦ノードにアクセス, 再帰的に
アクセス可能
tree.tree_.threshold … 現時点のしきい値
tree.tree_.feature … ⽊の⼊⼒変数リスト
tree.tree_.value … 認識したクラスインデックス
⽣成されたコード
• if-then-else形式で出⼒
19
Tree 1 Tree 2 Tree n
C1
C2
C1
Voter
C1 (Class)
Input
...
フルパイプライン化
Tree 1 Tree 2 Tree b
C1 C2
C1
Voter
C1
X (Input)
...
20
マルチプレクサベースの実現
21
システムデザインツールの利⽤
22
①
②
④
③
1. Behavior design
+ pragmas
2. Profile analysis
3. IP core generation by HLS
4. Bitstream generation by
FPGA CAD tool
5. Middle ware generation
↓
Automatically done
短精度整数演算
float X1, X2;
(set inputs)
result = tree(X1, X2);
__kernel int tree( 
__global const float X1, 
__global float X2){
(fetch inputs)
if( X2 < 0.53){
if( X2 < 0.29){
return C1;
} else {
if( X1 < 0.63){
return C2;
} else {
return C1;
}
}
...
int X;
(set inputs)
result = tree(X & 0x3FFF, 
(X >> 16) & 0x3FFF);
__kernel int tree( 
__global const int X1, 
__global int X2){
(fetch inputs)
if( X2 < 4341){ // 0.53*213
if( X2 < 2375){ // 0.29*213
return C1;
} else {
if( X1 < 5160){ // 0.63*213
return C2;
} else {
return C1;
}
} ..
Host
Program
Kernel
Program
23
短精度ビット⻑と分類精度
0.0
5.0
10.0
15.0
20.0
25.0
30.0
35.0
40.0
45.0
6 7 8 9 10 11 12 13 14
Misclassification Rate [%]
n‐bit Fixd Point Precision
Dermatology
Arrhythmia
Contraceptive Method Choice
Glass Identification
Hayes‐Roth
Hepatitis
Ionosphere
Iris
24
分類⽊の実現
X1
X2
c1 c2
c3
X2
c4 X3
c5 c6
Tree1 Tree2
X1
X2
X2
X3
c3
c1 c2
c4
c5   c6
Tree1 Tree2
25
時分割によるリソース共有
__kernel int RF( 
__global float X1, X2, X3){
(fetch inputs)
for( int i = 0; i < 2; i++){
if( i == 0) class = tree1(X1,X2,X3);
else class = tree2(X1,X2,X3);
voting[class]++; // voter
}
}
..
X1
X2
X2
*
c1 c4
Voter
*
X3
c2 c4
c3 c5 c3 c6
26
ループ展開による
スループット向上
__kernel int RF( 
__global float X1,X2,X3){
(fetch inputs)
#pragma unroll 2
for( int i = 0; i < 2; i++){
if( i == 0) class = tree1(X1,X2,X3);
else class = tree2(X1,X2,X3);
voting[class]++; // voter
}
}
..
X1 X2 X3
c3
c1 c2
c4
c5   c6
Voter
Voter
Register
27
実験結果
28
実験⽅法
Pre‐learned
Random
Forest
C‐
Code
CUDA
Code
Binary
Binary CPU
GPU
Cython gcc
CUDAT nvcc
Binary Host
PC
29
他のプラットフォームとの⽐較
• Implemented RF following devices
• CPU: Intel Core i7 650
• GPU: NVIDIA GeForce GTX Titan
• FPGA: Terasic DE5-NET
• Measure dynamic power including
the host PC
• Test bench: 10,000 random vectors
• Execution time including
communication time between
the host PC and devices
30
GPU
FPGA
GPU, CPUとの⽐較
31
GPU@86W
GeForce Titan
CPU@13W
Xeon (R) E5607
FPGA@15W
Stratix V A7
Name LPS LPS/W LPS LPS/W LPS LPS/W
Dermatology 336.2 3.9 211.6 16.3 3221.2 214.7
Contraceptive 
Method
521.9 6.1 286.4 22.0 10924.3 728.3
Glass 
Identification
726.7 8.5 587.5 45.2 6442.3 429.5
Hayes‐Roth 1512.9 17.6 1165.5 89.7 12884.6 859.0
Hepatitis 739.1 8.6 662.7 51.0 8209.9 547.3
Ionosphere 821.0 9.5 595.9 45.8 9663.5 644.2
Iris 446.6 5.2 436.7 33.6 4831.7 322.1
LPS: 1秒間に検索できるデータ数
FPGAに適した計算法
• ×ホストやオフチップメモリを頻繁にアクセス
• GPUやCPUと⽐較して帯域が1桁狭い
• ○外部I/Oやオンチップメモリを利⽤
FPGAFPGA
||||||||
DDRDDR
DDRDDR
I/OI/O I/OI/O
FPGAFPGA
||||||||
DDRDDR
DDRDDR
I/OI/O I/OI/O
ADC
RAM
ここに依存するアプリだと負け 32
プログラミングモデルの違い
33
D1 D2 D3 D4 D5
↓ ↓ ↓ ↓ ↓
CC CC CC CC CC
↓ ↓ ↓ ↓ ↓
広帯域
DDR4/DDR5 DDR3
HW1 D1 D2 D3 D4
HW2 D1 D2 D3 D4
HW3 D1 D2 D3 D4
HW4 D1 D2 D3 D4
狭
帯域
GPU FPGA
• 均⼀な演算を空間的に並列実⾏
• 均⼀な演算器
• ワープダイバージェント (if⽂ダメ)
• 帯域・動作周波数が⾼い
• 特定な演算を時間的に並列実⾏
(要はパイプライン︕)
• カスタマイズした演算器
• 帯域・動作周波数は低い
他の識別器との⽐較
34
ディープニューラルネットワークと
⽐較して
• ⼩規模データのタスクに適⽤可能
• 短時間学習
• 強⼒な計算機環境不要
• ローカル(エッジ)での学習可能
• ハイパーパラメータのチューニング不要
• FPGAで⾼性能を発揮できるデータ構造
35
Deep Forestへ拡張
• Sliding Window + Cascaded Forestの組合せ
36
Z.H.Zhou, J.Feng, “Deep Forest: Towards An Alternative to Deep Neural 
Networks,”arXiv:1702.08835, [v2] Wed, 31 May 2017.
データセットを⽤いた認識率の⽐較
• MNIST(⼿書き⽂字)データセットの認識率
• ORL(顔認識)データセット
37
データセットが少ないため
データセットを⽤いた認識率の⽐較
(続)
• 画像認識CIFAR10 (10クラス5万枚学習)
38
SOTAなCNN
CNNとRandom Forestの⽐較
• 認識率
• データセットが少ない場合: RF(というかCNNはダメ)
• 単純(スパース)なデータセット: ほぼ同等の認識率→MNISTはここ
• ⼤量のデータセット: CNN
• (MNISTでの)学習時間
• RF: CPUで約5分(中原所有のノートパソコン, Thinkpad X1 Cardbon)
• CNN(LeNet5): GPU Titan X (Pascal)で約5分
• (MNISTに必要な)ハードウェア量
• RF: 18706 LUTs, 42982 FFs, 175 18Kb BRAMs
• CNN: 34419 LUTs, 33029 FFs, 115 18Kb BRAMs
• (MNISTの)推論時間
• RF: 約5000 FPS@100MHz, Zedboard使⽤時
• CNN: 約200 FPS@100MHz, Zedboard使⽤時
39
データセット次第ではCNNよりも同等なHW・認識精度で25倍⾼速
まとめ
• Random ForestをFPGAで実装
• DNNよりも(少ないデータセットで)⾼速に学習
• Scikit-learnを使った学習・コード⽣成
• FPGAで性能を発揮できるデータセット
• ヘテロジニアスなパイプライン
• GPUが苦⼿とする構造
• Xilinx SDSoC, Intel SDK OpenCLを使ったお⼿軽実装
• Deep Forestの紹介
• RFよりも認識性能は上だが、コストに⾒合うかは疑問
• No Free Lunch TheoremはHWから⾒ても真でした
→あらゆる問題で性能に優れる万能な機械学習HWは存在しない
とはいうものの… 40

(公開版)FPGAエクストリームコンピューティング2017