#1. 深層学習の軽量化・高速化技術
深層学習を実際に商用利用しようと思うと、軽量化、高速化をしないと利用できない。
深層学習は、毎年、10倍のいきおいで、モデルの大きさ、データの量が大きくなっている。
しかしこの速度は、HWの性能向上の勢いを追い越してしまっている。
そこで、軽量化、高速化、分散処理化が必要になっている。
- データ並列化(複数PCで並列処理)
- モデル並列化(複数コアで並列処理)
- GPU高速化
- 量子化
- 蒸留
- プルーニング
#2. データ並列化
データ並列には2種類のやり方がある。
- 同期型
- 非同期型
同期型は、各子モデルに勾配を計算させて、終わったら、親モデルがまとめて勾配平均をとってパラメータ更新をし、その結果をまた各子モデルに勾配を計算させる。親モデル、子モデルの垂直統合モデルで、完全同期で処理をするやり方である。割と精度が良い結果がでる。
非同期型は、パラメータサーバに、各子モデルが計算した学習済みモデルを保存する。そして、各子モデルが学習するさいには、パラメータサーバにある最新の学習済みモデルを使って学習をする。これを繰り返すやり方である。しかし、タイミングによって、最新学習モデルが次々更新されるとは限らないので、結果が不安定になりやすい。
#3.モデル並列化
大きなNNの場合、モデルをいくつかに分割して、それを各ワーカーで並列処理することが可能である。
そんなことが出来るのか?という気はする。モデルを途中で切ると、入力するデータは?
実際には、途中で枝分かれするようなモデルを並列化することが多い。
しかし、モデル並列をネットワーク上で分散すると、データ統合処理に結局時間がかかるので、1台のPC上での並列となることが多い。
#4. GPU高速化
CPUで処理させずに、GPUで計算させて高速化を図る。
NNの計算は行列演算だらけなので、GPU計算には合っている。
なお、GPU使うにはCUDAを使うことになるが、Tensorflowが勝手に使ってくれる。
#5. 量子化
処理の軽量化の手法の一つとして、量子化がある。
量子化とは、64bit浮動小数点の重みwの情報を、32bit浮動小数点に精度を落とすことで、メモリ使用量、演算負荷の削減を行うことをいう。
単純に情報を保存するメモリ領域が削減され、さらに、計算対象の桁数が減ることで、計算の高速化(計算量の削減)が可能になる。
なお、機械学習で利用するには、16bitで十分であるので、量子化は高速化には十分有効である。
#6. 蒸留
Knowledge Distillation、Hint Training。
処理の軽量化の手法の一つとして、蒸留がある。
蒸留とは、精度の高い複雑で大きなモデル(教師モデル)から、性能の近い軽量で小さいモデル(生徒モデル)を作ることをいう。
生徒モデルを学習するさいに、教師モデル(重み固定)も一緒に学習させて、教師モデルの誤差に合わせるように、生徒モデルの学習をさせる。
#7. プルーニング
モデルの軽量化の手法としてプルーニングがある。
大きなNNが出来たとき、いくつかのニューロンは、何も寄与していない場合がある。この時、この寄与していないニューロンを削減して、パラメータを減らし、モデルの圧縮を行うことを、プルーニングという。
具体的には、重みが0に近い(閾値以下の)ニューロンを削減してしまう。
さらに、一回消すと、出力になにも寄与しないニューロンが出てくるので、これも削減することが可能である。
これで半分以上削減が出来るらしい。