1.この記事で分かる事
- 活性化関数とは
- よく出てくる活性化関数の数式及びその特徴や使用目的と、Pythonによるスクラッチ実装
- ステップ関数
- シグモイド関数
- ソフトマックス関数
- tanh関数
- ReLU関数
2.活性化関数とは
活性化関数の特徴は、①非線形な関数で、②微分可能な関数という事が特徴。
①については、NN内において非線形な変換を行うため。
②については、勾配計算の際に微分可能である必要がある。
3.よく出てくる活性化関数
ステップ関数(階段回数)
特徴
- 標準形
step(x)=\left\{\begin{array}{l1}
1&(a \geq 0)\\
0&(a \lt 0)
\end{array}\right.\\
- 閾値(上記のコードではa)以上なら1
- 閾値未満なら0という非常にシンプルな関数
- 閾値 aはハイパーパラメータ
深層学習における問題点
- 微分できない
- 閾値を超えないと常に0なので、勾配消失が起こりがち
step 関数
def step(a,x):
if x >= a: #閾値a以上なら、1を返す
return 1
else: #他は全て0
return 0
シグモイド関数
特徴
- 標準形
sigmoid(x)=\frac{1}{1 + e^{-ax}}
- 微分形
sigmoid(x)をf(x)としたとき、f'(x)= (1-f(x))f(x)となる
- 値域が0~1の範囲で、確率の出力に類似している
- a は基本的に1のハイパーパラメータ
深層学習における問題点
- 勾配消失が起こりやすい事
sigmoid 関数
import numpy as np
def sigmoid(a,x):#以下のグラフではa=1としている
return 1 / (1 + np.exe(-a*x))
補足
- シグモイド関数とロジスティック関数が混同する事が多いので気になる方は以下のページへ
→シグモイド関数とロジスティック関数の違い - シグモイド関数の微分も大事なので、一度実際に計算する事をお勧めします。
→シグモイド関数の微分の解答
tanh関数
特徴
- 標準形
tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
- 微分形
tanh(x)をf(x)としたとき、f(x)'= (1-f(x))^2となる
- 値域が-1~1の範囲。
- a は基本的に1のハイパーパラメータ
深層学習における問題点
- 勾配消失が起こりやすい事
tanh 関数
import numpy as np
def tanh(x):
return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
softmax関数
特徴
- 標準形
y_i=\frac{e^{x_i}}{\sum_{k=1}^{n}e^{x_k}}
- 微分形
\frac{∂y_i }{∂x_j }=\left\{\begin{array}{l1}
y_i(1-y_j)&(i=j)\\
-y_jy_i&(i\neq j)
\end{array}\right.\\
- 値域が0~1の範囲
深層学習における問題点
- 勾配消失が起こりやすい事
- オーバーフロー対策が必要になる場合がある
softmax 関数
import numpy as np
def softmax(x):
x = x.T
x = x - np.max(x, axis=0) #オーバーフロー対策で最大値を引いている。
x = np.exp(x) / np.sum(np.exp(x), axis=0)
return x.T
x = np.array([1, 2, 3, 4, 5, 6]) として、上記の関数を適用すると以下の図のようになる。
補足
モデルの蒸留に使われる温度付きソフトマックス関数(元の式のexpの乗数の分母に、温度パラメータTを付けたソフトマックス関数のこと)→詳しくはこちらのページ
ReLU関数
特徴
- 0より上の入力をそのまま扱うことで、上記の関数の勾配消失問題を解決したこと
深層学習における問題点
- 0以下の部分において、勾配消失が起こりやすい事
ReLU(x) = max(0,x)
ReLU
import numpy as np
def ReLU(x):
return np.maximum(0,x)