sigmoid関数とReLU関数を実装してみる

ニューロンが入力から出力を生むまでの計算、つまりニューロンの中身のことを「活性化関数(Activation function)」と呼ぶ。パーセプトロンでは、活性化関数にステップ関数を使っていた。ステップ関数とは、入力に対してある閾値を境に出力が1か0か決まる関数のことだ。階段のようにガクッと出力が変わるからステップ関数、というわけだ。

画像①ステップ関数

ニューラルネットワークでは基本的に活性化関数としてステップ関数ではなく、滑らかな関数を使う。これには明確な理由があり、ステップ関数は微分するとゼロになるからだ。ニューラルネットワークは学習をする際に微分を含む計算を行うため、微分するとゼロになる関数は都合が悪い。ここでは、ニューラルネットワークでよく使われる活性化関数として「シグモイド関数(sigmoid function)」と「ReLU関数(Rectified Linear Unit function)」を挙げる。

1.ジグモイド関数

画像②数式

画像③ジグモイド関数

ステップ関数では微分した時の話が問題になるが、ジグモイド関数には滑らかさの代名詞、ネイピア数が使われている。exp(x)は微分してもexp(x)であるという性質から、微分したい放題というわけである。ジグモイド関数をPythonで書くと以下のようになる。

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

x = np.array([-2.0, 1.0, 0.5])
y = sigmoid(x) #[ 0.11920292 0.73105858 0.62245933]

数式からもわかるが、コードで試すとよくわかる。sigmoid関数はマイナスを含むどんな値に対しても0~1の小数で返す。ディープラーニングではあらゆる要素に対して確率をベースに考えるので、0~1の小数に変換されること、つまり正規化(Normalization)されることは都合が良い。最初からそれを狙った関数なのである。よく使われる関数というのは偶然ではなく、活性化関数として適切な関数ということだ。

2.ReLU関数

画像④数式

画像⑤ReLU関数

ReLU関数はシンプルだ。この関数の強みは、①計算が速い、②勾配損失しない、③スパース性(Sparsity)の高さに繫がる、の3つだと言える。①は言うまでもない。ジグモイド関数より計算が速いのは明らかだ。②は要するに、微分してゼロにならないということだ(0以上の話)。③のスパース性とは、英語で”スカスカ度合い”とでも言えるもの。ReLU関数は、重要でない要素に小さな値を与え続けるのではなく、大胆に切ってしまうことで高速化する。スパース性が高いことで、より重要な要素(特徴量)に焦点を絞ることができる。

『スパース性と機械学習』
https://matome.naver.jp/odai/2146248047579237201

ReLU関数をPythonで書くと以下のようになる。

def relu(x):
return np.maximum(0, x)

このように、活性化関数は極めてシンプルである必要がある。何故なら、これら活性化関数の役割は非線形であることによってニューラルネットワークを多層化を可能にすること”だけ”にあるからだ。活性化関数には複数の入力の重要度の順位を逆転させるような機能はなく、重要度の判定は全て「重みパラメータ」に委ねられている。活性化関数は重みを支える骨組みでしかない。これはコンピュータにおけるハードとソフトの関係のようなもので、コンピュータの意味はソフトにあるが、ハードがなければソフトは存在できない。(MacBookAirを包丁代わりに使用した場合、ハードそのものにも存在価値はあるかもしれない。)

*パーセプトロンが発明された当初は活性化関数としてステップ関数が使われていたが、ここにジグモイド関数を使うことが1つのブレークスルーとなった。その一歩先として、最近はReLU関数が使われることが多いらしい。

 

Leave a Comment