こんにちは!
現役パラレルワーカー フクコです。
前回の記事↓に続き
来年の2月の試験に向けてE資格試験勉強中のため
ゼロつくシリーズでおなじみ
オーライリーから出版されている
ディープラーニングの本格的な入門書でよくおススメされる
この本↑を毎日5ページずつコツコツこなすと
約2か月間で今年中に終了するので
来年のE資格試験までにこれで基礎力をつけることにしました。(^^)
ついつい私は何もないとだらけてしまうので(笑)
毎日5ページ終わった後の記録とまとめを書いていこうと思います。
と、まとめに入る前に…
やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)
「死ぬほど鍛える。結局、それ以外にできることないと思うよ。」
byまこも
ついつい私も引用しちゃう「鬼滅の刃」の第3話で出てくるまこものセリフです。
「強くなるにはどうすればいい?」の炭次郎の問いに対しての答え。
結局、何かを究めようという時にショートカットなんかあるもんか!!ってことなんですよね。
基礎を死ぬほど叩き込むって大切ですよね。
何かどうにもうまくいかなくて、壁にぶつかっている時にパッと思い浮かんでやる気になるコトバです。
それはさておき、いい加減まとめに入ります。笑
その前に本の目次の紹介です。
ゼロつくディープラーニングは、下記↓の合計8章で構成されています。
本の目次
- 1章 Python入門
- 2章 パーセプトロン
- 3章 ニューラルネットワーク
- 4章 ニューラルネットワークの学習
- 5章 誤差伝播法
- 6章 学習に関するテクニック
- 7章 畳み込みニューラルネットワーク
- 8章 ディープラーニング
ちなみに…
ゼロつくディープラーニングの第1章はPython入門のセクション(20ページ分)なので、
とりあえず今回私は飛ばし、第2章からまとめています。
今回もひきつづき第3章からでーす。
3章 ニューラルネットワーク
3章は、ニューラルネットワークの全体像についてです。
3.4.2 各層における信号伝達の実装 つづき
入力層から第1層への信号の伝達の図例
図例↑では、
活性化関数をh()で表し、ココではシグモイド関数を使うことにする。
Pythonで実装すると次のようになる。
#入力層から第1層への信号の伝達までの図例を表す import numpy as np X = np.array([1.0, 0.5]) W1 = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]]) B1 = np.array([0.1, 0.2, 0.3]) A1 = np.dot(X,W1) + B1 #まずはシグモイド関数の定義 def sigmoid(x): return 1 / (1 + np.exp(-x)) #Z1にシグモイド関数を使う Z1 = sigmoid(A1)
つづいて、
第1層から第2層への信号の伝達までの図例を表すと…
第1層から第2層への信号の伝達までの図例が↓となる。
第1層から第2層への信号の伝達までの図例を表す。
コレをPythonで実装すると次↓のようになる。
#第1層から第2層への信号の伝達までの図例を表す W2 = np.array([[0.1, 0.4],[0.2, 0.5],[0.3, 0.6]]) B2 = np.array([0.1, 0.2]) A2 = np.dot(Z1, W2) + B2 Z2 = sigmoid(A2)
↑のPythonの実装を見るとわかるようにNumPy配列を使うと
層から層への信号の伝達が簡単に書けることがわかる。
最後に、第2層から出力層への信号伝達。
第2層から出力層への信号の伝達までの図例が↓となる。
コレをPythonで実装すると次↓のようになる。
#第2層から出力層への信号の伝達までの図例を表す。 def identity_function(x): return x W3 = np.array([[0.1, 0.3],[0.2,0.4]]) B3 = np.array([0.1, 0.2]) A3 = np.dot(Z2, W3) + B3 Y = identity_function(A3)#もしくは、Y = A3
↑のPythonの実装を見るとわかるように
出力層の実装も第2層までの実装とほぼ同じ。
ただし!!
最後の活性化関数だけ、これまでの隠れ層に使われた活性化関数と違う。
identity_function(x)という関数を定義して、
この活性化関数は「恒等関数」という。
「恒等関数」は、入力をそのまま出力する関数。
ここでポイント:
出力層で利用する活性化関数は、解く問題に応じて決められる。
2クラス分類だとシグモイド関数、多クラス分類だとソフトマックス関数を使用するのが一般的。
3.4.3 実装のまとめ
ココまで行ってきたニューラルネットワークの実装を
一度にPythonでまとめてみると↓のような感じ。
#NumPyライブラリインストール import numpy as np #シグモイド関数定義 def sigmoid(x): return 1 / (1 + np.exp(-x)) #恒等関数定義 def identity_function(x): return x #ニューラルネットワークまとめて定義 def init_network(): network = {} network['W1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]]) network['b1'] = np.array([0.1, 0.2, 0.3]) network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]]) network['b2'] = np.array([0.1, 0.2]) network['W3'] = np.array([[0.1,0.3],[0.2,0.4]]) network['b3'] = np.array([0.1, 0.2]) return network #入力から出力方向へ伝達処理の定義 def forward(network, x): W1, W2, W3 = network['W1'],network['W2'],network['W3'] b1, b2, b3 = network['b1'],network['b2'],network['b3'] a1 = np.dot(x, W1) + b1 z1 = sigmoid(a1) a2 = np.dot(z1,W2) + b2 z2 = sigmoid(a2) a3 = np.dot(z2, W3) + b3 y = identity_function(a3) return y network = init_network() x = np.array([1.0, 0.5]) y = forward(network, x) print(y)#答えは、[0.31682708 0.69627909]
ちなみに、
ニューラルネットワークの実装の慣例(お作法)で重みだけW1といった大文字になっているが、
他は基本的に小文字で表す。
NumPyの多次元配列をうまく使うことで、
ニューラルネットワークの実装を効率的に行うことができる。
ハイ、今日はここまで!!
ということで、第3章のニューラルネットワークはまだまだ続きます。
第3章がやっとあと30%ぐらい残ってる感じ。ふう…
でもなんかこの本を終わるころには基礎力上がってる気がします。
本当にスクラッチからコードを書いているので。いつもはコピペですし。苦笑
引き続き頑張りまっす。
最後まで読んでくださり、ありがとうございます!
フクコ
ディープラーニング入門書おススメ本