Amazon

2017年12月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

最近のトラックバック

無料ブログはココログ

Amazon2

« ニューラルネットワーク(機械学習)をC#で実装してみる その1 | トップページ | あけましておめでとうございます。 »

2016年12月30日 (金)

ニューラルネットワーク(機械学習)をC#で実装してみる その2


さて、C#でニューラルネットワークを実装して遊んでみる第二弾です。
今回は、前回作成したクラスを使用して、多数の点(サンプル)を数式から作り出し、
それをニューラルネットワークで学習できるかどうか試してみたいと思います。

・目次
  ・その1 実装編 (ソースコードあり)
  ・その2 数式を学習してみる(シンプル編) ★今回の記事です





・今回の内容

今回は、以下の様な事を試してみたいと思います。

  ・前回作成したニューラルネットワークを使用して学習する
    これは当然ですね

  ・数式を作成しそれより上を赤、それより下を青として学習する
    例えばy = ax + bより上なら赤い点、下なら青い点 で赤青を判定させます

  ・点をx/y軸共に-128~+128の範囲でグラフ化する
    学習の都合上、点は-2~+2の実数で表し、それをグラフで表示する

  ・式/点(サンプル)の数/ニューラルネットワークの構成を色々変えてみる
    これらを学習回数を変えてその結果をグラフで表示します


上記方針で色々学習させてみて、どれぐらい再現するか試してみたいと思います。


・学習 その1

以下のパターンで学習してみます。乱数で処理する都合上。残念な結果になった時は
やり直しています。ニューラルネットワークは
入力層 2 : 隠れ層① 4 : 隠れ層② 3 : 出力層 2 で、処理します。

白い線が実際の境界線。赤と青の点がサンプル。ピンクと水色の背景が学習結果を
表しています。

サンプル数y=x+32y=64sin(x)y=x^3/4096y=x^2/32-32
64①64②64③64④64
128①128②128③128④128
256①256②256③256④256


結果は以下の通りです。(途中から経過時間の表示機能を追加しました…)

①64

64


①128

128


①256

256


②64

64_2


②128

128_2


②256

256_2


③64

64_3


③128

128_3


③256

256_3


④64

64_4


④128

128_4


④256

256_4



さて、如何でしょうか。まず、この程度のソースコードで結構学習して再現
出来ています。そして少ない情報量でもそれなりに学習出来ている様子が分かります。
そして、やっぱり直線の様な単純な形状には強いですね。
また、情報が多い方がやっぱり再現性が高くなっています。順当な結果です。

そして、やっぱり曲線的な奴は苦手ですね。③と④だけもう少しサンプル数を
増やしてやってみます。計算時間がどんどん伸びていく…。

サンプル数y=x^3/4096y=x^2/32-32
512③4096④4096
1024③1024④1024


③512

512


③1024

1024



④512

512_2


④1024

1024_2



グラフの端の方は情報が少なくなる為どうしても再現性が良くないですが、
中央付近は結構きれいに再現できています。但し、学習回数が多ければ
必ずしも良い結果が得られる訳ではなさそうです。このあたりは偶然に
よる所もありますのでなかなか難しいですね。

・学習 その2

今度はニューラルネットワークの構成を変えてみます。
題材としては③256をベースに実行してみます。今度はサンプルの点は
全ての題材で同じ物を使用します。

ネットワーク構成y=x^3/4096 (サンプル256点)
2-2-2③2-2-2
2-3-2③2-3-2
2-4-2③2-4-2
2-4-3-2③2-4-3-2
2-6-4-2③2-6-4-2
2-6-4-3-2③2-6-4-3-2


③2-2-2

222


③2-3-2

232


③2-4-2

242


③2-4-3-2

2432


③2-6-4-2

2642


③2-6-4-3-2

26432




う~ん。ネットワークが深ければ良いってもんでもなさそうですね。
意外と2-4-2ぐらいが良いバランスで、その先は大差ないと言うか…。
③2-6-4-3-2の様に5層になると全然駄目なのは逆伝搬が正しく機能して
いないせいだと思います。


う~ん。おまけにニューラルネットワークをぐっと増やして
2-12-8-2もやってみましょう。

21282



しかし、これも目立った効果は無いというか、いまいちな結果になりました。


ざっくりまとめると

  ・ニューロンの数が多いと複雑な形状を表現出来るようになる
    数式で表しにくい様な形状を表現出来るようになります

  ・但し層が多ければ良いって物でもない
    層が多ければきっちりフィッティングする訳でもなさそうです

とは言え、こんなソースコードの計算量で、点だけから元の曲線を再現出来たり
するのは凄いですね。これを考え付いた人は凄いと思います。

如何でしょうか。計算処理時間は兎も角、この程度のソースコードでも結構しっかりと
学習する事が示せたと思います。これはかなり面白い技術だと思います。
次回はもうちょっと学習させてみたいと思います。

しかし、合計しても大したパラメータ(重み)量ではないはずなのに、あんなに複雑な
形状にフィットするなんて不思議だな…。






さてさて、計算時間ですが…この程度の処理であってもやっぱり結構良い時間がかかりますね。
計算量ですが256点ある場合に
  一回当たりの計算量 (2 * 4) + (4 * 3) + (3 * 2) = 26 (ニューラルネットワークの計算量)
  学習 : 10000 * 2 * 256 = 5120000回
  予測 : 256 * 256 * 6 = 393216回 (256*256画素の画面を六つ)

つまり、(5120000 + 393217) * 26 = 143343642 なので一億四千万回以上計算しています。
これは、私のメイン開発PCに搭載されているCPU Athlon5350ではちょっと遅すぎます…。ノートPCのCore i5 M540でも
きついです。そして、何よりも計算処理以外の処理(OOP的なせい?)の処理量も気になります。
やっぱりOOPしちゃ駄目なんですかね。。。

GPGPUと言う手もあるけれど….NETから使えるのかな???












« ニューラルネットワーク(機械学習)をC#で実装してみる その1 | トップページ | あけましておめでとうございます。 »

データサイエンティスト・データ分析」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1680410/69036596

この記事へのトラックバック一覧です: ニューラルネットワーク(機械学習)をC#で実装してみる その2:

« ニューラルネットワーク(機械学習)をC#で実装してみる その1 | トップページ | あけましておめでとうございます。 »