๋ดํ ํ์ง์ด '์๋' ๋ฉํฐ๋ชจ๋ฌ ๋ถ๋ฅ๊ธฐ (ver2)
ํ๊ตญ์ด ๋ดํ ํ์ง์ด '์๋' ๊ฐ ๋ฐํ์์ ์ด๋ค ํ์ฉ ๊ธฐ๋ฅ์ผ๋ก ์ฐ์๋์ง 7๊ฐ์ง๋ก ๋ถ๋ฅํฉ๋๋ค. ๋ฌธ์ฅ(ํ ์คํธ)๊ณผ ๋งํฌ(์์ฑ)๋ฅผ ํจ๊ป ์ ๋ ฅ๋ฐ๋ ๋ฉํฐ๋ชจ๋ฌ ๋ถ๋ฅ๊ธฐ์ ๋๋ค.
- ํ
์คํธ ์ธ์ฝ๋:
klue/roberta-largeยทbeomi/KcELECTRA-base-v2022 - ์์ฑ ์ธ์ฝ๋:
microsoft/wavlm-base-plus - ๋ฐ๋ชจ: ๐ [Space ๋งํฌ๋ฅผ ์ฌ๊ธฐ์ ๋ฃ์ผ์ธ์]
๋ถ๋ฅ ์ฒด๊ณ
| id | ๋ถ๋ฅ | ๋ป | ์ |
|---|---|---|---|
| 0 | ๊ฐ์กฐ/๊ฐํ ๊ธ์ | ์๊ธฐ ๋ง์ ํ์ฃผ์ด ์ธ์ | ์๋ ์ข์ ์ ๋ ๋ง์ง. |
| 1 | ๋๋/๊ฐํ | ์์ ๋ฐ์ด๋ผ ๋๋ | ์๋ ์ด๊ฒ ์ 9์ ๋ ์ผ๊น...;;; |
| 2 | ๋ฐฉ์ด/ํฉ๋ฆฌํ | ์๋ ๋น๋์ ๋ฐ์ ๋๊ธฐ๋ฉฐ ๋ณํธ | ์๋ ์๊ธฐ๋ค๋ ๊ณ ์ถฉ์ด ์์ํ ๋ฐ ๊ทธ๋ด์๋ ์์ง |
| 3 | ๋ถ์ฐ/์์ธํ | ์๋ง์ ์ค๋ช ์ ๋ง๋ถ์ | ์๋ ์ ์ค๋ ํ๊ต ๋ด๋ ค๊ฐ๋ค๊ฐ ๋ถ์ด๋นต ๋ณด์ด๊ธธ๋ |
| 4 | ๋ถ์ /๋ฐ๋ฐ | ์๋ ๋ง์ด๋ ์ํฉ์ ๋ถ์ | ์๋ ์ ์๋คํํ ๋๋ฆฌ? |
| 5 | ์ฆ๊ฐ ์์ | ๋ฐฉ๊ธ ํ ๋ง์ ๊ณง๋ฐ๋ก ๊ณ ์นจ | ํ๋ณต... ์๋ ์ค๋ ์ฌ์ธ์ |
| 6 | ํ์ ์์/์ ํ | ์ ์ด์ผ๊ธฐ๋ฅผ ๊บผ๋ด๊ฑฐ๋ ๋๋ฆผ | ์๋ ๊ทผ๋ฐ ๊ธด ์๋จธ๋ฆฌ์ ๋ชธ๋งค์ข์ผ๋ฉด ๋์ ์ธ๊ฑด๊ฐ์?? |
์ฑ๋ฅ
5-fold ๊ต์ฐจ๊ฒ์ฆ์ผ๋ก 10๊ฐ ๋ชจ๋ธ(5 fold ร 2 ํ ์คํธ ๋ฐฑ๋ณธ)์ ํ์ตํ๊ณ , ํ๋ฅ ํ๊ท ์ผ๋ก ์์๋ธํ์ต๋๋ค.
| ํ๊ฐ | ํ๋ณธ | ์ ํ๋ | macro-F1 | weighted-F1 |
|---|---|---|---|---|
| ๊ต์ฐจ๊ฒ์ฆ (out-of-fold) | 1,846 | 0.6018 | 0.5507 | 0.5956 |
| ํ ์คํธ (์์๋ธ) | 206 | 0.5825 | 0.5303 | 0.5780 |
| ํ ์คํธ (๋จ์ผ ์ต๊ณ ๋ชจ๋ธ) | 206 | โ | 0.5233 | โ |
๊ต์ฐจ๊ฒ์ฆ ์์น๊ฐ ํ๋ณธ์ด 9๋ฐฐ ๋ง์ ๋ ์์ ์ ์ ๋๋ค. ๋ฌด์์ ์ถ์ธก์ macro-F1 ์ ์ฝ 0.14 ์ ๋๋ค.
ํด๋์ค๋ณ (ํ ์คํธ 206๊ฑด, ์์๋ธ)
| ๋ถ๋ฅ | precision | recall | F1 | ํ๋ณธ |
|---|---|---|---|---|
| ๊ฐ์กฐ/๊ฐํ ๊ธ์ | 0.417 | 0.455 | 0.435 | 11 |
| ๋๋/๊ฐํ | 0.537 | 0.550 | 0.543 | 40 |
| ๋ฐฉ์ด/ํฉ๋ฆฌํ | 0.588 | 0.435 | 0.500 | 23 |
| ๋ถ์ฐ/์์ธํ | 0.333 | 0.182 | 0.235 | 11 |
| ๋ถ์ /๋ฐ๋ฐ | 0.556 | 0.682 | 0.612 | 66 |
| ์ฆ๊ฐ ์์ | 0.739 | 0.680 | 0.708 | 25 |
| ํ์ ์์/์ ํ | 0.731 | 0.633 | 0.679 | 30 |
๋ชจ๋ฌ๋ฆฌํฐ ๊ธฐ์ฌ๋ (ํ ์คํธ)
๊ฐ์ ๋ชจ๋ธ์์ ํ์ชฝ ๋ฒกํฐ๋ฅผ 0์ผ๋ก ๋ง๋ค์ด ์ธก์ ํ์ต๋๋ค.
| ์ ๋ ฅ | ์ ํ๋ | macro-F1 |
|---|---|---|
| ํ ์คํธ + ์์ฑ | 0.5825 | 0.5303 |
| ํ ์คํธ๋ง | 0.5194 | 0.4874 |
| ์์ฑ๋ง | 0.5000 | 0.3649 |
์์ฑ๋ง์ผ๋ก๋ ๋ฌด์์(0.14)๋ฅผ ํฌ๊ฒ ์๋๊ณ , ํ ์คํธ์ ์์ฑ์ ๋ํ๋ฉด macro-F1 ์ด 4.3์ ์ค๋ฆ ๋๋ค.
ํ ์คํธ ๋ฐฑ๋ณธ ๋น๊ต
| ๋ฐฑ๋ณธ | ๊ต์ฐจ๊ฒ์ฆ macro-F1 | ํ ์คํธ macro-F1 |
|---|---|---|
| klue/roberta-large (5 fold) | 0.5485 | 0.5317 |
| beomi/KcELECTRA-base-v2022 (5 fold) | 0.5337 | 0.5023 |
| ๋์ ํฉ์น 10๋ชจ๋ธ ์์๋ธ | 0.5507 | 0.5303 |
์ ์ฅ์ ํ์ผ
| ํ์ผ | ๋ด์ฉ |
|---|---|
best_model.pt |
๋จ์ผ ์ต๊ณ ๋ชจ๋ธ (fold5, klue/roberta-large ๊ธฐ๋ฐ, fp16, ์ฝ 864MB) |
config.py model.py data.py audio_utils.py inference.py |
์ถ๋ก ์ ํ์ํ ์ฝ๋ ์ ๋ถ |
use_model.py |
๋ด๋ ค๋ฐ์ ๋ฐ๋ก ๋๋ ค ๋ณด๋ ์์ |
model_config.json label_map.json |
๊ตฌ์กฐยทํ์ดํผํ๋ผ๋ฏธํฐ ์์ฝ, ๋ผ๋ฒจ ๋งคํ |
metrics.json summary.md classification_report.txt confusion_matrix.png |
์ ์ฒด ํ๊ฐ ๊ฒฐ๊ณผ |
predictions.csv |
ํ ์คํธ 206๊ฑด์ ์ํ๋ณ ์ ๋ตยท์์ธกยทํ๋ฅ |
์์๋ธ ์ ์ฒด(10๊ฐ ์ฒดํฌํฌ์ธํธ, 6.2GB)๋ฅผ ์ฌ๋ ธ๋ค๋ฉด fold*_*.pt ํ์ผ๋ ํจ๊ป ์์ต๋๋ค.
์ฌ์ฉ๋ฒ
pip install torch transformers librosa soundfile huggingface_hub
from huggingface_hub import hf_hub_download, snapshot_download
REPO = "<์ฌ์ฉ์๋ช
>/<๋ชจ๋ธ์ ์ฅ์์ด๋ฆ>"
# ์ฝ๋ + ์ฒดํฌํฌ์ธํธ ๋ด๋ ค๋ฐ๊ธฐ
snapshot_download(repo_id=REPO, local_dir="ani_model",
allow_patterns=["*.py", "*.json", "best_model.pt"])
import sys; sys.path.insert(0, "ani_model")
from inference import Predictor
p = Predictor("ani_model/best_model.pt")
# ํ
์คํธ + ์์ฑ
res = p.predict(text="์๋ ์ด๊ฒ ์ 9์ ๋ ์ผ๊น...;;;", audio="sample.wav")
print(res["label"], round(res["confidence"], 3))
# ์์ฑ ์์ด ํ
์คํธ๋ง (์์ฑ ๋ฒกํฐ๋ฅผ 0์ผ๋ก)
import numpy as np
res = p.predict(text="ํ๋ณต... ์๋ ์ค๋ ์ฌ์ธ์", audio=np.zeros(16000, dtype="float32"), drop_audio=True)
print(res["label"], res["probs"])
์์๋ธ๋ก ์ฐ๋ ค๋ฉด ์ฒดํฌํฌ์ธํธ ๊ฒฝ๋ก ๋ฆฌ์คํธ๋ฅผ ๋๊น๋๋ค. ๋ชจ๋ธ 1๊ฐ๋น ๋จ ์ฝ 1.8GB(roberta) / 0.9GB(KcELECTRA)๊ฐ ๋ญ๋๋ค.
p = Predictor(["ani_model/fold1_roberta.pt", "ani_model/fold2_roberta.pt"])
์ ๋ ฅ ํ์
text: '์๋'๊ฐ ํฌํจ๋ ํ๊ตญ์ด ๋ฌธ์ฅ. ์ต๋ 192 ํ ํฐ.audio: wav/mp3/m4a ๋ฑ ์ด๋ค ํฌ๋งทยท์ํ๋ ์ดํธ๋ ๋ฉ๋๋ค(๋ด๋ถ์์ 16kHz ๋ชจ๋ ธ๋ก ๋ณํ). ๋๋ 16kHz float32 numpy ๋ฐฐ์ด. 10์ด๋ณด๋ค ๊ธธ๋ฉด ํ ์คํธ์ '์๋' ์์น๋ฅผ ์ถ์ ํด ๊ทธ ์ฃผ๋ณ 10์ด๋ง ์๋๋ค.
๋ชจ๋ธ ๊ตฌ์กฐ
ํ
์คํธ โโบ RoBERTa/ELECTRA โโบ [CLS] โ '์๋' ํ ํฐ ํ๊ท โโบ Linear+LayerNorm 512 โโ
โโ concat โโบ Dropout โโบ Linear 512 โโบ GELU โโบ Dropout โโบ Linear 7
์์ฑ โโบ WavLM โโบ 13๊ฐ ์ธต ๊ฐ์คํฉ โโบ attention pooling โโบ Linear+LayerNorm 512 โโ
๋ฌธ์ฅ ์ ์ฒด๊ฐ ์๋๋ผ '์๋' ํ ํฐ ์์น์ ํํ์ ๋ฐ๋ก ๋ฝ์ [CLS]์ ์ด์ด ๋ถ์ด๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค. ์์ฑ ์ชฝ์ ๋ง์ง๋ง ์ธต๋ง ์ฐ์ง ์๊ณ 13๊ฐ ์ธต์ ํ์ต ๊ฐ์ค์น๋ก ํฉ์น ๋ค, ํ๋ ์๋ณ attention ์ผ๋ก ํ๋งํฉ๋๋ค.
ํ์ต ๋ฐฉ๋ฒ
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ๋ถํ | ์ธตํ 5-fold ๊ต์ฐจ๊ฒ์ฆ (1,846) + ๊ณ ์ ํ ์คํธ์ (206) |
| ์ต์ ํ | AdamW, cosine + warmup 10%, ์ธต๋ณ ํ์ต๋ฅ ๊ฐ์ 0.9 |
| ํ์ต๋ฅ | ํ ์คํธ 2e-5 / ์์ฑ 5e-5 / ํค๋ 5e-4 (์ธ์ฝ๋๋ ๋งจ ์์ธต ๊ธฐ์ค) |
| ์ ํจ ๋ฐฐ์น | 16 (2 ร ๋์ 8), bf16 ํผํฉ์ ๋ฐ๋ |
| ์ ๊ทํ | R-Drop ฮฑ=1, manifold mixup ฮฑ=0.2, modality dropout 0.15, label smoothing 0.05, weight decay 0.05 |
| ๊ธฐํ | ๊ฐ์ค์น EMA 0.99, ํด๋์ค ๊ฐ์ค(sqrt), macro-F1 ๊ธฐ์ค best ์ ํ, patience 6 |
| ์ค๋์ค | 16kHz ๋ชจ๋ ธ, '์๋' ์ถ์ ์์น ์ค์ฌ 10์ด ์ฐฝ, ๊ฒ์ธยท๋ ธ์ด์ฆยท์ฐฝ ์์น ์ฆ๊ฐ |
| ์๊ฐ | RTX 5060 Ti 16GB ์์ 10๊ฐ ๋ชจ๋ธ ์ฝ 4.9์๊ฐ |
๋ฐ์ดํฐ
- ํ๊ตญ์ด ๋๊ธยท๋ฐํ 2,052๊ฑด. ๊ตญ์ด ์ธ์ดํ ์ ๊ณต ์ฐ๊ตฌ์๊ฐ '์๋'์ ํ์ฉ ๊ธฐ๋ฅ์ ์ง์ ๋ถ๋ฅํ์ต๋๋ค.
- ๊ฐ ๋ฌธ์ฅ์ ํ ๋ช ์ ํ์๊ฐ ๋ญ๋ ํด ๋ น์ํ์ต๋๋ค(ํ๊ท 10.5์ด).
- ํด๋์ค ๋ถํฌ๊ฐ ๋ถ๊ท ํํฉ๋๋ค: ๋ถ์ /๋ฐ๋ฐ 655, ๋๋/๊ฐํ 392, ํ์ ์์/์ ํ 298, ์ฆ๊ฐ ์์ 245, ๋ฐฉ์ด/ํฉ๋ฆฌํ 236, ๋ถ์ฐ/์์ธํ 117, ๊ฐ์กฐ/๊ฐํ ๊ธ์ 109.
- ์์ฑ ์๋ณธ๊ณผ ํ ์คํธ ์๋ณธ์ ์ด ์ ์ฅ์์ ํฌํจ๋์ด ์์ง ์์ต๋๋ค. ๋ชจ๋ธ ๊ฐ์ค์น๋ง ๊ณต๊ฐํฉ๋๋ค.
ํ๊ณ
- ํ์ ์ผ๋ฐํ ๋ฏธ๊ฒ์ฆ: ์์ฑ์ด ํ ์ฌ๋์ ๋ญ๋ ์ด๋ผ ๋ค๋ฅธ ๋ชฉ์๋ฆฌยท์ค์ ๋ํ์์๋ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์์ต๋๋ค. ์ด ๋ฐ์ดํฐ๋ก๋ ์ธก์ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
- ๋ญ๋ ์ฒด: ์์ฐ ๋ฐํ๊ฐ ์๋๋ผ ํ ์คํธ๋ฅผ ๋ณด๊ณ ์ฝ์ ์์ฑ์ด๋ฏ๋ก, ์ค์ ๋ํ์ ์ด์จ๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ์์ ํด๋์ค ์ฝ์ธ: ๋ถ์ฐ/์์ธํ(F1 0.235), ๊ฐ์กฐ/๊ฐํ ๊ธ์ (0.435)์ ํ์ต ํ๋ณธ์ด ๊ฐ๊ฐ 117๊ฑด, 109๊ฑด์ผ๋ก ์ ์ต๋๋ค.
- ์ธ์ ๊ธฐ๋ฅ ํผ๋: ๋๋/๊ฐํ โ ๋ถ์ /๋ฐ๋ฐ ์ฌ์ด ํผ๋์ด ๊ฐ์ฅ ๋ง์ต๋๋ค. ์ฌ๋๋ ํ๋จ์ด ๊ฐ๋ฆฌ๋ ๊ฒฝ๊ณ๊ฐ ์์ต๋๋ค.
- ์ ๋ฐ์ดํฐ๊ฐ ์จ๋ผ์ธ ๋๊ธ์ด๋ผ ๊ณต๊ฒฉ์ ยท๋น์ํ ํํ์ด ํฌํจ๋์ด ์๊ณ , ๋ชจ๋ธ์ ๊ทธ ๋ถํฌ๋ฅผ ํ์ตํ์ต๋๋ค.
- ์ฐ๊ตฌ์ฉ ๋ชจ๋ธ์ ๋๋ค. ์์ ์ ์ด์ฉ์ด๋ ์ฌ๋์ ๋ํ ํ๋จ ๊ทผ๊ฑฐ๋ก ์ฐ์ง ๋ง์ญ์์ค.
์ธ์ฉ
@misc{ani_discourse_marker_2026,
title = {๋ดํ ํ์ง์ด '์๋' ๋ฉํฐ๋ชจ๋ฌ ๋ถ๋ฅ๊ธฐ},
author = {<์ ์ ์ด๋ฆ>},
year = {2026},
howpublished = {\url{https://huggingface.co/<์ฌ์ฉ์๋ช
>/<๋ชจ๋ธ์ ์ฅ์์ด๋ฆ>}}
}