背景
アプリ等にデプロイされている多くのモデルは、リアルタイムだったり、可能な限り早い推論速度が求められます。その場合、リアルタイムな推論ができるインフラを構築したとしても、モデルそのものの推論速度が遅ければ、あまり意味がありません。
モデルが推論結果を出力するのが遅い場合、主に三つアプローチがあります。
- モデルを小さくする
- もっと早く推論させるようにする
- 早い推論ができるようにハードウェアを変える
今回は、1番目のモデルを小さくする「Model Compression(モデル圧縮)」について共有します。
Model Compression(モデル圧縮)
元々「Model Compression(モデル圧縮)」は、Edge端末にモデルを載せるために行われていましたが、基本的にモデルを小さくすると推論速度も向上するため、推論速度向上が目的の時でも使われるようになっていったそうです。
「Model Compression(モデル圧縮)」では、以下の4つがメインで使われている手法です。
- Low-Rank Factorization
- Knowledge Distillation
- Pruning
- Quantization
手法1. Low-Rank Factorization(低ランク行列分解?多分笑)
難しそうな名前をしていますが、やっていることは、扱っている高次元のテンソルを低次元のテンソルに置き換える作業をしているだけです。
Ex. 1 SqueezeNet
3x3の畳み込み層を1x1に変えたりしたことで、AlexNet並みの精度をパラメータ数1/50で実現
Ex. 2 MobileNet
一般的な(KxKxC)の畳込み層を、(KxKx1)及び(1x1xC)に分解することで、元のパラメータ数が、(K^2*C) だったのに対して、分解した後は(K^2+C)となります。
仮に3x3x10の畳み込みをする場合(3x3のフィルターで10個featuremapを作成)、元のパラメータ数は90、分解後は19となります。既に元のパラメータ数に対して2割程度になるまで抑えられています。
手法2. Knowledge Distillation(蒸留)
「Knowledge Distillation(蒸留)」とは、元のモデル(「"親"モデル」)から知恵を"蒸留"(抽出)して、サイズを小さくした「"生徒"モデル」を学習させる手法です。
3つのKnowledge
「"生徒"モデル」は、「"親"モデル」から主に三つの知恵を”蒸留”します。
1. Relation-Based Knowledge
中間層・出力層の知恵に加えて、各featuremapがどのような関係性を持っているのかの情報を用いて「"生徒"モデル」の学習を促進。
2. Response-Based Knowledge
「"生徒"モデル」が「"親"モデル」の出力をまねるという前提を元に、それぞれの最終層同士を比較。
3. Feature-Based Knowledge
特徴量を捉える中間層を用いて「"生徒"モデル」の学習を促進。
手法3. Pruning(枝刈り)
Neural Networkを使用する際、多くのケースで、重みのほとんどは無意味だと言われています。つまり、ほしい出力結果に影響を及ぼす重みはかなり限られていることになります。不要な情報を排除しようと試みているのがPruningです。
Pruningは主に二つアプローチがあります。
1. Unstructured Pruning
不要な重みを消す手法。全結合しているNodeもあれば、過疎化しているものもある状態になります。
2. Structured Pruning
すべてのNodeが全結合するように、不要なNodeをすべて排除する手法。
手法4. Quantization(量子化)
最も一般的で頻繁に使用されている手法だと思われます。
Quantizationは、パラメータを表現するためのbit数を減らすことでモデルを小さくします。(因みに多くのモデルのデフォルト値は,floatの32bitsを使用しています。)
例として、あるモデルが1億個パラメータがあってかつfloat32bitsを使用する場合は、保管するのに400MBも容量が必要です。これを16bitsに変えるだけで容量が半分になります。このように、とてもシンプルで且つ有効なため、多くの人に使われているのだと思います。
具体的な実装手法としては、主に三つあります。
1. Dynamic Quantization(ランタイム中の量子化)
ランタイム中に量子化を適用する手法。手間が一番かからないものの、一部のレイヤーしか量子化されないため精度の低下は比較的大きい。
2. Post-Training Quantization(学習後の量子化)
学習を終えた後のモデルに対して量子化を適用する手法。すべてのレイヤーに対して量子化が行われるため、DynamicQuantizationと比較すると精度の低下は抑えられる。
3. Quantization-Aware Training(学習中の量子化)
学習中に量子化をすることですべてのレイヤー対して量子化ができる上、三つの手法の中で一番精度低下が抑えられる。その分手間が一番かかる。
Writed by F.K(20代・入社3年目)