
감정 모델이 가장 먼저 한 일은 슬픔(grief)을 완전히 무시하는 것이었다
요약
감정 분류 모델 학습 과정에서 특정 희귀 감정(슬픔)을 예측하지 못하는 문제를 지표 선택과 손실 함수 개선을 통해 해결하는 과정을 다룹니다. Micro-F1의 함정과 Macro-F1의 중요성, 그리고 비대칭 손실 함수 적용 사례를 설명합니다.
핵심 포인트
- Micro-F1은 다수 클래스에 편향되어 희귀 클래스의 실패를 숨길 수 있음
- 희귀 클래스 성능을 확인하려면 Macro-F1 지표를 반드시 확인해야 함
- 비대칭 손실(Asymmetric Loss)을 통해 모델이 희귀 클래스에 집중하도록 유도 가능
- 지도 대조 학습(Supervised Contrastive Learning)은 배치 크기 등 하드웨어 제약에 영향을 받음
내 감정 모델이 가장 먼저 한 일은 슬픔(grief)을 완전히 무시하는 것이었다
지난주에 텍스트에서 감정을 감지하는 모델을 학습시켰는데, 첫 번째 버전에는 이상한 습관이 있었습니다. 바로 "슬픔(grief)"을 단 한 번도 예측하지 않는다는 것이었습니다. "잘못 예측했다"는 뜻이 아니라 말 그대로 단 한 번도 없었습니다. 제로(Zero)였습니다. "안도(relief)\
그것이 바로 함정입니다. 모델은 서류상으로는 괜찮아 보일 수 있지만, 실제로는 카테고리의 3분의 1에서 조용히 실패하고 있을 수 있습니다.
문제를 숨기는 지표, 그리고 문제를 드러내는 지표
처음 성능을 측정했을 때, 전체 점수는 그럴싸해 보였습니다. 그것은 제가 잘못된 수치를 보고 있었기 때문입니다.
28개 클래스에 대해 성능을 평균 내는 방법에는 두 가지가 있습니다. Micro-F1 (마이크로 F1)은 모든 개별 예측을 하나로 모으는데, 이는 매우 흔한 몇 가지 감정들이 점수를 지배하게 만들고, 희귀한 감정들은 거의 기록되지 않음을 의미합니다. 모델은 슬픔(grief)에 대해서는 쓸모가 없으면서도 건강한 Micro-F1 점수를 기록할 수 있으며, 당신은 이를 전혀 알 수 없습니다.
Macro-F1 (매크로 F1)은 그 반대입니다. 각 감정을 별도로 점수화한 다음 그 점수들을 평균 내기 때문에, 슬픔은 중립(neutral)과 정확히 동일한 비중을 가집니다. 제가 Macro-F1 보고로 전환하는 순간, 실제 모습이 드러났고 그것은 처참했습니다. 제 28개 클래스 중 상당수가 0 근처에 머물러 있었습니다.
이것에서 한 가지만 얻어 가신다면: 당신이 실제로 중요하게 생각하는 것을 측정하는 지표를 선택하십시오. Micro-F1은 제가 저 자신을 속이도록 내버려 두었을 것입니다.
해결책: 모델이 희귀한 것들에 신경 쓰게 만들기
해결책은 더 큰 모델이나 더 많은 학습이 아니었습니다. 모든 실수를 동일하게 취급하는 것을 멈추도록 손실 함수 (loss function)를 변경하는 것, 구체적으로는 비대칭 손실 (Asymmetric Loss)로 바꾸는 것이었습니다.
직관은 간단합니다. 이 방식은 두 가지 일을 수행합니다. 첫째, 모델이 이미 맞히고 있는 쉽고 확신에 찬
내가 확실히 작동할 것이라 믿었지만, 실패했던 아이디어
여기가 대부분의 기술 블로그(write-ups)가 생략하는 부분입니다.
감정은 무작위로 나타나지 않습니다. 감정은 떼를 지어 이동합니다. 감사(Gratitude)는 감탄(Admiration)과 함께 나타납니다. 슬픔(Grief)은 비탄(Sadness)과 함께 나타납니다. 그래서 저는 이렇게 생각했습니다. 28개의 모든 감정을 독립적인 결정으로 취급하는 대신, 모델이 이러한 관계를 _학습(learn)_하게 만들면 어떨까? 저는 두 번째 학습 목표(supervised contrastive learning, 지도 대조 학습)를 추가하여, 동일한 감정을 공유하는 댓글들은 유사하게 표현하고, 감정을 공유하지 않는 댓글들은 다르게 표현하도록 모델을 유도했습니다.
결과는 상황을 약간 더 악화시켰습니다.
Macro-F1 점수 기준으로 극적으로 떨어지지는 않았지만, 손실을 보았습니다. 강도를 조절(tuning)해 보았지만 여전히 손실이 발생했습니다. 깊이 파고들어 본 결과, 이유는 구조적인 문제였습니다. 이 기법이 유용한 신호(signal)를 얻으려면 각 학습 배치(batch) 내에 동일한 레이블을 공유하는 예시가 많이 필요하지만, 저는 무료 GPU를 사용하느라 배치당 예시를 32개로 제한해야 했습니다. 28개의 희소한(sparse) 감정들 때문에, 대부분의 배치에는 충분한 중첩(overlap)이 없었습니다. 아이디어가 틀린 것이 아니라, 제 하드웨어가 공정한 테스트를 제공할 수 없었던 것입니다.
그럼에도 불구하고 저는 최종 보고서에 이를
다시 시작한다면 스스로에게 해줄 말
슬픔(Grief)은 6개의 예시만으로는 여전히 기본적으로 학습이 불가능합니다. 어떤 손실 함수(Loss function)로도 해결할 수 없는 문제입니다. 정직한 답변은 어떤 문제들은 모델링(Modeling)의 문제가 아니라 데이터(Data)의 문제이며, 영리함에는 한계가 있다는 것입니다.
하지만 핵심 교훈은 변하지 않았습니다. 더 화려한 모델을 찾기 전에, 현재 모델이 어떻게 실패하고 있는지 살펴보고 그 구체적인 부분을 수정해야 한다는 것입니다. 불균형(Imbalance)이 질병이었고, 화려한 대조 학습(Contrastive learning) 아이디어는 다른 질병에 대한 치료제였습니다. 지루한 손실 함수(Loss-function) 교체가 실제로 중요했던 해결책이었습니다.
모델은 살아있으니 직접 테스트해 보셔도 좋으며, 코드와 전체 결과는 GitHub에 있습니다. 복잡하고 혼합된 내용을 입력해 보세요. 감정 탐지(Emotion detection)가 흥미로워지는 지점은 바로 그곳입니다.
- 모델 및 데모 링크는 리포지토리(Repo)에 있습니다. DeBERTa-v3 + GoEmotions를 기반으로 구축되었으며, 무료 Kaggle GPU로 학습되었습니다.
https://github.com/Dev-Abdullah-17/goemotions-emotion-demo

https://goemotions-emotion-demo-cksccxfpdawgisu4esdrzu.streamlit.app/
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기