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

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

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

前回「その」の最埌に曞いた、重みW1、W2、バむアスb1、b2のグラフ描画甚デヌタを䞀括しお採取するコヌド改造は、あっさりできた。

#コヌド4-0
import sys, os
sys.path.append(os.pardir)
import numpy as np
from common.functions import *
from common.gradient import numerical_gradient as n_g
x_e = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
t_e = np.array([[1, 0], [0, 1], [0, 1], [1, 0]])
weight_init_std=50.
W1 = weight_init_std * np. array([
[ 0.07395519, -0.13489392, -0.1178099 ],
[ 0.01890785, -0.02397794, 0.18300705]])
W2 = weight_init_std * np. array([
[-0.13469725, 0.1634472 ],
[ 0.13778756, -0.06120645],
[ 0.03805643, 0.24871219]])
b1 = np.zeros(3)
b2 = np.zeros(2)

def predict(x):
    A1 = np.dot(x,W1) + b1
    Z1 = sigmoid(A1)
    A2 = np.dot(Z1,W2) + b2
    y = softmax(A2)
    return y


def loss(x, t):
    y = predict(x)
    return cross_entropy_error(y, t)


def acc(x, t):
    y = predict(x)
    y = np.argmax(y, axis=1)
    t = np.argmax(t, axis=1)
    accuracy = np.sum(y == t) / float(x.shape[0])
    return accuracy


import matplotlib.pyplot as plt
loss_W = lambda W: loss(x_e, t_e)
loss_list, acc_list = [ ], [ ]
data_list = [[[ ] for i in range(3)] for j in range(4)]
l_r , s_n = 5.0, 20

 

append() メ゜ッドでグラフ芁玠を远加しおゆく空の倚次元リストを䜜成する方法は、次のサむトを参考にさせおいただきたした。ありがずうございたした。

Pythonのリスト配列を任意の倀・芁玠数で初期化 | note.nkmk.me

 

#コヌド4-1
for i in range(s_n):
    W1 -= l_r*n_g(loss_W, W1)
    b1 -= l_r * n_g(loss_W, b1)
    W2 -= l_r * n_g(loss_W, W2)
    b2 -= l_r * n_g(loss_W, b2)
    loss_list.append(loss(x_e,t_e))
    acc_list.append(acc(x_e, t_e))
    for k in range(3):
        data_list[0][k].append(W1[0,k])
        data_list[1][k].append(b1[k])
        data_list[2][k].append(W2[k,0])
    for k in range(2):
        data_list[3][k].append(b2[k])

 

Anacondaプロンプト察話モヌドで䞊掲「#コヌド4-0」ず「#コヌド4-1」に続けお次の「#コヌド4-2」を貌り付ければ正解率ず損倱関数の倀のグラフが 

#コヌド4-2
x = np.arange(len(loss_list))
plt.plot(x, loss_list, label='loss')
plt.plot(x, acc_list, label='acc', linestyle='--')
plt.xlabel("iteration") #x軞ラベル
plt.legend() #凡䟋
plt.show()

 

 

「#コヌド4-3」を貌り付ければ重みW1の1行目3芁玠の3D折れ線グラフが 

#コヌド4-3
from mpl_toolkits.mplot3d import Axes3D #3Dでプロット

fig = plt.figure()
ax = Axes3D(fig)
ax.plot(data_list[0][0], data_list[0][1], data_list[0][2], "o-")

ax.set_xlabel('W100') # 軞ラベル
ax.set_ylabel('W101')
ax.set_zlabel('W102')

plt.show() #衚瀺

 

「#コヌド4-4」を貌り付ければ重みW1の1行目3芁玠の3面2D展開図颚グラフが 

#コヌド4-4
plt.subplot(2, 2, 2)
plt.plot(data_list[0][0], data_list[0][2], 'o-')
plt.xlabel("W100")
plt.ylabel("W102")

plt.subplot(2, 2, 3)
plt.plot(data_list[0][1], data_list[0][2], 'o-')
plt.xlabel("W101")
plt.ylabel("W102")

plt.subplot(2, 2, 4)
plt.plot(data_list[0][0], data_list[0][1], 'o-')
plt.xlabel("W100")
plt.ylabel("W101")
plt.show()

 

「#コヌド4-5」を貌り付ければバむアスb1の3D折れ線グラフが 

#コヌド4-5
fig = plt.figure()
ax = Axes3D(fig)
ax.plot(data_list[1][0], data_list[1][1], data_list[1][2], "o-")
ax.set_xlabel('b10')
ax.set_ylabel('b11')
ax.set_zlabel('b12')
plt.show()

 

「#コヌド4-6」を貌り付ければバむアスb1の3面2D展開図颚グラフが 

#コヌド4-6

plt.subplot(2, 2, 2)
plt.plot(data_list[1][0], data_list[1][2], 'o-')
plt.xlabel("b10")
plt.ylabel("b12")

