或るレールを渡る

そして通り過ぎて行く

機械学習でよく使われる「活性化関数」についてまとめてみた

お疲れ様です。

機械学習に興味があり、本を読んだりインターネットで調べたりしてなんとなく理解はしているつもりなのですが、実はその「つもり」が一番やっかいで、結局自分は何も学んでいないのではないかと最近考えております。
このような分野を本当に理解するためには、やはり自分の手で実装してみるのが一番ということで、巷でよく良書と言われているこちらの本、「ゼロから作るDeepLearning」を使用して実際に手を動かしながら勉強中です。
良書と言われているだけあり1つ1つのセクションが丁寧でわかりやすく、今までなんとなく理解したつもりで済ましてきたことも、実際にpythonでコーディングしてみると新たな発見やより深い理解が得られました。
少しづつまとめていきたいと思います。
まずは、機械学習でよく使われる「活性化関数」についてまとめてみました。
 

その前に、macpythonで学んだこと。

1.スクリーンショットのとり方

[command]+[Shift]+[4]

2.pythonのエラー回避

SyntaxError: Non-ASCII character '\xe3' in file

上記のエラーが出た場合、文字コードのエラーのため、.pyファイルの最初の行に以下を追加することで回避できる。

# coding:utf-8

 

パーセプトロン

複数の入力に対して1つの出力を返すモデル。

以下の画像のイメージがよく使われておりわかりやすい。

f:id:yuchame:20181230010719p:plain
パーセプトロン
 

活性化関数

入力信号の総和を出力信号に変換する関数。

「活性化」という名前の通り、入力信号の総和がどのように活性化(発火)するかということを決定する役割がある。

『ステップ関数』『シグモイド関数』『ReLU関数』などがある。

各それぞれの違いを見ていく。

 

ステップ関数

閾値を境にして出力が切り替わる関数。

単純パーセプトロンでは、活性化関数にステップ関数を採用していることとなる。
一般的に「単純パーセプトロン」といえば、単層のネットワークで、活性化関数にステップ関数を使用したモデルを指す。
「多層パーセプトロン」というと、多層でシグモイド関数などの滑らかな活性化関数を使用するモデルを指す(そしてこれがニューラルネットワークとなる)。
グラフで表そうとするとソースコードは以下。

# 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:yuchame:20181229225816p:plain
ステップ関数

 

シグモイド関数

ニューラルネットワークで用いられる関数の1つ。

実装してみてステップ関数と比較してみる。

# 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) #y軸の範囲指定
plt.show()

実際に出力されるグラフ

f:id:yuchame:20181229225809p:plain
シグモイド関数

ステップ関数と比較してみる。

f:id:yuchame:20181229225801p:plain
比較


■異なる点
・ステップ関数が0を境に急に出力を変えているのに対し、シグモイド関数は滑らかな曲線を描いている。
・ステップ関数が0か1かの値しか返さないのに対し、シグモイド関数は実数(0.731とか0.880とか)を返す。
■共通する点
・入力が小さいときには0に近く(もしくは0)、出力が大きい時に1に近づく(もしくは1)。
 →入力信号が重要な情報であれば大きな値を出力し、重要でなければ小さな値を返す。
・入力信号の値にかかわらず、0から1の範囲の値を返す。
非線形関数(1本の直線ではなく、折れ曲がった線となる)。

ReLU関数

シグモイド関数ニューラルネットワークにおいて古くから使用されていたが、最近よく使用されることになったのがこのReLU関数。
入力値が0を超えていればそのまま出力し、0以下であれば0を出力する単純な関数。

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

#ReLU関数
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, 6.0) #y軸の範囲指定
plt.show()

実際に出力されるグラフ

f:id:yuchame:20181229225754p:plain
ReLU関数


なぜシグモイド関数ではなくReLU関数が使用されることになったのかは、「勾配消失」が深く関わっているのですが、それはまた実装しながら勉強し直そうと思います。

また、この関数実装は本書では全8章あるうちのまだ第3章の部分です。
これからこれらの関数を使用して実際にDeepLearningを実装することになるのですが、まだそこまで進めていないので、随時まとめていければと思います。
更にこの本の第2弾「ゼロから作るDeepLearning〜自然言語処理編」もかなり良さそうなので、そこまで一度網羅できるように頑張ります。

以上です。
よろしくお願いします。