이 글은 필자가 학교 수업 수강중 딥러닝 프로젝트 과제를 하면서 혼자서 파인튜닝을 한 고난기를 적은 여정입니다. 모델 튜닝을 하여 제출하는 과제이기에 제 자신이 한 머릿속 고민들과 아이디어들을 적어보고 싶어 만든 글이라 개념 설명은 따로 하지 않았습니다. 편하게 봐주세요!
완성된 모델 링크입니다.(완벽한 모델은 아니니 개발은 이렇게 진행된다고 감을 잡으시는 용도로 좋을 것 같습니다.)
매일 성능을 작성하였습니다.(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들을 쓴다고 해결되지 않음인 본질적인 문제점을 파악했다.
'Projects > Projects' 카테고리의 다른 글
[딥러닝 프로젝트] Medical Imaging 모델 Fine-tuning 고난기: 2주차 차차 정리 (0) | 2021.06.07 |
---|---|
[딥러닝 프로젝트] Medical Imaging 모델 Fine-tuning 고난기: 0~1주차 혼란 (0) | 2021.05.30 |
[웹개발] Nodejs-Firebase-Bootstrap을 이용한 프로젝트 CIYN 소개 (0) | 2020.12.18 |
[JAVA] 네트워크를 통한 실시간 그림판/채팅방 구현 (2) | 2019.12.27 |