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

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

드랍아웃 방법은 기울기 소실 문제 해결과 더불어서 딥러닝 역사에서 아주 중요한 의미를 가진다.

CNN, dropout, 그리고 Relu 이들 세가지 방법들에서 공통으로 알 수 있는 것. 너무 많은 계산을 하지 마라. 쓸데없이 고생만 한다. 딱 필요한 것만 하라. 그러면 일을 더 잘 할 수 있고, 계산을 더 많이 안 해도 된다.

딥러닝에서 3대 혁신으로 볼 수 있는 것: Relu, CNN, dropout


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

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

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

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

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


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


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

--------------------------------------------------------------------------------------------------------------
2012년이 딥러닝의 원년이다.
2011년 Relu 함수의 출현 : vanishing gradient problem 해결, 표현력이 높은 딥러닝이 시작됨.
2012년 Dropout 방법의 출현 : overfitting problem 해결, 정규화된 훈련이 가능함. regularization의 도입.
2012년 CNN 출현 : 방대한 이미지 데이터 처리 문제 해결, 비대칭 데이터에 대한 처리가 가능함.
2013년 VAE 출현: 생성모델로서 다양한 가능성을 제안함.
2014년 GAN 출현: 생성모델로서 많은 응용 가능성을 제안함.
2015년 TensorFlow 구현의 출현과 보급 : 실질적인 딥러닝의 민주화가 단행됨.
2016년 알파고 출현 : 바둑 정복
2017년 알파고 제로 출현 : tabula rasa, first-principles 방법을 이용하여 바둑 정복, 진정한 바둑의 정복이 가능함. 기보없이 바둑 정복함. 프로기사에게 절대로 지지 않는 사실상 바둑의 신이 탄생함. 바둑의 역사 5000년 Mastering the game of Go without human knowledge | Nature http://incredible.egloos.com/7372719
2017년 cycleGAN 출현 http://incredible.egloos.com/7530913
2018년 알파폴드 출현
2021년 플로어플랜닝 (반도체 칩 설계) A graph placement methodology for fast chip design | Nature
2021년 나우캐스팅 (단기 일기예보) https://www.nature.com/articles/s41586-021-03854-z
2022년 알파코드  https://alphacode.deepmind.com/

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



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

#     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만을 사용함.
    x = layers.MaxPooling2D((3,3), strides=2, padding="same")(x)

    x = layers.Dropout(0.5)(x)

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


---------------------------------------------------------------------------------------------------------------------
# evaluate a logistic regression model using repeated k-fold cross-validation
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import RepeatedKFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
# create dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1)
print(X.shape)
print(y.shape)
print(X[10,:])
print(y[10])
# prepare the cross-validation procedure
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# create model
model = LogisticRegression()
# evaluate model
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
# report performance
print('Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))

--------------------------------------------------------------------------------------------------------------
dropout의 또 다른 중요한 의미: 추론의 정확성을 산정할 수 있게 한다.


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

2012년이 딥러닝의 원년이다.
2011년 Relu 함수의 출현 : vanishing gradient problem 해결, 표현력이 높은 딥러닝이 시작됨.
2012년 Dropout 방법의 출현 : overfitting problem 해결, 정규화된 훈련이 가능함. regularization의 도입.
2012년 CNN 출현 : 방대한 이미지 데이터 처리 문제 해결, 비대칭 데이터에 대한 처리가 가능함.
2013년 VAE 출현: 생성모델로서 다양한 가능성을 제안함.
2014년 GAN 출현: 생성모델로서 많은 응용 가능성을 제안함.
2015년 TensorFlow 구현의 출현과 보급 : 실질적인 딥러닝의 민주화가 단행됨.
2016년 알파고 출현 : 바둑 정복
2017년 알파고 제로 출현 : tabula rasa, first-principles 방법을 이용하여 바둑 정복, 진정한 바둑의 정복이 가능함. 기보없이 바둑 정복함. 프로기사에게 절대로 지지 않는 사실상 바둑의 신이 탄생함. 바둑의 역사 5000년 Mastering the game of Go without human knowledge | Nature http://incredible.egloos.com/7372719
2017년 cycleGAN 출현 http://incredible.egloos.com/7530913
2018년 알파폴드 출현
2021년 플로어플랜닝 (반도체 칩 설계) A graph placement methodology for fast chip design | Nature
2021년 나우캐스팅 (단기 일기예보) https://www.nature.com/articles/s41586-021-03854-z
2022년 알파코드  https://alphacode.deepmind.com/

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


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

핑백

덧글

댓글 입력 영역

최근 포토로그