데이터과학 유망주의 매일 글쓰기 — 63일차
과적합 줄이기
#과적합, #overfitting
오늘 한일:
오늘은 과적합을 줄이는 다양한 방법들에 대해 알아보았다. 머신러닝 뿐만아니라, 딥러닝에서도 이러한 과적합을 줄이는 것은 매우 중요하다.
과적합이란, 특정한 데이터에서만 성능이 좋은 상태를 말한다. 새로운 데이터가 왔을 때, 성능이 급격하게 떨어지는 원인이 되기도 한다. 과적합은 모델이 일반화가 충분히 되지 않았을 때, 학습이 잘 되었더라도, 테스트에서 상당한 성능의 저하를 초래한다. 그렇다면 딥러닝에서도 이러한 과적합의 문제를 막기 위해 어떤 것을 할 수 있을까?
딥러닝에서 과적합을 줄이는 방법
과적합을 줄이는 방법을 딥러닝에서는 일반적으로 규제방법(regularization)이라고 부른다. 대표적으로 3가지 방법이 있다.
- EarlyStopping
- EarlyStopping, Weight Decay, Dropout 혼용
- EarlyStopping, Constraint, Dropout 혼용
EarlyStopping
가중치가 목표를 달성 한 시점 이후에는 더 이상 업데이트되지 않도록 규제하는 방법을 말한다. 상당히 상식적인 방법으로써, 일단 가중치가 최적화 되었다면, 더 이상의 계산을 하지 않아도 된다고 판단하는 것이다.
Keras의 callbacks.EarlyStopping 매소드를 사용할 수 있다. 일반적인 형태는 아래와 같다.
keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1)
Weight Decay(가중치 감소)
그래프 상에서 overfitting은 주로 지나치게 굴곡이 많은 형태의 그래프로 나타난다. 가중치를 줄이면, 상대적으로 이러한 overfit 그래프가 나타나는 것을 피할 수 있다. 가중치의 크기가 일정한 값 이상 커지지 못하도록 규제하는 기법을 말한다.
이는 Keras를 사용한다면, 코드상에서 L1/L2 regularization 기법을 통해 구현할 수 있는데, 모델을 만드는 과정에서 Dense layer를 쌓을 때 아래와 같이 설정할 수 있다.
Dense(64, input_dim=64,kernel_regularizer=regularizers.l2(0.01), # L2 norm regularizationactivity_regularizer=regularizers.l1(0.01)), # L1 norm regularization
Constraints
Weight Decay는 가중치의 학습에 영향을 주는 방법이라면, Constraint는 직접적으로 가중치의 크기를 규제하는 방법이다. 즉, 특정한 기준값을 초과하는 가중치의 값을 그 기준에 미치지 못하는 값으로 함수 등을 통해 변경하는 방법이다. 확실하게 가중치를 원하는 값 이하로 떨어뜨릴 수 있다는 장점이 있다.
이전 Weight Decay 기법과 같이 Keras를 사용시, 코드에서 Dense layer를 쌓을 때 설정해 줄 수 있다.
Dense(64, input_dim=64,kernel_regularizer=regularizers.l2(0.01),activity_regularizer=regularizers.l1(0.01),kernel_constraint=MaxNorm(2.))
Dropout
노드 연결을 강제로 끊어 버리는 방식이다. 임시로 노드 연결을 차단하여, 해당 연결을 제외 한 채로 결과를 예측할 수 있다. 과적합의 원인이 될 수 있는 뉴런을 제거하고 학습을 진행할 수 있다는 장점이 있다.
Keras의 사용시 이전 기법들이 Dense Layer 상에서 설정값들을 변경하거나 추가하는 방법이었다면, 이 기법은 Dropout이라는 layer가 존재하여 이를 직접적으로 모델에 추가할 수 있다. 아래와 같이 Dropout()을 layer로 모델에 추가할 수 있는데, Dropout 내에서는 rate라는 인자에 대해, 버릴 가중치의 기준값을 설정해 줄 수 있다. 이 비율보다 큰 가중치는 버리는 기법이라 할 수 있다.
model = Sequential([Dense(64, input_dim=64,kernel_regularizer=regularizers.l2(0.01),activity_regularizer=regularizers.l1(0.01),kernel_constraint=MaxNorm(2.)),Dropout(0.5) # dropout )
앞으로 할일:
오늘 수업을 듣고서, L1/L2 정규화 기법에 대해 정확이 아는 것이 중요함을 느꼈다. 선생님께서 이 개념에 대해 많이 강조하셨기 때문이다. 조금 더 시간을 내서 이 개념에 대해 공부해야겠다는 생각이 들었다.
또한 무엇보다도, backpropagation을 수학적으로 이해하는 것이 매우 중요함을 느꼈다. 그래서, 주말에 시간을 내서 좀 더 파고 들 생각이다. 또한 오늘 추가적으로 배웠으나 블로그에서 다루지 못한 learning rate에 관해서도 좀 더 학습할 생각이다.
개념적으로 이해할 것들은 이번 섹션이 가장 어렵다고 느꼈다. 코딩은 오히려 잘 정비된 라이브러리 때문에 지난 머신러닝 시간 처럼 그렇게까지 어렵다는 생각은 들지 않았다. 하지만, 이 개념들을 수학적으로 이해하고 면접에서 설명할 수 있어야 하기 때문에, 딥러닝에 관심이 있다면 좀 더 개념적으로 최대한 많은 것들을 이해할 수 있어야 한다. 그 어느 때 보다도 수학적이고 논리적인 사고가 많이 필요한 이번 한 달이다. 이 기회를 통해 좀 더 수학적이고 논리적인 사람으로 다시 태어날 수 있도록 최대한 노력해야겠다고 다짐한다.
참조:
(1) https://i.ytimg.com/vi/An5z8lR8asY/maxresdefault.jpg
(2) https://miro.medium.com/max/2560/1*M19RSMEU-kMu_3Sk1X7idA.jpeg