hwijin97 2021. 11. 17. 17:43

심층 신경망 훈련

https://github.com/kimhwijin/HandsOnMachineLearing/blob/main/Train_DeepLearning_Network_11.ipynb

 

심층 신경망을 훈련할 때 일어나는 문제들

그레디언트 소실, 그레디언트 폭주 : 신경망 깊숙이 갈수록 그레디언트가 작아지거나 커지는 현상

- 훈련하는데 데이터가 충분하지 않거나, 레이블을 만드는 작업에 비용이 많이든다

- 훈련이 극단적으로 느려진다.

- 파라미터 개수가 많을수록 과대적합의 위험이 커진다. (샘플이 적거나, 잡음이 많은경우 더심함)

 

11.1 그레디언트 소실과 폭주 문제

 

역전파 알고리즘을 이용해 출력층에서 입력층으로의 오차 그레디언트를 이용해 모든 파라미터를 수정하며 전파한다. 그런데 이 알고리즘이 하위층으로 갈 수록 그레디언트가 점점 작아지는 그레디언트 소실 vanishing gradient 또는 점점 커져서 여러 층이 비정상적으로 과도하게 갱신되면 발산diverse하는 그레디언트 폭주exploding grdient 가 나타난다.

 

로지스틱 시그모이드 함수를 사용할때, 층을 진행할 때마다 분산이 커지는 이유때문에 가장 깊은 층에서 활성화 함수가 0 또는 1 로 수렴하게 되고 시그모이드함수의 평균이 0.5이고 항상 양수이기 때문에 출력의 가중치합이 입력의 가중치합보다 커질 수 있어서 더욱 소실문제가 심해진다.

로지스틱 시그모이드 함수는 입력이 커지면 커질수록 기울기가 0에 가까워져 층을 내려갈 수록 남아있는 그레디언트가 없게 된다.

 

11.1.1 글로럿과 He초기화

 

불안정한 그레디언트 문제를 완화하기 위해서, 각 층의 출력에 대한 분산과 입력에 대한 분산이 같아야 한다고 한다. 그리고 역방향에서 층을 통과하기 전과 후의 그레디언트 분산이 동일해야한다.

입력과 출력 연결개수인 팬-인fan-in, 팬-아웃fan-out 이 동일하지 않으면 위의 두가지를 보장할 수 없지만, 각 층의 연결 가중치를 정규분포를 통해 무작위 초기화를 해서 어느정도 보장할 수 있다. 이를 세이비어 초기화Xavier initialization, 글로럿 초기화glorot initialization 이라고 한다.

 

fan_avg = (fan_in + fan_out) / 2 일때

평균이 0 이고 분산이 위의 값인 정규분포

또는 

r 이 위의 사진일때, -r 과 +r 사이의 균등 분포

여기서 fan_avg 를 fan_in 으로 바꾸면 르쿤 초기화 가 된다. 

ReLU활성화 함수에 대한 초기화 전략은 He 초기화 라고 부른다.

글로럿 활성화함수 없음, tanh, logistic, softmax 1 / fan_avg
He ReLU 함수와 그 변종들 2 / fan_in
르쿤 SELU 1 / fan_in

케라스는 균등분포의 글로럿 초기화를 기본으로 사용한다. 변경하고싶으면 kernel_initializer 을 변경한다.

 

 

11.1.2 수렴하지 않는 활성화 함수

 

활성화 함수를 잘못 선택하면 그레디언트의 소실이나 폭주로 이어질 수 있다. 그래서 깊은 신경망에서는 ReLU와 같이 특정 양수값에서 수렴하지 않는 활성화 함수가 더 잘 작동한다. 

그런데 ReLU함수는 음수에서 0이기 때문에, 죽은 ReLU 로 알려진 문제가 발생한다. 훈련 세트에있는 모든 샘플에 대해 입력가중치 합이 음수가 되면 그 뉴런은 0 이외의 값을 출력하지 않는 문제이다.

이 문제를 해결하기 위해서 LeakyReLU 같은 변종을 사용한다.

 

LeakyReLU 는 max(az, z) 로 정의되고, 하이퍼파라미터 alpha는 함수가 '새는leaky'정도를 결정한다. 이 기울기가 뉴런이 절대 죽지 않게 만들어주고, 알파가 높은 것이 낮은것보다 좋은성능을, ReLU보다 항상 좋은 성능을 내는 것을 보여준다.

