🍉しいたげられたしいたけ

NO WAR! 戊争反察Ceasefire Now! 䞀刻も早い停戊を

排他的論理和EORを機械孊習で実珟しようずしたらバタフラむ効果が発生したその

応甚数理科孊の花圢である機械孊習ずいうゞャンルで、しかも基本䞭の基本であるEOR回路を実珟しようずいうのだから、先行研究がないわけがないずは思うのだが、自分の趣味でやっおいるのでいいこずにする。

 

ゞェむムズ・グリック『カオス―新しい科孊を぀くる』(新朮文庫)より、気象孊者の゚ドワヌド・ロヌレンツが「バタフラむ効果」あるいは「カオス」ず呌ばれる珟象を発芋した瞬間の蚘述を思い出した。

 䞀九六䞀幎冬のある日のこず、䞀区切りのデヌタをもっず念入りに調べたいず思ったロヌレンツは、近道をするこずにした。時間を節玄するため始めの郚分をはしょっお、䞭途から凊理を始めるこずにしたのである。たず最初の条件をコンピュヌタに入れおおくため、前にずったプリントアりトの数字をそっくりそのたたタむプしおおき、コンピュヌタの隒音を逃れおコヌヒヌをのむため廊䞋に出た。小䞀時間ほどしお郚屋に戻った圌は、たったく思いがないもの、たさに新しい科孊の皮がそこに播かれおいるのを芋たのである。
 さっきロヌレンツが自分で数字の䞀宇䞀字をそっくりそのたたコンピュヌタに打ちこみ、別にプログラムを倉えたわけではないのだから、この結果も前のず党く同じになるはずだ぀た。ずころが今、新しいプリントアりトを芋぀めるロヌレンツの県前にくり拡げられおいたのは、たった数カ月分の倩候のパタヌンなのに、それが以前のものずは䌌おも䌌぀かぬものになるほどの速床でずれお行くさただった。
≪䞭略≫
 だが次の瞬間、圌ははっず本圓のこずに気が぀いた。機械が狂ったのではなく、実は圌が打ちこんだ数字の方に問題があったのだ。コンピュヌタのメモリヌの䞭には.506127ずいう六桁の数字が蚘憶されおいたが、玙面を倹玄するためプリントアりトには.506の䞉桁しか印刷されない。だが千分の䞀ぐらいなら倧した誀差ではないず思ったロヌレンツは、四捚五入しお短くしたその䞉桁の数字をそのたた打ちこんだのだ。

「第1ç«  バタフラむ効果」P3334より。改行䜍眮倉曎しおいたす。ルビ省略しおいたす。

バタフラむ効果ずは初期倀のわずかな違いが結果に甚倧な圱響をもたらす珟象、カオスずは簡明に蚘述できる系から予枬困難な結果が出おくる珟象、ずいうふうに理解しおいたすが、間違っおいたら誰か教えおください。

  

ロヌレンツのひそみに倣っお、ダンプさせたW1、W2の倀を初期倀ずしおコヌド䞭に蚘述し、Python のラむブラリ numpy の round メ゜ッドを䜿っお、各桁で䞞めおみた。

パラメヌタの数が 88重みW1の圢状2×4、W2の圢状4×2の堎合ず倚く、どこから手を぀けたらいいのか即座に刀断付かなかったので、手軜に倉曎する工倫の぀もりだった。

すなわち前回の゚ントリヌに蚘述した「コヌド4」を、次のように改造しお 

#コヌド4-1
import sys, os
sys.path.append(os.pardir)
import numpy as np
from common.functions import *
from common.gradient import numerical_gradient

x_e = np.array([[0, 0], [1, 0], [0, 1], [1, 1]]) #入力デヌタ
t_e = np.array([[1, 0], [0, 1], [0, 1], [1, 0]]) #教垫デヌタ

W1 = np.array([[ 0.007111976, 0.008841753, 0.016924526, -0.022701769],
[-0.018342164, -0.000087162, 0.016726299, 0.021702541]])
W2 = np.array([[ 0.013091743, -0.003338104],
[-0.013076172, 0.00560719 ], [ 0.013749352, 0.000776133],
[ 0.000917579, 0.016105434]])
b1, b2 = np.zeros(4), np.zeros(2) #れロで初期化

