머신 러닝 및 파이썬/밑바닥부터 시작하는 딥러닝
Ch.6 학습 관련 기술들/ 6.4.3 드롭아웃
제정신은코딩에해로워
2020. 3. 11. 20:43
신경망 모델이 복잡해지면 가중치 감소만으로 대응하기 어려워진다. 이때 드롭아웃 Dropout 이라는 기법을 이용한다.
드롭아웃은 뉴런을 임의로 삭제하면서 학습하는 방법이다. 훈련 때 은닉층의 뉴런을 무작위로 골라 삭제한다. 삭제된 뉴런은 신호를 전달하지 않게 된다. 훈련 때는 데이터를 흘릴 때마다 삭제할 뉴런을 무작위로 선택하고, 시험 때는 모든 뉴런에 신호를 전달한다. 단, 시험 때는 각 뉴런의 출력에 훈련 때 삭제한 비율을 곱하여 출력한다.
class Dropout:
def __init__(self, dropout_ratio=0.5):
self.dropout_ratio = dropout_ratio
self.mask = None
def forward(self, x, train_flg=True):
if train_flg:
self.mask = np.random.rand(*x.shape) > self.dropout_ratio
return x * self.mask
else:
return x * (1.0 - self.dropout_ratio)
def backward(self, dout):
return dout * self.mask
순전파:
train 중이라면, x와 동일한 모양의 bool type 행렬을 만들고, 곱해서 dropout_ratio 보다 큰 원소만 True로 설정한다.
역전파:
ReLU와 동일, 순전파 때 신호를 통과시키는 뉴런은 역전파 때도 신호를 그대로 통과시키고, 그렇지 않은 뉴런은 역전파때도 신호를 차단함
드롭아웃을 적용한 결과, 훈련 데이터와 시험 데이터에 대한 정확도 차이가 줄어들었으며, 훈련 데이터에 대한 정확도가 100%에 도달하지 않게 되었다. (train은 100%에 도달하였으나, test가 100%가 아니라면 사실 상 정확하지 않은 오버피팅 상태)
이처럼 드롭아웃을 이용하면 표현력을 높이면서도 오버피팅을 억제할 수 있다.