RReLU 에서 알파를 무작위로 선정하는 방법 (휸련 세트의 과대적합을 줄이는 규제역할을 보여줌),

PReLU 에서 알파를 모델 파라미터로 여겨서 학습시키도록하는 방법이 있다. (대규모 이미지에서 ReLU보다 앞서지만, 소규모에서는 과대적합 위험이 있다)

 

ELU exponential Linear unit 이라는 활성화 함수는 저자의 실험에서 모든 ReLU 변종의 성능을 앞서고 훈련시간도 줄고 테스트 성능도 좋았다.

- z < 0 일때 음수값이 들어와 활성화 함수의 평균이 0 에 가까워지도록 만들어준다.

- alpha 를 조정해서 수렴하는 값을 지정할 수 있다.

- z < 0 일때 그레디언트가 0 이 아니기때문에 죽은 뉴런을 만들지 않는다.

- alpha = 1 이면, z = 0 일때 연속으로 모든구간 매끄러워 경사하강법의 속도를 높여준다.

단점은 지수함수를 사용해서 계산이 ReLU 보다 느리다는 점에 있다.

 

SELU scaled ELU 활성화 함수는 스케일이 조정된 ELU 로서 Sequential 형태의 네트워크에서 입력특성이 표준화 되어있고, 은닉층 가중치가 르쿤 초기화 되어있다면 네트워크가 자기 정규화self-normalize 된다. 훈련하는 동안 출력이 표준화 되어 아주 깊은 네트워크에서 뛰어난 성능을 보여준다.

 

심층 신경망 은닉층 활성화 함수 선택 기준

SELU > ELU > LeakyReLU > ReLU > tanh > logistic

1. 네트워크가 자기 정규화 되지 않는 구조일때 -> ELU

2. 실행속도가 중요하다면 -> LeakyReLU

3. 하이퍼 파라미터를 줄이고 싶다면 -> ReLU

4. 신경망이 과대적합되었다면 -> RReLU

5. 훈련세트가 아주 크다면 -> PReLU 포함

 

 

11.1.3 배치 정규화

 

ELU 와 함께 He 초기화를 사용하면 훈련 초기에 그레디언트 문제를 크게 감소시킬 수 있지만, 혼련동안 다시 발생하지 않으리란 보장이 없어 직접적으로 입력을 정규화하는 레이러를 추가한다. 이를 배치 정규화batch normalization 이라고 한다.

이 기법은 활성화 함수를 통과하기 전이나 후에 입력을 원점으로 맞추고 정규화한다. 그리고 모델파라미터인 감마와 베타로 스케일을 조정하고, 이동시킨다.

배치 정규화 알고리즘

- mu_B : 미니배치 B 에 대한 입력 평균 벡터 (batch_size, )

- sigma_B : 미니 배치 B 에 대한 표준편차 벡터 (batch_size, )

- m_B : 미니배치의 샘플 수 

- x_hat_i : 평균이 0 이고 정규화된 샘플 i 의 입력

- gamma : 층의 출력 스케일 파라미터 벡터 (batch_size, )

- beta : 충의 출력 이동 (오프셋) 파리미터 벡터 (batch_size, )

- epsilon : 분모 0 을 막는 아주 작은숫자 (1e-5)

- z_i : 배치 정규화 연산의 출력, 입력의 스케일을 조정하고 이동시킨것.

 

테스트 배치정규화

배치 정규화는 미니배치를 통해 평균과 분산을 구하는데, 테스트 시에는 배치를 사용하지 않고 샘플 하나에 대한 예측을 만들어야 하는데, 이는 신뢰도가 떨어진다. 이럴 경우 훈련이 끝나고 전체 훈련세트를 신경망에 통과시켜 배치 정규화 층의 각 입력에 대한 '최종' 평균과 표준편차를 계산해서 예측할 때 이를 대신 사용할 수 있다.

그런데 대부분의 배치 정규화 구현에서는 평균과 표준편차의 이동평균을 사용해서 최종 통계를 추정한다.

즉 gamma (스케일 조정), beta (출력 이동 오프셋), mu (최종 입력 평균 벡터) , sigma (최종 입력 표준편차 벡터) 를 학습한다.

 

