しいたげられたしいたけ

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

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

タネ本である斎藤康毅『ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装』(オライリー・ジャパン)では、拙「Excelで手軽に試す機械学習」シリーズの1章で述べたような一次不等式で実現した論理回路を「パーセプトロン」と呼んでいる(第2章)。

パーセプトロンという語はまだ使っていなかったが、その他の用語や記号はだいたい『ゼロから作るDeep Learning』に準拠している。

 

前回「1章の2」で、XOR回路(=排他的論理和)は一次不等式では実現できない旨を述べた。パーセプトロンでXOR回路は作れないのだ。

ではどうすればいいか? パーセプトロンで作れる論理回路を組み合わせてXORを構成することなら可能である。

例えばMIL記号で記述すると、次のようにOR回路とNAND回路の出力をAND回路に入力することによって、XOR回路を得ることができる。

 

f:id:watto:20190804114415p:plain

真理値表を書いてみる。

 x  y u = x OR y v = x NAND y u AND v
 0  0 0 1 0
 0  1 1 1 1
 1  0 1 1 1
 1 1 1 0 0

回路の出力に相当する右端の列に着目すると、確かにXOR回路ができていることがわかる。 

 

これを一次不等式の組み合わせを使って、Excel上で実現することを考えてみる。

ただし一次不等式の諸定数は、いきなり機械学習で求めるのではなく、まずは手動によって与えてみる。

これまで述べてきた通り、x、y が 0 または 1 のとき例えば

0.6 x + 0.6 y - 0.5 > 0 が真のとき 1、偽のとき 0

とすれば OR回路が、

- 0.4 x - 0.4 y + 0.5 > 0 が真のとき 1、偽のとき 0

とすればNAND回路が得られる。

ただし今後、変数 x 、y を単純変数ではなく2次元ベクトル x で、係数を2×2の係数行列 Wで表すことがある。

 

今回は、次のようなExcelシートを作成した。 

f:id:watto:20190804130652p:plain

これまでの入力 x、y の代わりにベクトルの要素のつもりで x[0]、x[1] と表記している。ただしシート形状の都合で1行2列(1×2)で表記している。

同様に、MIL記号のAND回路の出力 u の代わりに u[0]、v の代わりに u[0] とした。


F列より右側で、数式が入力されているセルのみ細枠線を付して示した。それ以外は数値データか文字データである。

入力されている数式は、以下の通り。

セル 数式 意味
H1 =B2*F2+C2*F3 ベクトルxと行列W0の積
I1 =B2*G2+C2*G3
L1 =H2+J2 上の結果とベクトルb0の和
M1 =I2+K2
N1 =IF(L2>0,1,0) 上の結果を2値化
O1 =IF(M2>0,1,0)
H6 =F6*N2+F7*O2 上の結果とW1の積
L6 =H6+J6 上の結果とb1の和
N6 =IF(L6>0,1,0) 上の結果を2値化
O6 =D2 教師データT再掲:比較用

論理回路の1段目では、出力ベクトル u を、入力ベクトル x と重み行列 W0 (2×2)および定数ベクトルb0を用いて

u = x*W0 + b0

で計算し、IF関数を用いて2値化している。

2段目すなわち全体の出力は、2値化後の u と重みベクトルW1(2×1)および定数b1を用いて

出力 = u*W1+ b1

で計算し、やはりIF関数で2値化した。

 

マクロは

  1. セルA10~D10を範囲選択し右クリック、ショートカットメニューから「コピー(C)」を選択
  2. セルA2上で右クリック、ショートカットメニュー「貼り付けのオプション」から「値(V)」を選択

の2操作を記録し、ボタン3に登録した。

ボタン3を4回以上クリックし、セルN6(「出力」)と O6(「t 再掲」)が常に一致していることを確認した。

すなわちこれでXOR回路が実現できたことがわかった。

 

次なる課題は、重み行列 W0 、定数ベクトル b0、重みベクトル W1、定数 b1 を機械学習によって求めることである。

 

今回も Excel シートの csv ファイルへのダンプを示す。

入力,x[0],x[1],t,,W0,,x*W0,,b0[0],b0[1],x*W0+b0,,u[0],u[1]
0,1,1,0,,0.6,-0.4,=B2*F2+C2*F3,=$B$2*G2+$C$2*G3,-0.5,0.5,=H2+J2,=I2+K2,"=IF(L2>0,1,0)","=IF(M2>0,1,0)"
,,,,,0.6,-0.4,,,,,,,,
,,,,,,,,,,,,,,
index,x[0],x[1],t,,W1,,u*W1,,b1,,u*W1+b1,,出力,t 再掲
=A2+1,0,0,0,,0.4,,=F6*N2+F7*O2,,-0.5,,=H6+J6,,"=IF(L6>0,1,0)",=D2
,0,1,1,,0.4,,,,,,,,,
,1,0,1,,,,,,,,,,,
,1,1,0,,,,,,,,,,,
"=MOD(A6,4)","=INDEX(B6:B9,$A$6,1)","=INDEX(C6:C9,$A$6,1)","=INDEX(D6:D9,$A$6,1)",,,,,,,,,,,

すみません、ブラウザ画面からダンプ部分をコピーしてメモ帳に貼り付け、拡張子を.csvに変更して保存というのを自分で試すと、ダブルクリックで開いたとき文字化けが発生するという現象が生じ、いろいろ調べたのですが改善されませんでした。Windows10+Chromeです。

そこで拡張子.txtで保存し、Excelの「開く」より「すべてのファイル(*.*)」を指定して読み込んだところ、文字化けが起きませんでした。ただし「テキストファイルウィザード 2 / 3」「区切り記号」の「□カンマ(C)」にチェックを入れる必要があります。ご参考まで。

スポンサーリンク