[딥러닝 프로젝트] Medical Imaging 모델 Fine-tuning 고난기 : 3주차 마무리 및 문제점들/보완점들
Projects/Projects

[딥러닝 프로젝트] Medical Imaging 모델 Fine-tuning 고난기 : 3주차 마무리 및 문제점들/보완점들

이 글은 필자가 학교 수업 수강중 딥러닝 프로젝트 과제를 하면서 혼자서 파인튜닝을 한 고난기를 적은 여정입니다. 모델 튜닝을 하여 제출하는 과제이기에 제 자신이 한 머릿속 고민들과 아이디어들을 적어보고 싶어 만든 글이라 개념 설명은 따로 하지 않았습니다. 편하게 봐주세요!

완성된 모델 링크입니다.(완벽한 모델은 아니니 개발은 이렇게 진행된다고 감을 잡으시는 용도로 좋을 것 같습니다.)

매일 성능을 작성하였습니다.(Colab PRO를 구매해서 제대로 써보고자 매일 모델을 학습시키고 있습니다.) epoch마다의 학습 중 가장 성능이 뛰어날때/일반화가 잘 되었을 때를 뽑았습니다. 시험기간이라 6월 초반에는 진행을 하지 않았고, 중반에 완성해 모델 완성은 된 상태입니다. (완성된 모델은 종강되는대로 링크로 올려보겠습니다)

- 6월 12일: 98.58 100.0 -> 완료!

3주차. 보완하기

  • Data Preprocessing
    • K-fold Cross Validation
    • (R+G+B) 하나의 채널+ HorizontalFlip 그래도
    • CentralCrop 제거 및 모델 구조 조금 수정
    • train_test_split 구현
    • Data Preprocessing: RGB채널 각각이 아닌 한 채널로 처리
    • Data Augmentation: HorizontalFlip
  • 모델 구조 뜯어고치기. 가능하면 FPN을 구현하여 괜찮게 구현하고 싶다.
    • Encoder/Decoder 구조 -> 굳이?라는 생각이 든다. -> Classification task이므로 Encoder 구조만 가능/Decoder 필요 없음
    • Mini-Batch Gradient Descent
    • (더 수정 필요) ResNet 구조
  • Generalization / Regularization
    • L2-Norm 파라미터 추가
    • 추가 옵션) DropOut
    • Epoch 추가
  • Hyper-Parameter(항상 진행중)
    • Learning Rate 조정
    • Batch size 조정
  • 추가 필요!
    • Edge Enhancement -> High-pass filtering
    • Dropout은 Fully Connected Layer으로만 구성

도대체 무엇이 문제인가

도대체 무엇이 문제인지 도통 감이 잡히지 않았다. 전체적으로 다 완성한 것 같은데 무엇이 빠진 것일까. 그러다 시험기간에 문득 배운 Dropout 세부 내용이 떠올랐다. 먼저 지금 현재 상태는 Underfitting 안에 또 Overfitting이 발생하는 예시였다. 그러면 일단 Underfitting 부터 Overfitting으로 바꾸어야겠다는 생각이 들었다. Overfitting으로 도달하기 위해서는 모델 capacity를 늘리는 일(모델을 복잡하게 만드는 일)이 최우선이었다. 그래서 모델 capacity를 늘릴 수 있는 일들을 나열해보았다.

  • Add Layer, Unit
  • Dropout P_(keep) 늘리기
  • Regularization coefficient 높이기

이렇게 생겼는데 일단 첫번째는 충분히 되었다고 판단되었다. 여기서 그럼 차선책으로 선택할 수 있는 것이 Dropout 설정. 이상하게도 cs231n에서 말한 것과는 달리 교수님께서는 Dropout을 Fully Connected에서만 사용하라고 말씀하셨다. 그래서 바로 바꾼 결과는 다음과 같다.

# Epoch : 110 / 120 99.47 98.59
# Epoch : 111 / 120 98.94 97.14
# Epoch : 112 / 120 98.76 100.0
# Epoch : 113 / 120 98.94 100.0
# Epoch : 114 / 120 99.47 100.0
# Epoch : 115 / 120 98.94 98.59
# Epoch : 116 / 120 98.94 100.0
# Epoch : 117 / 120 98.05 91.55
# Epoch : 118 / 120 97.17 97.14
# Epoch : 119 / 120 98.76 92.96
# Epoch : 120 / 120 98.58 100.0

완전한 최적으로 나아갔다. 지금까지 Dropout을 설정하여 복잡도를 늘리기는 커녕 P_keep으로 제한하여 복잡도를 줄이고 있었던 것이다. 결과적으로는 아름답게 마무리가 되었다. Dropout에 대해서 다시금 생각할 기회를 주게하였다.(역시 배운걸 이해할때까지 의심하고 또 의심하라는 중요한 교훈을 얻었다.)

Sum-Up

해당 모델은 이렇게 마무리되었다. 확실히 Fine-tuning을 해본적은 처음이라 되게 처음에는 버벅였는데 갈수록 익숙해지고 모델 여러 하이퍼파라미터들을 요리조리 만져볼 수 있는 좋은 기회였다. 암기보다는 이해가 우선이 되는 게 교훈인 것 같다. 이게 결국에는 보면 Kaggle 대회이라 생각도 들고, 어쨌든 좋은 경험을 했다고 느낀다.

교수님과 같이 논의된 모델의 문제점들

일단 모델 자체가 문제점이 많은 것이라 판단되었다. 이유는 다음과 같다.

  • 전체 이유는 내가 CNN 중 Medical Imaging task이므로 이에 맞게 대해야 하는데 너무 Computer Vision의 일반적인 task(Object Detection 이나 Tracking, Segmentation의 용도)로 취급하였기 때문이다
    : 데이터 부족은 당연하고, 분명한 object를 대하는 것이 아닌 흑백의 몇가지 대비를 통해서도 결과가 바뀌는 부문이기 때문에 Generalization, Optimization 관점이 달라야 한다.
  • Validatiton set과 Train set accuracy가 추이가 이상하다.
    : 이건 모델 자체를 잘못된 걸로 설정한 문제이라 판단된다. 접근 자체가 잘못 되었음을 이야기한다고 말할 수 있다. 일반적으로 이러한 상황에서는 ResNet보다는 VggNet, AlexNet 등의 Plain 한 network이 더 어울린다고 한다.

나름 만족하였지만 본질은 Task에 맞춘 접근법이 더 중요하다고 생각된다. 무작정 Tool들을 쓴다고 해결되지 않음인 본질적인 문제점을 파악했다.