Deep learning/모델 구현

12. 학습 관련 기술들(4) - 오버피팅, 가중치 감소, 드롭아웃

jwjwvison 2021. 4. 23. 22:17

이 포스팅은 밑바닥부터 시작하는 딥러닝을 공부하고 정리한것 입니다.


 기계학습에서는 오버피팅이 문제가 되는 일이 많다. 오버피팅이란 신경망이 훈련 데이터에만 지나치게 적응되어 그 외의 데이터에는 제대로 대응하지 못하는 상태를 말한다.

 

1. 오버피팅

 오버피팅은 주로 다음의 두 경우에 일어난다

   1. 매개변수가 많고 표현력이 높은 모델

   2. 훈련 데이터가 적음

 이처럼 정확도가 크게 벌어지는 것은 훈련 데이터에만 적응(fitting)해버린 결과이다. 훈련 때 사용하지 않은 범용 데이터에는 제대로 대응하지 못하는 것을 이 그래프에서 확인할 수 있다.

 

 

2. 가중치 감소

 오버피팅 억제용으로 예로부터 많이 이용해온 방법 중 가중치 감소(weight decay)라는 것이 있다.  이는 학습 과정에서 큰 가중치에 대해서는 그에 상응하는 큰 페널티를 부과하여 오버피팅을 억제하는 방법이다. 원래 오버피팅은 가중치 매개변수의 값이 커서 발생하는 경우가 많기 때문이다.

 신경망 학습의 목적은 손실 함수를 줄이는 것이다. 이때, 예를 들어 가중치의 제곱 노름(norm) (L2 노름)을 손실 함수에 더하면 가중치가 커지는 것을 억제할 수 있다.

6-20 과 비교하면 차이가 줄었다. 그리고 훈련 데이터에 대한 정확도가 100%에 도달하지 못한 점도 주목해야 한다.

 

 

3. 드롭아웃

신경망 모델이 복잡해지면 가중치 감소만으로는 대응하기가 어려워진다. 이럴 때는 흔히 드롭아웃(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