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

NO WAR! 戦争反対!Ceasefire Now! 一刻も早い停戦を!

排他的論理和EORを機械学習で実現しようとしたらバタフライ効果が発生した?(その5)

前回との違いは、重みW1とW2への乗数 weight_init_std を 0.1 とうんと小さくしたことと、繰り返し学習回数 s_n を20から100に増やしたことの2点である。繰り返し学習回数を増やしたのは、20回では正解率が100%にならなかったためだ。

その上で、np.round() メソッドの decimals オプションを 7~3 の範囲で変えてみた。すなわち小数点以下7桁から3桁までの範囲で丸めを行った。

 

まずは丸めをおこなわなかった場合。すなわち W1 と W2 のダンプは

>>> W1
array([[ 0.00739552, -0.01348939, -0.01178099],
[ 0.00189079, -0.00239779, 0.01830071]])
>>> W2
array([[-0.01346973, 0.01634472],
[ 0.01377876, -0.00612065],
[ 0.00380564, 0.02487122]])

である。バイアスb1とb2はゼロで初期化している。

 

左:前回の「#コード4-3」によるW1の3D折れ線グラフ。

右:「#コード4-4」によるW1の3面2D展開図風グラフ。

f:id:watto:20210320002145p:plain
f:id:watto:20210320104305p:plain

 

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

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

f:id:watto:20210320002126p:plain
f:id:watto:20210320002121p:plain

 

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

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

f:id:watto:20210320002116p:plain
f:id:watto:20210320002141p:plain

 

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

右:「#コード4-2」による正解率と損失関数の値のグラフ。

f:id:watto:20210320002132p:plain
f:id:watto:20210320001301p:plain

 

グラフ描画後の W1、b1、W2、b2 の値のダンプ。

>>> W1
array([[ 4.00632453, 0.74621904, -4.45154713],
[-4.41780543, 0.3158155 , 4.06376368]])
>>> b1
array([2.88515978, 3.49637772, 2.9176136 ])
>>> W2
array([[ 7.52188442, -7.51900942],
[ 5.85674287, -5.84908476],
[ 7.60501813, -7.57634126]])
>>> b2
array([-17.24374337, 17.24374337]) 

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者:斎藤 康毅
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)
 

次に小数点以下7桁に丸めたケース。

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

>>> W1
array([[ 0.0073955, -0.0134894, -0.011781 ],
[ 0.0018908, -0.0023978, 0.0183007]])
>>> W2
array([[-0.0134697, 0.0163447],
[ 0.0137788, -0.0061206],
[ 0.0038056, 0.0248712]])

   

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

右:「#コード4-4」によるW1の3面2D展開図風グラフ。

f:id:watto:20210320003544p:plain
f:id:watto:20210427191959p:plain

 

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

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

f:id:watto:20210320003523p:plain
f:id:watto:20210320003539p:plain

 

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

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

f:id:watto:20210320003513p:plain
f:id:watto:20210320003539p:plain

 

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

右:「#コード4-2」による正解率と損失関数の値のグラフ。 

f:id:watto:20210320003529p:plain
f:id:watto:20210320001306p:plain

 

グラフ描画後の W1、b1、W2、b2 のダンプ。

>>> W1
array([[ 3.44539626, 0.73045915, -4.26451676],
[-4.25213382, 0.51924299, 3.47807515]])
>>> b1
array([3.72557846, 4.69945879, 3.73723392])
>>> W2
array([[ 11.62101214, -11.61813714],
[ 11.18154668, -11.17388848],
[ 11.66302433, -11.63434753]])
>>> b2
array([-30.40488191, 30.40488191])

丸めをおこなわなかった時との違いは、有効桁数どころではない。最上位桁から違っている! 

ゼロから作るDeep Learning ❷ ―自然言語処理編

ゼロから作るDeep Learning ❷ ―自然言語処理編

  • 作者:斎藤 康毅
  • 発売日: 2018/07/21
  • メディア: 単行本(ソフトカバー)
 

 小数点以下6桁に丸めたケース。

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

>>> W1
array([[ 0.007396, -0.013489, -0.011781],
[ 0.001891, -0.002398, 0.018301]])
>>> W2
array([[-0.01347 , 0.016345],
[ 0.013779, -0.006121],
[ 0.003806, 0.024871]])

 

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

右:「#コード4-4」によるW1の3面2D展開図風グラフ。

f:id:watto:20210320005155p:plain
f:id:watto:20210320005146p:plain

 

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

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

f:id:watto:20210320005137p:plain
f:id:watto:20210320005131p:plain

 

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

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

f:id:watto:20210320005127p:plain
f:id:watto:20210320005151p:plain

 

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

右:「#コード4-2」による正解率と損失関数の値のグラフ。

f:id:watto:20210320005141p:plain
f:id:watto:20210320001310p:plain

 

グラフ描画後の W1、b1、W2、b2 の値のダンプ。

>>> W1
array([[-1.86501773, -4.61775425, 3.55631742],
[-1.88107736, -4.61879971, 3.55773063]])
>>> b1
array([-1.10349328, 1.53527639, -5.55997762])
>>> W2
array([[ 1.26900181, -1.26612681],
[ 4.25877394, -4.25111594],
[ 4.42342661, -4.39474961]])
>>> b2
array([-2.23040188, 2.23040188])

今回採取したデータの中では、このデータが一番奇妙に感じた。何かどう奇妙なのかは少し説明しなければならないが、後日とさせてください。 

