機械学習のお勉強(活性化関数と損失関数と過学習対策)
活性化関数
活性化関数は、入力信号の総和がどのように活性化するかを決定する役割を持つ
単位ステップ関数 👈パーセプトロン
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すること