機械学習の基礎まとめ【活性化関数(ステップ、シグモイド、ReLU、ソフトマックス)】

この記事を読むのに必要な時間は約 12 分です。

この記事を読むのに必要な時間は約 12 分です。

今回は活性化関数について、

 

「活性化関数ってなに??」

「活性化関数にはどんな種類のものがあるの??」

「Pythonで活性化関数を実装すると??」

 

などをまとめてみました。

 

ちなみに、活性化関数はJDLAのG検定にも出題される重要な内容です。

 

この記事を書いている僕はシステムエンジニア6年目

 

普段はJavaでWebアプリを作ったりSQL書いたり・・・、

なので最近流行りのPython、数学、人工知能、デープラーニングができる人には正直憧れています。。。。

 

 

自分も一から勉強してこの辺りできるようになりたい、、画像認識モデルを作ったりして、アプリに組み込みたい!

これが機械学習、深層学習の勉強を始めたきっかけでした。

 

 

体系的に、この分野の基礎から学ぼうとJDLAのG検定の勉強をして合格するところまでいきました。

次のステップとして、

実際にPythonでコードを書きながら機械学習や深層学習の知識を深めているところです。。。

 

 

今回は、JDLAのG検定にも出題される「活性化関数」についてまとめてみました。

 

 

活性化関数の役割

 

 

活性化関数は、ニューラルネットワークにおいて、

ニューロンが入力信号を次のニューロンに「伝達する??しない??」、「どれくらい伝達する??」を制御する役割を担います。

 

活性化関数の仕組みを図にすると、

 

 

上の図は○がニューロンを、\( h( )\)が活性化関数を表しています。

ちなみに、上の図を式で表すと以下のようになります。

$$a = b + w_{1}x_{1} + w_{2}x_{2}$$

$$y = h(a)$$

 

 

 

いろんな活性化関数

 

 

ステップ関数

ステップ関数は閾値を境にして出力が切り替わる関数で、「階段関数」とも呼ばれます。

 

$$ \begin{eqnarray}h(x) = \begin{cases} 0 & ( x \leq  0) \\ 1 & ( x \gt  1) \end{cases}\end{eqnarray} $$

 

上の式のように、閾値を境に出力が切り替わる式はパーセプトロンでも登場しました。

この関数は閾値0を境に1(次のニューロンに伝送する)か0(次のニューロンに伝送しない)がはっきり決まります。

 

 

ステップ関数をPythonでグラフにすると、

Python
import numpy as np
import matplotlib.pylab as plt
​
def step_function(x):
  y = x > 0
  return y.astype(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)
plt.show()

 

step_functionでは、受け取った配列を0より大きいか小さいかBoolean(True、False)の配列にして、

数値型にキャストしてTrueを1、Falseを0に変換しています。

 

グラフは以下のようになります。

 

 

シグモイド関数

ニューラルネットワークでよく用いられるの活性化関数がシグモイド関数です。

パーセプトロンとニューラルネットワークの主な違いは、活性化関数です。

 

シグモイド関数の式は

$$h(x) = \frac{1}{1 + e^{-x}}$$

 

上の式の\(e\)はネイピア数で2.7182・・・の実数を表します。

 

シグモイド関数をPythonでグラフにすると、

Python
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()

 

グラフは以下のようになります。

 

シグモイド関数の特徴は、

\(x\)が負の無限大に近づくと分母は(\(e^{\infty} = \infty\)のため)正の無限大となるので出力は\(0\)に近づき、

\(x\)が負の無限大に近づくと分母は(\(e^{-\infty} = 0\)のため)\(1\)に近づき、出力は\(0\)に近づきます。

また、\(x\)が\(0\)に近づくと、分母は(\(e^{0} = 1\)のため)\(2\)になり、出力は\(\frac{1}{2}\)になります。

 

シグモイド関数と先ほどのステップ関数を比較すると、

ステップ関数が0か1しか返せないのに対して、

シグモイド関数の方が滑らかな曲線で、0.23や0.78などの実数が返却できる点が異なります。

 

逆に共通しているのは、

\(x\)が小さくなると返却ちが0に近づき、\(x\)が大きくなると1に近づく点です。

 

 

ReLU関数

ニューラルネットワークではシグモイド関数が昔から利用されてきましたが、

最近ではReLU(Rectified Linear Unit)関数が主に用いられます。

 

数式で表すと、

$$ \begin{eqnarray}h(x) = \begin{cases} x & ( x \gt  0) \\ 0 & ( x \leq  0) \end{cases}\end{eqnarray} $$

 

とてもシンプルです。

ReLU関数をPythonでグラフにすると

Python
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(-0.1, 5.1)
plt.show()

グラフは以下のようになります。

 

ReLU関数は、入力が0より大きければ、その入力をそのまま出力し、0以下なら0を出力する特徴があります。

 

ソフトマックス関数

ソフトマックス関数はニューラルネットワークの出力層で使われます。

数式で表すと、

$$y_k = \frac{e^{a_k}}{\displaystyle \sum_{ i = 1 }^{ n } e^{a_i}}$$

上の式では出力が全部で\(n\)個ある\(k\)番目の出力\(y_k\)を求める計算式を表しています。

 

ソフトマックス関数をPythonで実装すると、

Python
import numpy as np
import matplotlib.pylab as plt

def softmax(x):
  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)
# y[0]、y[1],y[2]の確率をそれぞれ出力できる(y[2]の確率が一番高くなる)
print(y)
#配列yの出力の合計は1になる
print(np.sum(y))

 

出力結果は

 

ソフトマックス関数の特徴は出力の総和は1になることです。

そのため、それぞれの出力を確率と捉えることができます。

上の例だと、y[2]の確率が73%で最も高く、y[0]の確率が8%で最も低いと解釈できます。

(入力値が大きい値ほど出力の値も大きくなります。(\(y = e^{x}\)が単調増加する関数であるため))

 

この性質を利用して、

手書き文字が何の数字なのかソフトマックス関数で確率を出力して分類することもできます。

 

 

 

まとめ

 

 

今回は活性化関数について確認しました。

そこまで難しい内容ではないですが、G検定にも出題される重要な内容です。

 

以下は抑えておきましょう。

  • 活性関数はニューロンが入力信号を次にどれだけ伝送するか制御する役割を担う。
  • 活性化関数にはステップ関数、シグモイド関数、ReLU関数、ソフトマックス関数などがある。

 

参考にした資料

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください