3월 3일 저녁 7시, 드디어 첫 프로젝트가 끝이 났다!

(글을 쓰기 시작한 것은 3월 6일인데 마무리 짓는 시기는 3월 23일이다. 많이 바쁘기도 했고 고민하면서 써서 그런가..)

 

Image Classification과 관련한 프로젝트였고, 마스크 착용 상태를 분류하는 Competition 형태였다.

 

부스트 캠프 내에서 회고에 쓰일 질문 문항을 7개 정도 사전에 제공해주어서 해당 문항을 포함한 내 개인 의견까지 포함하여 한 번 적어보려고 한다.

 

 

1. 이번 프로젝트에서 나의 목표는 무엇이었는가?

 

일단 나는 부스트캠프에 들어오기 전에 전문적인 교육을 받은 적도, 전문적인 프로젝트를 진행 해 본 적도 없었다.

 

AI 프로젝트도 작년에 동아리에서 KISIA 측에서 진행한 KUCIS 프로젝트에 참여할 수 있게 되어 Malware Classification라는 프로젝트를 해보았지만, 내가 참여할 수 있는 부분은 극히 드물었었다.

(왜냐면 이제 막 AI를 공부하려고 시작한 상황이었는데, 내가 프로젝트를 통해서 공부해보려고 했지만 실제적으로 이렇게까지 어려웠을 줄 몰랐고 또 도움을 줄 수 있는 부분도 극히 드물었었다.)

 

따라서 이번 프로젝트가 내가 참여하고 기여할 수 있는 첫 번째 프로젝트였다.

 

특히, 시간으로만 따지면 1주일 살짝 넘은 기간동안 진행하는 단기간 프로젝트라는 것도 처음 해보는 것이었다.

(적어도, 학교 팀플도 3주 정도는 시간이 주어졌었기 때문..)

 

그렇기에 나의 첫 목표는 "이번 프로젝트를 성공적으로 마무리 해보자."였다.

 

성공적이라는 것이 성능이 잘나오고, 단순히 프로젝트를 마치는 것이 아니라 성능이 잘 나오지 않을지언정 내가 직접 참여 해보고, 다른 팀원들도 포기하지 않고 끝까지 완주하는 것이었다.

 

이 목표는 성공적으로 달성이 되었다!

 

우리 조는 프로젝트를 이탈자 없이, 중간 포기 없이 성공적으로 완주하였고, 우수한 순위권은 아니었지만 나도 직접 참여해보고 노력해보았다.

 

그 다음으로의 목표가 "어느정도 나 혼자서 개인 프로젝트를 할 수 있을 정도로 실력을 끌어 올려보고 이번 경험을 통해서 어느정도 프로젝트의 틀을 잡아가자"였다.

 

앞서 말한 것처럼, 나는 이런 전문적인 프로젝트가 처음이기 때문에 프로젝트의 틀이 많이 잡히지 않아있었다.

 

이번 프로젝트를 통해서 전반적으로 "아, 전문적으로 진행하는 프로젝트는 이렇게 짜이는구나"라는 틀을 잡아가고, 프로젝트를 통해서 내 실력을 성장시키는 것도 하나의 목표였다.

 

개인적으로 이 목표는 달성하지 못한 것 같다.

 

일단, 프로젝트를 통해서 내가 스스로 개인 프로젝트를 할 수 있을 정도로 실력을 쌓기에는 너무 짧은 시간이었고 너무 안일한 생각이었다.

 

프로젝트 한 번을 통해서 내가 스스로 개인 프로젝트를 할 수 있을 것이라는 생각 자체가 애초에 잘못 되었던 것 같다..

 

또한, 프로젝트의 틀 역시 아직 완벽하게 짜이지 않았다.

 

우리 조는 github보다는 notion을 통해서 협업이 주로 진행되었다는 점에서 약간 아쉬움이 남는데, 실제로 멘토님께서 notion과 github를 같이 이용하는 것이 좋다고도 하셨었고, github로는 단순히 코드 공유 정도로 그쳤기 때문이다.

 

따라서 다음 프로젝트에서는 github를 조금 더 세부적으로, 다각적으로 사용하여 프로젝트의 틀을 만들어 놓고 싶다!

 

사실 그 다음의 목표들은 부차적인 목표들이다.

 

"48개의 팀들 중 24위 안에는 들어보자.", "순위권도 한 번 들어가보자!" 이런 순위 관련 부차적인 목표였는데, 사실 이는 희망사항일 뿐, 우선 순위의 목표들은 아니었다.

 

 

2. 나는 내 학습 목표를 달성하기 위해 무엇을 어떻게 했는가?

 

일단, 프로젝트가 시작하고 EDA를 진행해 보았다.

 

EDA를 시작하면서, 어떻게 EDA를 시작해야 하는지 감조차 잡히지 않았고, EDA를 시작하여도 "내가 pandas나 matplotlib, seaborn을 아직 잘 다루고 있지 못하는 구나"라는 생각도 들었다.

 

그렇기에 EDA를 해보았음에도 불구하고, 내가 알아보고 싶은 가장 중요한 정보는 직접 손으로 적어가며 정보를 얻어내었었다.

 

따라서, 다음 프로젝트를 진행하기 전에 EDA를 조금 더 확실하게 연습해 둘 필요가 있을 것 같다.

 

EDA 이후에는 모델 선정을 시도해보았지만 (Resnet18) 코딩 구현 능력이 부족하여 실패하였고, 다른 캠퍼 분이 올려주신 Resnet18을 시도해보았지만 같은 조 캠퍼 분이 Efficientnet-b0와 Resnet18을 비교하여 성능을 내어서 이 부분은 더이상 진행하지 않았다.

 

이 역시, 다음 프로젝트부터 끝날 때까지 (어쩌면 끝나고 나서도) 계속 연습해야 할 부분이 아닐까 생각한다.

 

아무리 데이터가 중요하더라도 모델을 쓸 줄 모르면... 말짱 도루묵이 되기 때문에...

 

이후에는 Data Augmentation을 진행했다!

 

이 부분을 정말 집중적으로 실험했다.

 

처음에는 단순히 baseline code에서 augmentation이 회전이나 뒤집기만 적용이 되어있어서 "RGB변형과 같은 색조 변형, 윤곽선 강조처럼 직접적인 변형은 효과가 없을까?"라는 생각으로 진행하였다.

 

이러한 생각을 바탕으로 albumentations라는 augmentation 툴을 사용하는 방법을 숙지하고, albumentations 공식 문서를 참고하여 augmentation을 해 보았다.

 

얼마 지나지 않아 우리 조 다른 캠퍼 분들이 진행한 실험 결과들을 바탕으로 60세 이상 label에 대해 분류하는 정확도가 낮다는 문제점을 파악했고, 이 점을 해결하기 위해 augmentation 기능들의 특성을 보고 해당 label을 더 잘 분류할 수 있을만한 기능을 선택하여 진행해 보았다.

 

결과적으로는 해당 실험들이 큰 성능 향상을 이루지는 못하였지만, 내가 직접 문제점을 파악하고 실험한 점에서 크게 자신감을 얻었던 것 같다.

 

Augmentation이 끝난 이후, 오피스 아워에서 언급된 Auto-ML을 이용한 Hyper-parameter Tuning을 직접 우리 코드에 적용해보고 싶다는 생각이 들었고, 이를 직접 적용하고자 시도했다.

 

다양한 에러와 해결 방법이 구글링을 통해서도 안뜨는 에러가 생겨서 많이 삽질했는데, 결과적으로는 성공하게 되어서 너무 너무 기뻤던 기억이 남는다.ㅋㅋㅋ

 

마지막에 우리 조 다른 캠퍼분이 작성해 준 하드보팅 Ensemble을 적용해 보았고, last dance 느낌으로 기존의 학습 방법인 Supervised Learning을 Semi-Supervised Learning으로 변환하려는 시도를 해 보았다.

 

처음에는 Pseudo Labeling을 적용해 보려 하였으나 Pseudo Labeling의 단점 중 하나인 "teacher가 잘못 편향되어 학습이 일어난 경우 student도 잘못 편향되어 학습이 일어난다"는 점이 현재 우리의 60세 이상 label에 동일하게 문제점으로 작용할 것이라고 생각되어 다른 방법을 고안했다.

 

Pseudo Labeling의 단점을 보완한 Meta Pseudo Labels를 시도해보려고 하였으나 자료도 부족하였고 시간도 부족하였고 (프로젝트 마무리 당일 날 생각 해 본 내용) 또한 github에서 코드를 긁어와서 변형해보려고 하였지만 능력도 부족하여 결국에는 해보지 못했다.

 

 

3. 나는 어떤 방식으로 모델을 개선했는가?

 

학습에 평가되는 방법이 f1 score였기 때문에 accuracy에 집중하는 것이 아니라 f1 score에 집중하였다.

 

따라서 모든 시도가 f1 score를 근거로 평가되었으며 내가 주로 했던 Augmentation 역시 마찬가지였다.

 

특히 가장 문제가 되었던 60세 이상 label을 집중적으로 공략하려고 FaceNet 등을 도입하여 진행해보았으나 효과가 미미하였었다.

 

시도한 내용을 정리해보면 크게 Augmentation, Auto-ML, Learning 방법 변환 (Supervised -> Semi-Supervised) 시도를 해본 것 같다.

 

 

4. 내가 한 행동의 결과로 어떤 지점을 달성하고, 어떠한 깨달음을 얻었는가?

 

내가 프로젝트에서 한 행동들은 "main"이 되는 행동이라기 보다는 조금 "보조" 해주는 행동들을 많이 한 것 같다.

 

데이터를 상세 분석하여 유의미한 결과를 도출하거나, 모델 선정에 있어서 최적의 모델을 찾아내거나, 앙상블을 진행하여 성능을 끌어올리는 행동은 하지 않았던 것 같고 주로 데이터 Augmentation을 통해서 성능 향상을 보이는지와 Hyper-parameter Tuning을 통해서 가장 나은 Optimizer와 Loss를 구하는 행동들 말이다.

 

따라서 내가 생각하기에 이번 프로젝트를 통해서 "시작 선"을 넘었다고 생각한다. 그것도 한 걸음 크게.

 

앞서도 말했다시피 기존에 해봤던 프로젝트는 Malware Classification이었고 전문성도 떨어지고 내가 아는 것이 없었기에 보고 어떻게 하는 것인지 느끼는 정도였다면 이번 프로젝트를 통해서 전반적인 프로젝트의 큰 틀, 협업의 큰 틀, AI Develop에서의 시작을 보고 해보면서 배우지 않았나 생각이 든다.

 

또한 이로써 현재의 내 정확한 실력을 판가름 할 수 있는 지표를 얻었다고 생각하고, 내가 직접 시도하고 성공한 Data Augmentation, Auto-ML with NNI에 대해서는 어느정도 자신감을 얻었다고 생각한다. (여기서 말한 성공은 유의미한 결과 도출이 아니라 아무것도 알지 못하는 상태에서 직접 필요성을 느껴서 library를 불러와서 코드를 직접 짜보고 에러를 고쳐내고 실험해보는 작업을 말한다.)

 

깨달음이라 하면.. 일단 데이터의 중요성에 대해서 크게 느낀 것 같다.

 

데이터에 잔 오류가 많았고, imbalance한 문제가 정말 컸기 때문에 데이터가 얼마나 잘 정돈되어 있고 품질도 좋고 양도 어느정도 확보되어있는지가 가장 중요한 부분이라고 느꼈다.

 

물론, 실제로는 그렇지 않은 데이터가 다반사기에 어쩔 수 없는 부분인 것 같기도 하다.

 

 

5. 전과 비교해서, 내가 새롭게 시도한 변화는 무엇이고, 어떤 효과가 있었는가?

 

사실 "전"이라는 것이 나한테 존재하지 않았어서 모든 것이 다 새로웠다.

 

"나 자신에 대한 변화"라면 내가 모든 것을 해야만 한다고 생각하지 않고 일단은 내가 그나마 잘할 수 있는 것이 무엇인지를 찾아가며 필요한 것들을 도움이 될 수 있도록 시도해 본 점인 것 같다.

 

이 덕에 딥러닝 프로젝트의 구성 요소 하나하나를 알아가고 초반부를 어느정도 정복해 나가는 느낌을 받았다.

 

또한, 부스트캠프가 마무리 될 즈음에는 나 스스로가 하나의 프로젝트를 만들 수 있을 정도의 실력을 쌓을 수 있을 것 같다는 느낌도 들었다.

 

다만, 모델을 직접 짜보는 부분이 여전히 어려워서 이 부분은 어떻게든 연습을 해야할 것 같다. (데이터 시각화도 마찬가지)

 

 

6. 마주한 한계는 무엇이며, 아쉬웠던 점은 무엇인가?

 

가장 먼저, EDA에 대한 부족이 떠오른다.

 

Matplotlib이나 Seaborn library 수업에서 조금 가벼이 하고 넘어간 것이 아마 화근이 되지 않았나 싶다.

 

또한 모델링 부분도 부족한 것 같다.

 

바로 위에서 말했었지만 모델을 직접 짜보는 부분이 너무 어렵기도 하고 아직 전반적으로 어떤 코드가 어떤 위치에 필요한지를 이해하지 못하여서 더더욱이 직접 짜보는 것이 어렵다.

 

마지막으로 코드에 대한 이해가 부족하다는 점이다.

 

Semi-Supervised Learning 기법(VAT와 MPL)을 우리 코드에 적용시켜보고자 github 등에서 코드를 찾고 입맛에 맞게 변형시켜보려고 하였으나 나의 코드 작성 능력과 이해 능력이 아직 현저하게 부족하다는 점을 크게 느꼈다.

 

아쉬웠던 점이라면.. 내가 시도해 본 결과들이 유의미한 결과를 내지 못했다는 점과 다른 상위권 조들의 방법을 들었을 때 우리가 했던 방법들과 비슷했던 것 같은데 그러한 생각들을 해보지 못한 점이 정말 아쉬웠다.

 

또한 내 개인 f1 score를 0.7을 넘겨보지 못한 점 또한 아쉽다. (팀 f1 score는 0.73이었지만 내가 제출한 것 중 가장 잘 나온 f1 score는 0.68이었다.)

 

끝으로 Github를 통한 협업과 WandB/MLFlow 등의 협업을 제대로 해보지 못한 것이 아쉽다.

 

우리 조의 경우 Notion을 통한 협업은 정말 잘되었으나 Github는 단순 코드 공유 정도, WandB나 MLFlow는 시도해보지 않아서 이 부분이 조금 아쉬웠던 것 같다.

 

 

7. 한계/교훈을 바탕으로 다음 P-Stage에서 스스로 새롭게 시도해볼 것은 무엇일까?

 

앞으로의 P-Stage에서도 내가 처음 들어보는 기술들을 적용시켜야 할 때가 올 것이다. (당장에 이 말을 적고 있는 23일 지금, Object Detection 프로젝트가 시작하였는데 Object Detection 자체가 내가 처음 들어보는 기술들로 가득하다.)

 

이번에는 실력적인 부분에서도 미흡했고 시간도 부족하여 적용해 보지 못하였지만 다음 기회가 온다면 한 번 붙잡고 늘어져보는 것도 좋은 방법이라고 생각하여 시도해보고 싶다.

 

또한 직접 모델링(일단은 pre-trained model을 불러와 우리의 입맛에 맞게 fine-tuning하고 갖가지 코드들을 조금 더 덧붙이는)을 성공해보고 싶다.

 

아! Notion을 통한 협업뿐만 아니라 Notion + Github + MLFlow 세 가지를 모두 아우르는 협업도 해보고 싶다.

+ Recent posts