koelectra-emotion-7-emotion-base (ONNX)
ํ๊ตญ์ด ๋ฌธ์ฅ์ ๊ฐ์ ์ ๋ถ๋ฅํ๋ KoELECTRA-base-v3 ํ์ธํ๋ ๋ชจ๋ธ์ ONNX ๋ณํ๋ณธ์ ๋๋ค. ๋ฌธ์ฅ 1๊ฐ๋ฅผ ์ ๋ ฅํ๋ฉด 7๊ฐ ํด๋์ค โ ๊ฐ์ 6์ข (๊ธฐ์จ, ๋ถ๋ ธ, ์์ฒ, ๋ถ์, ๋นํฉ, ์ฌํ) + ์ค๋ฆฝ(๊ฐ์ ์์) โ ์ ํ๋ฅ ์ ์ถ๋ ฅํฉ๋๋ค.
PyTorchยทtransformersยทCUDA๊ฐ ์ ํ ํ์ ์์ต๋๋ค. ๋ฐํ์ ์์กด์ฑ์ onnxruntime + tokenizers + numpy 3๊ฐ๋ฟ์ด๋ฉฐ, CPU์์ ๋ฌธ์ฅ 1๊ฐ๋น ์์ญ ms๋ก ๋์ํด GPU ์๋ ๋ฐฐํฌ ํ๊ฒฝ์ ์ ํฉํฉ๋๋ค.
- Base model: monologg/koelectra-base-v3-discriminator
- ์๋ณธ(PyTorch) ๋ชจ๋ธ: MelissaJ/koelectra-emotion-7-emotion-base
- ์ ๋ ฅ: ํ๊ตญ์ด ๋จ๋ฌธ(๋ฐํ 1๊ฐ), max_length 128 ํ ํฐ
- ๋ณํ: opset 17, fp32, ๋์ ๋ฐฐ์น/์ํ์ค ์ถ (
torch.onnx.export) - ๋ณํ ๊ฒ์ฆ: ์๋ณธ torch ๋ก์ง๊ณผ 1e-3 ์ด๋ด ์ผ์น (parity ํ ์คํธ ํต๊ณผ)
ํ์ผ ๊ตฌ์ฑ
| ํ์ผ | ์ค๋ช |
|---|---|
model.onnx |
๋ชจ๋ธ ๋ณธ์ฒด (fp32, ์ฝ 452MB) |
tokenizer.json |
HuggingFace tokenizers ํฌ๋งท ํ ํฌ๋์ด์ |
config.json |
๋ผ๋ฒจ ๋งคํ(id2label) ํฌํจ โ ๋ณ๋ ๋ผ๋ฒจ ํ์ผ ๋ถํ์ |
์ค์น
pip install onnxruntime tokenizers numpy huggingface_hub
์ฌ์ฉ๋ฒ
import json
from pathlib import Path
import numpy as np
import onnxruntime as ort
from huggingface_hub import snapshot_download
from tokenizers import Tokenizer
model_dir = Path(snapshot_download("MelissaJ/koelectra-emotion-7-emotion-base-onnx"))
tokenizer = Tokenizer.from_file(str(model_dir / "tokenizer.json"))
tokenizer.enable_truncation(128)
session = ort.InferenceSession(
str(model_dir / "model.onnx"), providers=["CPUExecutionProvider"]
)
config = json.loads((model_dir / "config.json").read_text(encoding="utf-8"))
id2label = {int(i): label for i, label in config["id2label"].items()}
def classify_emotion(text: str) -> dict[str, float]:
enc = tokenizer.encode(text)
feeds = {
"input_ids": np.array([enc.ids], dtype=np.int64),
"attention_mask": np.array([enc.attention_mask], dtype=np.int64),
"token_type_ids": np.array([enc.type_ids], dtype=np.int64),
}
logits = session.run(None, feeds)[0][0]
exp = np.exp(logits - logits.max())
probs = exp / exp.sum()
return dict(
sorted(
((id2label[i], float(p)) for i, p in enumerate(probs)),
key=lambda x: -x[1],
)
)
print(classify_emotion("์ค๋ ๋๋์ด ํฉ๊ฒฉ ์์์ ๋ค์์ด!"))
# {'๊ธฐ์จ': 0.998, ...}
์ถ๋ ฅ ์์
"์ค๋ ๋๋์ด ํฉ๊ฒฉ ์์์ ๋ค์์ด!" โ ๊ธฐ์จ 0.998
"๋ฐค๋ง๋ค ๋ฏธ๋๊ฐ ๊ฑฑ์ ๋ผ์ ์ ์ด ์ ์." โ ๋ถ์ 0.489 (2์ ์์ฒ 0.300)
"์ค๋ ํ์๋ 3์์ ์์ํฉ๋๋ค." โ ์ค๋ฆฝ 1.000
"์ ์ฌ ๋ญ ๋จน์๊น?" โ ์ค๋ฆฝ 1.000
GPU ๊ฐ์ (์ ํ)
CPU๋ง์ผ๋ก ์ถฉ๋ถํ ๋น ๋ฅด์ง๋ง, ํ์ํ๋ฉด onnxruntime-gpu ์ค์น ํ providers๋ง ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค:
session = ort.InferenceSession(
str(model_dir / "model.onnx"),
providers=["CUDAExecutionProvider", "CPUExecutionProvider"],
)
ํ์ต ๋ฐ์ดํฐ
| ํด๋์ค | ์์ค | train / val |
|---|---|---|
| ๊ฐ์ 6์ข | AI Hub ๊ฐ์ฑ๋ํ๋ง๋ญ์น (์ฌ๋๋ฌธ์ฅ1~3์ ๋ ๋ฆฝ ์ํ๋ก ์ ๊ฐ) | 144,696 / 17,910 |
| ์ค๋ฆฝ | KLUE-YNAT ๋ด์ค ์ ๋ชฉ | 12,000 / 1,500 |
| ์ค๋ฆฝ | ์ก์์ ์ฑ๋ด ๋ฐ์ดํฐ ์ผ์(label 0) ์ง๋ฌธ | 4,734 / 525 |
| ์ค๋ฆฝ | KorNLI ์ ์ ๋ฌธ (train: MultiNLI, val: XNLI dev+test) | 8,000 / 1,000 |
์ด train 169,430 / val 20,935 ๋ฌธ์ฅ. ํด๋์ค ๋ถ๊ท ํ(๊ธฐ์จ์ด ์ ์)์ weighted cross-entropy๋ก ๋ณด์ ํ์ต๋๋ค.
๋ํ ์คํ์ผ ์ฆ๊ฐ (v2, 2026-08): train/val ๊ฐ 50%์ ํธ๋ช ("โโ๋!", "โโ์,"), ๊ตฌ์ด ๊ฐํ("์์ด๊ณ , ์ง์ง!", "์ดํด," ๋ฑ), ๋ง์ค์("...")์ ๋ผ๋ฒจ ๋ถ๋ณ์ผ๋ก ์ ํด๋์ค์ ๊ท ์ผ ์ฃผ์ ํ์ต๋๋ค. v1์ ์ค๋ฆฝ ์์ค๊ฐ ์ ๋ถ ๋ด์คยท์ฑ๋ด์ฒด๋ผ "ํธ๋ช ยท๊ตฌ์ด ๊ฐํ = ์ค๋ฆฝ"์ด๋ผ๋ ๋๋ฉ์ธ ์ง๋ฆ๊ธธ์ ํ์ตํ๊ณ , ์บ๋ฆญํฐ ๋ํ์ฒด ๊ฐ์ ๋ฐํ("๋ฉ๋ฆฌ์ฌ๋! ์ ๋ง ํ๊ฐ ๋๋ค!")๊ฐ ์ค๋ฆฝ ํ๋ฅ ~1.0์ผ๋ก ํฌํ๋๋ ๋ฌธ์ ๊ฐ ์ค์ธก๋์ต๋๋ค. ๊ท ์ผ ์ฃผ์ ์ผ๋ก ์ด ์ง๋ฆ๊ธธ์ ์ฐจ๋จํ์ต๋๋ค.
ํ์ต ์ค์
- 8 epochs, batch 32, lr 3e-5, max_length 128, fp16, seed 42
- warmup 10%, weight decay 0.01, f1_macro ๊ธฐ์ค best model ์ ํ (early stopping patience 2)
์ฑ๋ฅ (val 20,935๋ฌธ์ฅ, ์คํ์ผ ์ฆ๊ฐ ์ ์ฉ ๋ถํฌ)
ONNX ๋ณํ์ ๋ฌด์์ค์ ๊ฐ๊น์ต๋๋ค(๋ก์ง ์ฐจ์ด 1e-3 ์ด๋ด, v2 ์ค์ธก ์ต๋ 4e-5). ์๋๋ ์๋ณธ ๋ชจ๋ธ ๊ธฐ์ค ์ฑ๋ฅ์ด๋ฉฐ, v2์ val์ ์ฆ๊ฐ ๋ถํฌ๋ผ v1 ์์น(acc 0.6790 / f1_macro 0.6744)์ ์ง์ ๋น๊ตํ ์ ์์ต๋๋ค.
| ์งํ | ๊ฐ |
|---|---|
| accuracy | 0.6745 |
| f1_macro | 0.6699 |
| f1_weighted | 0.6757 |
| ํด๋์ค | precision | recall | f1 |
|---|---|---|---|
| ๊ธฐ์จ | 0.8975 | 0.8610 | 0.8789 |
| ๋ถ๋ ธ | 0.6380 | 0.6045 | 0.6208 |
| ์์ฒ | 0.5208 | 0.4969 | 0.5086 |
| ๋ถ์ | 0.5749 | 0.5952 | 0.5849 |
| ๋นํฉ | 0.5271 | 0.5979 | 0.5603 |
| ์ฌํ | 0.5484 | 0.5433 | 0.5458 |
| ์ค๋ฆฝ | 0.9930 | 0.9864 | 0.9897 |
ํธ๋ช ยท๊ฐํ ํ๊ท ํ๋ก๋ธ(v1์์ ์ ๋ถ ์ค๋ฆฝ ~1.0 ํฌํ)๊ฐ v2์์ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ์ผ๋ก ๋ณต๊ท: "๋ฉ๋ฆฌ์ฌ๋! ์ ๋ง ํ๊ฐ ๋๋ค!" โ ๋ถ๋ ธ 0.79, "...์์ด๊ณ , ์ง์ง! โโ๋๋ ๋ํํ ๋งจ๋ ์ผ๋ง ์ํค์ง!" โ ๋ถ๋ ธ 0.98. ํธ๋ช ์์ธ ์ค๋ฆฝ("โโ๋, ์ค๋ ํ์๋ 3์์ ์์ํฉ๋๋ค")์ ์ค๋ฆฝ ์ ์ง.
ํ๊ณ
- ์์ฒ/์ฌํ/๋ถ์ ๊ฒฝ๊ณ๊ฐ ํ๋ฆฝ๋๋ค. ๊ฐ์ฑ๋ํ๋ง๋ญ์น ํน์ฑ์ ๋ผ๋ฒจ๋ฌ ๊ฐ์๋ ๊ฐ๋ฆฌ๋ ๋ถ๋ฅ๋ผ f1์ด 0.5 ์ํ์ ๋๋ค. ํ์ ์๊ณ๊ฐ(์ต์์ ํ๋ฅ 0.5 ๋ฏธ๋ง์ด๋ฉด ํ๋จ ๋ณด๋ฅ) ๋ณํ์ ๊ถ์ฅํฉ๋๋ค.
- ๋ฐ๋ง ๊ตฌ์ด ํ์๋ฌธ ์ค๋ฆฝ("๋ถ์ฐ๊น์ง ์ธ ์๊ฐ ๊ฑธ๋ ค")์ ๊ฐ์ (์ฃผ๋ก ๊ธฐ์จ)์ผ๋ก ์ค๋ถ๋ฅ๋ ์ ์์ต๋๋ค. ๊ฐ์ ํ์ต ๋ฐ์ดํฐ๊ฐ ๋๋ถ๋ถ ๋ฐ๋ง ๊ตฌ์ด์ฒด ๋ฐํ๋ผ์ ์๊ธด ํธํฅ์ ๋๋ค. ๋ด์คํ ๋ฌธ์ฅ, ์ผ์ ์ง๋ฌธ, ๊ฒฝ์ด์ฒด/๋ฌธ์ด์ฒด ํ์๋ฌธ ์ค๋ฆฝ์ ์ ์กํ๋๋ค.
- ๋จ๋ฌธ(๋ฐํ 1๊ฐ) ๊ธฐ์ค์ผ๋ก ํ์ต๋์ด, ๊ธด ๋ฌธ๋จ๋ณด๋ค ๋ฌธ์ฅ ๋จ์ ์ ๋ ฅ์ด ํ์ต ๋ถํฌ์ ๋ง์ต๋๋ค.
- Downloads last month
- 20
Model tree for MelissaJ/koelectra-emotion-7-emotion-base-onnx
Base model
monologg/koelectra-base-v3-discriminator