Python
MachineLearning
DeepLearning
Keras
TensorFlow

怠け者のためのディープラーニング入門 - Early Stopping(早期終了)

はじめに

Early Stopping(早期終了・早期打ち切り)

エポック数は、データセットを何回学習するか表す数値で、前回紹介したハイパーパラメータの仲間でもあります。今までは決め打ちで設定していたのですが、ニューラルネットの学習がうまく行っていない場合にそれを打ち切る手法として早期終了(Early Stopping)があります。この方法では、学習データセットおよびテストデータセットとは別に検証用データセットを元いて誤差のような値を監視し前回のエポックに比べて増えた場合学習を終了します。

005.png

Early Stoppingを使うことで、過学習(Over fitting)に陥ることを避けつつ、簡単にエポック数を考える手間を減らすことができます。

サンプルコード

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras import optimizers
from keras.callbacks import EarlyStopping
from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split

# Setup dataset
np.random.seed(1234)
n_data = 200
n_class = n_data//2
X_positive = np.random.normal(loc=1.0, scale=1.0, size=(n_class, 2))
X_negative = np.random.normal(loc=-1.0, scale=1.0, size=(n_class, 2))
X = np.r_[X_positive, X_negative]
y = np.r_[[1]*n_class, [0]*n_class]
# Split dataset
X, y = shuffle(X, y)
X_train, X_test, y_train, y_test =\
        train_test_split(X, y, test_size=0.2)
X_train, X_validation, y_train, y_validation =\
        train_test_split(X_train, y_train, test_size=0.2)
# Build a model
model = Sequential()
model.add(Dense(units=128, input_dim=2))
model.add(Activation('relu'))
model.add(Dense(units=128))
model.add(Activation('relu'))
model.add(Dense(units=1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',
              optimizer=optimizers.SGD(lr=0.01),
              metrics=['accuracy',])
# Training
early_stopping = EarlyStopping(monitor='val_loss', patience=10, verbose=0)
model.fit(X_train, y_train, batch_size=20, epochs=1000,
            validation_data=(X_validation, y_validation),
            callbacks=[EarlyStopping()])

# Evaluation
score = model.evaluate(X_test, y_test)
print("\nLoss:", score[0], "Accuracy:", score[1])

実行結果 :

エポック数が77のところで学習が打ち切られていることが分かります。

Epoch 1/1000
128/128 [==============================] - 0s - loss: 0.6646 - acc: 0.8125 - val_loss: 0.6481 - val_acc: 0.7500
Epoch 2/1000
128/128 [==============================] - 0s - loss: 0.6425 - acc: 0.8750 - val_loss: 0.6291 - val_acc: 0.8125
...略...
Epoch 75/1000
128/128 [==============================] - 0s - loss: 0.1816 - acc: 0.9609 - val_loss: 0.2505 - val_acc: 0.8438
Epoch 76/1000
128/128 [==============================] - 0s - loss: 0.1808 - acc: 0.9609 - val_loss: 0.2504 - val_acc: 0.8438
Epoch 77/1000
128/128 [==============================] - 0s - loss: 0.1800 - acc: 0.9609 - val_loss: 0.2509 - val_acc: 0.8438
32/40 [=======================>......] - ETA: 0s
Loss: 0.242067420483 Accuracy: 0.925

おわりに

エポック数の試行錯誤と過学習を避ける方法として、Early Stoppingを紹介しました。