[Survey]Deep Learning with Limited Numerical Precision

[Deep Learning with Limited Numerical Precision](http://arxiv.org/pdf/1502.02551.pdf)

Deep Learningを固定小数点(**Fixed Point**)演算で行った時の精度と性能の検証及び**FPGA**での実装に関する論文。

論文では16bit Fixed Point演算で32bit Floating Pointと同等の性能を達成している。

Fixed pointのメリットは、
・Floating Pointに比べて**高速**に演算ができ、**H/W Cost**が少ない
・**メモリの消費**を抑えられる（16bit Fixed Pointと32bit Floating Pointとの比較での話）

# 固定小数点の表記
論文で使用している表記は以下の通り

Fixed Point = [QI.QF]
**QI** ... integer
**QF** ... fractional part 

**IL** ... # of integer bits
**FL** ... # of fractional bits
**WL** ... word length  WL = IL + FL

Fixed Pointの表記は**\<IL, FL\>**を使用

固定小数点の値の幅は
$[-2^{IL-1}, 2^{IL-1}-2^{-FL}]$

例えばIL=8, FL=8の時
$[-2^7, 2^7-2^{-8}]$

範囲の最大値の意味は$2^７$から小数の最小値$2^{-8}$を引いたということ。

# Rounding Mode
固定小数点計算の場合に四捨五入（Round）の扱いが問題になる。

四捨五入は２つのModeで検証した

## Round-to-nearest
普通の四捨五入
ここで$\epsilon=2^{-FL}$のこと
~~$\lfloor x \rfloor$は$x$を超えない最も近い整数値~~
$\lfloor x \rfloor$は$x$以下の$\epsilon=2^{-FL}$を整数倍した値
$FL=1$のとき$\epsilon=0.5$なので
$x=1.75$だったら$\lfloor x \rfloor=1.5$
$x=1.8$だったら$\lfloor x \rfloor=2.0$
になる。

![範囲を選択_190.png](https://qiita-image-store.s3.amazonaws.com/0/100523/f48ba3aa-54a3-143c-6146-ad966d17fd26.png)

## Stochastic rounding
ramdomでどっちにするか決める。その時の確率は$x$と$\lfloor x \rfloor$の差を$\epsilon$で割ったもの。

![範囲を選択_191.png](https://qiita-image-store.s3.amazonaws.com/0/100523/e947dc7f-f1d1-719e-070d-7016bb47e62f.png)

# Convert ( clipping)
値が範囲外だった時の処理
最小値以下だったら最小値に、最大値以上だったら最大値にする。
![範囲を選択_192.png](https://qiita-image-store.s3.amazonaws.com/0/100523/e9c793f4-729d-fa22-121f-52d807b1689d.png)

# Multiply and accumulate(MACC) operation

要素毎に掛け算して、総和を取る演算

```math
z=\sum_{i=1}^d a_ib_i
```

２つの値の掛け算後の値は\<2*IL,2*FL\>になる。毎回四捨五入すると精度が落ちるので、専用のTemporal Registerを使って演算する。
必要なビット精度は、$log_2d+2WL$

# 性能評価
## MNIST
Networkの構造、学習パラメータは以下の通り
・2 hidden layer
・1000 unit ReLU
・training image 60,000, test image 10,000 28x28 
・imput data range [0,1]
・data augmentatoinなし
・weight N(0,0.01)、bias 0 で初期化
・minibatch size 100
・SGD

Round to nearestだとFL=８，10,12で劣化が見られる。
パラメータがほとんど０になっているのが原因とのこと。
Stochastic roundingだとFL=8でも大きな劣化が見られない。
![範囲を選択_187.png](https://qiita-image-store.s3.amazonaws.com/0/100523/57f4449c-a9a3-3321-7e7a-2733fbe3c6f9.png)

## CNN
・MNIST
・2 convolutional layer
・5x5 filter
・ReLU
・first layer 8 feature maps, second layer 16 feature maps
・max pooling 2x2 non-overlapping
・fully connected layer 128 ReLU
・10-way softmax
・exponentially decreasing learning rate 0.95/epoch
・first learning rate 0.1
・Momentum 0.9
・weight decay 0.0005
・SGD

Stochastic roundingだとFL=12,14でFloatingと同じぐらいの性能

![範囲を選択_188.png](https://qiita-image-store.s3.amazonaws.com/0/100523/150f883a-5a77-52f3-8f03-acd22e0bdbee.png)

## CIFAR-10
・training image 50,000, test image 10,000 RGB image 32x32 
・input range [0,1]
・data augmentationなし
・3 convolutional layer
・5x5 fiter 64 feature maps
・max pooling 3x3 stride = 2
・learning rate 0.01 epoch 50, 75, 100 の時に1/2


Stochastic roundingだとFL=14でFloatingと同じぐらいの性能
![範囲を選択_189.png](https://qiita-image-store.s3.amazonaws.com/0/100523/a8a53ebf-6778-4b2c-6027-0f2ccbdc2e02.png)

# Hardware Prototyping
Xilinx Kintex325T FPGA, 8 GB DDR3 memoryで実装したとのこと。
性能は37Giga ops/s/W　（opsはoperations, Wはワット 1秒間１Wの時のOperation回数）
NVIDIA GT650m, GTX780だと1-5 G-ops/s/Wとのこと。

実装の詳細は論文参照してください。

#最後に
Round to nearestに比べてStochastic roundingがいいのは、おそらく四捨五入の結果が確率的に変わるので値がRound to nearestよりは0になりにくいのがいいのでしょうか？
今だとNVIDIAのCUDAが16bit floating pointをサポートしているので、それと比較するとメモリの節約効果はあまり無い気がする。
ただ固定小数点と浮動小数点ではH/W Cost＆演算速度が異なるので、そのへんはメリットがあるかも。
モデルごとに必要な精度が異なるのがネックになりそう。