仕事をしながら考えていたのだが、前回のSimple2dの問題は、0と1に分類するときに、どの程度の確率で0と1に分類されるかについて示されているんじゃないかと思った。
という訳で、もう一度データを見ながらリトライしてみよう。
注意: この記事は機械学習初心者が試行錯誤した記事です。本文には誤った情報が含まれている可能性があります。
データを3Dで出力する。
トレーニングデータの観察
まず、訓練データについて、再度3Dでしっかり観察してみよう。使ったのは、gnuplotだ。
splot "SimpleDataTrain.txt"
うん、見事に0と1に分類されている。XとYの座標に対し、Zが0と1に分類されているデータとなる。 これを、ニューラルネットワークに通す。最初の定義では、入力が5であり、5回の中間層を通って、2つの出力、つまり0と1のどちらに分類されるのかを決定するのであろう。 そうすると、ニューラルネットワークの図は以下になるであろうと想像する。この学習データから、次にテストデータがどのような結果になったのか見てみよう。
テストデータの観察
テストデータは、SimpleDataTest.txtだ。データフォーマットについては、 [X座標, Y座標, 回答(誤差を計算するため)] だと思われる。この3値をそのままGnuplotに出力すると、プロットされるのは回答(Z値に相当)だ。ちゃんと、トレーニングデータに沿った分類結果が回答として入力されている。
テストデータから、分類結果を出力する
これが前回の、command=Simple_Demo_Outputだ。この結果、0に分類されるか、1に分類されるかの確率(比率)が出力されるとするならば、各軸をgnuplotで出力してみれば良い。
おお、何となく意味が通じるんじゃないか?ある程度、データが0と1に分類されている。
これって本当なんだろうか?新しいデータセットを作って試してみようじゃないか?
別のデータセットを用意して分類に挑戦
まずは新しいデータセットを100000個ほど生成し、特定の規則によって0と1に分類されるようにする。 だいぶ省略しているが、プロットデータは以下のようになる。
局所的にデータが1になったり0になったり、って感じだ。
これをトレーニングさせて、さらにテストデータを抽出してみる。やり方は上記とまったく同じで、データセットが異なるだけだ。ただし、今回は全体にテストデータの座標を散らばせている。
- テストデータの値
[X座標、Y座標、値] -7.878702 4.909430 0 1.446271 -0.835176 0 -2.305882 -4.520214 0 3.359248 -2.090500 1 -4.368542 5.598394 0 1.981883 -7.541073 1 -2.208519 9.499767 1 -0.648022 -7.196572 0 -9.158628 4.559925 0 2.312110 8.054642 0 2.452668 -4.797566 1 1.110354 -1.900270 0 -7.164883 1.554927 0 0.530425 8.771382 0 9.177576 9.688636 0 ...
これに対して、結果は以下のようになった。
19.8743 -18.449 5.45226 -3.82612 10.8099 -9.48674 -5.79303 7.33916 5.24297 -3.73486 -5.36912 6.86374 -5.3498 6.89128 4.17675 -2.80384 22.6939 -21.2914 10.2059 -8.50689 -6.17231 7.69031 0.0087567 1.54677 24.3107 -22.9085 4.6912 -3.04885 12.0003 -10.2779 13.4469 -12.1834 ...
うまくいっていない気がする?
あれー?トレーニングデータに対して、結果が[0, 1]にそれぞれマッピングされる確率だとしたら、これ逆になってないか?実際、テストデータに対して結果の値が逆相で登場してしまった。
こんな感じ。見事に逆位相になってないか?一方で、逆にマッピングされる確率だとすると、ぴったり一致するのが奇妙だ。
結論
CNTKまだ謎なところ多すぎいい!