HuggingFace transformers 3.0 나왔다. 기존 2.x 쓸 때 trainer API가 애매해서 직접 루프 짜곤 했는데, 3.0부터 Trainer가 꽤 쓸만해졌음. 한국어 분류 파인튜닝 기록.
데이터
사내 상품 카테고리 분류. 한글 텍스트 3만건, 14 클래스. 클래스 불균형 심함(상위 3개가 60%).
모델
KoBERT는 직접 업데이트가 뜸해서 이번엔 bert-base-multilingual-cased로 갔다. 사이즈 이유로 실운영은 distilbert 다국어 버전도 병행.
from transformers import (
AutoTokenizer, AutoModelForSequenceClassification,
Trainer, TrainingArguments
)
tok = AutoTokenizer.from_pretrained("bert-base-multilingual-cased")
model = AutoModelForSequenceClassification.from_pretrained(
"bert-base-multilingual-cased", num_labels=14
)
args = TrainingArguments(
output_dir="out",
per_device_train_batch_size=16,
num_train_epochs=3,
learning_rate=2e-5,
warmup_ratio=0.1,
weight_decay=0.01,
evaluation_strategy="epoch",
fp16=True,
)
Trainer(model=model, args=args, train_dataset=train_ds, eval_dataset=val_ds).train()
결과
- 베이스라인(TFIDF + LR): macro F1 0.58
- mBERT fine-tune: macro F1 0.73
- Distil-mBERT: 0.70 (훨씬 가벼움, 서빙 용)
소수 클래스는 여전히 약함. focal loss 시도해봤는데 효과는 미미. 데이터 리샘플링(상위 클래스 undersampling)이 더 효과 있었다. macro F1 0.73 → 0.76.
서빙은 onnx 변환 후 CPU 추론. 한 건당 35ms 정도. 실시간 API에 붙이기엔 아슬아슬해서 비동기 큐 사용.
댓글 없음:
댓글 쓰기