코딩일기

[Deep Learning] 4. 딥러닝에서 과적합을 방지하는 방법(feat. 학습 규제 전략 (Regularization Strategies)) 본문

Code/딥러닝(NL)

[Deep Learning] 4. 딥러닝에서 과적합을 방지하는 방법(feat. 학습 규제 전략 (Regularization Strategies))

daje 2021. 5. 3. 16:41
728x90
반응형

 

 

 

안녕하십니까 다제입니다. 

 

오늘은 딥러닝의 학습 규제 전략 (Regularization Strategies)에 대해서 알아보도록 하겠습니다. 

 

 


 

1. EarlyStopping

  1) 가중치가 최고 유용성 시점을 훨씬 지나서 더 업데이트 되지않도록 학습을 조기 중단함

  2) 지난번에 보았던 코드를 가지고 EarlyStopping 실습을 진행해보겠습니다. 

# 모델생성
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten

# 케라스에서는 Sequential 모델은 레이어를 선형으로 연결하여 구성합니다
model = Sequential() 

# 선형으로 들어가야하기 때문에 28*28 = 784 특성 벡터로 펼쳐 변환해 Dense 층으로 들어갑니다
# input_shape를 알려주고, 선형으로 만들어주는 Flatten을 사용합니다. 
model.add(Flatten(input_shape=(28, 28))) 

# 추가적으로 Dense층을 더해줄 수 있으며, 활성화함수를 추가할 수 있다. 
#softmax는 다른 뉴런의 출력값과 상대적인 비교를 통해 최종 출력값이 결정된다. 
# 예를 들어 1,2,3이 출력이 된다면, 0.33, 0.33, 0.33이런식으로 출력이 된다는 의미있다. 
# 이에 대한 설명은 코드 하단에 추가적으로 기재해놓았으니 참고 바랍니다. 
model.add(Dense(10, activation='softmax'))

# EarlyStopping
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1)

# 위에서 층을 설정해주었고, 최적화, loss_function, metrics를 설정하여 모델을 완성한다. 
model.compile(optimizer='adam'
             , loss='sparse_categorical_crossentropy'
             , metrics=['accuracy'])

# 총 7850 parameters (10 bias)
model.summary()

  3) Early_stoping 파라미터 

  -. monitor

    * val_loss 또는 val_acc로 설정이 가능하고 평가하고자 하는 대상을 출력해준다. 

 

  -. min_delta

    * (전 - 후) 값이 숫자보다 작으면 조기종료 발생된다. 

    * min_delta를 0 으로 설정하게 되면 살짝이라도 관찰하는 대상이 위로 튀게 되면 바로 조기 종료된다. 

    * min_delta < 0 으로 설정하면 이러한 현상으로 정지는 방지하게 된다.

 

  -. patience

    * 훈련이 중단 된 후 개선되지 않은 Epoch 수입니다.

 

  -. verbose

    * 학습 중 출력되는 문구를 설정합니다.
    * verbose=0 : 아무 것도 출력하지 않습니다.
    * verbose=1 : 훈련의 진행도를 보여주는 진행 막대를 보여줍니다.
    * verbose=2 : 미니 배치마다 손실 정보를 출력합니다.

 


 

2. Weight Decay(가중치 감소)

 

-. 등장배경 

    * 데이터가 단순 & 모델 복잡도↑ → Gradient descent(기울기 강하)를 기반으로 학습  학습 시, weight(가중치)가 점점 증가 → Overfitting 발생

 

  -. 상세설명

    * 테스트 시, 발생하는 에러(Generalization Error)를 줄이기 위해 가중치에 패널티(L1 또는 L2)를 부과하여 비용함수(cost function) 값을 키워 과적합의 위험을 줄이는 기법
    * 즉, Weight Decay를 이용하여 학습하는 반경(범위)을 조절할 수 있음 

  

  • L1 규제 : 가중치 w들의 절대값 합계를 비용 함수에 추가합니다. L1 노름이라고도 합니다.
  • L2 규제 : 모든 가중치 w들의 제곱합을 비용 함수에 추가합니다. L2 노름이라고도 합니다.

모두 비용 함수를 최소화하기 위해서는 가중치 w들의 값이 작아져야 한다는 특징이 있습니다.

L1 규제를 사용하면 비용 함수가 최소가 되게 하는 가중치와 편향을 찾는 동시에 가중치들의 절대값의 합도 최소가 되어야 합니다. 이렇게 되면, 가중치 w의 값들은 0 또는 0에 가까이 작아져야 하므로 어떤 특성들은 모델을 만들 때 거의 사용되지 않게 됩니다.

 