장점

배치 정규화는 그레디언트 소실 문제를 크게 감소시켜 로지스틱 활성화 함수를 사용할 수 있고, 가중치 초기화에 네트워크가 훨씬 덜 민감해지고, 훨씬 큰 학습률을 사용하여 학습과정의 속도를 크게 높일 수 있고, 약간의 규제의 역할을 해서 다른 규제 기법의 필요성을 줄여준다.

 

단점

배치 정규화는 모델의 복잡도를 키우고, 실행시간도 증가시킨다. 그래도 훈련이 끝나면 이전층과 배치정규화 층을 합쳐서 계산한다.

XW + b -> gamma otimes ( XW + b - mu ) / sigma + beta

W' = gamma otimes W / sigma, b' = gamma otimes ( b - mu ) / sigma + beta 으로 정의하면

XW' + b' 으로 단순화 된다.

 

배치정규화를 사용할 때 에폭마다 더 시간이 걸리는데, 수렴이 훨씬 더 빨라지므로 보통 상쇄된다.

 

- 배치 정규화의 sigma , mu 는 역전파로 훈련되지 않는 non-trainable variable 이다.

- 배치 정규화 층을 활성화 함수 이전 혹은 이후에 추가하는 것에 대해서는 작업마다 다르므로 실험해보고 좋은것을 사용한다.

- 배치정규화 층에 beta 로 이동 파라미터항이 있기 때문에 이전 층에서 편향을 제거해도 된다.

- momentum 매개변수로 이동평균 업데이트에 사용하는 하이퍼 파라미터가 있다.

v_hat <- v_hat x momentum + v x (1 - momentum ) , 1에 가까운 값으로 데이터셋이 크고 미니배치가 작으면 소수점 뒤에 9를 넣어 1에 가깝게 한다.

- axis 하이퍼 파라미터로 정규화할 축을 결정한다. 기본은 -1 로 마지막 축을 정규화하는데 [batch_size, height, width ] 이면 width 축을 정규화하므로 height 개의 평균과 표준편차가 생성된다.

- model의 fit 함수에는 배치 정규화층의 call 메서드의 training 매개변수를 1 로 설정한다.

 

 

11.1.4 그레디언트 클리핑

 

배치 정규화를 사용하지 못하는 신경망에서 유용한 그레디언트 폭주문제를 완화하는 방법이다.

그레디언트 클리핑gradient clipping 은 역전파 될때 일정 임계값을 넘어서지 못하게 그레디언트를 잘라내는 기법이다.

옵티마이저를 생성할 때, clipvalue를 지정하면된다.

 

그레언트 클리핑은 그레디언트 벡터의 방향을 바꿀 수 있다. [0.9, 100] 방향의 그레디언트 벡터를 클리핑하면 [0.9, 1.0] 으로 방향이 확바뀌는데,

이를 못하게 하려면 clipnorm을 지정하여 l2 노름을 이용해서 클리핑한다.

 

 

11.2 사전훈련된 층 재사용 하기

 

아주 큰 깊은 신경망을 처음부터 새로 훈련하기보다 비슷한 유형의 문제를 처리한 신경망의 하위층을 재사용하는 것이 좋다. 이를 전이학습transfer learning 이라고 한다.

- 원래 문제에서 사용한것과 입력크기가 다르다면 전처리 과정이 필요하다.

- 원본 모델과 비슷한 문제에서 하위 은닉층은 저수준 특성이 비슷하므로 유용하다.

- 작업이 비슷할 수록 많은 층을 재사용 하는 것이 좋다.

 

재사용하는 층을 모두 동결하고 훈련후 성능을 평가한다.

맨 위의 한 두개의 은닉층의 동결을 해제하고 가중치를 조정해서 성능이 향상되는지 확인한다.

재사용층의 동결을 해제할 때는 학습률을 줄이는 편이 가중치를 세밀하게 조정하는데 좋다.

데이터가 적으면 상위 은닉층을 제거하고 남은 은닉층 동결후 다시 훈련후 성능을 평가한다.

데이터가 많으면 은닉층을 다른걸로 바꾸거나 은닉층을 추가할 수 있다.

이렇게 적절한 재사용층의 개수를 찾는다.

 

11.2.1 케라스를 사용한 전이 학습

 

