AI/Kaggle Writeups

Kaggle Writeup: NBME - Score Clinical Patient Notes

검정비니 2023. 10. 9. 20:15
728x90
반응형

주요 과제

2022년 2/1 ~ 5/3까지 진행되었던 대회로, 자연어 처리 기반의 대회였다.

해당 대회는 기본적으로 의료 진단 노트에 대한 피드백의 자동화를 위한 AI 모델의 학습이 주요 목적이었다.

기본적으로, 의사를 방문할 때 의사가 증상을 어떻게 해석하는지에 따라 진단이 정확한지 여부가 결정될 수 있다. 의사들은 면허를 취득할 때까지 환자의 증상, 신체 검사 결과, 가능한 진단 및 후속 치료를 기록하는 환자 메모를 작성하는 연습을 많이 해왔다. 환자 기록 작성 기술을 학습하고 평가하려면 다른 의사로부터 피드백을 받아야 하는데, 이는 시간이 많이 걸리는 과정이다.

이러한 현실적 어려움을 극복하기 위해서 자동화된 AI 기반 솔루션을 구축하기 위해서 NBME(National Board of Medical Examiners)에서 주최한 대회였다.

기본적으로 대부분의 참가자들이 deberta 모델과 roberta 모델을 사용하였는데, 나 같은 경우에는 relative positional encoding을 통해 입력 데이터의 길이로부터 비교적 자유로운 deberta 모델을 선택하였다 (deberta-v3-large).

 

평가 방식

해당 대회에서는 리더보드 평가를 위해 `micro-averaged F1 score`를 사용하였다.
해당 지표에 대해서 더 높은 점수를 얻기 위해서 대회 참여자들을 자연어 임베딩 기반의 classification 모델의 학습 문제로 접근을 하였다.

따라서, 학습에는 주로 CrossEntropy와 같은 분류 문제를 위한 loss 함수를 사용하였다.

 

라벨링 되지 않은 데이터에 대한 접근법

해당 대회의 가장 큰 특징으로는 학습을 위해 제공된 데이터 10만개 중 3만여개의 데이터만이 라벨링이 되어 있었고, 라벨링이 되지 않은 데이터가 약 7만개로 전체 데이터 중 70%가 라벨링 되지 않은 데이터였다.

이미 라벨링된 데이터의 수가 충분히 많아서 해당 데이터 만으로도 어느정도 높은 성능을 낼 수는 있었지만, unlabelled data의 수가 생각 이상으로 많았기 때문에, 고득점을 노리는 참가자들은 모두 이 데이터를 어떻게 다룰 지에 대해서 대부분의 시간을 사용하였다.

많은 고민 끝에 다음과 같은 2가지 방법들을 선택하였다.

 

1. pseudo labelling

우선, 라벨링된 3만여개의 데이터로 deberta-v3-large 모델을 5-fold로 finetuning을 시킨 뒤, 각 fold 모델들에 대해서 라벨링되지 않은 데이터들을 pseudo labelling 기법을 통해 임시 라벨을 추가하였다. 그 후에, 이 pseudo labelling된 데이터들을 추가한 대형 데이터셋으로 다시 5-fold로 deberta-v3-large 모델들을 학습시켰다.

이 때, 각 pseudo labelling된 데이터는 정확히 같은 폴드의 모델의 학습에서만 활용이 되었다. 이게 무슨 말이냐면, 0번 폴드를 validation set으로 사용하는 0번 폴드 모델이 pseudo labelling한 데이터는 0번 폴드의 모델을 재학습 시킬 때에만 사용하였다.

이러한 방법을 사용한 이유는, k-fold 학습에서 서로 다른 k-fold model의 경우 서로 다른 validation data를 사용하기 때문에 1번 폴드 모델이 pseudo labelling한 데이터를 2번 모델이나 3번 모델의 학습에 적용할 경우, 1번 모델이 2번 폴드 데이터나 3번 폴드 데이터로부터 얻은 지식이 증류된 pseudo labelled 데이터로부터 간접적으로 영향을 받기 때문에 오히려 학습된 모델이 오버피팅이 되는 문제가 발생하게 되었다.

그 후, 똑같은 방법으로 5-fold가 아닌 10-fold 기반으로 pseudo labelling 학습을 진행하였고, 이를 통해 점수를 크게 향상시킬 수 있었다.

 

2. Knowledge Distillation

deberta-v2-xlarge 모델의 경우, 크기가 큰 만큼 성능은 좋으나, inference 제한 시간인 9시간 내에 이런 큰 모델을 5-fold 이상의 많은 폴드로 inference를 진행하게 할 경우 Notebook Timeout 에러가 나게 되는 문제가 발생하였다.

따라서, deberta-v2-xlarge 모델을 finetuning 시킨 뒤, 이 모델을 teacher model로 활용해서 deberta-v3-large 모델에 대해 지식 증류(knowledge distillation)를 사용해서 성능을 끌어 올릴 수 있을지 실험을 진행해 보았다.

deberta-v2-xlarge 모델에 대해서는 pseudo labelling을 진행하기에는 시간이 너무 많이 걸려서 colab 타임아웃에 의해 학습이 중도 중단되는 문제가 있었기 때문에 오직 원래 labelling된 데이터에 대해서만 학습을 시킨 뒤, 이를 deberta-v3-large 모델에 대해 knowledge distillation을 통해 학습을 시켰다.

이 방법을 통해, micro-average f1 score를 0.87813에서 0.88758로 약간 끌어올리는데 성공하였고, 그 덕분에 최종적으로 메달권에 들 수 있었다.

 

흥미로운 접근법

 

고득점을 한 다른 참가자들의 경우 여러 흥미로운 접근법들을 사용하였는데, 그들 중 가장 흥미로운 몇가지를 공유하려 한다.

1. Focal Loss with Label Smoothing

앞서 언급하였듯, Cross Entropy를 사용해서 학습을 진행하는 것이 일반적인 접근법이었는데, 일부 고득점자들의 경우, Pseudo Labelling 학습 시 Focal Loss를 통해 불균형적인 분류 데이터에 대해서 안정적인 학습이 가능해지도록 하였고, 이를 통해서 0.01점 정도 점수 향상을 얻을 수 있었다고 언급하였다.

 

2. AWP (Adversarial Weight Perturbation)

해당 대회에서 1등을 한 참가자가 공개한 자신의 최종 점수를 가장 크게 향상 시켜준 방법은 "AWP"를 통해 적대적 학습을 진행하도록 함으로써, 점수를 크게 끌어올릴 수 있었다고 한다.

실제로, 해당 대회 이후 AWP나 FGM과 같은 적대적 학습 기반의 접근법이 자연어 처리 기반의 대회들에서 거의 필수 사항이 되었다.

 

링크: https://www.kaggle.com/competitions/feedback-prize-2021/discussion/313177

반응형