2016/02/07

[ai]『深層学習』の8章に挫折してCNTKを試す (2)

今日はメインPCの復旧処理をやっているので、今回はCNTKについて調べるだけだ。

前回、MicrosoftのCNTKを入れてみて、CaffeでやったことのあるMNISTのサンプルがあったので動かして、「で?」で終わってしまった。
CNTKのインストールで注意するところだけわかった。

  • WindowsかLinux
  • どちらも64bitのみ
  • Windowsは、ビルドするなら英語localeがよいらしい(試してない)
  • [win]ビルド済みを使うなら、CUDAバージョンはファイル名を見よう


前回わからなかった、あの実行結果をどうしてよいのかを調べたい。
ただ、何をキーワードにしてよいのかもわからない。。。

日本語でCNTKを動かしている人を探していると、ようやく見つかった。
CNTKのチュートリアル(MNIST)の読み解きに挑戦 - FPGA開発日記
そうそう、こういう「使ってみました」を探していたんです。

この方も「全然面白くないよ!」と書かれているから、やり方は間違ってなかったようだ。
ただ、結果はlogファイルに入ってたんだな・・・気付かなかった。
いまはPCが使えないので、あとで見ることにする。

そして、Simple2dのように出力を出すように変更なされてる。
Wikiにも一番上にあったのだが、Others/Simple2dと「その他」みたいな扱いだったのでスルーしたのだ。
順番にも意味があったのか・・・。


Simped2dサンプル

MNISTはpythonでデータ取得から始めていたが、Simple2dのデータは既にDataフォルダに入っているとのこと。
見てみると、txtファイルが3つある。
SimpleDataTest.txtとSimpleDataTrain.txtは3列のデータがだーっと入っている。
SimpleMapping.txtは、0と1と書いてある行があるだけ。

Trainは訓練用、Testは評価用だろう。
3列のデータも、(x, y) = z、みたいなことじゃなかろうか。
本来は、Test.txtの3列目はないのだろうけど、正答率を計算するために付いてるだけだと思う。
だって、ニューラルネットだろうとなんだろうと、自分が判定した結果が正しかったかどうかを自分で知る方法はないのだ。
人間が自分の意見が正しいのかどうかを考えるため他の人の意見を聞くように、誰かに頼るしかない。
そして聞いた中の意見で一番多いものを採用する、くらいしかやりようがない。
「でもやっぱり自分はこう思う!」という意見を貫きにくいだろうな、やつらは。


なので、当たり前だけど、機械学習が正しく学習するためには、正しい結果を教え続ける、少なくとも正しい結果が間違った結果を上回るようにしないといけない。
間違ったことだけ教えていたら、その学習結果は間違った方に進んでしまい、正しい結果を受け入れなくなってくるんじゃなかろうか。

Train.txtは正しい結果という前提の元、Test.txtが評価されることになる。
なので、悪意でTrain.txtが正しくない結果だった場合、Test.txtは正しくない評価をされることになる。
今は、機械学習は「当てにならないもの」という前提の世界だからよいけど、もし機械学習が正しい前提の世界になったら、ロジックで生み出された結果ではないため、混乱するだろうな。
そういう意味では、判定がロジックで評価できるしくみとセットになっていた方が安全だと思う。

いかんいかん、脱線してしまった。
だけど、ロジックで作っていない動作が不安な理由って、制御ができないことだと思う。
もしロジックで作った部分と併用して、機械学習の結果がロジックと異なった場合に拒否させようとしても、ロジックの方が「異なる」と判定できないんじゃなかろうか。
そもそも、ロジックでそういうのが出せないから、機械学習させようとしてるのだと思うし。

今は「よくできましたね~」という子供の成長を見てるようなレベルだからいいけど、盲目的に信用できるくらいになったらそういう心配もしないといかんでしょうな。


脱線続きだ。。。

Simple2dのReadmeでは、Simple.cntkをconfigファイルとして動かすように書かれている。
このconfigファイルが、ニューラルネットのネットワーク構成だろう。
文法はわからんが、以下の3つがある。

  • Simple_Demo_Train
  • Simple_Demo_Test
  • Simple_Demo_Output

