과적합을 해결하는 드롭아웃(Dropout)과 사용법

    머신러닝 그중에 신경망은 딥러닝(Deep Learning) 시대로 넘어오고나서 빅데이터의 등장, GPU, 딥러닝 프레임워크(ex: tensorflow, torch 등), 옵티마이저 등등으로 인해 엄청난 발전을 이루게 되었다. 하지만, 양이 있으면 음도 있는 법 모든 시스템이 딥러닝에 적합한 것은 아니었다.

     

    특히, 데이터가 풍부하지 못하거나 너무 많은 특징(Feature)를 가지고 있는 시스템의 경우 과적합(Overfitting) 이라는 문제가 발생하였는데 이 문제는 학습 데이터에 지나치게 학습되어 실제 운영 데이터에 제대로 된 결과를 보여주지 못하는 문제였다.

     

    과적합을 해결하는 방법은 여러가지가 있으며, 한가지만 써서 문제가 해결되지 않는다. 예를 들어 데이터가 적은데 특징이 많을 경우 궁극적으로 과적합을 벗어날 수가 없을 것이다. 이 경우 특징을 줄이던가 어떻게든 데이터를 추가로 확보해야 하는 문제가 있다. 그리고 이번에 소개할 드롭아웃(Dropout)은 딥러닝 코드에 간단히 설정만 하여 과적합을 어느정도 해소할 수 있는 개념이다.

     

    과적합을 해결하는 드롭아웃(Dropout)과 사용법


    드롭아웃(Dropout)의 이해하기

    적절한 이성을 소개시켜주는 앱을 딥러닝으로 만들고 있다고 해보자. 그러나 우리에게 누가 누구를 좋아하는지에 대한 데이터가 10,000건 정도밖에 없다고 가정을 해보자. 그리고 데이터가 충분치 않기 때문에 이 데이터를 모조리 학습(Training)에 사용했다고 가정을 해보도록 한다.

     

    누군가를 좋아하는데 사용할 값으로 눈의 모양, 코의 모양, 얼굴 모양, 입의 모양, 피부색, 키, 몸무게, 연봉, 학력 등등이 있을 것이고, 이 값들을 조합하면 총 10만가지가 나온다고 할 경우, 한 사람의 행동 값을 어떤 사람에게 추천할 것이고 너무 Fit한 데이터로 인해서 예상치 못한 결과를 추천하게 될 수도 있다. 

     

    물론 이 케이스가 맞을수도 있고 틀릴 수도 있지만 이렇게 과적합 된 문제는 예측하지 못한 이상한 결과를 내뱉을 수 있다는 것이 문제다. 아래는 Underfitted, Good Fit, Overfitted 관련된 그래프로 과적합의 모형이 얼마나 이상한지를 알 수 있다..

     

     

    드롭아웃은 학습할 때 특징의 일부를 날려버린다. Overfit을 감소 시켜 준다. 예를 들어, A라는 사람이 어떤 여성의 총 10가지의 특징을 보고 좋아했다고 한다면, 학습을 할 때 4가지 정도를 날려버린다는 것이다. 그게 얼굴 모형이 될수도 있고, 코 모양이 될 수도 있고 되도록이면 안 날리는 것이 중요하겠지만, 제대로 된 학습 모형을 만들기 위해서 오버핏한 데이터의 일부를 날려버린다.

     

    이렇게 하면, 데이터가 느슨해지기 때문에 다양한 케이스에 모델이 대응을 할 수 있게 된다. 내부적으로는 정확도는 떨어지겠지만 더 많은 데이터를 학습한 것과 같은 효과가 나타나게 된다.

     

     

    텐서플로우(Tensorflow), 케라스(Keras) 예시

    model = tf.keras.models.Sequential()
    model.add(keras.layers.Dense(N_HIDDEN,
                                 input_shape=(RESHAPED,),
                                 name='dense_layer', activation='relu'))
    model.add(keras.layers.Dropout(0.3))
    model.add(keras.layers.Dense(N_HIDDEN,
                                 name='dense_layer_2', activation='relu'))
    model.add(keras.layers.Dropout(0.3))
    model.add(keras.layers.Dense(NB_CLASSES,
                                 name='dense_layer_3', activation='softmax'))

    드롭아웃을 추가하는 것은 매우 간단하다. 레이어 사이에 위와 같이 Dropout layer를 추가하면 되기 때문이다. 비율은 삭제할 노드의 비율이며, 노드는 무작위로 삭제한다.

     

    파이토치(Pytorch) 예시

    self.layers = nn.Sequential(
    nn.Flatten(),
    nn.Linear(14 * 14 * 1, 32),
    nn.Dropout(p=0.25),
    nn.ReLU(),
    nn.Linear(32, 16),
    nn.Dropout(p=0.25),
    nn.ReLU(),
    nn.Linear(16, 5)
    )

    파이토치 역시, 케라스와 사용방법이 유사하다. 중간에 Dropout(p=0.25)와 같이 무작위로 0을 만들 확률을 넣어주면 된다.

     

    댓글

    Designed by JB FACTORY