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 세 가지를 모두 아우르는 협업도 해보고 싶다.

P Stage가 이번주 월요일부로 시작되었다.

 

사실 부스트 캠프에서 가장 걱정되었던 부분이 나에게는 P Stage였다.

 

올해로 갓 21살의 나이에 대학교 1학년을 마치고 AI 관련 강의를 부스트코스에서 수강하던 와중에 모집 글을 보고, '떨어지는 경험이라도 쌓고 익숙해지자'라는 생각으로 지원했었는데 운이 좋게도 붙어버린 것.

 

실제로 부스트 캠프 내에서도 내가 제일 나이가 어린 것 같았다.

 

Python이 가장 자신 있는 언어라고 해도 (하다못해 전문적으로 자신 있는 것이 아니라 이 때까지만 해도 list comprehension에 익숙해져서 재미 들린 시기) '대학교 1학년 마친 사람이 어떻게 나보다 나이 많은 사람들의 경험을 이길 수 있을까?' 라는 걱정이 앞섰다.

 

특히, 내 경우에는 학교에서 수업시간에 진행한 "팀플"로 2번 프로젝트 해본 경험 및 동아리에서 참여한 KUCIS 프로젝트로 Malware e-mail classification 참여 해 본 것이 전부였다.

 

조금 체계적으로 진행하는 프로젝트는 동아리에서 했던 프로젝트 단 하나 뿐이었으며 더군다나 이것도 내가 적극 참여할 수 없었던 프로젝트였다.

 

그 이유는, 내가 딱 AI에 시작하자마자 신청해본 프로젝트라서 데이터 수집부터 model 생성, train까지 해 본 적이 없는 나에게는 정말 따라가고, 모델 복사해서 파라미터 수정해보는 것이 전부였었기 때문이다.

 

즉, 부스트 캠프에 참여하기 전에 실질적으로 체계적인 프로젝트에 참여해 본 경험은 0에 가까웠다.

 

그렇기에 P Stage가 가장 걱정되었던 것.

 

물론, U Stage가 어렵지 않은 것은 아니었다. 정말 어려웠고, 나에게 첫 AI 교육이기 때문에 나의 것으로 만들고 싶은 내용들을 최대한 만들어보려 했고, 정말 빡셌다.

 

하지만, P Stage를 시작하면서 처음 부딪힌 난관이 "배운 내용을 바탕으로 코드를 어떻게 짜는가?" 였다.

 

U Stage에서 이론을 5주? 6주?간 배우고, 과제로 코드에 빈칸을 채우거나 몇 몇 줄을 짜보는 것 정도는 나왔었지만 (이마저도 나는 매우 매우 매우 힘들어했고, 70% 확률로 스스로 문제를 해결하지 못했었다;;) EDA부터 베이스 라인 코드 작성까지 나는 아무것도 할 수 없었다.

 

이 점이 너무 너무 힘들었다.

 

U Stage를 거쳐가면서 배운 이론과 과제들을 바탕으로 P Stage에서는 내가 어느정도 코드를 조금 다룰 수 있게 되지 않을까 내심 기대했었는데 한 순간에 꽈당했다. (물론, 말도 안되는 생각이긴 하다. 수학으로 따지면 미적분 이론 배우고 바로 수능 29번, 30번 문제 푸는 꼴이니까..)

 

문제는, 다 같이 힘들어 하면 모를까... 부스트 캠프 내에서 정말 날아다니는 캠퍼분들이 많이 존재했다.

 

내가 현재 가지고 싶은 모습들이 다른 많은 캠퍼분들은 가지고 있었던 것.

 

물론, 보이는 캠퍼분들이 전부가 아니라 실제로 나처럼 끙끙대는 캠퍼분들도 존재하겠지만, 너무 gap 차이가 크게 나는 것 아닐까? 하는 생각이 많이 들었다.

 

실제로, 내 팀에서 (한 팀당 인원은 5명) 나를 제외한 4명은 각자가 해당 프로젝트에 기여하는 부분들이 명확하게 존재하거나 무언가 성과를 내는데, 나는 주어진 베이스 코드를 바탕으로 실험해보다가 에러 잡는 것에만 몇시간 투자하고 결국에는 에러를 못잡고 마무리되는 상황들이 존재했다.

 

더군다나 나는 서버를 연동시키는 법을 몰라 주어진 베이스 코드(py파일)을 서버의 jupyter lab에서 실행하고 수정하기 위해서 ipynb로 바꿔가며 시도한지라 다른 팀원분들의 코드를 받아오더라도 작업이 필요해 번거로웠다.

 