- 모델을 가중치를 복사하려면 keras.models.clone_model( model ) 후 set_weights(model.get_weights()) 으로 복사한다.

- 기존 가중치를 사용하지 않는 새로운 층이 랜덤하게 되어있어 오차 그레디언트가 기존 가중치를 망칠 수 있다. 따라서 처음 몇 에폭은 층을 동결하고 새로운 층이 가중치를 학습하도록 시간을 주는 방법이 있다.

- 층의 가중치를 동결하거나 해제한 후에는 compile을 다시해줘야 한다. compile이 훈련될 가중치를 모으기 때문에.

 

 

11.2.2 비지도 사전훈련

 

레이블된 훈련 데이터가 많지않고, 비슷한 문제를 훈련한 모델을 못찾았을 경우, 레이블 된 훈련 데이터도 더 모으기 어렵다면 비지도 사전훈련unsupervised pretraining 으로 훈련 샘플을 모을 수 있다.

레이블되지 않은 많은 훈련데이터가 있다면 오토인코더autoencoder 혹은 GAN 판별자의 하위층을 재사용하고 그 위에 새로운 작업에 맞는 출력층을 추가 할 수 있다. 그렇게 레이블작업을 하고 최종 네트워크를 세밀하게 튜닝한다.

 

딥러닝 초기에는 심층 신경망을 훈련하기 어려웠기 때문에, 탐욕적 층 단위 사전훈련(greedy layer-wise pretraining)이라 불리는 한층 훈련후 동결, 새로운 층 추가 훈련후 동결 ... 식으로 훈련했지만,

오늘날에는 한번에 RBM(restructed boltzmann machine) 대신 오토인코더나 GAN을 이용해 전체 비지도 학습 모델을 훈련한다.

 

11.2.3 보조 작업에서 사전훈련

 

레이블된 훈련데이터가 많지않다면, 마지막 방법으로 레이블된 훈련  데이터를 쉽게 얻거나 생성할 수 있는 보조 신경망을 훈련하는 것이다.

그리고 이 신경망의 하위 층을 실제 작업을 위해 재사용한다.

예를들어 얼굴 인식 시스템에서 개인별 이미지 ( 레이블된 이미지 ) 를 많이 모으기 힘들기 때문에, 인터넷의 무작위 사람의 이미지를 수집해서 같은 사람인지 아닌지 감지하는 등의 첫번째 신경망을 훈련시키고, 그 하위층을 재사용해 적은 양의 훈련데이터에서 얼굴을 잘 구분하는 분류기를 만든다.

 

 

11.3 고속 옵티마이저

 

아주깊은 신경망의 훈련 속도를 높이기 위해서 연결 가중치에 좋은 초기화, 좋은 활성화 함수, 배치 정규화, 사전훈련된 네트워크 재사용하기 방법들을 이용했다.

그 외의 방법으로 표준적인 경사하강법 대신 더빠른 옵티마이저를 사용할 수 있다.

모멘텀 최적화momentum optimization

네스테로프 가속 경사Nesterov accelerated gradient

AdaGrad

RMSProp

Adam

Nadam

 

11.3.1 모멘텀 최적화

공이 매끈한 경사면을 굴러 떨어지듯이 그레디언트를 조정하는 방법이다.

기존의 경사하강법은 가중치에 대한 비용함수의 그레디언트를 학습률에 곱하여 조정해서 이전의 그레디언트에는 전혀 영향을 받지않는다. 그래서 전반적으로 그레디언트가 낮다면 훈련 속도가 매우 느려질 것이다.

반대로 모멘텀 최적화에서는 이전 그레디언트를 매우 중요하게 생각한다. 현재 그레디언트에 학습률을 곱한뒤 모멘텀 벡터 m 에 더하고 이 값으로 가중치를 갱신한다. 즉 현재 그레디언트는 가속도를 나타낸다.

모멘텀 알고리즘

여기서 beta는 모멘텀momentum 이라는 새로운 하이퍼 파라미터로 일종의 마찰저항으로 모멘텀이 아주커지는 것을 방지한다. 0~1 이고, 일반적으로 0.9이다.

m 은 이전의 그레디언트를 쌓은 모멘텀 벡터이다.

 

