목차 열기
왜 무엇을 버리나?
Drop Out은 말 그대로 버리는 것이다. MLP로 예를 들면 퍼셉트론의 연결을 훈련중에 일정 확률로 일부분을 랜덤하게 연결을 끊어 학습을 더디게 만드는 것이다.
왜 더디게 만드는 지 이야기 전 논문 저자의 직관부터 이야기 하면 2014년도 Bishop은 이를 유성생식에 비유했다. 부모의 한쪽 유전자씩 받는 그 과정에서 유전의 혼합 능력을 떠올린 것이다. (그래서 50프로 확률로 연결을 끊어 절반만 살린다)
하지만 더 나은 직관으로 앙상블 효과로 보는 경우도 있다. 앙상블이란 간단하게 똑똑한 애 하나의 점수보다 덜 똑똑한 애 10명이 투표해 낸 결과의 점수가 높다는 것이다. 기존 앙상블은 여러 다른 모델을 사용하는 것이지만, Drop-Out이 연결을 끊음으로 훈련 중 여러 모델의 효과를 낸다는 것이다.
왜 더디게 만드나?(Regularization)
학습 중에 데이터의 입력 순서, 양, 라벨의 정확도 등 다양한 문제로 인해 학습이 너무 훈련 데이터셋에만 적응하여 훈련 데이터 이외에 것을 오히려 잘 못 맞출 수 있다. 이를 과적합(Over-Fitting)이라고 한다.
간단한 예로 개와 고양이를 분류한다 할 때 200장의 훈련 데이터셋인데 180은 개이고 20장은 고양이에 테스트 데이터 셋을 고양이가 더 많으면 데이터의 양이 부족하다 생각 할 수도 있지만 대충 개만 답으로 내놔도 좋은 애처럼 보이기 때문에 과적합이 일어나기 쉽다.
데이터 관점이 아니라 모델 관점에서 해결하기 위해 Regularization을 사용한다. 일부러 덜 학습 되도록 만들어 입력에 노이즈를 추가하거나 결과에 노이즈를 넣어 Loss를 증가시키는 방법이 있다.
Drop-Out 또한 Regularization로 보며 실제 경험적 성능 향상이 있어 활용을 한다.
여담으로 MLP는 간단하게 다 연결되서 모두 랜덤하게 끊으면 되지만, CNN같은 경우 블럭 전체의 랜덤이 아닌 Channel간 연결을 차단하는 것이 더 좋다 한다.
초간단구현
import numpy as np
p =0.5 #하이퍼 파라미터로 버릴 확률
def drop(in_layer):
mask = np.random.rand(*in_layer.shape) < p #layer의 모양에 확률에 따라 0 또는 1
return in_layer*mask
# 훈련중 사용
input_layer = np.random.rand(3,2)
hidden_layer = drop(np.dot(W,input_layer)+b)
out = Activation(hidden_layer)
# 테스트시
hidden_layer = np.dot(W,input_laer)+b
out = Activation(hidden_layer * p)
tensorflow나 pytorch의 내부코드가 어떻게 동작되는 지 보여주는 것도 좋아 보이지만 업데이트 됨에 따라
디렉토리나 참고등 업데이트 해주어야 할 것 같아 간단하게 넘파이로 만들 수 있다는 것을 보여 드린다.
훈련중 말고 테스트 시에는 탈락 확률을 곱해주면 훈련 중 기대 값과 같아 진다. 하지만 실제에서는 그렇게 하지 않고 훈련 중에 기대값을 확률로 나누어 테스트에서는 바꾸지 않아도 되도록 한다. 훈련 중 곱하기 한번의 부하가 계속 동작될 부하보다 낫다는 것이다. 즉 훈련이 오래걸리는 것보다 실제 동작이 간단해야한다. 그럼 코드는 다음과 같다
import numpy as np
p =0.5 #하이퍼 파라미터로 버릴 확률
def drop(in_layer):
mask = np.random.rand(*in_layer.shape) < p #layer의 모양에 확률에 따라 0 또는 1
return in_layer*mask / p # 달라진 점
# 훈련중 사용
input_layer = np.random.rand(3,2)
hidden_layer = drop(np.dot(W,input_layer)+b)
out = Activation(hidden_layer)
# 테스트시
hidden_layer = np.dot(W,input_laer)+b
out = Activation(hidden_layer)
이번에 간단하게 Drop-Out에 관해 알아봤습니다.
여담으로 천개의 뇌를 직접 읽어 보지는 않았지만,
신피질 뉴런이 층층히 연결되어 있는 것으로 알려져 있었지만,
뉴련의 기둥들이 병렬로 쌓여 층이 된 것이고 그 각 기둥에서 낸 결과를 종합해 결론을 낸다는 것이다.
이를 처음 보고 Drop-out과 앙상블이 떠올라 글을 쓰게 되었습니다.
'知 > job지식' 카테고리의 다른 글
Stochastic process (0) | 2024.05.23 |
---|---|
Reinforcement Learning (0) | 2024.05.21 |
Weight initialization (0) | 2024.05.15 |
Resnet 직관 (0) | 2024.05.05 |
CNN(Convolution Neural Network) (0) | 2024.05.02 |