가장 쉬운 드랍아웃 [Keras] by 바죠

가장 쉬운 드랍아웃 [Keras]

딥러닝에서 과적합(overfitting)을 피할 수 있는 방법으로 드랍아웃 방법이 아주 유명하다. 
2012년 탄생하였다.
딥러닝의 역사와 함께 시작하였다.
극도로 구현이 간단한 알고리듬이다. 알고리듬이라고 말하기에 민망할 정도이다. 
하지만, 그 효과는 실로 엄청난 것이였다.
난공불락처럼 여겨져 왔었던 Overfitting 문제, 즉, 과적합 문제를 해결할 수 있기 때문이다. 
드랍아웃은 인공신경망의 최고의 골칫거리, 문제점인 과적합 문제를 해결한다.
드랍아웃의 출현은 2011년 탄생한 Rectified linear unit(Relu) 함수의 출현과 더불어서 딥러닝 알고리듬 역사에서 가장 간단하면서도 가장 후폭풍이 큰 기여들로 볼 수 있다. 그 밖에, 가중치 초기화 방법, CNN 등의 등장을 혁신의 사례들로 볼 수 있다.


기계학습 분야에서는 아래의 푸른색처럼 데이터를 붉은 점을 따라갈 때, 과적합되었다고 합니다.

푸른색이 아니고 녹색처럼 만드는 것을 정규화라고 한다. 모델이 보다 더 일반적인 형식이 되게 하는 것을 정규화라고 한다.

훈련 데이터에 대해서 오차가 작을 수 있다. 

하지만, 훈련하는데 사용하지 않은 별도의 검증 데이터에서 오차를 계산하고 이로부터 진짜 모델의 성능을 평가한다.

훈련을 하면 할수록 검증 데이터에서 모델의 성능이 지속적으로 나빠질 때 이것을 우리는 과적합이라고 한다.


원초적으로 과적합을 피할 수 있어야 마음놓고 훈련을 할 수 있다. 딥러닝의 성공 배경에 이 조건이 포함되어 있다.


딥러닝 방법은 연속적으로 변화하는 데이터에 대해서 아주 강력한 솔루션이 될 수 있다.
하지만, 소위 테이블 데이테에 대한 회귀, 분류는 여전히 트리 기반 알고리듬들이 좋은 성능을 발휘한다.
LightGBM, XGBoost 알고리듬들이 매우 좋은 분류, 회귀 성능을 자랑한다. 특히, LightGBM 방법은 매우 뛰어난 실행 성능과 정밀도를 제공한다.

2012년이 딥러닝의 원년이다.
2011년 Relu 함수의 출현 : vanishing gradient problem 해결, 표현력이 높은 딥러닝이 시작됨.
2012년 Dropout 방법의 출현 : overfitting problem 해결, 정규화된 훈련이 가능함.
2012년 CNN 출현 : 방대한 이미지 데이터 처리 문제 해결, 비대칭 데이터에 대한 처리가 가능함.
2013년 VAE 출현: 생성 모델로서 다양한 가능성을 제안함.
2015년 TensorFlow 구현의 출현과 보급 : 실질적인 딥러닝의 민주화가 단행됨.
2016년 알파고 출현 : 바둑 정복
2017년 알파고 제로 출현 : tabula rasa, first-principles 방법을 이용하여 바둑 정복, 진정한 바둑의 정복이 가능함. 기보없이 바둑 정복함. 프로기사에게 절대로 지지 않는 사실상 바둑의 신이 탄생함.

 



---------------------------------------------------------------------------------------------------------------------

#     Example of Dropout on the Sonar Dataset: Hidden Layer
from pandas import read_csv
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.wrappers.scikit_learn import KerasClassifier
from keras.constraints import maxnorm
from keras.optimizers import SGD
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
#     load dataset
dataframe = read_csv("sonar.csv", header=None)
dataset = dataframe.values
#     split into input (X) and output (Y) variables
X = dataset[:,0:60].astype(float)
Y = dataset[:,60]
#     encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
#     dropout in hidden layers with weight constraint
def create_model():
    #     create model
    model = Sequential()
    model.add(Dense(60, input_dim=60, activation='relu', kernel_constraint=maxnorm(3)))
    model.add(Dropout(0.2))
    model.add(Dense(30, activation='relu', kernel_constraint=maxnorm(3)))
    model.add(Dropout(0.2))
    model.add(Dense(1, activation='sigmoid'))
    #     Compile model
    sgd = SGD(lr=0.1, momentum=0.9)
    model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])
    return model
estimators = []
estimators.append(('standardize', StandardScaler()))
estimators.append(('mlp', KerasClassifier(build_fn=create_model, epochs=300, batch_size=16, verbose=0)))
pipeline = Pipeline(estimators)
kfold = StratifiedKFold(n_splits=10, shuffle=True)
results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)
print("Hidden: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

---------------------------------------------------------------------------------------------------------------------

#     mlp with dropout on the two circles dataset
from sklearn.datasets import make_circles
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from matplotlib import pyplot
#     generate 2d classification dataset
X, y = make_circles(n_samples=100, noise=0.1, random_state=1)
#     split into train and test
n_train = 30
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
#     define model
model = Sequential()
model.add(Dense(500, input_dim=2, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
#     fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0)
#     evaluate the model
_, train_acc = model.evaluate(trainX, trainy, verbose=0)
_, test_acc = model.evaluate(testX, testy, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
#     plot history
pyplot.plot(history.history['accuracy'], label='train')
pyplot.plot(history.history['val_accuracy'], label='test')
pyplot.legend()
pyplot.show()

---------------------------------------------------------------------------------------------------------------------

CNN의 경우, dropout 확률 0.5
maxpooling을 사용함.

핑백

덧글

댓글 입력 영역

최근 포토로그



MathJax