こんにちは!
現役パラレルワーカー フクコです。
前回の記事↓に続き
来年の2月の試験に向けてE資格試験勉強中のため
ゼロつくシリーズでおなじみ
オーライリーから出版されている
ディープラーニングの本格的な入門書でおススメされる
この本↑を毎日5ページずつコツコツこなすと
約2か月間で今年中に終了するので
来年のE資格試験までにこれで基礎力をつけることにしました。(^^)
ついつい私は何もないとだらけてしまうので(笑)
毎日5ページ終わった後の記録とまとめを書いていこうと思います。
と、まとめに入る前に…
やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)
「希望にカタチが見えてきた。
だからなんだってする。無理でもやる!」 byエマ
↓の記事でもおススメした「約束のネバーランド」から
私の大好きなエマのコトバです。(^^)
やっぱり「約束のネバーランド」いいですよね~。
なんか「鬼滅の刃」ばかり人気が出て知る人ぞ知るみたいになりましたが
夢をかなえたい! 目標を達成したい!みたいなときにものすごく励みになるマンガだと思います。
おかげでやる気が出ます。
ありがとうございます!!(^^)
というコトで、いい加減まとめに入ります。笑
その前に本の目次の紹介です。
ゼロつくディープラーニングは、下記↓の合計8章で構成されています。
本の目次
- 1章 Python入門
- 2章 パーセプトロン
- 3章 ニューラルネットワーク
- 4章 ニューラルネットワークの学習
- 5章 誤差伝播法
- 6章 学習に関するテクニック
- 7章 畳み込みニューラルネットワーク
- 8章 ディープラーニング
ちなみに…
ゼロつくディープラーニングの第1章はPython入門のセクション(20ページ分)なので、
とりあえず今回私は飛ばし、第2章からまとめています。
前回、2章が終わったので、今回は第3章からでーす。
第3章 ニューラルネットワーク
ニューラルネットワークには、
入力層、隠れ層、出力層がある。
3.1.2 パーセプトロンの復習
パーセプトロン 例
パーセプトロンの数式
bは「バイアス」とよばれるパラメータで、ニューロンの発火のしやすさをコントロールする。
↑のパーセプトロンの数式は、入力が0を越えたら1を返し、そうでなければ0を返す。
3.1.3 活性化関数の登場
このパーセプトロンの数式のように、入力信号の総和を出力信号に変換する関数のことを「活性化関数」(activation function)とよぶ。
3.2 活性化関数
活性化関数は、閾値を境にして出力が切り替わる関数。
3.2.1 シグモイド関数(sigmoid function)
シグモイド関数は、ニューラルネットワークでよく用いられる活性化関数のひとつ。
シグモイド関数の式
注: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()
出てくるグラフが↓のもの。
3.2.4 シグモイド関数の実装
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()
コレを実行すると、下記↓のグラフになる。
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関数を式で表すと、下記↓のようになる。
ReLU関数の実装はとってもシンプル。
下記↓のコードで実装できる。
#ReLU関数の実装 import numpy as np def relu(x): return np.maximum(0, x)
↑はNumPyのmaximum関数を使っている。
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の配列」
そして、図例↓のように
ヨコ方向の並びを「行」、タテ方向の並びを「列」という。
3.3.2 行列の積
つづいて、行列の積についての説明。
行列の積例↓のように
最初の行列は行を取り、次の行列は列を取って、かけ算していく。
コレを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つの行列で対応する次元要素数を一致させる必要がある。
ちゃんとしてないと実装時にエラー!!になる。
例えば、
↓のような行列の積の場合
行列積の例
3 x 2の行列Aの2と2x4の行列Bの2が一致していないとかけ算できない。
ハイ、今日はここまで!!
ということで、第3章のニューラルネットワークはまだまだ続きます。
やっぱりコツコツとちょっとずつでもいいから続けるのが大切ですよね~。
引き続き頑張りまっす。
最後まで読んでくださり、ありがとうございます!
フクコ
ディープラーニング入門書おススメ本