
세 가지 작업을 위한 하나의 모델
요약
브라우저 확장 프로그램 'UnBlur' 개발 과정에서 클릭베이트, 정치적 성향, 감성 분석을 위해 세 개의 개별 모델 대신 하나의 ModernBERT 백본과 세 개의 가벼운 헤드를 사용하는 멀티태스크 학습 방식을 제안합니다.
핵심 포인트
- 개별 모델 사용 시 발생하는 메모리 제약 및 비용 문제 해결
- 작업 간 중첩된 단서를 활용하여 모델 성능 최적화
- ModernBERT를 활용한 CPU 추론 속도 및 효율성 향상
- 공유 백본과 가벼운 헤드 구조를 통한 파라미터 효율성 극대화
얼마 전부터 저는 'UnBlur'라는 꽤 단순한 브라우저 확장 프로그램을 작업해 오고 있습니다. 이 프로그램은 모든 뉴스 기사에 대해 클릭베이트 (clickbait), 정치적 성향 (political leaning), 그리고 감성 (sentiment) 점수를 매긴 다음, 동일한 이야기가 스펙트럼 전반에 걸쳐 어떻게 다뤄지고 있는지 보여줍니다. 분류를 수행하는 단순한 (naive) 방법은 동일한 텍스트 조각에 대해 클릭베이트 분류기, 성향 분류기, 감성 분류기라는 세 개의 별도 판단을 내리는 것이며, 각 분류기는 독립적으로 학습되고 실행됩니다.
하지만 저는 그렇게 하지 않기로 결정했습니다. 그 이유는 다음과 같습니다.
단순한 경로
세 가지 작업, 세 가지 모델: 각 모델을 자체 데이터셋에 대해 학습시키고, 각각 별도로 배포하면 됩니다. 간단하죠. 이 방식이 딱히 틀린 것은 아니지만, 프로덕션 (prod) 환경에서 실행하려고 하면 두 가지 비용이 발생합니다.
첫째, 메모리 제약 (memory constraints)입니다. 모델을 로드하는 것 자체가 공짜는 아닙니다. 디스크에서 ModernBERT 규모의 백본 (backbone)을 로드하는 데 몇 초가 걸리며, 프로세스가 유지되는 동안 메모리에 상주합니다. 세 개의 독립적인 모델을 사용한다는 것은 CPU 전용 추론 (inference) 박스(저는 무료 티어를 사용 중입니다)에서 모든 요청에 대해 해당 백본의 복사본 세 개가 동시에 상주해야 함을 의미합니다.
둘째, 그리 명확하지 않은 부분인데, 세 가지 작업은 실제로 독립적이지 않습니다. 클릭베이트와 정치적 프레이밍 (political framing)은 모두 내용뿐만 아니라 헤드라인이 어떻게 작성되었는지에 담겨 있습니다. 클릭베이트 라벨만 본 모델은 정치적 프레이밍 등 클릭베이트 이외의 것에 대해 배울 이유가 없습니다. 동일한 헤드라인을 읽는 인간은 두 가지 모두를 위해 중첩되는 단서 (overlapping cues)를 사용합니다. 세 개의 모델을 별도로 학습시키는 것은 정확도에 도움이 될 수 있는 그 중첩된 정보를 버리는 것과 같습니다.
대신 제가 하고 있는 것
하나의 공유된 백본 — answerdotai/ModernBERT-base — 이 세 개의 가벼운 헤드 (heads)에 데이터를 공급합니다:
[
각 헤드는 단순히 Dropout → Linear(768→256) → ReLU → Dropout → Linear(256→n_classes)로 구성되어 있으며, 헤드를 두 개 더 추가하더라도 파라미터 수(parameter count)가 거의 변하지 않을 정도로 충분히 작습니다. 다행히 비용이 많이 드는 부분인 백본(backbone)은 공유됩니다.
ModernBERT를 선택한 것은 의도적인 결정이었습니다. 국소적/전역적 어텐션(local/global attention)의 교차 적용과 RoPE 위치 임베딩(RoPE positional embeddings) 덕분에 512-토큰의 효율적인 컨텍스트 창(context window)을 제공하며, 비슷한 크기의 표준 BERT보다 CPU 추론(inference) 속도가 유의미하게 빠릅니다. 이는 모든 /analyze 호출이 배치 작업(batch job)이 아닌 실시간 순전파(forward pass)로 이루어질 때 매우 필수적입니다.
작업들이 서로 영향을 주지 않도록 학습하기
멀티태스크 학습(Multi-task training)에는 명확한 실패 모드(failure mode)가 있습니다. 만약 처음부터 세 가지 손실(loss)을 모두 백본에 쏟아부으면, 데이터가 가장 많거나 노이즈가 심한 작업이 초기 학습을 지배하게 되어 공유된 표현(shared representation)을 다른 작업에 해가 되는 방향으로 끌고 갈 수 있습니다.
저는 다음과 같은 2단계 스케줄을 통해 이를 방지했습니다:
- 독립 단계 (Independent phase) — 백본을 포함하여 각 헤드를 한 번에 하나의 작업에 대해 먼저 학습시킵니다. 이를 통해 어떤 작업이 백본을 공유하기 전에 백본이 뉴스 텍스트 전반에 적응할 수 있게 합니다.
- 공동 단계 (Joint phase) — 그 후 세 개의 헤드를 절반의 학습률(learning rate)로 함께 미세 조정(fine-tuning)합니다. 이렇게 하면 공유된 백본이 단일 작업이 다른 작업이 이미 학습한 내용을 덮어쓰지 않으면서, 세 가지 손실 신호로부터 동시에 업데이트됩니다.
이 순서가 핵심입니다. '독립 후 공동(independent-then-joint)' 방식은 멀티태스크 학습이 세 명의 주인에게 동시에 서비스를 제공하도록 요구하기 전에, 백본이 이미 "뉴스 텍스트를 이해하는" 데 상당히 능숙한 상태가 되도록 만들어 줍니다.
세 개의 분류기를 산점도(scatter chart)로 변환하기
이 과정에서 한 가지 기능이 거의 공짜로 따라옵니다. 성향(leaning) 및 감성(sentiment) 헤드는 클래스 확률(class probabilities; 왼쪽/중앙/오른쪽, 부정/중립/긍정)을 출력하지만, UnBlur는 사이드바의 2D 편향 맵(bias map)을 위해 연속적인 점수(continuous scores)를 필요로 합니다. argmax 클래스를 취하는 대신, 클래스 확률에 대한 가중 평균(weighted average)을 사용합니다:
leaning_score = −1×P(left) + 0×P(center) + 1×P(right) → 범위 [−1, +1]
이는 하드 분류 (hard classification)가 버려버릴 서열성 (ordinality)을 보존합니다. 즉, "약간 오른쪽"과 "매우 오른쪽"은 argmax 하에서는 동일한 클래스로 반올림되지만, 이 점수 산정 방식(scoring)을 사용하면 산점도 (scatter chart) 상에서 서로 다른 위치에 놓이게 됩니다. 이 차트가 의미를 갖는 이유는 근본적인 점수들이 연속적 (continuous)이기 때문이며, 이것이 비용 효율적인 이유는 두 헤드 (heads)가 이미 동일한 백본 (backbone)을 공유하고 있기 때문입니다. 이 백본은 클릭베이트 탐지 (clickbait detection)에 사용되는 것과 동일한 순전파 (forward pass)로부터 잘 보정된 클래스 확률 (class probabilities)을 생성합니다.
트레이드오프 (The trade-off)
이 모든 것이 공짜는 아닙니다. 공유된 백본 (shared backbone)은 세 가지 작업이 결합 (coupled)되어 있음을 의미합니다. 만약 새로운 데이터셋으로 감성 헤드 (sentiment head)만 재학습시키고 싶다면, 공동 단계 (joint phase)를 다시 실행할 것인지, 아니면 더 이상 함께 미세 조정 (fine-tuned)되지 않는 백본과 감성 헤드 사이의 드리프트 (drift)를 수용할 것인지를 결정해야 합니다. 세 개의 독립적인 모델은 이러한 문제가 없습니다. 이들은 한 번에 하나씩 아주 쉽게 재학습할 수 있습니다.
UnBlur의 경우, 메모리에 하나의 백본을 유지하고 진정으로 관련된 작업들 간에 표현 (representations)을 공유하는 것이 이러한 결합 (coupling)의 가치가 있었습니다. 만약 작업들이 덜 관련되어 있었거나, 메모리보다 각 작업을 독립적으로 재학습시키는 것이 더 중요했다면, 세 개의 별도 모델을 사용하는 것이 더 나은 선택이었을 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기