입력 특성 정규화를 하지 않은 비용함수의 경우 길쭉한 타원형을 나타내고 경사하강법은 깊은 골짜기를 내려올 때 매우 천천히 내려오지만, 모멘텀 최적화 방식은 최적점에 도달할 때까지 점점 빠르게 내려간다. 또한 지역 최적점을 폴짝 건너뛰도록 하는데도 도움이 된다.

 

모멘텀 하이퍼파라미터때문에 최적값에 안정되기전에 최적점을 기준으로 진동하지 않고 수렴하도록 도와준다.

 

11.3.2 네스테로프 가속 경사

네스테로프 가속 경사Nesterov accelerated gradient(NAG) 는 모멘텀 최적화 방식의 변종으로 현재 위치가 theta가 아니라 조금 앞의 theta + beta * m 에서 비용함수의 그레디언트를 계산한다.

네스테로프 가속 경사 알고리즘

모멘텀 벡터가 올바른 최적점을 향하는 방향을 가르킨다면, 일반 최적화는 모멘텀 단계 이전에 계산한 그레디언트를 적용하고, 네스테로프 모멘텀 최적화는 모멘텀 단계 이후에 계산한 그레디언트를 적용한다.

 

 

11.3.3 AdaGrad

 

한쪽이 길쭉한 그릇 문제에서 알고리즘은 가파른 차원을 따라 그레디언트 벡터의 스케일을 감소시켜 일찌감치 전역 최적점 쪽으로 방향을 찾는다.

AdaGrad 알고리즘

첫번째 단계는 s 에 그레디언트의 제곱을 누적한다.

비용함수의 i 번째 차원이 계속해서 가파르다면 ( 기울기 값이 크다면 ) 반복이 진행될수록 i 번째 항이 점점 커진다.

두번째는 경사하강법과 비슷한 방식으로 그레디언트 스케일을 조정한후 가중치를 업데이트한다.

이때  sqrt( s + epsilon ) 으로 나눔으로써, 경사가 가파른 곳에서는 학습률을 줄여서 속도가 느려지게끔, 경사가 완만한 곳에서는 학습률을 높여서 속도가 높아지게끔 조정하는것을 적응적 학습률adaptive learning rate 이라고 부른다.

 

그런데 이 AdaGrad 알고리즘은 훈련할 때 가파른 곳에서 학습률이 너무 감소되서 훈련이 일찍 멈추는 문제가 있다. 그래서 심층 신경망에는 적절하지 않다.

 

 

11.3.4 RMSProp

 

AdaGrad는 학습률이 너무 빠르게 감소해서 멈추는 문제가 있었는데, RMSProp는 (훈련 시작부터 모든 그레디언트가 아닌) 가장 최근 반복에서 비롯딘 그레디언트만 누적함으로써 문제를 해결하였다. 최근 반복의 그레디언트만 누적하는 방법으로 지수 감소 하이퍼 파라미터를 사용한다.

RMSProp 알고리즘

보통 beta 를 0.9로 설정하면 대부분의경우 잘 작동한다. 그리고 이 알고리즘은 Adam 최적화가 나오기 전까지 가장 선호하는 최적화 알고리즘이었다.

 

 

11.3.5 Adam과 Nadam 최적화

 

적응적 모멘트 추정adaptive moment estimation 을 의미하는 Adam 은 모멘텀 최적화와 RMSProp의 아이디어를 합친 것이다. 모멘텀최적화처럼 지난 그레디언트의 지수 감소 평균을 따르고, RMSProp 처럼 지난 그레디언트 제곱의 지수 감소된 평균을 따른다.

Adam 최적화

1. : 지수 감소 평균 모멘텀을 누적한다. 

2. : 지수 감소 평균 그레디언트를 누적한다.

(지수감소 평균은 지수감소 합의 1 - beta배 이다)

5. : 모멘텀과 그레디언트를 같이 적용한다.

3, 4 단계는 m 과 s 가 0으로 초기화되기때문에, 초기에 m과 s 값을 증폭시켜주기위해 사용한다.

 

일반적으로 beta_1 = 0.9, beta_2 = 0.999 , learning_rate = 0.001 을 일반적으로 사용한다.

Adam은 RMSProp와 AdaGrad 와 같이 적응적 학습률 알고리즘이기 때문에 학습률을 튜닝할 필요가 적다.

 

 

AdaMax

 

