深層学習day4 Section3:軽量化・高速化技術

要点まとめ

分散深層学習とは

深層学習は多くのパラメータを使用したり学習をしたりするため、高速な演算が求められる。 データ量・計算量は1年毎に10倍に増加している。一方、コンピュータは18ヶ月で2倍の性能にしかならない。 そのため、複数の計算資源を用いて並列的にニューラルネットを構成することで効率よく学習を行いたい。

その実現方法には様々な方法がある。

  • 複数のCPUを実装する。
  • 複数のコンピュータをネットワークで結合して学習に使用する。
  • CPUだけではなく、GPUやTPUを使用する。

複数の計算資源を活用するためにいくつかの工夫が必要になる。

データ並列化

親モデルを各ワーカーに子モデルとしてコピーし、それぞれの計算資源で勾配を計算させる。 複数の計算資源での勾配を親モデルに反映させる方法には同期型と非同期型がある。 同期型は、複数の結果を全て集めて平均を計算して親モデルのパラメータを更新する方法。 非同期型は、勾配の計算が終わったワーカーから各子モデル毎にパラメータサーバーにPUSHする。 次の学習はパラメータサーバーからPOPしたモデルに対して学習を行う。

非同期型は最新のモデルのパラメータを利用できないので、学習が不安定になりやすく、現在は同期型が主流。

モデル並列化

親モデルを各ワーカーに分割し、それぞれのモデルを学習させる。全てのデータで学習が終わった後で一つのモデルに復元。 モデル並列化をすると、ネットワークなどでデータ通信のオーバーヘッドがある。

モデルが大きいときはモデル並列化を行い、データが大きいときはデータ並列化をすると良い。

GPUによる高速化

CPUは非常に高性能で高速なコアが少数搭載されている。 GPUは比較的低性能なコアが多数搭載されている。 ニューラルネットの演算は単純な演算を並列で行えるGPUが向いている。 GPU上で並列演算を行うためのCUDAというプラットフォームがあり、NVIDIAGPUを使用できる。

量子化

通常のパラメータの64bit浮動小数点を32bit等の下位の精度に落とすことで、メモリと演算処理の削減を行う。 16bit浮動小数点にすると更にメモリの使用量を削減することができる。 更にbit数が少ないと演算速度も高速にできる。 32bit演算は64bit演算に比べて約倍の性能が出る。 しかし、計算精度に関してはbit数が減ると悪化する方向になる。

実際の機械学習では半精度の16bitでも実用上十分な精度が得られる。

蒸留

教師モデル(規模が大きく、予測精度が高いモデル)と、生徒モデル(規模が小さく、そこそこの精度のモデル)を用いて学習を行う。

教師モデルの出力からの差を誤差として生徒モデルの学習を行うことで、規模が小さくてもそれなりに良い性能を得られる。

プルーニング

ネットワークの規模が大きくなると、使われていない(重みが0に近い)箇所が存在する。 重みがある閾値以下のネットワークを削除することで、演算の速度を高速化する手法。

実装演習

動画上なし

確認テスト等考察

ニューラルネットワークは規模が大きくなるとメモリ量・演算時間的な問題が発生する。 そのため、量子化・蒸留・プルーニング等の技術を使って軽量化・高速化を図られていることを学べた。

追加演習