技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

ニューラルネットワーク周りの関数

具体的には活性関数と呼ばれる連中。

これは入力を受けて結果を応答する関数。
調べてみると結構いっぱいある。

ステップ関数

0 基準で 0 か 1 かという単純なもの。


    \boldsymbol{y} =
        \left\{
            \begin{array}{cc}
                0 & (x \leq 0) \\
                1 & (x > 0) \\
            \end{array}
        \right.

in python

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline


def step_func(x):
    return np.where(x <= 0, 0, 1)


x = np.linspace(-5, 5)
y = step_func(x)

plt.plot(x, y)
plt.show()

f:id:white-azalea:20210217205027p:plain

シグモイド関数

もう一つの関数がシグモイド関数
まぁこっちの方が定義が単純


  y = \frac{1}{1 + e^{-x}}
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

y = sigmoid(x)
plt.plot(x, y)
plt.show()

f:id:white-azalea:20210217205117p:plain

素敵なことに、シグモイド関数だと微分が楽。


  y' = (1-y)y

ハイパボリックタンジェント

シグモイドに近い特性がありますが、こいつは -1 から 1 までの値域を持ってる。


  y = \frac{e^x - e^{-x}}{e^x + e^{-x}}

Tex 書式で書きづらいw

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


y = tanh(x)
plt.plot(x, y)
plt.show()

f:id:white-azalea:20210217205233p:plain

ReLU

ReLU 関数というと、0 から線形に伸びる関数


y = \left\{
      \begin{array}{cc}
        0 & (x \leq 0) \\
        x & (x > 0)
      \end{array}
    \right.
def relu(x):
    return np.where(x <= 0, 0, x)


y = relu(x)
plt.plot(x, y)
plt.show()

f:id:white-azalea:20210217205328p:plain

LeakyReLU

マイナスの際にちょっとだけマイナスに伸びてる ReLU 関数。
0 でボーダーしやすい。

def leakey_relu(x):
    return np.where(x <= 0, 0.01*x, x)


y = leakey_relu(x)
plt.plot(x, y)
plt.show()

f:id:white-azalea:20210217205410p:plain

ソフトマックス関数


y = \frac{e^x}{ \sum^{n}_{k=1} e^{x_k} }
def soft_max_function(x):
    return np.exp(x) / np.sum(np.exp(x))


y = soft_max_function(x)
plt.plot(x, y)
plt.show()

f:id:white-azalea:20210217205506p:plain