adam의 5단계에서 시간에 따라 감쇠된 그레디언트의 L2 norm으로 스케일을 조정한다. AdaMax에서는 L2 norm을 L_inf norm으로 변경한다. 즉 나눌때 가장큰 그레디언트으로 나눈다는 뜻  L_inf : 길이가 가장 긴 값

그래서 s <- max ( beta_2 s , 그레디언트 ) 로 바꾸고, theta <- theta + eta m / s 방식으로  가중치를 업데이트한다.

이때문에 실전에서 AdaMax 가 Adam보다 더 안정적이다. Adam이 작동하지 않는다면 시도해볼만하다.

 

 

Nadam

Nadam 옵티마이저는 Adam에 네스테로프 기법을 추가한 것이다. 그래서 종종 Adam 보다 더 빠르게 수렴한다.

일반적으로 Nadam이 Adam 보다 좋았지만, RMSProp가 나을 때도 있었다.

 

데이터셋에 따라 적응적 최적화 방법(RMSProp, Adam, Nadam)이 잘 작동하지 않을때가 있다. 이럴때 네스테로프 가속 경사를 사용하는 것도 좋은 방법이다.

 

 

희소 모델 훈련

모든 최적화 알고리즘은 파라미터가 0 이아닌 밀짐Dense 행렬, 모델을 만든다. 엄청 빠르게 실행할 모델 혹은 메모리를 적게 차지하는 모델을 만들기위해서는 희소sparse 모델을 만들 수 있다.

그 방법으로 보통처럼 훈련하고 작은 가중치를 제거하는 방법과 훈련하는 동안 l1 규제를 강하게 적용해 가능한 많은 가중치를 0으로 만든다.

 

 

11.3.6 학습률 스케줄링

 

좋은 학습률을 찾기위해서는 지수적으로 학습률을 증가시켜 여러번 훈련시킨후에 가장 좋은 학습률을 선택하는 방법이 있지만,

일정한 학습률보다는 큰 학습률로 시작하고 학습속도가 느려질 때 학습률을 낮추면 좋을 솔루션을 더 빠르게 발견할 수 있다.

이렇게 학습률을 감소시키는 전략을 학습 스케줄learning schedule 이라고 한다.

 

  • 거듭제곱 기반 스케줄링power scheduling

학습률을 t(반복횟수)에 대한 함수로 나타낸다. t = s 일때 1/2, t = 2s 일때 1/3 으로 줄어든다. 이때 eta_0 과 s를 튜닝해야 한다.

 

  • 지수 기반 스케줄링exponential scheduling

 

t = s 일 때 1/10 으로 줄어들고 t = 2s 이면 1/100 으로 지수적으로 줄어든다.

 

  • 구간별 고정 스케줄링piecewise constant scheduling

일정 구간동안의 학습률을 지정한다. 예를들어 10에폭동안 0.1, 이후 50에폭동안 0.001

 

  • 성능 기반 스케줄링perfomance scheduling

매 N스텝마다 검증 오차를 측정하고 오차가 줄어들지 않으면 lambda만큼 학습률을 감소시킨다.

 

  • 1 사이클 스케줄링 1cycle scheduling

훈련 절반동안 초기학습률 eta_0 에서 최대 학습률 eta_1 까지 선형적으로 증가시킨다. 이후 절반에서 eta_0까지 다시 선형적으로 줄이고 마지막 몇번에서는 학습률을 소수점 몇 째 자리까지 줄인다. 최대학습률 eta_1을 튜닝하고 eta_0은 보통 최대학습률의 1/10 배로 지정한다.

모멘텀을 사용할 때는 반대로 높은 모멘텀에서 낮은모멘텀 높은모멘텀까지 선형적으로 업데이트한다. 이 방법이 훈련속도를 크게 늘려주고 더 높은 성능을 낸다는 것을 cifar10 데이터셋에서 보여주었다.

 

 

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

 

'네 개의 파라미터로 코끼리 모양을 학습시킬 수 있고, 다섯 개가 있으면 코를 꿈틀거리게 할 수 있다' - 폰노이만

많은 파라미터가 유용하지 않을 수 있다는 뜻이다.

이미 최상의 규제방법중 하나인 조기종료와, 배치 정규화로 부가적인 규제 방법을 알고있다.

