사이토고키의 <밑바닥부터 시작하는 딥러닝>을 공부하고 정리해보았습니다.
이전 포스팅에서는 오버피팅을 억제하는 방식으로 손실 함수에 가중치의 L2 노름을 더한 가중치 감소 방법을 설명했습니다.
가중치 감소는 간단하게 구현할 수 있고 어느 정도 지나친 학습을 억제할 수 있습니다.
그러나 신경망 모델이 복잡해지면 가중치 감소만으로는 대응하기 어려워집니다.
이럴 때는 흔히 드롭아웃이라는 기법을 이용합니다.
드롭아웃 - Dropout
드롭아웃은 뉴런을 임의로 삭제하면서 학습하는 방법입니다.
훈련 때 은닉층의 뉴런을 무작위로 골라 삭제합니다.
삭제된 뉴런은 신호를 전달하지 않게 됩니다.
훈련 때는 데이터를 흘릴 때마다 삭제할 뉴런을 무작위로 선택하고, 시험 때는 모든 뉴런에 신호를 전달합니다.
단, 시험 때는 각 뉴런의 출력에 훈련 때 삭제 안 한 비율을 곱하여 출력합니다.
드롭아웃을 구현해보겠습니다.
순전파를 담당하는 foward 메서드에서는 훈련 때(train_flg = True일 때)만 잘 계산해두면 시험 때는 단순히 데이터를 흘리기만 하면 됩니다.
삭제 안 한 비율은 곱하지 않아도 좋습니다. 실제 딥러닝 프레임워크들도 비율을 곱하지 않습니다.
[드롭아웃 구현]
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
여기에서의 핵심은 훈련 시에는 순전파 때마다 self.mask에 삭제할 뉴런을 False로 표시한다는 것입니다.
self.mask는 x와 형상이 같은 배열을 무작위로 생성하고, 그 값이 dropout_ratio보다 큰 원소만 True로 설정합니다.
역전파 때의 동작은 ReLU와 같습니다.
즉, 순전파때 신호를 통과시키는 뉴런은 역전파 때도 신호를 그래도 통과시키고, 순전파 때 통과시키지 않은 뉴런은 역전파 때도 신호를 차단합니다.
그럼 드롭아웃의 효과를 MNIST 데이터 셋으로 확인해보겠습니다.
그림과 같이 드롭아웃을 적용하니 훈련 데이터와 시험 데이터에 대한 정확도 차이가 줄었습니다.
또, 훈련 데이터에 대한 정확도가 100%에 도달하지도 않게 되었습니다.
이처럼 드롭아웃을 이용하면 표현력을 높이면서도 오버피팅을 억제할 수 있습니다.
기계학습에서는 앙상블 학습(ensemble learning)을 애용합니다.
앙상블 학습은 개별적으로 학습시킨 여러 모델의 출력을 평균내어 추론하는 방식입니다.
신경망의 맥락에서 얘기하면, 가령 같은 구조의 네크워크를 5개 준비하여 따로따로 학습시키고, 시험 때는 그 5개의 출력을 평균 내어 답하는 것 입니다.
앙상블 학습을 수행하면 신경망의 정확도가 몇% 정도 개선된다는 것이 실험적으로 알려져 있습니다.
앙상블 학습은 드롭아웃과 밀접합니다.
드롭아웃이 학습 때 뉴런을 무작위로 삭제하는 행위를 매번 다른 모델을 학습시키는 것으로 해석할 수 있기 때문입니다.
그리고 추론 때는 뉴런의 출력에 삭제한 비율(이를테면 0.5 등)을 곱함으로써 앙상블 학습에서 여러 모델의 평균을 내는 것과 같은 효과를 얻는 것 입니다.
즉, 드롭아웃은 앙상블 학습과 같은 효과를 (대략) 하나의 네트워크로 구현했다고 생각할 수 있습니다.
'수학 > 딥러닝 이론' 카테고리의 다른 글
[딥러닝] 하이퍼파라미터를 최적화하는 방법과 구현하기 (0) | 2020.10.03 |
---|---|
[딥러닝] 검증 데이터 - 하이퍼파라미터의 성능을 평가 (0) | 2020.10.03 |
[딥러닝] 2. 오버피팅 억제법 - 가중치 감소 (0) | 2020.10.03 |
[딥러닝] 1. 오버피팅(과적합)이란? (0) | 2020.10.03 |
[딥러닝] 배치 정규화의 알고리즘과 효과 (0) | 2020.10.03 |