空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

機械学習のお勉強(活性化関数と損失関数と過学習対策)

活性化関数

活性化関数は、入力信号の総和がどのように活性化するかを決定する役割を持つ

単位ステップ関数 👈パーセプトロン

def step_function(x):     
    if x > 0:
        return 1
    else:
        return 0

or

def step_function(x):     
    if x > 0:
        return 1
    elif x == 0:
        return 0.5
    else:
        return 0

符号関数 👈パーセプトロン

def step_function(x):     
    if x > 0:
        return 1
    elif x == 0:
        return 0
    else:
        return -1

線形関数 👈ADALINE,線形回帰

def linear_function(x):     
    return x

区間線形関数 👈サポートベクトルマシン

def piecewise_linear_function(x):     
    if x >= 1/2:
        return 1
    elif -1/2 < x < 1/2:
        return x + 1/2
    else:
        return 0

シグモイド関数  👈ロジスティック回帰、ニューラルネットワーク

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

双曲線正接 👈ニューラルネットワーク

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

ReLU関数 👈ニューラルネットワーク

出力値の飽和を防ぐことで勾配消失問題を克服した手法

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

ReLU関数 👈ニューラルネットワーク

出力値の飽和を防ぐことで勾配消失問題を克服した手法

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

Leaky ReLU関数 👈ニューラルネットワーク

負の入力で微分が0になる問題を対処する

alpha = 0.01

def relu(x):
    if x > 0:
        return x
    else:
        return alpha * x

aplhaは微小量にすることが一般的

Parametric ReLU関数 👈ニューラルネットワーク

上記のalphaが学習によって更新されるしくみを採用。

また、入力の次元によってalphaが異なる値をとれるようにしている。

Expotential Linear Unit 👈ニューラルネットワーク

正規化のように働き学習が早く進む他、ノイズに対して頑強だと言われている

alpha = 1

def ELU(x):
    if x > 0:
        return x
    else:
        return alpha * (np.exp(x) - 1)

ソフトマックス関数 👈分類問題に使用

def softmax(x):
    exp_a = np.exp(x)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y
  • ソフトマックスの出力の総和は1になるという性質があり、この性質により出力を確率と解釈することができる。
  • 学習と推論のうち、学習の際にこの関数が関係してくる。

まとめ

重要なことは非線形の関数であるということ。 線形関数では層を深くしても隠れ層のないネットワークになり、多層にする意味がなくなってしまう。

損失関数

二乗和誤差  👈回帰問題に使用

def mean_squared_error(y,t):
    return 0.5 * np.sum((y-t)**2)

交差エントロピー誤差 👈カテゴリ識別問題に使用

def cross_entropy_error(y, t):
    delta = 1e-7←発散防止
    return -np.sum(t * np.log(y+delta))

y:softmax t:one-hot-encoding と考えると、正解ラベルである確率が1であるときに最小値になる

過学習対策

DropOut

イテレーションごとにネットワークからランダムに選ばれたユニットを隠し、学習を行う

バッチ正規化

バッチごとに平均beta、分散gammaに変換になるよう入力を調整する

多層ニューラルネットでBatch Normalizationの検証 - Qiita

Weight decay

L2正規化

損失関数に重みをいれることで、パラメータが極端な値になることを防ぐ

L_w = L + rambda * 1 / 2 * sum(x[k] ** 2 for k in range(i)) 

L1正規化

L_w = L + rambda * sum(abs(x[k]) for k in range(i)) 

Gradient Clipping

勾配爆発を防ぐことで学習を安定化

考え方は損失関数の勾配をある範囲を超えないようclippingすること

nmarkou.blogspot.jp