-Deep Learning- 活性化関数

ステップ関数の実装例を以下に示します.

まずは,ステップ関数の実装のためにまずは,Pythonインタプリタを用いての例を示します.以下の例では,x というNumPy配列を用意し,そのNumPy配列に対して不等号による演算を行なっています.

>>> 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])
>>> y = y.astype(np.int)
>>> y
array([0, 1, 1])
>>> 
NumPy 配列に対して不等号の演算を行うと,配列の各要素に対して不等号の演算が行われ,ブーリアンの配列が生成されます.ここでは,x という配列の要素に対し 0 より大きい要素は True に,0 以下の要素は False に変換され,新しい配列 y が生成されます.このy という配列はブーリアンの配列ですが,ステップ関数は,0 か 1 の int型を出力する関数です.そのため,配列y の要素の方をブーリアンからint型に変換しています.
 
上記の例で示したように,NumPy 配列の型の変換には astype() メソッドを用います.astype() メソッドでは,引数に希望する型(上記の例ではnp.int)を指定します.
なお,Pythonでは,ブーリアン型からint型に変換すると,Trueが1に,Falseが0に変換される決まりになっています.
 
上記で定義したステップ関数を図示するプログラム例を以下に示します.
 
# Import Module
import numpy as np
import matplotlib.pylab as plt
 
# Definition of Function
def step_function(x): 
    return np.array(x > 0, dtype = np.int)
 
# Execution part
x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
 
# Drawing Graph
plt.plot(x, y)
plt.ylim(-0.1, 1.1)     # Specify range of y axis
 
plt.show()
 
実行結果は以下のようになります.

f:id:HidehikoMURAO:20181230232448p:plain

 
np.arange(-5.05.00.1)は,-5.0から5.0までの範囲を0.1刻みとしてNumPy配列を生成します([-5.0, -4.9, ..., 4.9]).
step_function() は,NumPy配列を引数にとり,配列の各要素に対してステップ関数を実行し,結果を配列として返します.


続いてシグモイド関数の実装を行います.

 

まずは,Pythonインタプリンタを用いて実装例を示します.

>>> import numpy as np
>>> def sigmoid(x): 
...     return 1 / (1 + np.exp(-x))
... 
>>> x = np.array([-1.0, 1.0, 2.0])
>>> sigmoid(x)
array([0.26894142, 0.73105858, 0.88079708])
 
ここで,np.exp(-x) は数式の exp(-x) に対応します.ここで,引数のxにNumPy配列を代入しても,ブロードキャストの機能によりスカラ値とNumPy配列での演算が行われると,スカラ値とNumPy配列の各要素同士で演算が行われることより正しく計算されます.
ることに注意が必要です.以下にもう一つ例を示します.
>>> t = np.array([1.0, 2.0, 3.0])
>>> 1.0 + t
array([2., 3., 4.])
>>> 1.0 / t
array([1.        , 0.5       , 0.33333333])
>>> 
上記の例では,スカラ値(例では1.0)とNumpy配列の間で数値演算(+, / など)が行われています.結果として,スカラ値とNumPy配列の各要素の間で演算が行われ,演算の結果がNumPy配列として出力されています.
 
シグモイド関数の実装でも,np.exp(-x)はNumPy配列を生成するため,1 / (1 + np.exp(-x)) の結果は NumPy配列の各要素の間で計算されることになります.
 
上記の結果をグラフ描画するプログラム例を以下に示します.
 
# Import Module
import numpy as np
import matplotlib.pylab as plt
 
# Definition of Function
def sigmoid(x): 
    return 1 / (1 + np.exp(-x))
 
# Execution part
x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
 
# Drawing Graph
plt.plot(x, y)
plt.ylim(-0.1, 1.1)     # Specify range of y axis
plt.show()
 

実行結果は以下のようになります.

f:id:HidehikoMURAO:20181230232522p:plain

 

続いてReLU(Rectified Linear Unit)関数について示します.ReLUは入力が零を超えていれば,その入力をそのまま出力し,0以下であれば0を出力する関数です.

 

数式の通り,ReLU関数はシンプルな関数です.そのため,ReLU関数の実装も簡単で以下のように書くことができます.

def relu(x)
    return np.maximum(0, x)
 
上記の例では,NumPyのmaximum関数を使っています.このmaximumは,入力された値から大きい方の値を選んで出力する関数です.