Dropout
Dropout 은 입력 또는 어떤 계층의 출력을 다음 계층에서 모두이용하지 않고, 일부만 사용하면서 신경망을 훈련시키는 Regularizer 이다. 하이퍼 파라미터로 dropout rate p 를 입력받고, 각 노드는 비율 만큼의 확률로 무시되고, 그 반대의 확률로 활성화된다.
이때, 순전파와 역전파 처리에서 마스킹 처리를 하기때문에, 계산량을 오히려 더 늘어나고 모든 노드를 사용하지 않기 때문에 학습속도도 늦추는 점을 감안하고, 성능향상을 위해서 사용한다.
훈련시에는 1-p 의 확률로 선택된 노드들로 훈련이 되는데, 테스트시에는 모든 노드를 전부 사용하기 때문에 훈련할 때보다 활성화값이 $ \frac{1}{1-p} $ 배의 신호가 들어오기 때문에 잘 동작하지 않을 수 있다. 따라서 훈련이 끝난후 각 연결 가중치에 보존 확률 1-p 를 곱해주거나, 훈련하는동안 출력을 1-p 로 나누어주는 방법이 있다.
참고한 keras 에서는 훈련시 출력에 $ \frac{1}{1-p} $ 를 곱해준다.
드롭아웃의 여러 장점 중 하나로는, 확률적으로 네트워크를 변경시키기 때문에 매 훈련마다 다른 landscape 를 최적화 시킬 수 있다. 이는 지역 최소점에 갇힐 위험을 줄여준다.
코드 구현
def forward(self, inputs):
x = inputs
if not self.training:
return x
mask = np.random.binomial(1, self.rate, inputs.shape, dtype=self.dtype)
y = x * mask / (1. - self.rate)
self.mask = mask
return y
def backprop(self, dLdy):
dLdx = dLdy * self.mask / (1.-self.rate)
return dLdx
Monte Carlo Dropout ( MC Dropout )
MC Dropout 은 훈련시에는 기존 Dropout 과 동일하게 동작하지만, 추론시에 더욱 정확한 분포를 확인 할 수 있다.
훈련을 완료하고 추론시에 Dropout 을 훈련과 동일하게 사용하고, 하이퍼파라미터수만큼 반복한다.
예를들어) 동일한 입력을 10 번 Dropout 층을 통과시키면, 확률에 따라 매번 다른 노드들이 선택되어 다른 출력을 내고, 신경망을 통과시키면 10개의 다른 출력들이 생성되고 이를 평균하면 기존 Dropout 을 사용하지 않고 추론할 때보다 많은 분산정보를 얻을 수 있다.
코드 구현
def forward(self, inputs):
x = inputs
if not self.training:
x = np.expand_dims(x, axis=0)
y = self.dropout(x)
for _ in range(self.n_iters-1):
y = np.r_[y, self.dropout(x)]
return y
y = self.dropout(x)
return y
def backprop(self, dLdy):
dLdx = self.dropout.backprop(dLdy)
return dLdx
'머신러닝 > CustomFramework' 카테고리의 다른 글
Residual Connection (0) | 2022.04.04 |
---|---|
Batch Normalization (0) | 2022.04.03 |
L1 L2 Regularizer (0) | 2022.04.03 |
Convolution 2D Layer (0) | 2022.03.26 |
Dense (Fully Connect) Layer (0) | 2022.03.21 |