各ニューロンの各入力の重みを確率的勾配降下法で学習させて、例えば、コーヒーマグとそれ以外を区別できるように最適化して行く。その手順は、(1)入力の重みWをランダムに初期化する。(2)学習データのサブセットX(ミニバッチと呼ぶ)を取り、(3)Xをネットワークに入力して出力を求め、(4)誤差(Loss)を計算する。そして、(5)各入力の誤差に対する影響(勾配)を計算し、(6)出力から入力方向に向かって誤差を伝播させて、(7)重みWを修正して行く。
そして、収束するまで、2から7を繰り返す。
この確率的勾配降下法の計算は、ネットワークのサイズにもよるが、非常に大きな行列の積の計算が必要であり、計算量が大きい。そして、ニューラルネットワークの層ごとに行列積計算が必要なので、層数を増やすと、それに比例して計算量が増える。また、ニューロンの数を増やすと積を計算する行列のサイズが大きくなって、計算量が増える。
加えて、学習データを増やすと、この計算の繰り返し回数が増えるので、計算時間が掛かることになる。
確率的勾配降下法は、時刻tの状態にd1という入力が入り、時刻t+1の状態になり、そこにd2という入力が入り、時刻t+2の筐体になるという、原理的に逐次型のアルゴリズムであり、並列化は非常に難しい。
高速化の方法としては、この基本アルゴリズム以外の部分の、重みの更新を早くする、一度に更新する重みの数を増やすという方法が考えられる。
更新を早くする方法としては、CuBlasなどの高速の行列計算ルーチンを使う、Cuda-CNNを使って畳み込みの計算を高速化するなどの手がある。
入力バッチを細分化して、それぞれを複数のワーカーに送って、並列にフォワードとバックワードの計算を行なわせ、計算した勾配をマスタに集める。そしてマスタは、すべての勾配データを使って、Wの更新を行い、更新されたW'をすべてのワーカーに送信する。このようにすれば、勾配を集めてWを更新する部分以外は並列化することができる。
しかし、勾配データのサイズはモデルのサイズと同程度で、モデルは数100MBの規模である。そして、GPUでの計算時間は1秒程度であるので、各ワーカーは数100MBの勾配データを1秒程度の時間で送る必要がある。マスタは、これのワーカー数倍のデータを受信し、同じ程度のサイズの更新したW'を各ワーカーに送り返す。それを各ワーカーが受け取るということを、1秒で行う必要があるので、ネットワークには非常に高いバンド幅が要求される。
ネットワークバンド幅の問題を軽減する1つの方法は、計算データの精度を下げることである。ディープラーニングは16bitの浮動小数点でも十分で、8bitでもうまく行くという報告もある。32bitのFP32の代わりに、半精度のFP16を使えばデータ量は半分、8bitなら1/4で済む。
また、疎行列表現を使ってモデルを圧縮するという手もある。必要な通信バンド幅の低減には、低精度計算と疎行列の使用が有効である。
処理を分散すると、行列の形が細長くなり、行列積の計算の効率が低下する。このため、より良い最適化アルゴリズムが必要と述べたが、ここでは具体的な方策は示されていない。
すべてのワーカーは大量のデータを必要とし、小さな単位のランダムなアクセスを頻繁に行う。したがって、強力な並列ファイルシステムが必要になる。
まとめとして、ディープラーニングがHPCに期待するのは、高速なインタコネクト、低精度浮動小数点計算のサポートを含めて、行列積計算の高速化、分散したデータアクセスを効率的に処理できる並列ファイルシステムである。
そして、HPCの何十年にもわたる困難な並列化と最適化のノウハウの適用で、ディープラーニングの計算を高速化することである。
マシンラーニングは、始まったばかりである。という。