しいたげられたしいたけ

道を間違えているのが明白なのに、「きっと他の道はもっと間違っている」と進み続けたら、どうなる?

Excelで手軽に試す機械学習(1章の1:AND回路)

コンピュータの基礎となる論理回路を構成するには、さまざまな方法がある。

ここでは不等式を用いてAND回路とOR回路を構成してみる。

変数 x、y と重み W0、W1、W2 について、次の不等式を考える。

W0x + W1y + W2 > 0

この不等式が成立していれば '真' すなわち式の値を '1' と、成立していなければ '偽' すなわち式の値を '0' とする。

式の値を t と書いたとき、x、y、t の真理値表が

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

であるとき、AND回路が構成されたと考える。

また真理値表が

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

であるとき、OR回路が構成されたと考える。

 

AND回路またはOR回路を構成する重み W0~W2 の組み合わせは無限にあるが、とにかく上掲の真理値表が満たされていれば、なんでもいいことにする。

人間が思いつくのは、造作もないことだ。例えば W0 = W1 = 0.4、W1= - 0.5 とすればAND回路が構成できる。

 x  y 0.4x+0.4y-0.5  t
 0  0 - 0.5   0
 1  0 - 0.1   0
 0  1 - 0.1   0
 1  1 0.1   1

 

W0 = W1 = 0.6、W1= - 0.5 とすればOR回路が構成できる。

 x  y 0.6x+0.6y-0.5  t
 0  0 - 0.5   0
 1  0 0.1   1
 0  1 0.1   1
 1  1 0.7   1

 

今回のテーマは、これらの重みの値を、人間が決めるのではなくコンピュータに決めさせようということだ。

考え方は、7月19日付拙エントリー で述べたニュートン法による方程式の解法とそっくりである。

ただしニュートン法のようなすっきりしたものではなく、ところどころすごく雑である。「あれ、こんないい加減でいいの?」という考え方が、随所に出てくる。

どうにも気になるところについては、後日のエントリーで私なりの解釈を述べることにする。

 

いくつか道具を導入する。

まずはシグモイド関数というのを使う。シグモイド関数 h(x) は、次の式で与えられる。

f:id:watto:20190724172042p:plain

e はネイピア数すなわち自然対数の底である。
 x → - ∞ のとき h(x) → 0、x = 0 のとき  h(x) = 0.5、 x → ∞ のとき h(x) → 1 である。

h(x) のグラフの概形は、次のようになる。

f:id:watto:20190724172706p:plain

 なんでこんなものを使うかというと、これから相手にするのはデジタル値である。デジタル値は微分に適さない(大部分の値がゼロで、特定の値のみ無限大)。そこでこのような、なだらかな傾斜を持つ関数に当てはめて、強引に微分可能にしてしまうのである。

このような目的で使われる関数を「活性化関数」といい、シグモイド関数以外にも多数ある。

 

次に二乗和誤差 E というものを導入する。二乗和誤差の一般的な定義は確率・統計の教科書に出てくるが、今回は一変数の場合として、ある関数の値 f と目標となる値 t により

f:id:watto:20190724222810p:plain

と定義する。なお t を「教師データ」と呼ぶことがある。
 

これらを用いて、まずは AND 回路をパソコンに構成させてみよう。より正確には、重みW0、W1、W2の値を Excel に決めさせるのだ。

Excel のシートに、次のようにデータを入力する。

f:id:watto:20190724223526p:plain

セルに入力している数式とその意味は、以下の通り。

セル 数式 意味
B2~D2 (数値) 重みW0~W3
A4 真理値表の行番号(0~3)
B4~D4 変数x, y, t
G4 =B2*B4+C2*C4+D2 推定値
I4 =1/(1+EXP(-1*G4)) シグモイド関数
K4 =0.5*(I4-D4)^2 2乗和誤差
G7 (数値) 微小量
G8 =G4+G7 推定値の微小変化
I8 =1/(1+EXP(-1*G8)) 微小変化後のシグモイド関数
K8 =0.5*(I8-D4)^2 微小変化後の2乗和誤差
K9 =(K8-K4)/G7 2乗和誤差の数値微分
B7 =B4*$K9 重みW0~W3の修正値
C7 =C4*$K9
D7 =$K9
B10 =B2-B7 重みW0~W3の更新値
C10 =C2-C7
D10 =D2-D7
A13 =A4+1 真理値表の次の行番号
B13~D16 (数値) 真理値表
A17 =MOD(A13,4) 行番号を0~3の範囲に
B18 =INDEX(B13:B16,$A$13,1) 真理値表の次の行を取出す
C18 =INDEX(C13:C16,$A$13,1)
D18 =INDEX(D13:D16,$A$13,1)
G13 =-C2/B2 傾き(-W0/W1):参考値
I13 =-D2/B2 x切片(-W2/W0):参考値
K13 =-D2/C2 y切片(-W2/W1):参考値

