20200712

HuggingFace Transformers BERT 파인튜닝

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에 붙이기엔 아슬아슬해서 비동기 큐 사용.

댓글 없음: