【読書メモ】ゼロから作るDeep Learning 3章

f:id:taigok:20160908173332j:plain

ゼロから作るDeep Learning

ゼロから作るDeep Learningの読書メモとしてまとめました。

本を読む目的

Coursera Machine Learningを受講してニューラルネットワークを理解したので、次はディープラーニングについて深く理解をしたいため。

前章までのまとめ

内容

ステップ関数

# coding: utf-8
import numpy as np
import matplotlib.pylab as plt


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:taigok:20181215114538p:plain

シグモイド関数

# coding: utf-8
import numpy as np
import matplotlib.pylab as plt


def sigmoid(x):
    return 1 / (1 + np.exp(-x))    

X = np.arange(-5.0, 5.0, 0.1)
Y = sigmoid(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1)
plt.show()

f:id:taigok:20181215115130p:plain

ステップ関数・シグモイド関数の共通点

  • 入力が小さい時に出力は0に近く、入力が大きい時に出力は1に近づく
  • 出力信号は0から1の間
  • 非線形関数

Relu関数

最近のニューラルネットワークはRelu(Rectified Linear Unit)関数を主に用いている。

# coding: utf-8
import numpy as np
import matplotlib.pylab as plt


def relu(x):
    return np.maximum(0, x)

x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)
plt.plot(x, y)
plt.ylim(-1.0, 5.5)
plt.show()

f:id:taigok:20181215120547p:plain

ニューラルネットワークのnumpy実装

  • 回帰問題の場合、出力層の活性化関数を恒等関数(入力をそのまま出力する関数)として利用する
  • 分類問題の場合、ソフトマックス関数を利用する
## Neural Network
import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def indentity_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 = indentity_function(a3)

    return y

network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)
$  python nn.py
[0.31682708 0.69627909]

ソフトマックス関数

  • ソフトマックス関数の出力は0〜1
  • 出力の総和は1になる
  • よって、ソフトマックス関数の出力を確率として解釈できる
import numpy as np

# softmax function
def softmax(a):

    exp_a = np.exp(a) # 指数関数
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y

a = np.array([0.3,2.9,4.0])
y = softmax(a)
print(y)
$ python softmax.py
[0.01821127 0.24519181 0.73659691]