호돌찌의 AI 연구소
article thumbnail

 

 

이전 글에 이어서 후기를 이어나가겠습니다. 이전 글은 데이터 모양새와 대회 개요에 대한 내용이었다면, 이번 글은 문제를 푸는 방식에 대해 서술합니다. 

 

6. 문제를 푼 방식

6-1. 전처리 및 결측 처리
- 결측은 공백을 채우거나, 전부 다 채워져 있는 '과제명' 열을 채우거나 했습니다. ML 쪽과 PLM 쪽은 조금씩 다르지만 대체적으로 전처리는 숫자들은 대체하고, 영문은 소문자로 대체, 특수문자와 띄어쓰기 등은 공백으로 처리하는 수준이었습니다.

기술적인 문제를 다 풀고 한계점을 찍었을 때 10에 9는 데이터 문제였던 경험이 있는데, 여기 단계가 성능을 엎을 만한 제일 중요한 단계였을 수 있습니다. 상위권이 쓰는 방법은 거의다 비슷하기 때문에, 과거에도 이런 부분을 조정을 했을 때 등수가 막 치고 올라가면서 변별력을 주었던 기억이 있습니다.

- 아쉬웠던 점은 ML 쪽에서 유사어 같은 문제를 해결했어야 했었습니다.(한영이 혼용되거나 연구자마다 표현 단어들이 다른 경우가 있었습니다. 예를 들어서 쓰리디/3D/스리디, 캐패시터/capacitor 등) 그리고 OOV 문제들도 존재하였는데 신경을 쓰지 못했습니다. 

 

6-2. PLM 유형의 모델

- 처음 봤을 때에는 보통 한국어 PLM이 잘 통할 줄 알았는데 성능이 너무 안 나왔었습니다. KoBERT, KoElectra, KoGPT2 등등을 적용했었지만 Multi-lingual 모델인 구글 버트가 더 좋은 성능을 보여주었습니다. 여기에 대한 원인을 어체의 차이에 조금 집중을 하고 있는데, 정확한 원인을 찾지는 못했습니다. 괜히 베이스라인 모델을 이것저것 해봐야 하는 이유가 여기에 있는 것 같습니다. Multi-lingual 모델이 좋았다고 판단해서 XLM-RoBERTa도 시도를 하였습니다. 역시 예상대로 조금 성능이 올라갔었습니다.

- 사용한 Input 형태로는 과제명 뒤에 텍스트를 연결하여 사용했습니다.  '과제명 + 연구내용', '과제명 + 연구목표', '과제명 + 기대효과', '과제명 + 키워드'를 사용하였는데 기대효과는 마지막 앙상블을 했을 때 성능이 좋지 않았고 단일 모델로 사용했을 때에도 기대효과가 가장 성능이 낮았습니다. 

- 단일 모델만 쓴 것이 아니라, Fine Tuning 모델을 5-fold cv 해서 Column 별로 모델을 만들었습니다. 안 그래도 Multi-lingual 모델이라 무거운데 총모델을 칼럼 별(연구내용, 연구목표, 키워드) * 5-fold cv = 총 15개 모델을 만들었다고 생각하시면 됩니다. 

- 기타 parameter 값들이나 input 문장 길이를 조절하면서 optimal 한 값을 더 찾았어야 했는데 그러진 못했습니다. input seq length는 늘렸을 때 성능이 더 떨어졌었던 현상이 존재하였습니다.

 

6-3. Distributional Hypothesis Model

- 위의 PLM에서 사용했었던 Input 형태와 비슷하게 접근하였습니다. TextCNN, Bi-LSTM 위주로 활용했습니다. 역시 기대효과가 제일 성능이 안 좋았던 것으로 기억이 납니다. 

- 10-fold cv 실시하여 앙상블을 했지만 좋은 결과를 얻기 어려웠습니다. 일반적인 DNN류보다 성능이 떨어졌었습니다.

- 최종 앙상블을 했을 때 너무 안 좋은 영향을 주어서 튜닝도 열심히 했었지만 전부 다 손절을 해버렸습니다. 

 

 

6-4. ML Model

