Pynote

Python、機械学習、画像処理について

Deep Learning - 活性化関数

ステップ関数

ステップ関数 (step function) は以下の式で表される関数である。

\displaystyle
f(x) = \left\{
\begin{array}{*{35}{l}}
    1 & (x \ge 0) \\
    0 & (x < 0) \\
\end{array}
\right.

微分

\displaystyle
f'(x) =
\left\{
\begin{array}{*{35}{l}}
    0 & (x \ne 0) \\
    undefined & (x = 0) \\
\end{array}
\right.

数学的には、x = 0微分係数は定義されないが、実用上は f'(0) = 0 とする。

コード

def step(x):
    return np.where(x > 0, 1, 0)

ランプ関数 / ReLU

ランプ関数 / ReLU (Rectified linear Unit) は以下の式で表される関数である。

\displaystyle
f(x)=\left\{
\begin{array}{*{35}{l}}
    x & (x \ge 0) \\
    0 & (x < 0) \\
\end{array}
\right.

微分

\displaystyle
f'(x)=\left\{
\begin{array}{*{35}{l}}
    1 & (x \ge 0) \\
    0 & (x < 0) \\
    undefined & (x = 0) \\
\end{array}
\right.

数学的には、x = 0微分係数は定義されないが、実用上は f'(0) = 0 とする。

コード

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

シグモイド関数

シグモイド関数 (sigmoid function) は以下の式で表される関数である。

\displaystyle
f(x) = \frac{1}{1 + e^{-x}}

微分

\displaystyle
f'(x) = \frac{1}{(1 + e^{-x})^2} = f(x)(1 - f(x))

コード

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

ソフトサイン関数

ソフトサイン関数 (softsign function) は以下の式で表される関数である。

\displaystyle
f(x) = \frac{x}{1 + |x|}

微分

\displaystyle
f'(x) = \frac{1}{(1 + |x|)^2}

コード

def softsign(x):
    return x / (1 + np.abs(x))

ソフトプラス関数

ソフトプラス関数 (softplus function) は以下の式で表される関数である。

\displaystyle
f(x) = \log(1 + e^x)

微分

\displaystyle
f'(x) = \frac{1}{1 + e^{-x}}

コード

def softplus(x):
    return np.log(1 + np.exp(x))

恒等関数

恒等関数 (identity function) は以下の式で表される関数である。

\displaystyle
f(x) = x

微分

\displaystyle
f'(x) = 1

コード

def identity(x):
    return x

双曲線関数 / tanh

tanh (hyperbolic function) は以下の式で表される関数である。

\displaystyle
f(x) = \tanh x

微分

\displaystyle
f'(x) = 1 - \tanh^2 = 1 - f(x)^2

コード

def tanh(x):
    return np.tanh(x)

Scaled Exponential Liner Units (SELU)

SELU (Scaled Exponential Liner Units) は以下の式で表される関数である。

\displaystyle
f(x) = \lambda \left\{
\begin{array}{*{35}{l}}
    x & (x \ge 0) \\
    \alpha (e^x - 1) & (x < 0) \\
\end{array}
\right.\\
where \ \lambda = 1.0507, \alpha = 1.6732

微分

\displaystyle
f'(x) = \left\{
\begin{array}{*{35}{l}}
    \lambda & (x \ge 0) \\
    \lambda \alpha e^x = \lambda (f(x) + \alpha) & (x < 0) \\
\end{array}
\right.\\
where \ \lambda = 1.0507, \alpha = 1.6732

コード

def selu(x):
    l = 1.0507
    alpha = 1.6732
    return l * np.where(x >= 0, x, alpha * (np.exp(x) - 1))

Exponential Liner Units (ELU)

ELU (Exponential Liner Units) は以下の式で表される関数である。
SELU において、\lambda = 1 としたものが ELU である。

\displaystyle
f(x) = \left\{
\begin{array}{*{35}{l}}
    x & (x \ge 0) \\
    \alpha (e^x - 1) & (x < 0) \\
\end{array}
\right.

微分

\displaystyle
f'(x) = \left\{
\begin{array}{*{35}{l}}
    1 & (x \ge 0) \\
    \alpha e^x = f(x) + \alpha & (x < 0) \\
\end{array}
\right.

コード

def elu(x, alpha):
    return np.where(x >= 0, x, alpha * (np.exp(x) - 1))

ハードシグモイド関数

ハードシグモイド関数 (hard sigmoid function) は以下の式で表される関数である。

\displaystyle
f(x)=\left\{
\begin{array}{*{35}{l}}
    0 & (x < -2.5) \\
    0.2 x + 0.5 & (-2.5 \ge x \ge -2.5) \\
    1 & (x \ge -2.5) \\
\end{array}
\right.

微分

\displaystyle
f'(x)=\left\{
\begin{array}{*{35}{l}}
    0 & (x < -2.5, x > 2.5) \\
    0.2 & (-2.5 < x < -2.5) \\
    undefined & (x = -2.5, 2.5)
\end{array}
\right.

コード

def hard_sigmoid(x):
    return np.maximum(0, np.minimum(1, x * 0.2 + 0.5))

数学的には、x = -2.5, 2.5微分係数は定義されないが、実用上は f'(-2.5) = f'(2.5) = 0 とする。

Leaky ReLU

Leaky ReLU (Leaky Rectified Linear Unit) は以下の式で表される関数である。

\displaystyle
f(x)=\left\{
\begin{array}{*{35}{l}}
    x & (x \ge 0) \\
    \alpha x & (x < 0) \\
\end{array}
\right.

微分

\displaystyle
f'(x)=\left\{
\begin{array}{*{35}{l}}
    1 & (x \ge 0) \\
    \alpha & (x < 0) \\
    undefined & (x = 0) \\
\end{array}
\right.

数学的には、x = 0微分係数は定義されないが、実用上は f'(0) = 1 とする。

コード

def leaky_relu(x, alpha):
    return np.where(x >= 0, x, alpha * x)

参考