AI
NeuralNetwork
perceptron
noise
TensorFlowPlayground

誰でもわかるニューラルネットワーク:ノイズの影響をテンソルフロー・プレイグラウンドで試してみた。

深層学習とかニューラルネットワークとか、人工知能という言葉が世間で飛び交っています。いったい、これらがどのようなものなのかを理解したいと思っている人は多いのではないでしょうか?でもプログラミングの知識もなければ、ITの知識もないという人には高いハードルのように感じられます。そのような人のために、テンソルフロープレイグラウンドというツール、アプリが用意されているのをご存知ですか。テンソルフロープレイグラウンドはつぎのURLからアクセスできます。

https://playground.tensorflow.org/

をクリックするとA Neural Network Playgroundが立ち上がります。最初の画面は

image.png

という感じです。

これはニューラルネットワークを学ぶための学習ツールです。ニューラルネットワーク・シミュレーターとでも呼んだらいいのでしょうか?

この場合入力データは$X_1$と$X_2$が選ばれています。また出力はサークルが描かれています。青い点が円形に、赤い点がそれを取り巻く輪として配置されています。このニューラルネットワークでは隠れ層(Hidden layers)が2つでそれぞれに4つのニューロンと2つのニューロンが配置されています。ニューロンって何だろうと思ってしまいます。でも何か聞いたこともありそうです。そうです。たぶん聞いたことがあるはずです。脳を構成する神経細胞のことです。

image.png

これはイメージ図です。そしてこのニューロンがたくさん集まってネットワークを構成して脳を作っていると考えられています。

image.png

このイメージにヒントを得て作られたのがニューラルネットワークです。ニューラルネットワークは分類問題を解くことを得意としているので、テンソルフロープレイグラウンドではディフォルトとして分類問題を解くように設定されています。つまり私たちの目の前にあるのはニューラルネットワーク(NN) なのです。これをいじってNNを理解していこうというのです。まず最初に左上の黒い丸の中に三角形が白抜きされている実行ボタンを押してみてください。結果はつぎのようになるはずです。

image.png

背景の色と点の色が同じで何か境界線で2つの色の点が分離されていれば分類は成功したといえます。きれいなマルとはいえないまでも何となく分類されいます。つぎに別の問題を試してみましょう。今度は出力に2つの正規分布と呼ばれているものを選んでみましょう。

image.png

赤と青の点が正規分布しながら右上と左下に固まっています。正規分布しているかどうか疑問に思う人もいるかもしれませんが、そういうことにしましょう。そして実行ボタンを押してみます。

image.png

のようになるはずです。ものの見事に2つが分離されています。これのどこがすごいのかって思いますよね。それは同じNNを使ってどこも変更することなしに汎用的に2つの図柄がうまく分離されたからです。これをどんどん複雑にしていくと、人ごみの中から犯人を見つけたり、善人を見つけたりできるようになるのです。これがニューラルネットワークのすごいところです。

ではいよいよ本題に入りましょう。ニューラルネットワークにどのようにノイズが悪い影響を与えるのか、ノイズの除去がいかに大事か、どのようにしてノイズに強いニューラルネットワークを作ったらよいのかを考えてみましょう。誰にでも直感的にわかるように、プログラミングの知識なしでわかるように考えてみましょう。

まずは出力(OUTPUT)をサークルに戻してください。そしてプレイグラウンドの左の中央のnoiseと書かれているスライドをいじります。これのボッチを右にずらすとノイズを加えることができます。50%までめいっぱい増やして実行ボタンを押します。

image.png

今度はきれいに分離ができません。これはNNがノイズに影響されて与えられたデータをきちっと学習できていない証拠です。これを過学習とかオーバーフィティングといいます。NNは自由度が高く、いろいろな問題に対処できるのですが、自由度が高い分、ノイズには弱いのです。ではノイズに強いNNを作るにはどうしたらよいのでしょうか?それは背後にある状況を正確に把握してNNの構造を作ることです。ではやってみましょう。


単純パーセプトロン

まずは単純パーセプトロンを作ります。入力データとして$X_1$と$X_2$を選びます。入力データはFEATURESの7つからいくつでも選ぶことができますが、最初は上の2つを選びます。層の数はHIDDEN LAYERSの+と-のボタンで増やしたり減らしたりできます。-のボタンを一回押して層の数を1つにします。ニューロンは四角い箱で表現されています。今回はこれも1つにします。最初の層にニューロンが4つあるので +-のボタンの-を3回押してニューロンを一つにします。つぎのような単純パーセプトロンが出来上がります。

image.png

これはもっとも単純な構造をもったNNです。実行ボタンを押してみてください。

image.png

実はこれではうまく分離できません。そこで入力データを$X_1^2$と$X_2^2$に変えます。そして実行してみてください。

image.png

なんとあっという間に分類ができてしまいました。うまくいった原因を考えてみましょう。それは入力データの選択にあります。中学で習った数学を思い出してください。円を描くには$X_1^2+X_2^2=1$とすればよいことを学びました。NNでも同じことです。つぎにノイズを加えてみてください。

image.png

なんとさきほどよりもずっと原型をとどめてくれます。これはNNの構造が入力データの選択、隠れ層の数、ニューロンの数と出力に対して適切だからです。もちろん他にもいろいろな方法でノイズに強いNNを作ることができますが、まずは構造が重要です。左下のGENERATEボタンを押すと乱数をリセットでき、いろいろなノイズを試すことができます。やってみましょう。

参考:

「シミュレーターでまなぶニューラルネットワーク」(アマゾンkindle出版)

(https://www.amazon.co.jp/gp/product/B07MJ9R2T8?pf_rd_p=7b903293-68b0-4a33-9b7c-65c76866a371&pf_rd_r=4JRRRHRRE1FHXSY1EP5G)

L1正則化をテンソルフロープレイグラウンドで試してみた

(https://qiita.com/innovation1005/items/e6f035d74675d94744c8)

https://qiita.com/innovation1005/items/584e66edb0e08f037a80

誰でもわかるニューラルネットワーク:ロジスティック回帰をテンソルフロー・プレイグラウンドで試してみた。

https://qiita.com/drafts/5750dce7aecbb350264d