과적합을 해결하는 드롭아웃(Dropout)과 사용법
- 인공지능 및 데이터과학/인공지능 기술
- 2022. 8. 10.
머신러닝 그중에 신경망은 딥러닝(Deep Learning) 시대로 넘어오고나서 빅데이터의 등장, GPU, 딥러닝 프레임워크(ex: tensorflow, torch 등), 옵티마이저 등등으로 인해 엄청난 발전을 이루게 되었다. 하지만, 양이 있으면 음도 있는 법 모든 시스템이 딥러닝에 적합한 것은 아니었다.
특히, 데이터가 풍부하지 못하거나 너무 많은 특징(Feature)를 가지고 있는 시스템의 경우 과적합(Overfitting) 이라는 문제가 발생하였는데 이 문제는 학습 데이터에 지나치게 학습되어 실제 운영 데이터에 제대로 된 결과를 보여주지 못하는 문제였다.
과적합을 해결하는 방법은 여러가지가 있으며, 한가지만 써서 문제가 해결되지 않는다. 예를 들어 데이터가 적은데 특징이 많을 경우 궁극적으로 과적합을 벗어날 수가 없을 것이다. 이 경우 특징을 줄이던가 어떻게든 데이터를 추가로 확보해야 하는 문제가 있다. 그리고 이번에 소개할 드롭아웃(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을 만들 확률을 넣어주면 된다.
'인공지능 및 데이터과학 > 인공지능 기술' 카테고리의 다른 글
이미지에서 텍스트를 추출하는 OCR, 만들어보기 (1) | 2023.12.14 |
---|---|
[데이터전처리] 이진화(binarization), 크기조정(MinMaxScaler) (0) | 2021.06.21 |
[데이터전처리] 레이블 인코딩(Label Encoding) 기법 (0) | 2021.06.07 |
희소 표현과 분산 표현, 차원의 저주 (0) | 2021.03.11 |
GAN(Generative Adversarial network)이란? (0) | 2021.01.28 |