결국에 금요일에 idle에 서버를 연동시키고자 3시간정도 투자하였는데 항상 마지막 에러가 잡히지 않아서 멈추고 (시간을 너무 많이 소요한 것 같아) ipynb로 다시 작업을 진행하였다.

 

이러한 과정을 거치다보니 소위 "현타 왔다"라는 말처럼 내 자신에 대해 한숨이 나왔다.

 

'왜 나는 다른 캠퍼분들처럼 실험 하나 제대로 못하는가?'

 

'왜 나는 에러를 못잡고 서버도 연동을 못시켜서 이 모양 이꼴인가?'

 

'프로젝트에서 버스타기 싫어하면서 왜 버스타고 있는 꼴이 되어가는가?'

 

'level 2 팀원 분들을 구할 때는 적극적으로 했으면서 level 2에서도 민폐만 끼치고 싶은가?'

 

등등 온갖 혐오를...

 

너무 힘들었는데 또 포기하고 싶지는 않았다.

 

휴학하고자 수강신청도 안해놨었고.. 더군다나 이렇게 제대로 체계적인 교육을 어렵다고 포기하기에는 나에게 주어진 큰 기회를 내가 못잡는 것 같아서 더 한심할 것 같기 때문이었다.

 

이 시점에 내가 옳게 가기 위해서 조언이 필요한 것 같다는 생각이 들었고 변성윤 마스터님과 많은 캠퍼분들에게, 김태진 마스터님에게 질문을 올렸었다.

 

이 답변들이 나에게 하나의 큰 버팀목이 되어준 것 같다.

 

"처음에는 잘 할 수 없고 일단 나 자신을 위로 해 준다."

 

"내가 코드 작성을 못 하는 부분이 있다면 어떤 부분을 못하는지 분석해보고 그 문제점들을 하나씩 해결해 나간다."

 

"새로 배운 내용, 코드들을 노션에 정리한다."

 

"숲을 보는것보다는 나무 하나 하나를 이해하고 분석해 나아간다."

 

"조급해 하지 말고 우선 순위를 잡아 나아가자."

 

"이론만 보고 코드를 작성하는 사람은 천재다. 그것은 욕심이다." (뜨끔)

 

"원하는 이상치와 현재 상태의 간극을 좁히는 공부를 진행해라."

 

와 같은 정말 좋은 말씀들을 많이 남겨주셨다.

 

해당 내용을 바탕으로 아래 내가 해볼 공부들을 적어보았다.

 

 

아직 우선순위는 정해지지 않았다.

 

프로젝트가 한 4일정도 남아있어서 프로젝트에서 필요한 부분을 먼저 시도해 보지 않을까 생각이 든다.

 

또한, 내가 "왜" 이 코드들을 아직 작성하기 어려워 하는지가 "어떤 흐름으로 작성하고 어떤 기능들을 사용하는지 아직 잘 모르기 때문"이라고 생각해서 이 부분을 다양하고 많은 코드들을 보면서 "flow"를 읽고 한 줄 한 줄 코드가 어떤 기능을 하는지 숙지하면서 프로젝트를 통해 직접 짜보는 것으로 생각하고 있다.

 

 

내 목표는 사람 살리는 인공지능을 만드는 것이다.

 

부스트 캠프는 나의 목표를 이루기 위해 나아가는 첫 시작이 될 것이다.

 

첫 시작이 매우 중요하다고 하였는데, 정말 좋은 곳에서 시작할 수 있게 된 기회를 얻었다.

 

다른 사람들은 21살의 나이에 도전하는 것 자체가 대단하다고 하지만 나는 도전에만 멈추는 것이 아니라 성공하고 싶고 도움을 주고 싶다.

 

내가 이 공부들을 꼭 성공하고 세상에 한 획을 쓰리라!!

 

( + 개인 idle에 서버를 연동시키는 것을 오늘 드디어 성공했다. 운이 조금 작용했는데, 다른 캠퍼님이 올려주신 서버 연동법을 보고 시도를 반복하다가 server의 workspace 폴더에 내가 작성한 코드들이 올라간다는 것을 알게 되었고 CLI에서 성공적으로 실행할 수 있었다!!! 사실 CLI로 train.py를 바로 실행시켰을 때 에러가 많이 났었지만, 앞서 구글링을 통해서, 다른 캠퍼분과 같이 이야기하며 에러를 jupyter 상에서라도 해결했던 것을 메모해 둔 것이 크나큰 도움이 되었다. 역시 구글링과 같이 공부하는 것, 그리고 머리를 식히는 것은 매우 중요하다 ㅋㅋㅋ)

+ Recent posts