ミニバッチ単位の学習
学習は、入力画像ごとに行うのではなく、数10~数100画像をまとめて処理を行うと、畳み込みの計算が行列×ベクトルではなく、行列×行列の形になり、演算あたりのメモリアクセス回数を減らせるので、計算を高速に行うことができる。この入力画像のまとまりはミニバッチと呼ばれる。
そして、ミニバッチ単位で計算を行なう場合は、それぞれの学習画像から求めた重みWの補正を行うのではなく、ミニバッチの全画像の補正量の平均値を使用するという計算が行われる。
積和演算や行列積の計算はGPUの得意な計算で、Kryzhevsky等がGPUを使って推論や学習を高速に行おうとしたのは当然で、これ以降、ILSVRCではディープラーニングとGPUの使用が一般化した。
推論は低精度でも十分
一方、画像にしろ、音声にしろ、元々アナログ量であり、それほど高い精度を持つデータではない。また、多数の入力画像を学習するので、偏りさえ無ければ、それほどの計算精度は必要ないという考えも成り立つ。実際に適用して見ると、半精度の16ビット浮動小数点演算でもOKで、正規化は必要なものの、8ビット精度の整数演算でも、性能の低下は僅かであると報告されている。
次の図9-4は、Hot Chips 28でのDeePhiのSong Yao氏の発表スライドの引用であるが、「VGG-16」、「GoogLeNet」、「SqueezeNet」の3種のDNN(Deep Neural Network)について、単精度の浮動小数点数(FP32)での計算(ORIGINAL)と、16ビット精度の整数FIXED-16と8ビットの整数FIXED-8でのTop1とTop5の正解率を示している。Top1は一番スコアが高かった答えが正解であるパーセンテージ、Top5はスコアが上位5位までの中に正解が含まれているパーセンテージである。そして、RAWは単純に計算精度を下げた場合の認識率、RE-TRAINは低精度の推論を使って再度学習をやり直したものである。
これを見ると、FIXED-8はGoogLeNetでは認識率の低下が大きいが、他のネットワークではほとんど認識率は変わらず、逆に認識率が向上しているケースも存在する。
図9-4 FP32とFIXED-16、FIXED-8ビット計算の認識精度の比較。VGG16、GoogLeNet、SqueezeNetの3種のネットのTop1とTop5の正解率 (出典:Hot Chips 28でのDeePhiのSong Yao氏の発表スライド) |
図9-5はFP32とFIXED-8の比較で、左の犬の写真は3種のネットともに、FP32でもFIXED-8でもShetland Sheepdogが1位となっている。また、2位もCollieで一致している。3位はBorzoiが多いが、SqueezeNetはFP32ではBorder Collie、FIXED-8ではPapillon となっている。ここまで犬種を見分けるのは、人間でも愛犬家でないと難しい。
右は2つの写真で対象物の存在する範囲を認識するタスクで、FP32では0.983という高スコアがFIXED-8では0.780と自信レベルが下がっているが、赤枠で表示された認識した範囲は大差ない。
NVIDIAのPascalアーキテクチャのP100 GPUは16ビットの半精度浮動小数点演算(FP16)をサポートしている。FP16演算器は、32ビットのレジスタファイルに2個のFP16データを入れ、2つの積和演算を同時に実行するので、単位時間当たりの演算性能が倍増する。また、各入力の重みなどを記憶するGPUメモリも半分で済み、その分、2倍大きなネットワークを処理することができるようになる。
P100 GPUは、8ビット整数演算はサポートしていない。しかし、数カ月後に発表されたP40とP4 GPUでは、FP16 に加えて8ビット整数のINT8での積和演算をサポートしている。INT8でも十分という論文が出始めて、慌ててINT8サポートを追加したように見える。
INT8では、32ビット幅のGPUレジスタに4つの値を格納することができ、1命令でS+I0×W0+I1×W1+I2×W2+I3×W3を計算してくれる。FP16は2倍の性能で、半分のメモリであったが、INT8では4倍の性能で1/4のメモリで済む。
図9-4、9-5に見られるようにFIXED-8での計算でも認識率の低下は比較的小さく、4倍の計算ができるので、同じ推論ならば1/4の時間で実行できることになる。これはWebサービスならば、同じサーバ台数で4倍のユーザをサポート出来、サービスの単価を下げられる。また、自動運転のカメラ画像の認識であれば、1/4の時間で同じ認識ができる事になるので、非常に有効な機能である。
また、GPUの場合は図9-2のようなニューラルネットワークは、プログラムで論理的に作られているのに対して、FPGAでデータの流れに沿ってニューロンの配置を最適化した方が少ない消費電力で高速に演算することができるという考えもあり、現在では、GPU派とFPGA派が存在するという状況になっている。
なお、学習はFP32で行うケースが多い。SGDは収束法であり、FP16でもダメということは無いが、計算誤差が多くなると、収束しなかったり、収束に必要なループ回数が増えるという。このように、学習にどれだけの計算精度が必要かについては、まだ、研究が行われている状況である。