[복숭아 연구주제 10] 비전공자도 떠나는 데이터 사이언스 기행 [파이토치 10 화: Dropout]
오늘은 이전에 배웠던 모델을 설계하는데 있어서 고려해야 할 점중 하나인 오버피팅을 해결하는 방법 중 하나인 Dropout에 대하여 알아보겠습니다.
이전에 함께 알아보았던 오버피팅에 대한 개념을 다시 한번 짚고 넘어가도록 하겠습니다.
오버피팅이란 위에 보이는것 처럼 트레이닝 과정에서 과도하게 트레이닝 데이터에 맞추어서 모델을 설계하게 되는 현상을 말합니다.
트레이닝 과정에서 오차가 적을 지라도 오버피팅이 된 모델은 테스트 데이터를 활용해서 모델 퍼포먼스를 확인 했을때 적당히 피팅된 녹색 선보다 퍼포먼스가 떨어지는 것을 확인 할 수 있습니다.
오버피팅 문제를 해결하기 위해서 01. 트레이닝 데이터를 늘린다, 02. 데이터를 정의하는 피쳐의 갯수를 줄인다, 03. 데이터를 잘 포괄하는 regularization을 시행한다 등이 있었는데요 거기에 또 하나의 Dropout 이라는 방법을 소개해보고자 합니다.
위에 보이시는 것과 같이 학습을 하는 과정에서 Fully connected layer에 랜덤으로 몇개의 노드들만을 골라서 활성화 시키고 몇개의 노드는 비활성화 하는 것을 반복 하는 방법을 Dropout 이라고 합니다. 1번의 epoch를 트레인 하고 나서 이후 Back propagation 을 수행하여 weight를 업데이트를 해준 후에 이전에 dropout을 한 비율과 동일한 비율로 다시 한번 무작위로 노드를 비활성화 시켜준 후 러닝을 통하여 weight를 업데이트 해주는 방법으로 dropout은 진행됩니다.
그럼 이제 이전에 활용했던 MNIST 데이터 코드를 그대로 활용하는데 dropout만을 추가해서 어떻게 진행하는지, 그리고 결과는 어떻게 나오는지 확인해보도록 하겠습니다.
코드는 이전에 학습했던 MNIST 코드를 그대로 가져와 주었습니다. 거기에 dropout = torch.nn.Dropout(p=drop_prob) 코드를 추가해 주었는데요 여기서 drop_prob 는 위에서 말했던 무작위로 활성/비활성 노드를 구성하는 비율을 말합니다.
모델을 짜줄 때 dropout을 relu 이후에 추가를 해주면 각 레이어를 거칠 때 dropout을 적용하게 됩니다.
dropout을 사용할 때 주의하셔야 할 점이 있는데 그것은 학습을 할 때만 활성/비활성 노드를 고르게 해주고 테스트를 할 때는 모든 노드를 사용해 주어야 한다는 점을 주의하셔야 합니다. 그러므로 dropout 을 활용할 때 train 모드와 evaluation (eval()) 을 나누어 주어야 합니다. 학습을 할 때 Train()을 선언을 해주고 학습을 진행하고 테스트를 할 때는 model.eval() 과 같이 선언을 해주어 모든 노드를 활용하여 테스트를 하는 것을 잊으시면 안됩니다.