Deep learning/이론(hands on machine learning)

16. 규제를 사용해 과대적합 피하기

jwjwvison 2021. 6. 7. 20:20

 심픙 신경망은 전형적으로 수만 개, 때로는 수백만 개의 파라미터를 가지고 있다. 이 때문에 네트워크의 자유도가 매우 높다. 즉, 대규모의 복잡한 데이터셋을 학습할 수 있다는 뜻이다. 하지만 이런 높은 자유도는 네트워크를 훈련 세트에 과대적합되기 쉽게 만든다. 규제가 필요하다.

 

 앞에서 이미 최상의 규제 방법 중 하나인 조기 종료를 구현했다. 또한 배치 정규화는 불안정한 그레이디언트 문제를 해결하기 위해 고안되었지만 꽤 괜찮은 규제 방법으로도 사용할 수 있다. 이번에는 신경망에서 널리 사용되는 다른 규제 방법을 알아보겠다. l1과 l2규제, 드롭아웃(dropout), 맥스-노름(max_norm) 규제이다.

 

<l1 규제와 l2 규제>

 

 일반적으로 네트워크의 모든 은닉층에 동일한 활성화 함수, 동일한 초기화 전략을 사용하거나 모든 층에 동일한 규제를 적용하기 때문에 동일한 매개변수 값을 반복하는 경우가 많다. 이는 코드를 읽기 어렵게 만들고 버그를 만들기 쉽다. 이를 피하려면 반복문을 사용하도록 코드를 리팩터링(refactoring)할 수 있다. 또 다른 방법은 파이썬의 functools.partial() 함수를 사용하여 기본 매개변수 값을 사용하여 함수 호출을 감싸는 것이다.

from functools import partial
from tensorflow import keras

RegularizedDense=partial(keras.layers.Dense,
                         activation='elu',
                         kernel_initializer='he_normal',
                         kernel_regularizer=keras.regularizers.l2(0.01))

model=keras.models.Sequential([
                               keras.layers.Flatten(input_shape=[28,28]),
                               RegularizedDense(300),
                               RegularizedDense(100),
                               RegularizedDense(10,activation='softmax',kernel_initializer='glorot_uniform')
])

 

< 드롭아웃 >

 드롭아웃(dropout)은 심층 신경망에서 가장 인기 있는 규제 기법 중 하나이다. 매 훈련 스텝에서 각 뉴런(입력 뉴런은 포함하고 출력 뉴런은 제외한다)은 임시적으로 드롭아웃될 확률 p를 가진다. 즉, 이번 훈련 스텝에는 완전히 무시되지만 다음 스텝에는 활성화될 수 있다. 하이퍼파라미터 p를 드롭아웃 비율(dropout rate)라 하고 보통 10%와 50% 사이를 지정한다. 훈련이 끝난 후에는 뉴런에 더는 드롭아웃을 적용하지 않는다.

 

 케라스에서는 keras.layers.Dropout 층을 사용하여 드롭아웃을 구현한다. 이 층은 훈련 하는 동안 일부 입력을 랜덤하게 버린다(0으로 설정한다). 그다음 남은 입력을 보존 확률로 나눈다. 훈련이 끝난 후에는 어떤 작업도 하지 않는다. 입력을 다음 층으로 그냥 전달한다. 다음은 드롭아웃 비율 0.2를 사용한 드롭아웃 규레를 모든 Dense 층 이전에 적용하는 코드이다.

model=keras.models.Sequential([
                               keras.layers.Flatten(input_shape=[28,28]),
                               keras.layers.Dropout(rate=0.2),
                               keras.layers.Dense(300,activation='elu',kernel_initializer='he_normal'),
                               keras.layers.Dropout(rate=0.2),
                               keras.layers.Dense(100,activation='elu',kernel_initializer='he_normal'),
                               keras.layers.Dropout(rate=0.2),
                               keras.layers.Dense(10,activation='softmax')
])

 모델이 과대적합되었다면 드롭아웃 비율을 늘릴 수 있다. 반대로 모델이 훈련 세트에 과소적합되면 드롭아웃 비율을 낮추어야 한다. 층이 클 때는 드롭아웃 비율을 늘리고 작은 층에는 드롭아웃 비율을 낮추는 것이 도움이 된다. 또한 많은 최신의 신경망 구조는 마지막 은닉층 뒤에만 드롭아웃을 사용한다. 드롭아웃을 전체에 적용하는 것이 너무 강하면 이런 시도도 좋다.

 

 드롭아웃은 수렴을 상당히 느리게 만드는 경향이 있지만 적절하게 튜닝하면 훨씬 좋은 모델을 만든다. 따라서 일반적으로 추가적인 시간과 노력을 기울일 가치가 있다.

'Deep learning > 이론(hands on machine learning)' 카테고리의 다른 글

15. 학습률 스케줄링  (0) 2021.06.07
14. 고속 옵티마이저  (0) 2021.06.06
13. 사전훈련된 층 재사용 하기  (0) 2021.06.06
12. 배치 정규화  (0) 2021.06.03
9. 학습률, 배치 크기  (0) 2021.06.02