コンピュータの基礎となる論理回路を構成するには、さまざまな方法がある。
ここでは不等式を用いて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) は、次の式で与えられる。
e はネイピア数すなわち自然対数の底である。
x → - ∞ のとき h(x) → 0、x = 0 のとき h(x) = 0.5、 x → ∞ のとき h(x) → 1 である。
h(x) のグラフの概形は、次のようになる。
なんでこんなものを使うかというと、これから相手にするのはデジタル値である。デジタル値は微分に適さない(大部分の値がゼロで、特定の値のみ無限大)。そこでこのような、なだらかな傾斜を持つ関数に当てはめて、強引に微分可能にしてしまうのである。
次に二乗和誤差 E というものを導入する。二乗和誤差の一般的な定義は確率・統計の教科書に出てくるが、今回は一変数の場合として、ある関数の値 f と目標となる値 t により
と定義する。なお t を「教師データ」と呼ぶことがある。
これらを用いて、まずは AND 回路をパソコンに構成させてみよう。より正確には、重みW0、W1、W2の値を Excel に決めさせるのだ。
Excel のシートに、次のようにデータを入力する。
セルに入力している数式とその意味は、以下の通り。
セル | 数式 | 意味 |
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日付拙記事 参照。
- 範囲B10~D10をドラッグして右クリック、ショートカットメニューの「コピー(C)」を選択する
- セルB2上で右クリック、ショートカットメニューの「貼り付けのオプション」から「値(V)」を選択する
- 範囲A17~D17をドラッグして右クリック、ショートカットメニューの「コピー(C)」を選択する
- セルA4上で右クリック、ショートカットメニューの「貼り付けのオプション」から「値(V)」を選択する
1.と2.ではB~D列が操作対象だが、3.と4.ではA~D列が操作対象となっている点が要注意である。
最後にボタンを作成し、このボタンに記録したマクロを登録する。ボタンの作成とボタンへのマクロの登録は、やはり 7月19日付拙記事 参照。 これで準備完了である。
あとは「ボタン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のような数値を直接入力しているセルは、上書きでデータ書き換えが可能だから、初期値をいろいろ変えて試してほしい。
不等式をグラフにすると、次のような変化が起きるのだ。
ただしニュートン法のときと違って、シャープには収束しない。
今回もシートの内容を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)",,,,,,,
追記:
すみません、2019年8月3日付拙記事 より、以下をこの記事にも転載します。
すみません、ブラウザ画面からダンプ部分をコピーしてメモ帳に貼り付け、拡張子を.csvに変更して保存というのを自分で試すと、ダブルクリックで開いたとき文字化けが発生するという現象が生じ、いろいろ調べたのですが改善されませんでした。Windows10+Chromeです。
そこで拡張子.txtで保存し、Excelの「開く」より「すべてのファイル(*.*)」を指定して読み込んだところ、文字化けが起きませんでした。ただし「テキストファイルウィザード 2 / 3」「区切り記号」の「□カンマ(C)」にチェックを入れる必要があります。ご参考まで。
追記おわり
次回:
スポンサーリンク