2024. 11. 10. 01:22ㆍUpstage AI Lab
프로젝트 진행 기간 (10월 29일 - 11월 08일)
프로젝트 주제
주제 : 17개의 class 문서 타입 분류
목표 : 최근 기업에서 디지털, 전산화가 많이 이루어지다보니 그 초기 작업으로 이 문서가 어떤 문서인지 판별하는게 매우 중요하다. 현업에서도 문서분류 Task가 원활하도록 CV Model을 만들어보자.
학습시 사용한 데이터
- Upstage 내부 데이터셋 (비공개 원칙)
팀 개발 문화
나뿐만 아니라 다른 팀원 분도 이전 프로젝트를 진행하며 밀린 강의가 좀 있어서 각자 공부하고 최종 마지막 한 주에 모여서 개발하는 문화로 갔다. 그리고 이번엔 처음으로 팀장을 해보았다.
그렇게 어렵지는 않았다. 근데 조금 아쉬운 것은 팀장인데 좀 더 열심히 하면 어땠을까 생각해본다. 그래도 주어진 환경에서 최선을 다했고, 결과도 나쁘지 않게 나와서 감사다...
진행 과정
이미지 분석을 위해 팀 내부에서 다양한 시도들이 있었다.
근데 분석보다 먼저 중요한 것은 바로~!! EDA!!
이번 대회는 train dataset이 1600개 정도, test dataset이 약 3500개인가...? 있었다.
(정확히 기억은 안난다.. 암튼 train dataset보다 test dataset이 더 많았다)
그리고 train data는 이미지가 이상적인 이미지(문서의 글씨가 잘 보이고, 퀄리티가 좋은 매우 정직한 사진...)
But test data는 회전, cutout, 흐릿한 사진 등 조악한 퀄리티의 사진이 많았다.
즉, train data에서 데이터 증강을 통해 모델이 조악한 퀄리티에서도 문서 분류를 잘 할 수 있도록 하는 것이 주된 목표였다...
지금 와서 돌아보는 건데 여러모델 훈련시키고 성능을 비슷하게 맞추고 앙상블을 시도하는게 좋지 않았을까 싶다.
근데 우리팀이 그런 걸 시도 안한건 아니다. Vit, Efficient-Vit, Resnet등울 이용해서 문서 판별을 하려는 시도를 했다.
근데 시간 부족 이슈로 여러 모델을 실험하지는 못했다.
결국 실험하다가 최고 성능이 나오는 tf_efficientnetv2_m을 선택해서 모델 고도화를 진행했다.
앙상블은 못했다...
좀 주절주절 이야기가 길었는데 다시 EDA부터 돌아와서 보면,
class가 총 17개 class가 있었고 각 class별 데이터 분포를 보니 특정 class의 이미지 개수가 적었다.
그래서 Augmentation을 통해 class간 balance를 맞춰주었다.
하지만 그럼에도 모델이 훈련하기에는 데이터셋이 너무 작어서 oversampling과 augmentation을 통해 훈련에 필요한 데이터 셋을 확보했다.
이번 대회에서 평가 score은 f1-score이였는데 이 방법까지 적용하니 0.92-0.93 여기에서 더이상 올라가지 않았다.
이때부터는 kfold방식(k=5)을 적용해서 모델이 각 fold별로 내는 f1-score을 계산하고 평균으로 얼만큼의 성능을 내는가 파악했다.
보니까 특수한 17 class중 4개의 class의 점수가 유난히 낮았고, 왜 그런가 다시 사진을 봐보니까 4개 class다 비슷한 종류의 사진이었다.
여기서부터는 팀간 경쟁이 치열했다.
점수 끌어올리기
1. ocr시도
4개 class는 이미지 상으로 보기에 너무 비슷해서 ocr을 시도해서 문서 판별을 시도했다.
(ocr 해보려고 했지만 local환경에서 augraphy 버전에 따라 함수 명이 바뀐 이슈 등으로 새벽시간까지 갈아가면서 시도했지만 나는 못하고 팀원 분이 해주셨다는...)
0.01-0.02점 정도 점수 상승이 있었던 것 같다.
(엄청 적개 보이지만 대회에서는 엄청 큰 점수였다는...)
2. Cutout비율 수정
모델이 오분류하는 데이터들을 시각화 해봤다. 보니까 Cutout이 많이 적용된 이미지가 많아서 Cutout비율 약간 낮추고 다시 실험했는데 점수가 0.01점 정도 올라갔다.
그래서 추후에 조금더 바꿔서 진행했는데... 결과는 처음보다 낮게 나와서 빠르게 손절...
첫 시도때 가져갔던 Cutout비율 가져갔다.
나중에 발표 세션에서 보니까 Cutout비율 수정은 우리팀에만 있었다...
(이건 내가 했던 시도... 조금이나마 팀에 기여를 할 수 있었음에 감사...)
3. online augmentaion + offline augmentation 동시 사용
원래는 online augmentation만 이용해서 학습했는데 멘토링 때 강사님께서 offline augmentation을 사용하면 좋은 성능을 유지한 상태로 추가 학습이 가능하다고 하셨다. 근데 너무 offline만 사용하면 저장공간 이슈가 있기때문에 적절히 잘 사용하라고 하셨다.
대회 마감 3-4시간 남겨놓고 이 방법을 사용했다.
결과
대회 마감 5시간 전까지만 해도 우리팀은 Public 기준 5등이었다.
이런 상황에서 방금 위에 썼던 점수 끌어올리기에 나온 방법론을 적용해서 마감 2시간인가 1시간 남겨두고 1등을 했다.
사진 보면 알겠지만 다들 한 끝차이로 등수가 갈린다. Private 점수도 1등이랑 0.004 차이로 갈렸다.
나중에 발표 세션에서 알게된건데 상위권에 있는 다른 팀들은 다들 앙상블을 이용했다.
근데 우리팀만 앙상블 이용 안하고 단일 모델로 이렇게 왔다...
이번에 대회하면서 하나님 저는 제 상황에서 최선을 다하려고 합니다. 그래도 이왕하는거 좋은 결과가 있으면 좋겠네요...라고 기도했는데 앙상블 안한거 치고 엄청 좋은 결과를 받았다.
나중에 발표회 할 때 강사님이랑 피드벡 주고 받으면서 강사님께서 원기옥 모아서 쏜 것 같다고 말씀해주셨다.
각자 잘된 방법들 한 번에 모았을 때 점수 상승 되는 것도 쉽지 않은 일인데 잘 되어서 신기하다고 말씀해주시기도 했다.
troubleshooting
특정 클래스에서 f1-score불균형을 잡기 위해 focal loss를 사용했는데 CrossEntropy를 이용할 때와 별 차이가 없었다.
나중에 Cosine Annealing을 사용했는데 원래 시도했던 ReduceLRonPlateau와 큰 차이가 없었다.
(이거는 팀 내부에서 나온 troubleshooting임.)
실험 관리를 Wandb를 이용해서 하면 조금더 체계적으로 할 수 있었을 것 같은데 팀원 모두가 익숙하지 않아 사용하지 않았다...
저번 프로젝트부터 MLflow, Wandb등 사용하면 좋은게 많은데 사용 못해봐서 아쉽다...
앞으로 사용할 기회가 있으면 좀 사용해보자...
향후 방향성
시간이 있었으면 시도해보고 싶었던 것이 2 stage로 class 판별하는 모델을 해보고 싶었다.
위에서 언급한 특수 class들을 살펴보니까 이미지가 비슷한 클래스 안에서 오류가 생겼다.
대회 마감 5시간 앞두고 떠올린 아이디어라 완성하지 못했는데
efficient-net으로 17개의 class를 분류하고 오답이 높았던 특수 class에 대해서는 efficient-net이 특수 class로 분별한 사진에 한해서는 특수 class로만 훈련한 수행 새로운 모델에 넣어서 특수 class의 최종 판단을 하면 어떨까 생각을 했다.
그래서 2stage 전략으로 분류한 모델의 정확도가 높으면 2stage 모델의 결과를 신뢰하는 방향으로...
(그게 아니면 기존 efficient-net만 사용)
근데 아니나 다를까 발표회에서 비슷한 방식으로 최종 점수를 끌어올린 팀이 있었다.
(다들 생각하는게 비슷했다)
그리고 optuna를 이용해서 최적 hyperparameter도 찾고 싶었는데 시간 부족 이슈로 하지 못했다.🥲
마무리하며 + 교훈
가설을 세우고 실험을 하고, 가설이 맞으면 기분이 아주 좋다.
이번에 그런 경험을 조금이나마 할 수 있어서 좋았다.
그런데 아쉬웠던 것은 강의 진도에 집착하느라 대회를 일찍 시작하지 못한 것, 그래서 모델 앙상블을 시도하지 못한 것이 아쉽다.
대회를 진행하면 알아야할 지식은 강의에서 알려주는 지식보다 양이 적다.
이번에 우리팀에서 최고의 실력을 뽐내주셨던 팀원분도 나와 비슷하게 강의 진도가 밀렸는데 강의는 빠르게 듣고 직접 대회 코드만지면서 공부한다고 하셨다. 여기에서 좀 배울 점이 많았다.
나는 하나하나의 작동 원리를 이해하고 싶어서 가능하면 수학적 원리도 같이 이해하고, 코드도 한 줄 한 줄 뜯어보면서 이해하고 싶은데 부캠특성상 그게 어렵다.
그리고 배워도 금방 까먹는다. 그래서 팀원분이 학습하는 방법이 부트캠프에서는 최적화된 방법이 아닐까 생각을 해본다.
근데 이건 사회 나가서도 마찬가지라 생각한다. 모르는게 더 많기 때문에 빠르게 현실에 치이고 필요한 지식들 위주로 내 지식을 보강하는게 학습 속도며, 목표 달성에 더 효과적이다.
담부턴 그렇게 하자!
팀장으로서의 아쉬움
내가 먼저 다양한 방법으로 시도해보고 그랬어야 하는데 그러지 못해서 미안하고 감사할 따름이다...
진로적 방향성
그리고 이번 프로젝트 기간에 여러 특강이 있었다. AI 관련해서 진로적 방향성을 잡았는데 AI Researcher로 가고 싶다는 생각을 했다.
AI모델 자체를 연구하고 새로운 구조를 발견하는게 흥미로웠다.
나중이 되면 결국 궁극적으로 AI는 AGI의 방향성으로 갈 것이기에 MultiModal이 필수적이다.
그러면 다양하게 잘 해야 한다. NLP, CV등등(솔직히 NLP, CV 둘다 나름대로 괜찮다)
실제로 취업특강 들어보면 다들 처음부터 AI전공이라서, 특히 NLP전공이라서 LLM만들고 계신 것이 아니라 그냥 흥미 위주로 공부했다가 대회 결과도 잘 나와서 AI만들고 계신분도 계시고, ReSys하셨다가 회사에서 LLM개발하라고 해서 NLP하시는 분도 계시고... 이런 말들 들어보면 특정 도메인 지식은 살아가면서 배우며 습득하는게 맞다는 생각이 든다.
(다른 말로 골고루 관심을 가지고 열심히 하자라는 의미)
(아... 원래 대학원 생각 있다가 없어진지 얼마 안되었는데 다시 생각해봐야.. 읍읍...)
'Upstage AI Lab' 카테고리의 다른 글
LM to LLM 학습 일지 + Kaggle 연말 행사 회고 (4) | 2024.12.09 |
---|---|
NLP 경진대회 회고 (3) | 2024.12.02 |
Pytorch, DL 공부 (3) | 2024.11.09 |
MLOps Project 회고 (5) | 2024.10.12 |
MLOps 강의를 들으며 (3) | 2024.09.25 |