수학/딥러닝 이론

[딥러닝] 3. 오버피팅 억제법 - 드롭아웃

AI 꿈나무 2020. 10. 3. 21:17
반응형

사이토고키의 <밑바닥부터 시작하는 딥러닝>을 공부하고 정리해보았습니다.

 


 

 

[딥러닝] 오버피팅 억제법 - 가중치 감소

사이토고키의 <밑바닥부터 시작하는 딥러닝>을 공부하고 정리해보았습니다. 을 공부하고 정리해보았습니다. 오버피팅(과적합)  기계학습에서는 오버피팅이 문제가 되는 일이 많습니다.  오버�

deep-learning-study.tistory.com

 이전 포스팅에서는 오버피팅을 억제하는 방식으로 손실 함수에 가중치의 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 데이터 셋으로 확인해보겠습니다.

 

왼쪽은 드롭아웃 없이, 오른쪽은 드롭아웃을 적용한 결과 (dropout_ratio = 0.15)

 

 그림과 같이 드롭아웃을 적용하니 훈련 데이터와 시험 데이터에 대한 정확도 차이가 줄었습니다.

 

 또, 훈련 데이터에 대한 정확도가 100%에 도달하지도 않게 되었습니다.

 

 이처럼 드롭아웃을 이용하면 표현력을 높이면서도 오버피팅을 억제할 수 있습니다.

 

기계학습에서는 앙상블 학습(ensemble learning)을 애용합니다.

 앙상블 학습은 개별적으로 학습시킨 여러 모델의 출력을 평균내어 추론하는 방식입니다.
 신경망의 맥락에서 얘기하면, 가령 같은 구조의 네크워크를 5개 준비하여 따로따로 학습시키고, 시험 때는 그 5개의 출력을 평균 내어 답하는 것 입니다.
 앙상블 학습을 수행하면 신경망의 정확도가 몇% 정도 개선된다는 것이 실험적으로 알려져 있습니다.

 앙상블 학습은 드롭아웃과 밀접합니다.
 드롭아웃이 학습 때 뉴런을 무작위로 삭제하는 행위를 매번 다른 모델을 학습시키는 것으로 해석할 수 있기 때문입니다.
 그리고 추론 때는 뉴런의 출력에 삭제한 비율(이를테면 0.5 등)을 곱함으로써 앙상블 학습에서 여러 모델의 평균을 내는 것과 같은 효과를 얻는 것 입니다.

 즉, 드롭아웃은 앙상블 학습과 같은 효과를 (대략) 하나의 네트워크로 구현했다고 생각할 수 있습니다.

 

반응형