신경망에서 널리사용되는 다른규제방법인 l1, l2 규제 , 드롭아웃drop out, 맥스-노름max-norm 규제를 소개한다.

 

 

11.4.1 l1, l2 규제

 

신경망의 연결 가중치를 제한하기위해 l2, 희소 모델을 만들기위해 l1을 적용할 수 있다.

keras layer에 keras.regularizer.l1, l2, l1_l2 를 이용해서 규제를 추가할 수 있다.

keras층에 l1, l2 규제를 추가할 수 있다.

 

 

 

11.4.2 드롭아웃

 

드롭아웃은 심층 신경망에서 매우 인기있는 규제 기법이다.  최고성능을 내는 신경망에서도 드롭아웃을 통해 1~2%의 정확도를 높였다.

드롭아웃 알고리즘은 매우 간단한데, 매 훈련 스텝에서 각 뉴런들은 임시적으로 드롭아웃될 확률 p를 지니고, 드롭아웃되면 이번 스텝에서 완전히 무시된다.

하이퍼파라미터 p를 드롭아웃 비율dropout ratio 라고 하고, 보통 10%~50%로 지정한다.

순환 신경망에서는 20%~30%, 합성곱 신경망에서는 40~50%으로 보통 지정한다.

훈련이 끝나면 뉴런에 더는 드롭아웃을 지정하지 않고 모든 뉴런을 사용한다.

 

드롭아웃으로 훈련된 뉴런은 주변의 뉴런에게 의존하지 않고, 본인이 유용해져야 한다. 또한 몇개의 입력뉴런에게만 의존할수 없기 때문에 입력의 작은 변화에 덜 민감해진다. 결국 네트워크가 더 안정적으로 훈련되어 일반화 성능이 좋아진다.

50%의 드롭아웃을 수행하게되면 각 뉴런은 1/2확률로 신경망에 있거나 없고 n개의 뉴런이 존재하면 2^n 개의 네트워크가 가능하다. 따라서 많은 훈련 반복을 수행하더라도 겹치는 네트워크가 없고, 훈련이 다양한 네트워크에서 수행되고 가중치를 공유하더라도, 드롭아웃으로 훈련된 신경망은 모든 신경망을 평균한 앙상블로 볼 수 있다.

 

일반적으로 맨위의 층부터 세번째 층까지 있는 뉴런에만 드롭아웃을 적용한다.

 

50%의 드롭아웃을 지정해서 훈련하게되면 뉴런은 훈련시에 50%적은 입력뉴런과 연결되고, 훈련이 끝나면 드롭아웃을 적용하지 않기 때문에, 훈련때보다 두배 많은 입력에 노출되게된다. 따라서 이점을 보상하기위해 훈련이 끝나고 각 뉴런의 연결 가중치에 0.5를 곱해서 각 뉴런이 훈련때 노출받은 양과 비슷하게 맞춰주는게 좋다. 이를 훈련이 끝난 뒤 입력의 연결 가중치에 보존 확률keep probability(1-p) 를 곱해야 한다고 한다. 또는 훈련하는 동안 각 뉴런의 출력을 보존 확률로 나누기도 한다.

keras.layers.Dropout 함수는 훈련 하는 동안 일부 입력을 랜덤하게 버리고, 남은 입력을 보존확률로 나누고, 훈련이 끝나고 아무런 작업도 하지않는다.

 

모델의 과대적합여부는 validation이 아니라 훈련이 끝나고 test세트로 측정해야 정확하게 알 수 있다. 훈련이 끝나고 드롭아웃이 적용되지 않은 네트워크로 판단해야 하기때문이다.

모델이 과대적합되었으면 드럽아웃 비율을 늘리고, 모델이 과소적합되었으면 드롭아웃 비율을 낮춘다.

층이 크면 드롭아웃 비율을 늘리고, 층이 작으면 드롭아웃 비율을 낮추는것이 도움이된다.

최신의 신경망구조에서는 마지막 은닉층에서만 드롭아웃을 적용한다.

드롭아웃은 수렴을 느리게만들지만 잘 튜닝하면 훨씬 안정적인 모델을 만들 수 있다. 따라서 가치가 있다.

 

SELU 활성화 함수를 사용하는 자기 정규화 네트워크를 규제하고 싶다면, 알파 드롭아웃을 사용한다. 입력의 평균과 표준편차를 유지하는 드롭아웃의 변종이다. keras.layers.AlphaDropout(0.2)

 

 