def predict(x):
    A1 = np.dot(x,W1) + b1
    Z1 = sigmoid(A1) #シグモむド関数P48
    A2 = np.dot(Z1,W2) + b2
    y = softmax(A2) #゜フトマックス関数P66
    return y

 

 W1ずW2の倀を、次のように䞞めた。

W1 = np.round(W1, decimals=7)
W2 = np.round(W2, decimals=7)

 

round メ゜ッドの decimarl オプションは、䞞める小数点以䞋の桁数の指定である。 

decimarl オプションの指定倀を 27の範囲で倉曎しお、続けお前回拙゚ントリヌ「#コヌド5」を Anaconda プロンプトに貌り付け、描かせたグラフのスクリヌンショットを瀺す。

巊decimals=7、右decimals=6。

f:id:watto:20210314145356p:plain
f:id:watto:20210314145426p:plain

iteration繰り返し回数、loss損倱関数の倀、acc正解率である。以䞋同じ。

 

巊decimals=5、右decimals=4。

f:id:watto:20210314145421p:plain
f:id:watto:20210314145414p:plain

 

巊decimals=3、右decimals=2

f:id:watto:20210314145409p:plain
f:id:watto:20210314145403p:plain

 

decimals=2 のグラフの圢状が特異なのはなんずなく仕方ないずいう気がするが、decimals=3 ず decimals=4 で圢状が激しく倉化し、decimals=5 で元に戻っおいるように芋えるのが目を匕く。

蚀うたでもなくdecimals=3 ず decimals=4 では1/10,000以䞋、decimals=4 ず decimals=5 では1/100,000以䞋の差しかないはずである。

 

グラフの圢状が違うのみならず、収束するW1、W2、b1、b2の倀も異なる。

以䞋に瀺すのは研究ノヌトの぀もりでコヌド、ダンプ、スクショなど片っ端から貌り付けおいるpptxファむルのスクショである。

最初のW1、W2はnp.round実行埌のダンプ、続くW1、b1、W2、b2はグラフ描画埌のダンプである。タむトルの「P3-1-1'」ずいうのは自分の区別甚で意味はない。

䞊に貌ったグラフのスクショはブログを曞きながら採取したものだが、pptxに貌り付けたのは5日ほど前のものだ。぀たり圓然ながら再珟性があるずいうこずでもある。

f:id:watto:20210314145509p:plain

f:id:watto:20210314145506p:plain

f:id:watto:20210314145502p:plain

どうも「バタフラむ効果」たたは「カオス」ず呌ばれる珟象が起きおいるず考えおよさそうな気がする。

内郚で䜕が起きおいるか、もうちょっず掘れそうなので、匕き続き掘っおみる。

远蚘

実務ずしお機械孊習をやっおる人だったら、バタフラむ効果やカオス珟象には関心を向けず「ハむパヌパラメヌタが䞍適切だったこの堎合W1、W2の初期倀が小さすぎた」ず、さっさず修正をかけるずころかも知れない。

実際 

weight_init_std=1.
W1 = weight_init_std * np.array([
[ 0.07111976, 0.08841753, 0.16924526, -0.22701769],
[-0.18342164, -0.00087162, 0.16726299, 0.21702541]])
W2 = weight_init_std * np.array([[ 0.13091743, -0.03338104],
[-0.13076172, 0.0560719 ],
[ 0.13749352, 0.00776133],
[ 0.00917579, 0.16105434]])
b1 = np.zeros(4)
b2 = np.zeros(2)
loss_list = [ ]
acc_list = [ ]
learning_rate , step_num = 5.0, 50

ずしお、

巊weight_init_std=10.、右weight_init_std=20.のグラフ。

f:id:watto:20210314220027p:plain
f:id:watto:20210314220034p:plain

 

巊weight_init_std=50.、右weight_init_std=100.のグラフ。

f:id:watto:20210314220015p:plain
f:id:watto:20210314220020p:plain

スポンサヌリンク

Â