본문 바로가기
코딩/데이터 분석 이론 & 응용

[17] Deep Learning - Regularization

반응형

[17] Deep Learning - Regularization

 

 

 

 

 

Regularization

 

DNN에는 다양한 parameter들이 존재한다. parameter들이 많아질수록 모델은 유연해지고 , training data에 overfitting 되기 좋아진다. overfitting을 막기 위해 다양한 Regularization, 규제 기법들이 존재한다. 앞선 글에서 다루었던 배치 정규화도 규제 기법으로 사용할 수 있는 하나의 예시이다.

 

 

 

[12] Deep Learning - Batch normalization (tistory.com)

 

[12] Deep Learning - Batch normalization

[12] Deep Learning - Batch normalization Batch normalization 이전 글에서는 경사 소실 문제와 폭주 문제를 해결하기 위한 activation function들과 initialization 방법들을 살펴보았다. [11] Deep Lear..

ddggblog.tistory.com

 

 

 

배치 정규화를 이용한 규제 기법 이외에 다른 규제 기법들로는 l1 규제 , l2 규제 , 드롭아웃 , max-norm 규제가 있다.

 

 

 

 

 

L1 규제 & L2 규제

 

l1 규제와 l2 규제 모두 l1 norm과 l2 norm을 사용하는 규제 기법이기 때문에 위처럼 불린다. l1 규제의 경우 , loss function에 가중치의 l1 norm을 더하는 방식으로 규제가 이루어진다.

 

 

l2 규제의 경우는 loss function에 가중치의 l2 norm을 더하는 방식으로 규제가 이루어진다. 기본적으로 l1 , l2 규제가 이루어지는 방법을 릿지 리그레션과 lasso를 통해 살펴보자.

 

 

만약 linear regression 문제를 해결하려면 다음 식의 RSS를 최소화하는 가중치들을 찾는 것을 목표로 해야 할 것이다.

 

 

 

 

 

 

 

 

 

만약 여기에 l2 norm을 통해 overfitting을 막고자 한다면 다음과 같이 할 수 있다.

 

 

 

 

 

 

 

 

위처럼 RSS 뒤쪽에 l2 nrom을 통한 항을 하나 더 두어 overfitting 을 막고 있다. 앞의 람다는 뒤의 항이 얼마나 영향을 미칠지 정하는 parameter다. RSS가 크더라도 , 뒤쪽이 작으면 선택할 수 있다는 것이고 , RSS가 작더라도 뒤쪽이 훨씬 크면 선택할 수 없다는 것이다. 이러한 방법을 통해 단순한 Regression 문제에서도 overfitting을 피할 수 있다.

 

 

뒤쪽의 l2 norm을 l1 norm으로 바꾸면 규제의 방법이 l1 규제로 바뀐다. 회귀문제에서의 l1 규제인 라쏘 (lasso)를 살펴보자.

 

 

 

 

 

 

 

 

 

위쪽과 달리 뒤의 패널티 항 부분이 절댓값 , l1 norm으로 바뀌었다. 나머지 내용은 앞선 내용과 모두 같다. 

 

 

이처럼 l1 , l2 norm을 이용한 규제 기법은 다양하게 사용될 수 있다. 위의 예시들의 경우 linear regression에 적용한 예시다. 선형 모델에 적용한 l1 , l2 규제 기법처럼 network 구조에서도 가중치를 위한 l1 , l2 규제 기법을 사용할 수 있다.

 

 

keras에서 l1 , l2 규제 기법을 사용하는 방법은 다음과 같다.

 

 

 

layer = keras.layers.Dense(100, activation="elu",
	kernel_initializer="he_normal",
        kernel_regularizer=keras.regularizers.l2(0.01))

 

 

 

만약 l1 , l2 norm이 모두 필요하다면 , keras.regularizers.l1_l2() 을 사용할 수 있다. l1 , l2 규제 함수들은 훈련하는 동안 규제 손실을 계산하기 위해서 규제 객체를 반환하고 , 이는 최종 loss에 추가된다.

 

 

 

 

 

Dropout (드롭아웃)

 

드롭아웃 규제 기법은 간단하면서도 좋은 성능을 보여주는 규제 기법이다. 매 훈련 스텝에서 각 뉴런들은 임시적으로 드롭아웃될 확률을 가진다. 임시적이라는 말은 이번 스텝에는 제외될 수 있지만 , 다음 스텝에는 참여할 수도 있음을 의미한다. 이 드롭아웃될 확률 p는 hyper parameter다. 일반적으로 p는 10% ~ 50% 사이의 값으로 선택된다. 

 

 