11.4.3 몬테 카를로 드롭아웃

 

드롭아웃을 사용해야 되는 이유

1. 드롭아웃 네트워크를 사용하는 것이 근사 베이즈 추론aproximate Bayesian inference 와 수학적으로 동등하다.

2. 훈련된 드롭아웃 모델을 재훈련하거나 수정없이 성능을 크게향상시킬 수 있는 몬테 카를로 드롭아웃Monte Carlo dropout 기법을 소개한다.

 

몬테 카를로 드롭아웃 작동방식

- 드롭아웃 없이 예측한 하나의  결과보다 드롭아웃을 이용해 예측한 여러개의 결과를 평균한게 더 안정적이다.

y_probas = np.stack([model(X_test, training=True) for _ in range(100)])
y_proba = y_probas.mean(axis=0)

여기서 100이란 숫자는 하이퍼파라미터이다. 값이 높을수록 예측과 불확실성 추정이 정확해지지만, 예측시간이 선형적으로 늘어날 수 있다.

또한 일정 숫자를 넘어가면 성능이 크게 향상되지 않아 균형점을 찾는 것이 중요하다.

 

위와같이 training=True 강제로 설정할 경우에, 훈련하는 동안 다르게 작동하는 층이 모델에 존재할경우 test데이터로 훈련이 될 수 도있기 때문에, 아래와 같이 구현한다.

class MCDropout(keras.layers.Dropout):
	def call(self, inputs):
    	return super().call(inputs, training=True)

케라스 드롭아웃 층을 상속받아서, 항상 training=True 로 지정해주면, 예측시에도 드롭아웃층이 활성화된다.

 

기존에 훈련한 모델의 드롭아웃층을 바꾸고싶다면, 드롭아웃 층을 MCDropout으로 변경하고 기존 모델의 가중치를 바꾼 모델의 가중치에 복사한다.

 

 

11.4.4 맥스-노름 규제

 

신경망에서 널리 사용되는 규제기법으로 맥스-노름 규제max-norm regularization 이 있다. 이는 연결 가중치 w 가 ||w||_2 <= r 이 되도록 제한한다. 즉 각 뉴런의 연결가중치 l2 노름이 하이퍼파라미터 r 보다 작도록 제한한다.

 

맥스-노름 규제는 손실함수에 규제 손실 항을 추가하지않고, 매 스텝이 끝날때 w의 l2 norm 을 계산하고, 스케일을 조정한다.

 

r을 줄이면 규제의 양이 커져 과대적합을 줄이는데 도움이 된다. 또한 배치 정규화를 사용하지 않을때, 불안정한 그레디언트 문제를 해결해준다.

 

케라스 레이어에 적용

keras.layers.Dense(300, activatio='elu', kernel_initializer='he_normal',
					kernel_constraint=keras.constraints.max_norm(1.))

fit 메서드에서 매 훈련 반복이 끝나면 kernel_constraint 를 호출해 규제 함수를 수행한다. 이 자리에 사용자 정의 규제함수를 정의할 수도 있다.

max_norm 의 axis 매개변수는 0 이 기본값이고, 각 뉴런 가중치 벡터에 독립적으로 적용된다. 합성곱 층에 사용하려면 axis 를 적절하게 지정해 줘야한다. (axis=[0, 1, 2])

 

 

11.5 요약 및 실용적인 가이드라인

 

DNN 설정

하이퍼 파라미터 기본값
커널 초기화 He 초기화
활성화 함수 ELU
정규화 깊은 신경망일 경우 배치 정규화
규제 조기 종료( l2 규제 추가 가능 )
옵티마이저 모멘텀 최적화 ( 네스테로프, RMSProp, Nadam )
학습률 스케줄 1 사이클

 

 

- 희소 모델이 필요하다면 ( 빠른 실행, 적은 용량 ) l1 규제를 사용

- 빠른 응답하는 모델이 필요하면, 층을 줄이고, 배치 정규화를 이전 층과 결합하고, 빠른 활성화 함수, 부동 소수점 타입을 32bit-> 16, 8bit

- 위험에 민감하거나 예측속도가 중요하지않을경우, MCDropout 층으로 안정화