おひとりさま現役パラレルワーカーフクコろぐ

これからの会社員は、複数の収入源をもとう! 会社に翻弄されずアナタらしく仕事ができる。 そんなパラレルワーカーを広めるフクコのブログです。

【文系プログラミング初心者deE資格】ゼロつくディープラーニング #4

f:id:fukuko-parallel-work:20211103221755j:plain


こんにちは!

現役パラレルワーカー フクコです。

f:id:fukuko-parallel-work:20210212204833p:plain


前回の記事↓に続き

www.fukuko-parallel-work.com




来年の2月の試験に向けてE資格試験勉強中のため


ゼロつくシリーズでおなじみ

オーライリーから出版されている

ディープラーニングの本格的な入門書でよくおススメされる


f:id:fukuko-parallel-work:20211029220008j:plain




この本↑を毎日5ページずつコツコツこなす

約2か月間で今年中に終了するので

来年のE資格試験までにこれで基礎力をつけることにしました。(^^)


ついつい私は何もないとだらけてしまうので(笑)

毎日5ページ終わった後の記録とまとめを書いていこうと思います。


と、まとめに入る前に…

やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)


「死ぬほど鍛える。結局、それ以外にできることないと思うよ。」

byまこも

ついつい私も引用しちゃう鬼滅の刃の第3話で出てくるまこものセリフです。

「強くなるにはどうすればいい?」の炭次郎の問いに対しての答え。

結局、何かを究めようという時にショートカットなんかあるもんか!!ってことなんですよね。

基礎を死ぬほど叩き込むって大切ですよね。

何かどうにもうまくいかなくて、壁にぶつかっている時にパッと思い浮かんでやる気になるコトバです。


それはさておき、いい加減まとめに入ります。笑



その前に本の目次の紹介です。

ゼロつくディープラーニングは、下記↓の合計8章で構成されています。


本の目次

  • 5章 誤差伝播法
  • 6章 学習に関するテクニック


ちなみに…

ゼロつくディープラーニング第1章はPython入門のセクション(20ページ分)なので、

とりあえず今回私は飛ばし、第2章からまとめています。

今回もひきつづき第3章からでーす。

3章 ニューラルネットワーク


3章は、ニューラルネットワークの全体像についてです。

3.4.2 各層における信号伝達の実装 つづき


入力層から第1層への信号の伝達の図例

f:id:fukuko-parallel-work:20211103220944j:plain


図例↑では、

活性化関数を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層への信号の伝達までの図例が↓となる。


f:id:fukuko-parallel-work:20211103221057j:plain




第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層から出力層への信号の伝達までの図例が↓となる。


f:id:fukuko-parallel-work:20211103221422j:plain



コレを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%ぐらい残ってる感じ。ふう…

でもなんかこの本を終わるころには基礎力上がってる気がします

本当にスクラッチからコードを書いているので。いつもはコピペですし。苦笑

引き続き頑張りまっす。


最後まで読んでくださり、ありがとうございます!

フクコ


ディープラーニング入門書おススメ本