일정한 확률로 뉴런을 제외하고 훈련하는 방식이 잘 작동될 수 있었던 이유는 바로 뉴런사이의 의존성을 낮추기 때문이다. 드롭아웃된 뉴런은 훈련에서 제외되고 , 자신이 포함된 훈련에서 최상의 가중치를 가지려고 노력한다. 이러한 점은 다른 뉴런들과의 의존성을 낮추고 , 이는 뉴런들을 Train data의 작은 변화에 둔감하게 만든다. 이러한 변화가 쌓여 overfitting을 막아내고 , 좀 더 안정적인 network 구조를 만드는 것이다.

 

 

또한 다른 관점으로 드롭아웃의 원리에 대해 생각해보면 , 뉴런들을 선택해서 만드는 앙상블 모델이라고도 생각할 수 있다. 어느 스텝에는 어떤 뉴런들로만 구성해 모델을 구성하고 , 또 어느 스텝에서는 어떤 뉴런들로만 모델을 구성하고 훈련해 합친다고 생각할 수도 있다. 하지만 실제로는 가중치를 공유하는 하나의 모델에서 이러한 일이 일어나기 때문에 완전히 독립적이지는 않다. 이러한 관점으로 드롭아웃 규제를 살펴보면 드롭아웃 규제기법을 통해 만들어진 모델은 앙상블 방식으로 만들어졌다고도 생각할 수 있다.

 

 

드롭아웃 규제는 확률에 따라 하나의 뉴런이 평소보다 n배 많은 입력 뉴런들과 연결된다. 이러한 점을 커버하기 위해서 각 뉴런의 연결 가중치에 (1-p)를 곱해주어야 한다. 이걸 weight에 보존 확률을 곱한다고 이야기 한다. 또한 실제로 드롭아웃을 사용할 때 일반적으로는 맨 위의 층부터 세 번째 층의 뉴런에만 드롭아웃을 적용한다.

 

 

keras에서 드롭아웃을 사용하는 방법은 다음과 같다.

 

 

 

