데이터과학 삼학년

드롭아웃(dropout), 몬테 카를로 드롭아웃(Monte Carlo dropout) 본문

Machine Learning

드롭아웃(dropout), 몬테 카를로 드롭아웃(Monte Carlo dropout)

Dan-k 2021. 11. 15. 19:53
반응형

드롭아웃(dropout)

드롭아웃 : 심층 신경망에서 가장 인기있는 규제 기법 중 하나 (2012년 제프리 힌턴이 제안)

- 매 훈련 스텝에서 각 뉴런은 임시적으로 드롭아웃될 확률 p를 가짐 (인풋 뉴런 포함, 아웃풋 뉴런 제외)

- 훈련이 끝난 후 예측 과정에서는 드롭아웃을 적용하지 않음 

- 드롭아웃을 이용해서 모델의 정확도를 2~3% 더 올렸다는 연구는 매우 흥미로움

  > 예를 들면 어떤 회사 직원들이 출근할지 말지를 동전던지로 결정했을때 회사가 운영이 더 잘된다는 말로 볼 수 있음

  > 다만, 주변 동료들과 협력하며, 어떤 특정한 중요 업무도 한사람(뉴런)에게 전적으로 의지하지 않음을 의미

  > 즉, 전체적으로 보았을때 더 안정적인 네트워크가 되어 일반화 성능이 좋아짐

주의할점

  > p=50%로 설정되었을때, 특정 뉴런은 평균적으로 두배 많은 입력과 연결되므로, 이런 부분을 보정하기위해, 훈련이 끝난 이후, 연결 가중치에 0.5를 곱함

 > 즉, 훈련이 끝난 뒤, 연결 가중치에 보존 확률 (1-p)를 곱한다.

 

몬테 카를로 드롭아웃 (Monte Carlo dropout)

- 야린 갤과 주빈 가라마니의 2016년 논문에서 드롭아웃을 사용해야할 이유

1. 드롭 아웃을 수학적으로 정의하여 드롭아웃 네트워크와 근사 베이즈 추론 사이에 깊은 관련성 정립

2. 드롭아웃 모델을 재훈련하거나 전혀 수정하지 않고, 성능을 크게 향상시킬 수 있는 몬테 카를로 드롭 아웃 소개

 

몬테 카를로 드롭아웃 방법

- 예측과정에서 일반 dropout기법과 다르게 dropout층을 활성화 시키고, 테스트 셋의 100번 예측 결과를 만듦

- 드롭아웃으로 만든 예측을 평균하면 일반적으로 드롭아웃이 없이 예측한 하나의 결과보다 더 안정적인것 확인

y_probas = np.stack([model(X_test_scaled, training=True_ for sample in range(200)])

y_probas = y_probas.mean(axis=0)

예시

만약 mnist 테스트 셋 데이터에 대해 숫자 9라고 예측하는 모델이 아래와 같이 있다면

99%로 9라고 말한다면, 이 결과에 신빙성을 가질 수 있을까?

np.round(model.predict(X_test_scaled[:1]),2)
array([0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0.99])

- 모델 예측에서 dropout을 활성화하면 위 결과와는 다르다.

  > 드롭아웃을 활성화하면 모델이 예측결과에 대해 더이상 확신하지 않음

np.round(y_probas[:,:1],2)
array([[[0, 0, 0, 0, 0, 0, 0, 0.14, 0.17, 0.68]],
        [[0, 0, 0, 0, 0, 0, 0, 0.16, 0.2, 0.64]],
        [[0, 0, 0, 0, 0, 0, 0, 0.02, 0.01, 0.97]],
        ])

위 결과들을 몬테 카를로 드롭아웃 방법인 평균을 구하면, 클래스9에 속할 확률이 62%로 99% 확신한 결과보다는 납득적인 결과를 알 수 있음

np.round(y_proba[:,:1],2)
array([[0, 0, 0, 0, 0, 0, 0, 0.22, 0.16, 0.62]])

또한, 모델이 생각하는 다른 클래스에 대해 정확히 알수 있고, 확률 추정으로 표준 분포를 확인할수도 있음

y_std = y_probas.std(axis=0)
array([[0, 0, 0, 0, 0, 0, 0.28, 0.21, 0.02, 0.32]])

이 확률 추정에는 많은 분산이 있고, 위험에 민감한 시스템을 만든다면 불확실한 예측을 매우 주의 깊게 다루어야함.

즉, 맨처음 모델이 99%의 확신을 가진 예측처럼 만들어서는 안됨.

 

MCDropout

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

dropout층을 상속하고, call()메서드를 이용해 오버라이드하여 training매개변수를 강제로 True로 설정함.

간단히 말해서 MC드롭아웃은 드롭아웃 모델의 성능을 높여주고, 더 정확한 불확실성 추정을 제공하는 기술.

728x90
반응형
LIST
Comments