2つのニューロンでXORの学習は可能か?
XORの学習は、ディープラーニングの学習をしたことがある人は、誰でも入門書で見たことがあるはずです。でもその多くの場合、ニューロンは3個以上使われています。
今回の記事では、疑問に思ったので2つのニューロンでのXORの学習が可能か検証してみました。
そもそも何故一つのニューロンでXORの学習が無理なのでしょうか?
その理由は線形分離ができない事にあります。例えばANDの場合、一つの線で出力の境界を設定できます。しかしXORは二つの線が必要です。
自分の頭の中には、下のような図がありました。
上の図に従って、コードを書いてみました。
出力の結果
[0.5 0.5 0.5 0.5]
......あれ学習に失敗しましたね。何故でしょうか。
エポック不足でしょうかね。変えて見ましょう。
- 10エポック:[0.43826893 0.49031629 0.49031629 0.54236365]
- 100エポック:[0.49999965 0.49999994 0.49999994 0.50000024]
- 1000エポック:[0.5 0.5 0.5 0.5]
- 1000000エポック:[0.5 0.5 0.5 0.5]
ふーむ。これを見る限りエポック数が原因ではなさそうですね。
じゃあyの変動を見てみましょう。
import matplotlib.pyplot as pltして、新しい変数Graph_yを追加して、yをappendして、plot......
できました!
変わってないですねぇ......
じゃあw1は......
変わってますねぇ。
w2も変わってますね。つまり学習自体はしているっぽいですね。
じゃあ3次元グラフを作ってみましょう!
まずニューロン1というか、図で言う所の真ん中らへんのニューロンの動きを見てましょう。
あれ、、、変化がない。と思ってたらバイアスをつけるの忘れてました。
修正後がこれ。
あらら。これは、、、なんの役割も果たしてませんね。
ではニューロン2の方は?
変化ないですね。ただし上のグラフはxのみの入力に対してです。
ではyの入力にはどう対応するのでしょうか?
うーん。変動しませんね。
結論として、二つのニューロンでXORの学習はできないという事になりました。
*1:0, x