FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

CNTK Tutorialの計算ネットワークの仕組みを読み解く (2.1 - 2.2章)

最近仕事が忙しく徹夜続きになってしまっている。あまり趣味の実装が続かないのだが、とりあえず勉強のために読んでいる資料を読み解いていこう。

http://research.microsoft.com/pubs/226641/CNTKBook-20160121.pdf

この資料には、CNTKの使い方はもちろん、ニューラルネットワークの計算方法についてのアルゴリズムの解説も含まれている。これを読み解いていけば、CNTKの内部構造が分かるかもしれない。 今回は、この資料の第2章では何が書いてあるかを読み解いていく。また、図については、資料に入っているものを利用させて頂く (一部資料に追記させて頂いています)。

以下のやってみた日記は、機械学習初心者が書いているため、間違っている内容が含まれている可能性があります。 間違いがあれば、ご指摘頂ければうれしいです。

2.1 計算ネットワーク

ニューラルネットワークフレームワークわ作成するためには、与えられたネットワークをどのように計算するかのアルゴリズムを作成することが重要になる。 例えば、以下のOneHiddenLayerのニューラルネットワークは、上から順に計算していけばコンピュータで計算することができる。 このような各ステップを計算する手法を確立すれば、計算ネットワークを構築できる訳だ。

f:id:msyksphinz:20160207104206p:plain

このとき、OneHiddenLayerをネットワークで構築すると下記のようになる。上記の式を、そのままツリーにしただけだ。

f:id:msyksphinz:20160207105103p:plain

各ノードには、{計算ノード名、計算タイプ}が記述されている。このノードを順番に計算していけば、ネットワークを計算することができる。 上記のツリーを見れば分かるのだが、このツリーにはレイヤという概念が存在していない。ニューラルネットワークだったら、計算レイヤのようなものが存在しているのだが、CNTKの計算ネットワークにはレイヤが存在していない。 その代わり、自由にノード間の接続を構成することができる。例えば、図2.2のネットワークのように、同じ入力値が別のレイヤで2つ存在していたり、パラメートを共有して、図2.3のように構成することも可能になる。

(確かに、CNTKでネットワークを構成したときは、ネットワークの階層について考える必要は無かった。下記の記事も、実際にはネットワークを各レイヤで構成している訳ではなく、例えば[tex:{x2}]の計算では、レイヤを気にせずかなり自由にネットワークを構成している)

f:id:msyksphinz:20160207105731p:plain

2.2 ネットワークにおける前進計算(Forward Computation)

前進計算では、ネットワークの子ノードの方向から順に計算していく方式になる。上記のネットワークであれば、下側(子ノード)から順に計算していき、最終的に上の出力ノードが計算される。 この前進計算を実現するために、本資料では2つの方法を説明している。一つが、「同期式」であり、もう一つが、「非同期式」だ。

同期式の前進計算

同期式の前進計算では、ネットワークの計算順序は静的に決定されてしまう。この決定方法は深さ優先探索により決定される。 この計算方法も非常に単純なもので、子供の存在しないノードに到達するとそのノードをキューに入れ、キューの順番に処理していくというものである。単純!

f:id:msyksphinz:20160207112328p:plain

上記のネットワークの例だと、例えば下記のようにネットワークに名前を付けたとすると、深さ優先探索なので、{I,J,G,H,F,E,D,B,A}の順に計算される。

f:id:msyksphinz:20160207112726p:plain

非同期式の前進計算

もう一つの方法は、非同期式の計算になる。同期式の計算だと、計算する順序が既に決定されているが、非同期式は、あるノードの計算が決定されると、その親のノードを確認しに行く。 親のノードにとって、子ノードが全てReadyになると、親のノードが計算される。この場合、ノードのReady/Not Readyを非同期(というか並列に)判定できるので、並列計算に利用できる。

f:id:msyksphinz:20160207113405p:plain

ここまでで、ネットワークの計算方法についての確認になる。次は、モデルの構築について見ていこう (2.3章)。