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

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

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

f:id:fukuko-parallel-work:20211101222445j: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エマ


↓の記事でもおススメした約束のネバーランドから

私の大好きなエマのコトバです。(^^)

www.fukuko-parallel-work.com



やっぱり約束のネバーランドいいですよね~。

なんか「鬼滅の刃」ばかり人気が出て知る人ぞ知るみたいになりましたが

夢をかなえたい! 目標を達成したい!みたいなときにものすごく励みになるマンガだと思います。


おかげでやる気が出ます。

ありがとうございます!!(^^)


というコトで、いい加減まとめに入ります。笑



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

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


本の目次

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


ちなみに…

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

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

前回、2章が終わったので、今回は第3章からでーす。

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


ニューラルネットワークには、

入力層、隠れ層、出力層がある。


ニューラルネットワークの例

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


3.1.2 パーセプトロンの復習


パーセプトロン 例

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


パーセプトロンの数式

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


bは「バイアス」とよばれるパラメータで、ニューロンの発火のしやすさをコントロールする。

↑のパーセプトロンの数式は、入力が0を越えたら1を返し、そうでなければ0を返す


3.1.3 活性化関数の登場


このパーセプトロンの数式のように、入力信号の総和を出力信号に変換する関数のこと「活性化関数」(activation function)とよぶ。

3.2 活性化関数


活性化関数は、閾値を境にして出力が切り替わる関数

3.2.1 シグモイド関数(sigmoid function)


シグモイド関数は、ニューラルネットワークでよく用いられる活性化関数のひとつ。


シグモイド関数の式

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

注:eは、ネイピア数2.7182... の実数を表す。

3.2.2 ステップ関数の実装

ステップ関数は、入力が0を越えたら1を出力、それ以外は0を出力する


ステップ関数をPythonで実装すると…

def step_function(x):
    y = x > 0
    return y.astype(np.int)#astype関数とは、「ndarrayの各要素のデータ型を変換するための関数」

import numpy as np
x = np.array([-1.0, 1.0, 2.0])
x#array([-1.,  1.,  2.])

y = x > 0
y#array([False,  True,  True])
3.2.3 ステップ関数のグラフ

そして、ステップ関数のグラフをPythonで実行。

def step_function(x):
    return np.array(x > 0, dtype=np.int)

x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)#y軸の範囲を指定
plt.show()


出てくるグラフが↓のもの。

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


3.2.4 シグモイド関数の実装


シグモイド関数Pythonで実装してみると…

import numpy as np

return 1/(1 + np.exp(-x))

x = np.array([-1.0, 1.0, 2.0])
sigmoid(x)#答えは、array([0.26894142, 0.73105858, 0.88079708])

そしてシグモイド関数をグラフにするには、下記の↓のコード

#シグモイド関数をグラフにする
x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)#y軸の範囲を指定
plt.show()


コレを実行すると、下記↓のグラフになる。

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


3.2.5 シグモイド関数とステップ関数の比較


ステップ関数とシグモイド関数の異なっている点はどこか??

まず、気づくべき異なる点は…

グラフ線の「滑らかさ」

シグモイド関数は、滑らかな曲線

対するステップ関数は、0を境に急に出力が変わる


そして、共通する点は…

両者ともに入力が小さい時の出力は0に近く(もしくは0)

入力が大きくなると出力は1に近づく


したがって


ステップ関数シグモイド関数

「入力が重要な情報であれば大きな値を出力」

「入力が重要でなければ小さな値を出力」する。

そして

どんなに入力値が大きくても、出力値は「0から1の間」に押し込める


補足誤差逆伝播法(バックプロパゲーション)が登場してからは、シグモイド関数がよく使われ

最近ではRelu関数(後で出てきます)がよく使われているので、

現在ステップ関数はあまり使われていない

3.2.6 非線形関数


ステップ関数もシグモイド関数も、一本の直線ではない、非線形関数。


ニューラルネットワークでは、

活性化関数に非線形関数を用いる必要がある。

というか一本の直線で表せる線形関数が使えない

なぜなら…

ニューラルネットワークで層を深くすることの意味がなくなるから。

3.2.7 ReLU関数


ReLU関数(Rectified Linear Unit)は、

入力が0を超えていればその入力のまま出力、0以下なら0で出力する関数

最近では、ニューラルネットワークの活性化関数にはReLU関数が主に用いられる

ReLU関数を式で表すと、下記↓のようになる。

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


ReLU関数の実装はとってもシンプル。

下記↓のコードで実装できる。

#ReLU関数の実装
import numpy as np
def relu(x):
    return np.maximum(0, x)

↑はNumPyのmaximum関数を使っている。

3.3 多次元配列の計算


Pythonのライブラリ、NumPyの多次元配列を使った計算をマスターできれば

ニューラルネットワークの実装が効率的になる。

3.3.1 多次元配列

多次元配列とは、

カンタンにいうと「数字の集合」


多次元配列の例↓

#多次元配列の例
import numpy as np

B = np.array([[1,2],[3,4],[5,6]])
print(B)#出力は、[[1 2] [3 4] [5 6]]

#配列の次元数が出力される
np.ndim(B)#出力は、2ということで2次元の配列というコト

↑のBは、「3x2の配列」


そして、図例↓のように

ヨコ方向の並びを「行」タテ方向の並びを「列」という。

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


3.3.2 行列の積


つづいて、行列の積についての説明。

行列の積例↓のように

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


最初の行列は行を取り、次の行列は列を取って、かけ算していく。


コレをPythonで実装すると…

↓のようになる。

行列の積例の実装

import numpy as np
#まずは行列を作る
A = np.array([[1,2], [3,4]])
B = np.array([[5,6],[7,8]])
#行列のかけ算 A x Bは、np.dot関数を使う
np.dot(A, B)#答えは、array([[19, 22],[43, 50]])


大切なコト

Pythonでは、「行列の形状」〇x〇は、.shapeでだせる。

多次元配列の積では、2つの行列で対応する次元要素数を一致させる必要がある。

ちゃんとしてないと実装時にエラー!!になる。

例えば、

↓のような行列の積の場合

行列積の例

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


3 x 2の行列Aのと2x4の行列Bのが一致していないとかけ算できない




ハイ、今日はここまで!!


ということで、第3章のニューラルネットワークはまだまだ続きます。

やっぱりコツコツとちょっとずつでもいいから続けるのが大切ですよね~。

引き続き頑張りまっす。


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

フクコ

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