人工知能エンジニア修行日記

人工知能エンジニアを目指して修行します

3章ニューラルネットワーク(ステップ関数・シグモイド関数・ReLU関数)『ゼロから作るディープラーニング』

3章になって結構重くなってきたので、ゆっくりやっていく。

・活性化関数activation function:入力信号の総和を出力信号に変換する関数
・ステップ関数(階段関数):閾値を境にして出力が切り替わる関数
・パーセプトロンでは、ステップ関数を使っている

def step_function(x):
  if x > 0:
    return 1
  else:
    return 0

#配列引数対応版
def step_function(x):
  y = x > 0 # 配列要素に対して不等号の演算をしてTrue/Falseのbool値を返す
  return y.astype(np.int) # boolからintに型変換

def step_function(x):
  return np.array(x > 0, dtype=np.int) # 圧縮記述

以下、生成されたステップ関数グラフ例

import numpy as np
import matplotlib.pyplot as plt
plt.switch_backend('agg')

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

x = np.arange(-5.0, 5.0, 0.1)
y = step_func(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)

plt.savefig('step_func.png')

f:id:kaeken:20161103223008p:plain

ニューラルネットワークについて。

・ニューラルネットワーク(多層パーセプトロン)では、活性化関数として、ステップ関数とは別の関数を使用する
・よく使われる関数はシグモイド関数sigmoid functionである。シグモイド関数は、
 ネイピア数の2.7182...の実装を表す e の-x乗に1を加えた式の逆数である(ネイピア数をあとで調べる?)

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

import numpy as np
import matplotlib.pyplot as plt
plt.switch_backend('agg')

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.savefig('sigmoid.png')

f:id:kaeken:20161103223450p:plain

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

・下記合成した図を確認すると、「滑らかさ」が異なることが重要
・ステップは0/1の離散だが、シグモイドは連続的な実数値
・共通点は、入力が小さい時は0に近く、大きくなるに従い1に近づき、常に0から1の間にある非線形関数

f:id:kaeken:20161103225819p:plain

xの範囲を10倍した場合 f:id:kaeken:20161103225848p:plain

・最近はシグモイド関数の代わりにReLU関数(Rectified Linear Unit)が使われている
・ReLUは、入力が0を超えていればその入力をそのまま出力し、0以下なら0を出力する関数

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,)

plt.savefig('relu.png')

f:id:kaeken:20161103232333p:plain

いったんここまで。