plt.subplot(2, 2, 3)
plt.plot(data_list[1][1], data_list[1][2], 'o-')
plt.xlabel("b11")
plt.ylabel("b12")

plt.subplot(2, 2, 4)
plt.plot(data_list[1][0], data_list[1][1], 'o-')
plt.xlabel("b10")
plt.ylabel("b11")
plt.show()

 

「#コヌド4-7」を貌り付ければ重みW2の1列目3芁玠の3D折れ線グラフが 

#コヌド4-7
fig = plt.figure()
ax = Axes3D(fig)
ax.plot(data_list[2][0], data_list[2][1], data_list[2][2], "o-")
ax.set_xlabel('W200')
ax.set_ylabel('W210')
ax.set_zlabel('W220')
plt.show()

 

 

「#コヌド4-8」を貌り付ければ重みW2の1列目3芁玠の3面2D展開図颚グラフが 

#コヌド4-8
plt.subplot(2, 2, 2)
plt.plot(data_list[2][0], data_list[2][2], 'o-')
plt.xlabel("W210")
plt.ylabel("W220")

plt.subplot(2, 2, 3)
plt.plot(data_list[2][1], data_list[2][2], 'o-')
plt.xlabel("W210")
plt.ylabel("W220")

plt.subplot(2, 2, 4)
plt.plot(data_list[2][0], data_list[2][1], 'o-')
plt.xlabel("W200")
plt.ylabel("W210")
plt.show()

 

「#コヌド4-9」を貌り付ければバむアスb2の2D折れ線グラフが衚瀺されるはずである。

#コヌド4-9
plt.plot(data_list[3][0], data_list[3][1], 'o-')
plt.xlabel("b20")
plt.ylabel("b21")
plt.show()

 

さらに「#コヌド4-10」を貌り付けるず、W1、W2の小数点以䞋6桁で䞞めた状態でW1、b1、W2、b2、グラフ芁玠を栌玍するリストが初期化される。

#コヌド4-10
W1 = weight_init_std * np. array([
[ 0.07395519, -0.13489392, -0.1178099 ],
[ 0.01890785, -0.02397794, 0.18300705]])
W2 = weight_init_std * np. array([
[-0.13469725, 0.1634472 ],
[ 0.13778756, -0.06120645],
[ 0.03805643, 0.24871219]])

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

b1 = np.zeros(3)
b2 = np.zeros(2)

loss_list, acc_list = [ ], [ ]
data_list = [[[ ] for i in range(3)]\
for j in range(4)]

 

 

続けお「#コヌド4-0」以倖の「#コヌド4-1」「#コヌド4-9」を貌り付けるず、W1ずW2を6桁で䞞めた初期倀による各皮グラフが撮れる。

「#コヌド4-10」䞭の「decimals=」に続く数字2か所を倉曎するず、䞞めの桁数を倉えるこずができる。

 

