しいたげられたしいたけ

空気を読まない 他人に空気を読むことを求めない

Excelで手軽に試す機械学習(1章の2:OR回路、NAND回路、NOR回路)

OR回路に関しては、前記事のExcelシートにおいてセルB13~D16に入っている真理値表データのうち、D14とD15を 1 に変更するだけである。真理値表データや初期値、それに微小値などの数値データは、いくらでも上書きが可能である。

f:id:watto:20190726022615p:plain

 

今回もcsvファイルのダンプを貼り付ける。前回のcsvとの相違点は13行目と14行目だけだから、ファイルを保存していただいた方はExcelで開いてデータを書き換えていただいた方が早いのだが。

追記:

csvファイルのダンプはエントリー末尾に移動しました。サイドバーにはみ出して範囲選択がしづらかったので。

 

前回と同様の手中でマクロをボタンに登録すると、やはりだいたい60回くらいクリックした頃から、すなわち真理値表の「学習」を15回くらい繰り返した頃から、x と y が両方とも 1 のとき「推定値」の値が負、それ以外の場合には正になるはずである。もちろんこの回数は重み W0、W1、W2 の初期値によって変化する。

 

ボタンのクリックを何百回か繰り返していると、「2乗和誤差」の値はどんどん小さくなり、「参考値エリア」の「傾き」はおよそ - 1 に、「x 切片」と「 y 切片」は共に 0.4 前後の値に近づくと思われる。

 

前回同様、「学習」の概念図をグラフに表すと、こんなイメージである。

f:id:watto:20190726024157p:plain

 

真理値表のデータを変更することによって、OR回路のみならずNAND回路(AND回路の否定)や…

f:id:watto:20190726033800p:plain

 

NOR回路(OR回路の否定)も、学習させることができる。

f:id:watto:20190726034111p:plain

 

すなわち次の不等式において

W0x + W1y + W2 > 0

重みW0とW1が負であれば、両辺に -1 を掛けることにより

- W0x - W1y - W2 < 0

という不等式が実現可能である。 

 

AND、OR、NAND、NOR それぞれの真理値表データにおいて、重みW0、W1、W2の初期値をいずれも0.5とし、マクロボタンを100回クリックしたとき、すなわち「学習」を25回繰り返したところ、W0、W1、W2の値は、次表のようになった。

  W0  W1  W2 
AND 1.27433 1.20832  -2.17074
OR 1.74447 1.77601 -0.3671
NAND  -1.57819  -1.61533 0.2447
NOR  -1.09802  -1.03452 1.94745

 やり直すたびに微妙に値が違うことが気になったが、論理回路が構成できていればいいということにして、気にしないことにする。

 

   *      *      *

 

問題はXOR(排他的論理和)回路である。XORの真理値表は次のようになる。

 x  y  t
 0  0  0
 1  0  1
 0  1  1
 1  1  0

 

これを直交座標上にプロットすると次のようになり、これまでと違って一次不等式による構成が不可能であろうことは、ただちに予想される。

f:id:watto:20190726090025p:plain

実際、上掲Excelシート上の真理値表データを次のように変更すると、マクロボタンをどれだけクリックしても「2乗和誤差」の値は小さくならず、「推定値」に正しい結果は得られない。すなわちXOR回路を「学習」することはできない、ということだ。

f:id:watto:20190726090618p:plain

 

XOR回路を実現するためには、もうひと工夫を付け足すことが必要である。

そしてその工夫を付け足したとき、機械学習でできることが一気に拡がるのである。

 

追記:

今回のエントリーの最初にスクリーンショットを示したOR回路を学習させるExceシートのcsvダンプです。サイドバーにはみ出して範囲指定がしづらかったので移動しました。

重み,W0,W1,W2,,,,,,,
,1.283922956,1.310624771,-0.000851633,,,,,,,
入力,x,y,t,,,推定値,,シグモイド関数,,2乗和誤差
0,1,1,1,,,=B2*B4+C2*C4+D2,,=1/(1+EXP(-1*G4)),,=0.5*(I4-D4)^2
,,,,,,,,,,
,dW0,dW1,dW2,,数値微分作業エリア,,,,,
結果,=B$4*$K9,=C$4*$K9,=(K8-K4)/G7,,h,0.0001,,,,
,,,,,推定値+h,=G4+G7,,=1/(1+EXP(-1*G8)),,=0.5*(I8-D4)^2
,W0-dW0,W1-dW1,W2-dW2,,,,,,数値微分,=(K8-K4)/G7
更新値,=B2-B7,=C2-C7,=D2-D7,,,,,,,
,,,,,参考値エリア,,,,,
index,x,y,t,,,,,,,
=A4+1,0,0,0,,傾き,=-C2/B2,x切片,=-D2/B2,y切片,=-D2/C2
,0,1,1,,,,,,,
,1,0,1,,,,,,,
,1,1,1,,,,,,,
"=MOD(A13,4)","=INDEX(B13:B16,$A$13,1)","=INDEX(C13:C16,$A$13,1)","=INDEX(D13:D16,$A$13,1)",,,,,,,

スポンサーリンク