Kerasでアクティベーションのパラメータチューニング


以前は「Mnistで深層学習入門」を説明しました。今回は、活性化関数(Activation Function)のパラメーター調整を説明します。活性化関数は、入力信号の総和がどのように活性化するかを決定する役割を持ちます。これは、次の層に渡す値を整えるような役割をします。

実験では活性化関数での計算時間及び精度を比較します。

 

Linear

Linear activation(Identityとも呼ばれる)、最も単純な活性化機能の1つです。 これは、入力を出力に線形変換します。 ほとんど使われていませんが、その範囲とドメインは[-Inf; + Inf]になります。

activation01

 

Sigmoid

Sigmoid は、[-Inf; + Inf]を(0; 1)の範囲に設定し、S字曲線のように見えます。

また、勾配消失問題が起こる可能性があります。勾配消失(Vanishing gradients)とは。層を増やすにつれて、バックプロパゲーションでは徐々に最初の層に近づくにつれて情報を伝達出来なくなり、学習速度が遅くなっていきます。

activation02

 

Hard Sigmoid

範囲[-Inf; -2.5]で0に等しくなります。 [-2.5,2.5]の範囲で0直線的に増加し、範囲(+2.5; + Inf)で1となる関数です。Hard Sigmoidの計算は、指数関数ではないため、Sigmoidの計算より高速であると考えられ、分類タスクについて合理的な結果が得られます。 しかし、正確には近似値なので、通常のシグモイドよりも誤差がはるかに大きいため、回帰タスクに使用するべきではありません。また勾配消失もおこりやすいとされます。

activation03

 

Hyperbolic Tangent (TanH)

TanHはシグモイドのS字曲線によく似ていますが、その範囲は(-1; +1)です。 近年のRelu(ランプ)関数のようなアクティベーション関数が登場する以前にはかなり人気がありました。

Sigmoidの代わりにTanHを使用する利点

  • より強いグラジエント:データが0の周りに集中している場合、その微分はより高くなります。
  • 範囲(-1; 0)を含むため、勾配の偏りを避ける。

しかし、Sigmoidと同様、TanHは勾配消失問題は起こりうります。

activation04

 

Softsign

それは符号関数の連続近似であり、そのグラフはTanHと非常によく似ています。 しかし、TanHは指数関数的(exponential)ですが、Softsignは多項式(polynomial)です。

activation05

 

Rectified Linear Unit (ReLU)

非常に簡単で強力なアクティベーションです。 入力が正の場合は入力を出力し、そうでない場合は0を出力します。現在、SigmoidおよびTanHよりも優れた結果をもたらす事が多いです。勾配消失問題以外では、dying ReLU という問題が発生する可能性があります。

活性化関数ReLUは負の領域では値が0=勾配がないとう関数です。そのため学習時に大きく負側に重みが更新された場合、ReLU関数で活性化する事がなくなる可能性がある。

activation06

 

Exponential Linear Unit (ELU)

ReLUに比べてあまり広く使われていません。従来のReLUよりも高速だと言われています。 ReLUと同様にx> = 0のルールに従い、x <0で指数関数的に増加します。ELUは、平均アクティベーションをゼロに近づけて、トレーニングをスピードアップします。

負の部分の位取りを制御するパラメータalphaが1つだけあり、デフォルトでは1.0に設定されています。

activation07

 

Scaled Exponential Linear Unit (SELU)

これはELUをパラメーターlambdaで拡張し、正と負の両方の要素をスケーリングします。 この関数でアルファとラムダの初期設定は、おおよそそれぞれ1.67と1.05に等しい

activation08

 

SoftPlus

SoftPlus関数のグラフは、ReLUを0の辺りで平滑化したような関数です。

activation09

 

では、Mnistのデータをアクティベーションのパラメータチューニングします。

Jupytherで実験します。

 

#ライブラリーのインポート

import numpy as np

from keras.models import Sequential

from keras.layers.core import Dense, Activation

from keras.optimizers import SGD

from sklearn import datasets

from sklearn.model_selection import train_test_split

from tensorflow.examples.tutorials.mnist import input_data

 

%matplotlib inline

import matplotlib.pyplot as plt

 

#データロード

mnist = input_data.read_data_sets(‘MNIST_data’, one_hot=True)

 

# データ用意

n = len(mnist.train.images)

N = 10000  # MNISTの一部を使う

indices = np.random.permutation(range(n))[:N]  # ランダムにN枚を選択

 

X = mnist.train.images[indices]

y = mnist.train.labels[indices]

 

X_train, X_test, Y_train, Y_test = train_test_split(X, y, train_size=0.8)

 

 

#ニューラルネットワーク作成

n_in = len(X[0])  # 784

n_hidden = 200

n_out = len(y[0])  # 10

alpha = 0.01

 

model = Sequential()

model.add(Dense(n_hidden, input_dim=n_in))

 

# 詳しくはhttps://keras.io/ja/activations/

 

model.add(Activation(‘softplus’)) #パラメーターチューニング

model.add(Dense(n_hidden))

 

model.add(Dense(n_out))

model.add(Activation(‘softmax’))

 

model.compile(loss=’categorical_crossentropy’,

              optimizer=SGD(lr=0.01),

              metrics=[‘accuracy’])

 

# モデル・図作成

import time

t0 = time.time()

epochs = 100

batch_size = 50

 

history = model.fit(X, y, validation_split=0.8, epochs=epochs, batch_size=batch_size, verbose=0)

plt.plot(history.history[‘acc’])

plt.plot(history.history[‘val_acc’])

plt.title(‘Activation: softplus’)

plt.ylabel(‘accuracy’)

plt.xlabel(‘epoch’)

plt.legend([‘train’, ‘test’], loc=’lower right’)

plt.ylim(bottom=0)

plt.ylim(top=1)

plt.show()

t = time.time() – t0

print(“train time =”,t )

loss_and_metrics = model.evaluate(X_test, Y_test)

print(loss_and_metrics)

 

 

Linear, sigmoid, hard_sigmoid, tanh, softsign, relu, elu, softplusのアクティベーションのパラメータチューニングしました。結果は下記になります。

activation10
activation11

 

 

アクティベーションのパラメータチューニングの結果

Tanhは一番短く学習時間ですが、Softplusは一番時間がかかる結果になりました。Mnistデータの分類問題に対して、Sigmoidとhard_sigmoidは精度がちょっと低い結果になりました。Reluは一番良い結果になりました。問題に応じてこれは異なります。

https://towardsdatascience.com/deep-study-of-a-not-very-deep-neural-network-part-2-activation-functions-fd9bd8d406fc

2 thoughts on “Kerasでアクティベーションのパラメータチューニング”

  1. Pingback: 高度な活性化関数ReLU | S-Analysis

  2. Pingback: Keras AutoEncoder で異常検知「詐欺検知」 - S-Analysis

Comments are closed.