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')
ニューラルネットワークについて。
・ニューラルネットワーク(多層パーセプトロン)では、活性化関数として、ステップ関数とは別の関数を使用する ・よく使われる関数はシグモイド関数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')
ステップ関数とシグモイド関数の比較
・下記合成した図を確認すると、「滑らかさ」が異なることが重要 ・ステップは0/1の離散だが、シグモイドは連続的な実数値 ・共通点は、入力が小さい時は0に近く、大きくなるに従い1に近づき、常に0から1の間にある非線形関数
xの範囲を10倍した場合
・最近はシグモイド関数の代わりに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')
いったんここまで。