ただし毎回断っおいる通り、斎藀康毅『れロから䜜るDeep Learning ―Pythonで孊ぶディヌプラヌニングの理論ず実装』(O'REILLY) のサンプルスクリプトをダりンロヌドしたディレクトリに、事前に移動しおおく必芁がありたす。 

れロから䜜るDeep Learning ―Pythonで孊ぶディヌプラヌニングの理論ず実装

れロから䜜るDeep Learning ―Pythonで孊ぶディヌプラヌニングの理論ず実装

  • 䜜者:æ–Žè—€ 康毅
  • 発売日: 2016/09/24
  • メディア: 単行本゜フトカバヌ
 

 

今回は、たずはW1ずW2の初期倀に察する乗数 weight_init_std を50ず倧きくしおグラフのスクリヌンショットを撮っおみた。すなわちバタフラむ効果あるいはカオスらしき珟象が起きない状態のグラフである。

バタフラむ効果らしき珟象が起きおいるグラフでは、いろんな特城が芳枬され、ただたずめきれおいない。

W1の2行目やW2の2列目はどうなるかに぀いおも、埌日説明する予定。少しだけ先走っお曞いおしたうず、䞭途半端な察称性が珟れるのだ。

 

「#コヌド4-2」による正解率ず損倱関数の倀のグラフ。

巊䞞めなし、右䞞め6桁。

f:id:watto:20210318204419p:plain
f:id:watto:20210318204424p:plain

 

巊䞞め4桁、右䞞め2桁。

f:id:watto:20210318204429p:plain
f:id:watto:20210318204434p:plain

ご芧の通り、たったく区別぀かなかった

Windowsフォトで画像を順次衚瀺させたずころ、完璧に重なっおいた

 

「#コヌド4-3」によるW1の3D折れ線グラフ。

巊䞞めなし、右䞞め6桁。

f:id:watto:20210318204500p:plain
f:id:watto:20210318204540p:plain

 

巊䞞め4桁、右䞞め2桁。

f:id:watto:20210318204618p:plain
f:id:watto:20210318204714p:plain

 

「#コヌド4-4」によるW1の3面2D展開図颚グラフ。

巊䞞めなし、右䞞め6桁。

f:id:watto:20210318204505p:plain
f:id:watto:20210318204524p:plain

 

巊䞞め4桁、右䞞め2桁。

f:id:watto:20210318204602p:plain
f:id:watto:20210318204641p:plain

 

「#コヌド4-5」によるb1の3D折れ線グラフ。

巊䞞めなし、右䞞め6桁。

f:id:watto:20210318204513p:plain
f:id:watto:20210318204551p:plain

 

巊䞞め4桁、右䞞め2桁。

f:id:watto:20210318204630p:plain
f:id:watto:20210318204727p:plain

 

「#コヌド4-6」によるb1の3面2D展開図颚グラフ。

巊䞞めなし、右䞞め6桁。 

f:id:watto:20210318225703p:plain
f:id:watto:20210318225708p:plain

 

巊䞞め4桁、右䞞め2桁。

f:id:watto:20210318225713p:plain
f:id:watto:20210318225719p:plain

 

「#コヌド4-7」によるW2の3D折れ線グラフ。

巊䞞めなし、右䞞め6桁。

f:id:watto:20210318204540p:plain
f:id:watto:20210318204618p:plain

 

巊䞞め4桁、右䞞め2桁。

f:id:watto:20210318204618p:plain
f:id:watto:20210318204714p:plain

 

「#コヌド4-8」によるW2の3面2D展開図颚グラフ。

巊䞞めなし、右䞞め6桁。

f:id:watto:20210318204529p:plain
f:id:watto:20210318204607p:plain

 

巊䞞め4桁、右䞞め2桁。

f:id:watto:20210318204646p:plain
f:id:watto:20210318204743p:plain

 

「#コヌド4-9」によるバむアスb2の2D折れ線グラフ。

巊䞞めなし、右䞞め6桁。

f:id:watto:20210318204519p:plain
f:id:watto:20210318204557p:plain

 

巊䞞め4桁、右䞞め2桁。

f:id:watto:20210318204636p:plain
f:id:watto:20210318204731p:plain

繰り返すが、寞分たがわぬグラフができたのだ

 

さらにグラフを描画した埌でW1、b1、W2、b2の倀をダンプしたずころ、私芋だが驚くべき特城が芳察されたず考える

䞞めなし。

>>> W1
array([[ 3.10715279, -6.92996836, -8.0399468 ],
[-3.65469687, -2.36826359, 7.24733878]])
>>> b1
array([-2.79170761, 1.27328557, -4.31921463])
>>> W2
array([[-6.51184203, 7.94933953],
[ 6.5981932 , -2.7691377 ],
[ 1.59700312, 12.74142788]])
>>> b2
array([ 1.84055305, -1.84055305])

 

䞞め6桁。

>>> W1
array([[ 3.10715289, -6.92996828, -8.03994567],
[-3.65469717, -2.36826367, 7.24733962]])
>>> b1
array([-2.79170755, 1.27328572, -4.3192158 ])
>>> W2
array([[-6.51184149, 7.94933949],
[ 6.59819307, -2.76913807],
[ 1.59700329, 12.74142871]])
>>> b2
array([ 1.8405531, -1.8405531])

 

䞞め4桁。

>>> W1
array([[ 3.10710145, -6.92997272, -8.04005328],
[-3.6547279 , -2.36824909, 7.2472656 ]])
>>> b1
array([-2.79167077, 1.27327315, -4.31912361])
>>> W2
array([[-6.51186187, 7.94936187],
[ 6.59822748, -2.76912748],
[ 1.59701523, 12.74138477]])
>>> b2
array([ 1.84053306, -1.84053306])

 

䞞め2桁。

>>> W1
array([[ 3.09749693, -6.92642448, -8.03894874],
[-3.65772763, -2.36530438, 7.2475458 ]])
>>> b1
array([-2.78123196, 1.27206239, -4.32347713])
>>> W2
array([[-6.50319204, 7.94319204],
[ 6.60072934, -2.77072934],
[ 1.59685762, 12.74314238]])
>>> b2
array([ 1.83860683, -1.83860683])

驚くべき特城ずいうのは、各倉数で有効数字の範囲たで数字の䞀臎が芋られたこずだ

すなわち䞞め2桁ず4桁では小数点以䞋2桁たで、䞞め4桁ず6桁では小数点以䞋4桁たで、䞞め6桁ず䞞めなしでは小数点以䞋6桁たで、数字が䞀臎しおいた

違いがそれだけなら、パ゜コンから撮ったスクショは区別぀かないよね

 

でも有効数字っお、そういうこずだったっけ

あるいは「䜕を圓たり前のこずを」ずいう反応が返っおくるかも知れない。

ずころが weight_init_std の倀を小さくしたずき、このような特城が珟れなくなるのだ。

小数点以䞋どころか、いちばん䞊の桁が䞀臎しなくなる。甚だしい堎合は、笊号さえ異なるこずがある

これを䜕かの刀定基準ずするこずは、できないだろうか

スポンサヌリンク

Â