ゼロから作るDeep Learning ❸ ―フレームワーク編

ゼロから作るDeep Learning ❸ ―フレームワーク編

  • 作者:斎藤 康毅
  • 発売日: 2020/04/20
  • メディア: 単行本(ソフトカバー)
 

小数点以下5桁に丸めたケース。

>>> W1 = np.round(W1, decimals=5)
>>> W2 = np.round(W2, decimals=5)

>>> W1
array([[ 0.0074 , -0.01349, -0.01178],
[ 0.00189, -0.0024 , 0.0183 ]])
>>> W2
array([[-0.01347, 0.01634],
[ 0.01378, -0.00612],
[ 0.00381, 0.02487]])

 

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

右:「#コード4-4」によるW1の3面2D展開図風グラフ。

f:id:watto:20210320011037p:plain
f:id:watto:20210320011026p:plain


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

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

f:id:watto:20210320011016p:plain
f:id:watto:20210320011011p:plain

 

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

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

f:id:watto:20210320011006p:plain
f:id:watto:20210320011031p:plain

 

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

右:「#コード4-2」による正解率と損失関数の値のグラフ。

f:id:watto:20210320011021p:plain
f:id:watto:20210320001316p:plain

 

グラフ描画後の W1、b1、W2、b2 の値のダンプ。

>>> W1
array([[ 3.84608801, 0.18855283, -4.60571661],
[-4.37482109, 0.4782215 , 3.94866908]])
>>> b1
array([2.90711841, 3.87535165, 3.17658877])
>>> W2
array([[ 7.4825227 , -7.4796527 ],
[ 6.49566576, -6.48800576],
[ 7.59086115, -7.56218115]])
>>> b2
array([-17.8918042, 17.8918042]) 

直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ

直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ

 

小数点以下4桁に丸めたケース。

>>> W1 = np.round(W1, decimals=4)
>>> W2 = np.round(W2, decimals=4)

>>> W1
array([[ 0.0074, -0.0135, -0.0118],
[ 0.0019, -0.0024, 0.0183]])
>>> W2
array([[-0.0135, 0.0163],
[ 0.0138, -0.0061],
[ 0.0038, 0.0249]])

 

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

右:「#コード4-4」によるW1の3面2D展開図風グラフ。

f:id:watto:20210320012117p:plain
f:id:watto:20210320012107p:plain

 

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

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

f:id:watto:20210320012057p:plain
f:id:watto:20210320012052p:plain

 

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

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

f:id:watto:20210320012046p:plain
f:id:watto:20210320012112p:plain

 

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

右:「#コード4-2」による正解率と損失関数の値のグラフ。

f:id:watto:20210320012102p:plain
f:id:watto:20210320001320p:plain

 

グラフ描画後の W1、b1、W2、b2 の値のダンプ。

>>> W1
array([[ 3.26082489, 0.84500467, -4.08032286],
[-4.05662297, 0.60274533, 3.3283021 ]])
>>> b1
array([3.75500344, 4.4027963 , 3.78754744])
>>> W2
array([[ 10.75561538, -10.75281538],
[ 9.77794354, -9.77024354],
[ 10.87129995, -10.84259995]])
>>> b2
array([-27.96261495, 27.96261495])

生成 Deep Learning ―絵を描き、物語や音楽を作り、ゲームをプレイする

生成 Deep Learning ―絵を描き、物語や音楽を作り、ゲームをプレイする

  • 作者:David Foster
  • 発売日: 2020/10/05
  • メディア: 単行本(ソフトカバー)
 

小数点以下3桁に丸めたケース。乗数を小さくとったので、有効数字は2桁程度しかない。

>>> W1 = np.round(W1, decimals=3)
>>> W2 = np.round(W2, decimals=3)

>>> W1
array([[ 0.007, -0.013, -0.012],
[ 0.002, -0.002, 0.018]])
>>> W2
array([[-0.013, 0.016],
[ 0.014, -0.006],
[ 0.004, 0.025]])

 

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

右:「#コード4-4」によるW1の3面2D展開図風グラフ。

f:id:watto:20210320013259p:plain
f:id:watto:20210320013248p:plain

 

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

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

f:id:watto:20210320013238p:plain
f:id:watto:20210320013233p:plain

 

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

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

f:id:watto:20210320013227p:plain
f:id:watto:20210320013254p:plain

 

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

右:「#コード4-2」による正解率と損失関数の値のグラフ。

f:id:watto:20210320013243p:plain
f:id:watto:20210320001325p:plain

 

グラフ描画後の W1、b1、W2、b2 の値のダンプ。

>>> W1
array([[ 3.36957118, 0.62805896, -4.22677355],
[-4.21367348, 0.44197123, 3.40681463]])
>>> b1
array([3.92724771, 5.00984472, 3.93803199])
>>> W2
array([[ 13.17231312, -13.16931312],
[ 12.93812225, -12.93012225],
[ 13.20475575, -13.17575575]])
>>> b2
array([-35.21461348, 35.21461348])

生データを晒すだけでなく分析、考察を行わなくちゃいけないし、データを採っていると他にも確認したい条件が次々と出てくるのだが、とりあえずこれだけでも「ハイパーパラメータの設定が不適切だった」の一言では切り捨てられなさそうな「何かヘンなことが起きている」ことは、機械学習とカオス理論の知識のある人には伝わるんじゃないかと期待する。

先行研究も、ぼちぼち調べ始めている。

スポンサーリンク