深層学習-後編2 -軽量化・高速化技術


ラピッドチャレンジで学習したことを忘れないように残そうかと。

軽量化・高速化技術

分散深層学習

深層学習は多くのデータを使用したりパラメータ調整に多くの時間を使用する。
高速な計算が必要。
そのため、下記要素が必要。

  • データ並列化
    データが大きいときに適用すると良い。

  • モデル並列化
    モデルが大きいときに適用すると良い。
    パラメータ数が多いほど、スピードアップ効率も向上する。

  • GPUによる高速技術

データ並列化

  • 同期型
    各ワーカー(計算資源)の計算が終わるのを待ち、全ワーカーの勾配が出たところで勾配の平均を計算して親モデルのパラメータを更新する。

  • 非同期型
    各ワーカーはお互いの計算を待たず、各子モデルごとに更新する。
    学習が終わった子モデルはパラメータサーバにpushされ、新たに学習を始める時は、パラメータサーバから pop したモデルに対して学習していく。

非同期型は処理のスピードが早い。
ただし、最新のモデルのパラメータを利用できないので、学習が不安定になりやすい。

同期型の方が精度が良い。
現在の主流は同期型。

モデル並列化

親モデルをワーカーに分割し、それぞれのモデルを学習させる。
全てのデータで学習が終わった後で、一つのモデルに復元する。

パラメータ数が多いモデルの方が効果が高い。

GPUによる高速化

  • GPGPU (General-purpose on GPU) いずれもDeep Learningフレームワーク(Tensorflow, Pytorch)で実装されているので、使用する際は上記を指定すれば良い。 開発環境は下記がある。
    • CUDA
    • OpenCL (あまり使われてない)
  • CPU
  • GPU

モデルの軽量化

モデルの精度を維持しつつ、パラメータや演算回数を低減する手法。
計算の高速化や小メモリ化を行う。
手法は下記。

量子化

64bit浮動小数点を 32 bit など下位の精度に落としてメモリと演算処理を削減する。
- 計算の高速化
- 省メモリ化

重みを浮動小数点のbit数を少なくして有効桁数を下げるとメモリの使用を抑えられる。
一般的に浮動小数点は小数点部分のビットを増やす。
少数部分のビット数を減らすと精度が落ちるけど、必要なビット数が少なくなって、計算量もへる。
桁数が小さくなるが、実際の問題では単精度(16bit)で十分と言われている。
精度が落ちても高速化した方がメリットがある。

蒸留

精度の高いモデルはニューロンの規模が大きなモデルで、推論に多くのメモリと演算処理が必要。
規模の大きなモデルの知識を使って軽量なモデルの作成をする。

教師モデルと生徒モデル

教師モデルの重みを固定し、生徒モデルの重みを更新していく。
誤差は教師モデルと生徒モデルのそれぞれを使って重みを更新する。

  • 教師モデル
    予測精度の高い、複雑なモデルやアンサンブルされたモデル。
    重いが性能が良い。

  • 生徒モデル
    教師モデルを元に作られる軽量なモデル。
    軽くてほどほど性能が良い。

プルーニング

パラメータの全部が全部、寄与している訳では無い。
モデルの精度に寄与が少ないニューロンを削除することでモデルの軽量化・高速化を見込める。