写真提供:マイナビニュース

写真拡大

●ディープラーニングの基本
ISC 2016においてドイツのフラウンフォーファー研究所のJanis Keuper氏が、「Deep Learning goes HPC」と題して発表を行った。ディープラーニングの処理とその並列化を理解する上で分かりやすいと思うので紹介する。

ディープラーニングは、基本的には、(画像の場合)入力イメージから特徴を抽出し、入力イメージをN次元の多次元空間の点にマッピングし、それを学習して、コーヒーマグとそれ以外が区別できるN-1次元(図では2次元に分布した点と1次元の分離線)の平面を見つけることである。しかし、数学的に安定な特徴量の抽出は非常に難しく、この部分はエキスパートの人間が行っているという。

そして、Feature ExtractionとLearningの部分は、多層のニューラルネットワークを最適化することで実現されている。

次の図に示す、顔の認識の例では、第1層ではエッジを検出し、第2層では特徴的なパーツを認識し、第3層ではオブジェクトを認識しており、この部分が特徴の抽出を行っている。そして、その後は全対全接続のネットワークでイメージのクラス分けを行っている。

同じものを意味する入力(例えば犬)の中での個々犬の入力に違いがあっても、犬と安定に認識できるように学習するためには、大量の入力データが必要となる。そして、大量のデータを学習するには強力なコンピュータが必要となる。

ディープニューラルネットワークの形態としては、畳み込み(Convolution)型のネットワーク、ループを含んだRNN(Recurrent Neural Network)やLSTM(Long short-term memory)などがある。これらのループを含んだネットワークは、スピーチなどの時系列のデータの理解に使われている。

ニューラルネットワークは、ニューロン、フィルタ、正規化などの計算ブロックからなる層を重ねた多層構造で作られ、個々の入力に対する認識誤差を出力から入力側へと逆方向に伝えながら誤差が小さくなるように各層のニューロンの入力の重みを調整して行く。このプロセスは、Back-Propagationと呼ばれる。

このようなニューラルネットワークの記述と学習の記述を容易にするフレームワークが作られている。代表的なフレームワークとしては、Caffe、Torch、Theanoなどの大学が開発したものやGoogleのTensor Flow、IntelのIDLF、AmazonのDSSTNE、(なぜかMicrosoftのCNTKが入っていない)などがある。

フレームワークを動かすために、一般的に使われるハードウェアはワークステーションやブレードサーバで、2台〜8台のハイエンドGPUを装備したものである。残念ながら、学習に使われる確率的勾配降下法(Stochastic Gradient Descent:SDG)は、本質的にシーケンシャルな処理で、多数のサーバを使って高速化することができない。

●ディープラーニングがHPCに期待するもの
各ニューロンの各入力の重みを確率的勾配降下法で学習させて、例えば、コーヒーマグとそれ以外を区別できるように最適化して行く。その手順は、(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の何十年にもわたる困難な並列化と最適化のノウハウの適用で、ディープラーニングの計算を高速化することである。

マシンラーニングは、始まったばかりである。という。

(Hisa Ando)