예를 들어 H(x)=w1x1+w2x2+w3x3+w4x4라는 수식이 있다고 해봅시다.

여기에 L1 규제를 사용하였더니, w3w3의 값이 0이 되었다고 해봅시다.

이는 x3 특성은 사실 모델의 결과에 별 영향을 주지 못하는 특성임을 의미합니다.

 

  -. 사용시점

    * Complexity가 높은데 단순한 데이터로 인해 Overfitting이 발생하는 상황에서 사용합니다. 

    * 그중에서도 L1은 이상치에 영향을 덜 받게 하고 싶을 때 또는 어떤 특성들이 모델에 영향을 주는지 확인하고 싶을때 사용합니다. 

    * L2는 이상치에 영향을 많이 받게 하고 싶을 때 사용하면 되고, 경험적으로는 L2 규제가 더 잘 동작하므로 L2 규제를 더 권장합니다.

    * 왜냐하면, 가중치 감소  Local noise 에 영향을 덜 받음  이는 Outlier 의 영향 덜 받기 때문입니다.

 

  -. 공식

 

 

  -. 예제코드

# Weight Decay를 전체적으로 반영한 예시 코드
from tensorflow.keras.constraints import MaxNorm
from tensorflow.keras import regularizers

# 모델 구성을 확인합니다.
model = Sequential([
    Flatten(input_shape=(28, 28)),
    Dense(64, input_dim=64,
            # 이곳에 패널티를 부과하는 코드를 기재하면 됩니다. 
            kernel_regularizer=regularizers.l2(0.01),    # L2 norm regularization
            activity_regularizer=regularizers.l1(0.01)), # L1 norm regularization
    Dense(10, activation='softmax')
])

# 나머지는 기존 방식과 동일하게 진행합니다. 
# compile
# fit 
# test 

 

  -. 기타 : L1, L2에 대해서 더욱 깊이 있게 공부하고 싶다면 해당 링크를 참조해주세요

 


 

3. Dropout 

출처 : 이미지링크참조

  -. 등장배경 

    * 모든 노드를 사용하여 훈련을 진행하였더니 과적합문제 발생 / 2014년 JMLR 논문.

 

  -. 작동원리 

   * 위 그림에서 왼쪽 그림과 같은 모델에서 몇개의 연결을 끊어서 남은노드들을 통해서만 학습하는 방법

   * 학습 과정에서 특정 node들을 1-p의 확률로 제거함(0<p<1)

   * Dropout을 적용하면 적용하지 않은 것과 비교하여 각 node들의 output 값이 1/p배만큼 증가함

   * 따라서, test 과정에서는 모든 weight를 사용함 + weight들에 p배를 곱해짐

 

  -. 예제코드

model = Sequential([
    Dense(30, input_dim=17, activation='relu'),
    # 0.5의 확률로 Dropout을 실행함
    Layer.Dropout(0.5),
    Dense(30, input_dim=17, activation='relu'),
    Dense(1, activation='sigmoid')
])

 

  -. 기타 

    * Dropout이 업데이트 버전인 DropConnect, Drop-path, DropBlock, Spectral Dropout 등이 있다. 

    * 이에, 대한 자세한 설명은 링크를 전달드리오니 해당 링크를 참조하여 주시기 바랍니다. ( 참조링크 )

 


 

4. Constraint(가중치 제약)

  -. 정의 

    * Weight Constraint는 가중치의 크기를 조절하는 학습 방법

 

  -. 예제코드 

model = Sequential([
    Flatten(input_shape=(28, 28)),
    Dense(64, input_dim=64,
            kernel_regularizer=regularizers.l2(0.01),
            activity_regularizer=regularizers.l1(0.01),
            
            ## add constraints
            kernel_constraint=MaxNorm(2.)),          
    
    Dense(10, activation='softmax')
])

 


 

 

5. 기타 

  -. 학습시킨 데이터를 저장시키기 위한 코드 : checkpoint_filepath = "FMbest.hdf5"

 

 

 

지금까지 딥러닝에서 학습 규제방법 4가지에 대해서 알아보았습니다. 

 

공감이 되셨다면 하트 부탁드립니다. 

 

오늘도 방문해주셔서 감사드립니다!

 

 

 

 

728x90
반응형
Comments