研究室のゼミでニューラルネットワークの結果が出てきた時、なんとなくみんな思うことがあります。

こんなに精度いらないんじゃ・・・

ちょっと調べたんですが、これはみんな思っていることみたいですね。

1.5655364990234375

長ったらしい少数点を見て無駄だなーーと思う。

体感としては小数第四位ぐらいで十分なんですよね。しかも、うちはガチの神経から得たデータ使ってるんでノイズが入ってて第二位位から意味ない。

で、もっとビットを減らそうという話に決着を付けたいので、検証してみることに・・・。

この結果ってちょっとCPUとかGPUの構造を理解している人なら結果が見えていると思います。多分あなたが思ったとおりです。

 

 

検証結果

 

numpyでそのまま定義した場合とfloat16とfloat128とcudaで速度を比較しました。

cpuはXeon E5-2640でGPUはGTX 750 TIです。そこそこの性能ですが、並列処理してないのでCPUの恩恵は少ないと思います。

タスクはn*n行列の行列積

t1 = time.time()
a = np.random.rand(n, n).astype("float16")
b = np.random.rand(n, n).astype("float16")
c = np.dot(a,b)
t2 = time.time()
print(t2-t1)

コードはこんなん

n
nomal 64
16
128
cupy
100
0.04214
9.7454
3.6219
0.0005
1000
0.04245
10.806
3.0694
0.0005

で、わかったことはビットに関しては普通に指定しないほうが一番早いとうこと。

まぁ、CPUが64ビットなんだから当たり前ですよね。

きっと、型を指定すると、計算は64ビットでしてその後にいろいろ余計なことをしているんだと思います。

ちょっと調べたんですがgoogleのディープラーニング専用プロセッサTPUはビットのことも考慮して、8ビットで動かすこともできるそうです。

つまらない結果ですね。

 

それでは。