- 전처리는 같게 했으나, 사용한 Input 형태를 다르게 가져갔습니다. 모든 칼럼들을 연결하고 명사만을 추출하였습니다.

- 명사들을 모아서 log TF-IDF를 적용하였습니다.

- 사용한 모델은 Logistic, LGBM을 활용하였습니다.

- 시간 관계 상 LGBM에서 사용된 명사들의 Feature 수는 SelectBestK를 적용하여 15,000를 잡고 튜닝하였습니다. cv를 하지 않고, 튜닝을 한 후 모든 데이터를 다시 재학습 시켰습니다. 

- Logistic에서는 모든 명사들을 사용했을 때 성능이 제일 좋았습니다. 10-fold cv를 적용하였습니다. 

 

 

6-5. Ensemble

hard voting, soft ensemble 등 여러 가지 시도를 해봤습니다. Google BERT, XLM-RoBERTa, Logistic, LGBM 모델들의 로짓 값을 모아서 기하평균을 낸 뒤, 가장 클래스 별 확률이 높은 라벨을 최종 라벨로 선정하였습니다. 

 

 

 

7. 아쉬운 점 + 실험했던 내용

  • 제일 최초의 아이디어였던, NaN이랑 non-NaN 라벨을 먼저 나누고 계층적으로 모델을 접근하고자 하였으나 처음부터 non NaN을 잘못 예측하면 노이즈가 중첩된다고 판단하여 포기하였습니다.
  • 대회 초반에 loss를 다른 것(Self-adjusting Dice Loss, Focal Loss 등)을 써서 적용을 했을 때 성능이 좋지 않았는데 대회 막바지에 시간이 없어 적용을 해보지는 않았습니다.
  • 데이터가 상당히 imbalance 하지만 프로젝트를 해보면서 오버 샘플링해서 좋았던 기억이 없었기 때문에 따로 리샘플링 기법들을 활용하지 않았습니다. 다른 사람들이 공유한 코드들을 보니 오버샘플링하는 경우가 꽤 있었습니다.
  • NaN으로 잘못 예측한 건들에서 많이 등장하는 키워드를 분석 결과 한글&영문키워드 column에서 해당 키워드들이 많이 등장함을 확인했습니다. 해당 컬럼을 input으로 하는 모델 추가 후 성능이 향상되었습니다. 키워드가 상당히 유의미했었습니다. 
  • 경험상 BERT Classification의 경우 경험상 3~5 epoch 내에 optimal 한 loss에 수렴하였으나, 금번 모델의 경우 최소 10 epoch 이상 학습시켜야 optimal 한 loss에 수렴하였습니다.
  • 도메인을 뭔가 공부해서 활용을 하거나 외부 데이터를 응용하려고 생각만 하고 실천을 하지 않았습니다. 이 부분을 활용해서 마지막에 Rule을 적용한다거나 OOV 문제를 해결할 수 있는 key가 될 수 있었을 것 같습니다.  
  • 너무 LSTM, CNN 쪽 기술적인 부분에 집착을 했던 것이 개인적인 패착요인이라고 생각합니다. 그래서 아쉬웠고 OOV해결과 Fasttext쪽 임베딩 하는 쪽에 집중을 했었으면 달라졌을 것 같습니다.

 

8. 마무리

- 1등을 한 것이 아니기에, 이렇게 푸는 문제 해결 방식이 정답이 절대 아님을 밝힙니다. 어떻게 문제를 풀어서 좋았었다는 이야기 및 피드백을 해주면 정말 좋을 것 같습니다.

- 앞으로 프로젝트하면서 이러한 데이터를 볼 수도 있고, 문제를 푼 방식이 다른 프로젝트에 조금이나마 도움이 될 것 같아서 공유차 언급합니다. 

- 이걸 쭉 서술하다 보니, 정말 시간 핑계를 많이 댄 것 같습니다. 이런 데이터들도 많이 다뤄봤으면 경험이 쌓여서 시간을 벌었을 수 있었을 것 같습니다. 시간관리와 경험의 중요성을 한번 더 깨달은 대회였습니다.

profile

호돌찌의 AI 연구소

@hotorch's AI Labs

포스팅이 도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!