D13~D16の値が「0 0 0 1」となっていることが、AND回路を表している。

B2~D2の値は初期値で、スクリーンショットではいずれも0.5となっているが適当な値である。最初からAND回路を構成しないほうがいい。 

このシートで、次の4操作をマクロとして記録する。マクロへの記録方法は 7月19日付拙記事 参照。

  1. 範囲B10~D10をドラッグして右クリック、ショートカットメニューの「コビー(C)」を選択する
  2. セルB2上で右クリック、ショートカットメニューの「貼り付けのオプション」から「値(V)」を選択する
  3. 範囲A17~D17をドラッグして右クリック、ショートカットメニューの「コビー(C)」を選択する
  4. セルA4上で右クリック、ショートカットメニューの「貼り付けのオプション」から「値(V)」を選択する

1.と2.ではB~D列が操作対象だが、3.と4.ではA~D列が操作対象となっている点が要注意である。

f:id:watto:20190724224524p:plain


最後にボタンを作成し、このボタンに記録したマクロを登録する。ボタンの作成とボタンへのマクロの登録は、やはり 7月19日付拙記事 参照。 これで準備完了である。

f:id:watto:20190724230217p:plain

 

あとは「ボタン2」を繰り返しクリックするだけである。

まず確認してほしいのは、セルA4の値が0~3を繰り返しているかどうかで、もしそうならなかったらマクロの記録をどこかで間違えている。マクロの記録をやり直していただくしかない。

推定値(セルG2)は、重みW0~W2(セルB2~D2)が適切に求められた状態では、x と y(セルB4とC4)が共に 1 のときだけ正、それ以外は負になるが、スクリーンショットのようにW0~W2の初期値をすべて0.5とした場合には、最初のうちはそうならないはずである。

ボタンをだいたい60回くらいクリックした頃から、すなわち真理値表の「学習」を15回くらい繰り返した頃から、x と y が共に 1 のときだけ正、それ以外は負に落ち着くのではないか。

 

シグモイド関数の値は、わかりにくいと思う。2乗和誤差の値は、ボタンをクリックすればするほど小さくなるはずだ。

 

W0、W1、W2 の値もまた、直接観察していても、どのような変化が起きているかわかりにくい。例えば

0.2x + 0.2y - 0.4 > 0

と、

0.3x + 0.3y - 0.6 > 0

は同じだからだ。

それで「参考値エリア」に、傾き(-W0/W1)、x 切片(-W2/W0)、y切片(-W2/W1)を表示してみた。

「ボタン2」を辛抱強くクリックし続けていると(だいたい3~400回くらい)、傾きはおよそ - 1 に、x 切片と y 切片は共に 1.5 前後の値に近づく。これが Excel の決めたAND回路を構成する重み W0、W1、W2 というわけだ。

B4~D4のような数値を直接入力しているセルは、上書きでデータ書き換えが可能だから、初期値をいろいろ変えて試してほしい。

不等式をグラフにすると、次のような変化が起きるのだ。

f:id:watto:20190725005904p:plain

ただしニュートン法のときと違って、シャープには収束しない。

 

今回もシートの内容をCSVに保存したものを示す。エディタにコピペして拡張子「.csv」で保存すると、罫線や列幅のデータは失われているものの入力の手間を大幅に省略できるはずだ。

重み,W0,W1,W2,,,,,,,
,0.5,0.5,0.5,,,,,,,
入力,x,y,t,,,推定値,,シグモイド関数,,2乗和誤差
1,0,0,0,,,=B2*B4+C2*C4+D2,,=1/(1+EXP(-1*G4)),,=0.5*(I4-D4)^2
,,,,,,,,,,
,dW0,dW1,dW2,,数値微分作業エリア,,,,,
結果,=B$4*$K9,=C$4*$K9,=$K9,,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,0,,,,,,,
,1,0,0,,,,,,,
,1,1,1,,,,,,,
"=MOD(A13,4)","=INDEX(B13:B16,$A$13,1)","=INDEX(C13:C16,$A$13,1)","=INDEX(D13:D16,$A$13,1)",,,,,,,

スポンサーリンク