model = keras.models.Sequential([
	keras.layers.Flatten(input_shape[28,28]),
        keras.layers.Dropout(rate=0.2),
        #.....
    
#rate는 위의 p를 의미함

 

 

 

드롭아웃은 언제나 훈련 과정에서만 사용된다. 이를 모르고 Train loss와 valid loss를 비교하면 잘못된 결론을 내릴 수 있다. Train loss는 모델의 훈련이 끝난 후 평가하는 것이 정확하다. 또한 모델이 overfitting 되었다면 , p를 늘려야 하며 underfittng 되었다면 p를 낮추어야 한다. 

 

 

드롭아웃의 영향이 너무 크다면 마지막 hidden layer에만 드롭아웃을 적용하는 것도 고려해 볼 수 있다. 이에 더해 드롭아웃은 자기 정규화 기능이 있는 network 구조를 망가트릴 수 있으므로 자기 정규화가 있는 network에서는 " 알파 드롭아웃 " 사용을 고려해 볼 수 있다.

 

 

 

드롭아웃과 관련된 기법 중 , 몬테 카를로 드롭아웃이 있다. 몬테 카를로 드롭아웃은 드롭아웃을 진행한 모델을 다시 training 하거나 수정할 필요 없이 성능을 크게 향상 시킬 수 있는 방법이다. 몬테 카를로 드롭아웃은 드롭아웃으로 만든 예측을 평균 내면 그 결과가 일반적으로 드롭아웃 없이 예측한 결과보다 안정적이고 좋다는 아이디어를 통해 만들어진 방법이다. 

 

 

keras에서 몬테 카를로 드롭아웃을 간단하게 사용하는 방법은 다음과 같다.

 

 

 

#ex) 몬테 카를로 드롭아웃
y_prob = np.stack([model(X_test , training=True)
	for sample in range(100)])
y_probs = y_prob.mean(axis=0))

 

 

 

위에서 설명한 내용을 간단하게 코드로 직접 구현해서 사용하면 된다. 위의 코드는 training을 True로 두어 드롭아웃을 사용하고 있다. 예를 들어 위의 코드를 사용할 떄 테스트 결과로 100개의 prediction이 나왔다고 가정해보자 (클래스는 10개). test set에 10000개의 샘플이 있다면 y_prob은 [100, 10000, 10]의 행렬을 가질 것이다.

 

 

이를 첫번째 차원을 기준으로 평균을 내게 되면 행렬은 [10000, 10]으로 바뀔 것이다. 이 과정이 바로 몬테 카를로 드롭아웃 방법이고 , 이를 통해 얻은 결과는 드롭아웃 없이 예측한 결과보다 좀 더 안정적이다.

 

 

몬테 카를로 드롭아웃 방법에서 샘플의 크기는 hyper parameter다. 샘플 크기가 클수록 예측과 불확실성을 추정하는 세기가 강해질 것이다. 하지만 일정 샘플 크기를 넘으면 눈에 띄는 성능 향상은 일어나지 않을뿐더러 , 샘플 수가 늘어날수록 prediction에 걸리는 시간도 배로 늘어난다.

 

 

 

 

 

 

Max-norm Regularization (맥스-놈 규제)

 

맥스-놈 규제는 단순하게 가중치의 l2 norm이 일정 숫자 이하가 되도록 제한하는 방법이다. 만약 weight, 가중치의 l2 norm이 wl2 라면 w12 <= r이 되도록 제한하는 방법이다. r은 맥스-놈 규제에서 선택해야할 hyper parameter다. 맥스-놈 규제는 loss function에 따로 페널티 항을 넣지 않는다. 대신 훈련 스텝이 끝날 때마다 필요하면 가중치의 l2 norm을 확인하고 필요하면 스케일을 조정한다.

 

 

r을 줄이면 줄일 수록 과하게 규제가 들어가고 이렇나 규제는 overfitting을 줄이는데 도움을 준다. 또한 경사가 불안정한 문제 역시 완화시켜줄 수 있다.

 

 

keras에서 맥스-놈 규제를 구현하는 방법은 다음과 같다.

 

 

 

keras.layers.Dense(100 , activation="elu", kernel_initializer="he_normal",
	kernel_constraint=keras.constraints.max_norm(1.))

 

 

 

맥스-놈 규제는 위의 코드처럼 kernel_constraint 매개변수를 통해 구현 가능하다.

 

 

 

 

정리

 

NN에는 다양한 Hyper parameter들이 존재하고 이를 모두 튜닝하기란 너무나도 어렵다. 일반적으로 쓰이는 몇 가지 parameter 조합을 살펴보자.

 

 

 

  1. 커널 초기화 : He initialization
  2. 활성화 함수 : ELU
  3. 정규화 : Deep 한 경우 배치 정규화
  4. 규제 기법 : 조기 종료 규제 & 필요하면 l2 norm
  5. optimizer : 모멘텀 최적화 & RMSProp & Nadam
  6. lr 스케줄 : 1 사이클

 

 

 

  1. 커널 초기화 : 르쿤 initialization
  2. 활성화 함수 : SELU
  3. 정규화 : X ( 자기 정규화 모델 )
  4. 규제 기법 : X & 알파 드롭아웃 ( SELU 사용하기 떄문에 일반 드롭아웃 X )
  5. optimizer : 모멘텀 최적화 & RMSProp & Nadam
  6. lr 스케줄 : 1 사이클

 

 

 

이외에 모델을 만들 때 기억하고 고려해야할 사항들은 다음과 같다.

 

  • Input Feature들을 정규화 하기
  • 비슷한 문제를 해결한 모델이 이미 존재하는지 확인하기
  • 존재한다면 일부를 재사용하거나 모델 구조를 활용할 수 있는지 고민하기
  • 비슷한 문제를 해결하기 위해 사용된 label 된 데이터가 존재하는지 확인하기
  • 만약 비슷한 문제의 label 데이터가 만다면 이를 활용한 보조작업 고려하기
  • 희소 모델을 만들고자 한다면 l1 규제 고려하기
  • 모델 특성상 , 빠르게 output이 나와야 한다면 층 개수를 줄이고 배치 정규화 층을 이전 층에 합칠 수 있다
  • 또한 시간이 적게 소모되는 activation function , (ReLU 시리즈) 사용을 고려해 볼 수 있다
  • 시간이 중요하지는 않고 정확도가 중요하면 몬테 카를로 드롭아웃을 사용할 수 있다

 

 

 

 

 

ref. "Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition"

 

 

 

반응형