これを、L.15のcommandで指定して実行しているのだろう。
Outputはcommandに入ってないから、これは実行されないのかな。

 

SimpleNetworkBuilderがネットワークのテンプレートみたいなものなのかな。
読んでわかる単語は”Sigmoid”くらいだ。
シグモイド関数は、ロジスティック関数とも呼び、活性化関数としてよく使われるもの(『深層学習』p.10)。
活性化関数は、ユニットの出力(『深層学習』p.8)。
コメントに、inputが2つ、50要素の隠れたものが2つ(50シグモイドノードの隠しレイヤーが2つ)、outputが2つ、と書いてある。
隠しレイヤー(hidden layer)は、中間レイヤー(internal layer)のこと(『深層学習』p.12)。

”Softmax”という単語も覚えている。
結果がクラスごとの比率になっていて、「このクラスに属する可能性が一番高い」みたいな目安になる関数だ(『深層学習』p.19)。
円グラフみたいなもんだな。
これがtrainingCriterionだから、訓練時の判断基準ということだろう。

もう1つevalCriterionがあるが、違いは何だろうか?
そのまま訳すと、評価での判断基準となりそうだが、trainingCriterionと同じ気がしてしまう。
https://github.com/Microsoft/CNTK/wiki/Simple-Network-Builder
Simple.cntkでは”ErrorPrediction”が設定してある。
predictionは「予言」だから・・・エラーが起こりますぞ(ムック風)?
値の選択はtrainingCriterionと同じ、と書いてあるが、trainingCriterionの説明にはErrorPredictionは出てきていない。
https://github.com/Microsoft/CNTK/blob/master/Documentation/Documents/Network%20Description%20Language.md#error-prediction
こっちだと、ErrorPrediction()という関数があるように見える。
ということで、さっきのtrainingCriterionでの”CrossEntropyWithSoftmax”も、evelCriterionの”ErrorPrediction”も、関数名が書いてあるだけということか。
Googleで「prediction error」で検索していると「予測誤差法」という言葉が出てきた。
prediction error methodの意味 - 英和辞典 Weblio辞書
『深層学習』p.15に「誤差関数(error function)」とあるから、これと同じ意味だろうか。

 

もう1つ、SGDというものがある。
インストールするときに別途やらんといかんかったやつだ(1-bit SGD)。
Stochastic Gradient Descentの略。
確率的勾配降下法 - 機械学習の「朱鷺の杜Wiki」
これは『深層学習』p.23で章を割いてまで説明してあるやつだ。
順伝播型ネットワークの教師あり学習の方法の1つで、ディープラーニングでよく使われているらしい。
パラメータを見てもわからんが、minibatchは『深層学習』p.26に出てくる。
一度に処理すると大変なので小分けしましょう、ということだと思っている。
他のパラメータもPerMBとあるので、MiniBatch単位であれするこれする、ということなのだろう。

 

readerは、TestにもOutputにもあるが、データファイルの読み込みだろう。
TrainではTrain.txt、TestではTest.txt、OutputでもTest.txtを指定している。
前回のMINISTサンプルでは、Output/Modelsに01_OneHidden.xxというファイルが多数できていたが、それはOutputのoutputPathに書くようだ。
50Elementsだから、50ファイルできるのかな?

TestとOutputは、そのoutputPath以外は同じ設定値だ。
L.15のcommandではTraingとTestだけになってるけど、TestをOutputに置き換えるとファイルができるのか。

 

それで、そもそもこのサンプルがどういうものなのかは、先ほどの方が読もうとされている。
CNTKのチュートリアル(Simple2d)の読み解きに挑戦 - FPGA開発日記
CNTKのSimple2dに対して別のデータセットを与えて特徴を掴む(はずが謎が深まる) - FPGA開発日記

まだ私は理解がついて行ってないので、そういうのは次回以降で。。。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。