Ko-Edu Classifier 2k

ํ•œ๊ตญ์–ด ์‚ฌ์ „ํ•™์Šต ๋ง๋ญ‰์น˜ ํ€„๋ฆฌํ‹ฐ ํ‰๊ฐ€ ๋ชจ๋ธ

์ƒ์„ธ

๊ธฐ๋ฐ˜ ๋ชจ๋ธ: dragonkue/snowflake-arctic-embed-l-v2.0-ko

ํ•™์Šต ๋ฐ์ดํ„ฐ: werty1248/Ko-Edu-Annotation-500K ๋ฐ AI HUB ๋ฐ์ดํ„ฐ ๋“ฑ์„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ผ๋ฒจ๋ง ํ•œ 100K ๋ฐ์ดํ„ฐ(์•ฝ๊ด€์— ๋”ฐ๋ผ ๊ณต๊ฐœ X)

๋ฌธ์„œ์˜ ์•ž 512ํ† ํฐ์„ ๋„ฃ๋Š” ๊ฒƒ์ด ์†๋„ ๋ฉด์—์„œ ๊ถŒ์žฅ๋˜์ง€๋งŒ, ์ตœ๋Œ€ 2048ํ† ํฐ๊นŒ์ง€ ํ•™์Šต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ€„๋ฆฌํ‹ฐ ์˜ˆ์ธก ํ‰๊ท ๊ณผ ๋ถ„์‚ฐ์„ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜๋ฏ€๋กœ ์ผ๋ถ€ ๋ถ„์‚ฐ์ด ๋†’์€ ๋ฐ์ดํ„ฐ๋งŒ ๋” ๊ธด ๋ฌธ๋งฅ์„ ์ฃผ๊ณ  ํ‰๊ฐ€๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 512ํ† ํฐ์—์„œ test accuracy: 69.87%
  • 1,024ํ† ํฐ์—์„œ test accuracy: 72.92%
  • 2,048ํ† ํฐ์—์„œ test accuracy: 74.10%

์‚ฌ์šฉ๋ฒ•

  • ์ฒซ๋ฒˆ์งธ head: ํ€„๋ฆฌํ‹ฐ ์˜ˆ์ธก logit (mu = 4 * sigmoid(logit))
  • ๋‘๋ฒˆ์งธ head: ํ€„๋ฆฌํ‹ฐ ์˜ˆ์ธก์˜ ๋ถ„์‚ฐ logit (sigma = sqrt(e^(logit)))
  • 3-5๋ฒˆ์งธ head: [์ •์ƒ / ์•ฝ๊ฐ„์˜ ํŒŒ์‹ฑ ์˜ค๋ฅ˜ / ์‹ฌ๊ฐํ•œ ํŒŒ์‹ฑ ์˜ค๋ฅ˜] 3-class classification logit
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("werty1248/Ko-Edu-Classifier-2k")
model = AutoModelForSequenceClassification.from_pretrained("werty1248/Ko-Edu-Classifier-2k")
max_tokens = 512 # or 1024, 2048

model.eval()

text = """๋‚˜ ์•„๋Š”์‚ฌ๋žŒ ๊ฐ•๋‹ค๋‹ˆ์—˜ ๋‹ฎ์€ ์ด๋ชจ๊ฐ€ ๋‹ค์‹œ๋ณด๊ฒŒ๋˜๋Š”๊ฒŒ ๋‹ค์‹œ ๊ทธ๋•Œ์ฒ˜๋Ÿผ ์•ˆ๋‹ฎ๊ฒŒ ์—„๋งˆ๋ณด๋ฉด ๋А๊ปด์ง€๋Š”๊ฑธ์ˆ˜๋„ ์žˆ๋Š”๊ฑฐ์ž„?

์—„๋งˆ๋„?"""

text2 = """Ko-Edu-Annotation-500K
ํ•œ๊ตญ์–ด ์‚ฌ์ „ํ•™์Šต ๋ฐ์ดํ„ฐ ํ€„๋ฆฌํ‹ฐ ํ‰๊ฐ€ ๋ชจ๋ธ ํ•™์Šต ๋ฐ์ดํ„ฐ ์…‹
Annotation ์‹œ๊ฐ„ ๊ธฐ์ค€ 1x 5090์—์„œ ์•ฝ 24์‹œ๊ฐ„
๋‚ด์šฉ
quality_score: ์ตœ์ข… ์–ด๋…ธํ…Œ์ด์…˜ ์ ์ˆ˜
content_score: ํŒŒ์‹ฑ ์—๋Ÿฌ๋ฅผ ๋ฌด์‹œํ–ˆ์„ ๋•Œ ๋‚ด์šฉ์˜ ์ ์ˆ˜
critical_error: ํŒŒ์‹ฑ ์—๋Ÿฌ(ํ•ต์‹ฌ ๊ทธ๋ฆผ/ํ‘œ/์ˆ˜์‹ ๋ˆ„๋ฝ)๋กœ ์ธํ•ด ์›๋ฌธ์„ ์•Œ์•„๋ณด๊ธฐ ํž˜๋“ฆ
noncritical_error: ํŒŒ์‹ฑ ์—๋Ÿฌ(ํ‘œ๊ฐ€ plane text๋กœ ๋ณ€ํ™˜ ๋“ฑ)๊ฐ€ ์žˆ์ง€๋งŒ ์›๋ฌธ์„ ์ดํ•ดํ• ์ˆ˜๋Š” ์žˆ์Œ
Annotation Model
LilaRest/gemma-4-31B-it-NVFP4-turbo
Gemma-4-31B ๋ชจ๋ธ์— Attention๊นŒ์ง€ NVFP4๋กœ ์–‘์žํ™” ํ•œ ๋ชจ๋ธ
Solar Pro 4, Qwen 3.8 Flash Next ๋ชจ๋ธ๊ณผ ํ•จ๊ป˜ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์ •์„ฑ์  ํ‰๊ฐ€(edge case ํ™•์ธ) ๋ฐ ์ •๋Ÿ‰์  ํ‰๊ฐ€(๋™์ผ ๋ชจ๋ธ 3ํšŒ ๋ฐ˜๋ณต ํ‰๊ฐ€์˜ Spearman ์ƒ๊ด€ ๊ณ„์ˆ˜์™€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ชจ๋ธ ๊ฐ„ ํ‰๊ฐ€ ๊ฐ„ Spearman ์ƒ๊ด€ ๊ณ„์ˆ˜๊ฐ€ 0.78->0.73 ์ •๋„๋กœ ํฐ ์ฐจ์ด ์—†์Œ)๋ฅผ ๋“ค์–ด, ํ•ด๋‹น ๋ชจ๋ธ์ด ์ถฉ๋ถ„ํžˆ ๋ณ€๋ณ„๋ ฅ์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
"""

input = tokenizer([text, text2], return_tensors='pt', truncation=True, padding=True, max_length=max_tokens)
with torch.no_grad():
    output = model(**input)

mu = 4.0 * torch.sigmoid(output.logits[:, 0])
sigma = torch.sqrt(torch.exp(output.logits[:, 1].clamp(-5.0, 2.0)))

# Pass, Non-Critical, Critical
integrity_prob = torch.softmax(output.logits[:, 2:5], dim=-1)
crit_prob = integrity_prob[:, 2]

# if mu < 2.0, final_mu = mu.
# else, final_mu = (1-crit_prob) * mu + crit_prob * 2.0
final_mu = mu - crit_prob * torch.relu(mu - 2.0)

print(f"Value: {final_mu[0].item():.3f}ยฑ{sigma[0].item():.3f}")
print(f"Value: {final_mu[1].item():.3f}ยฑ{sigma[1].item():.3f}")
# ์˜ˆ์ƒ ์ถœ๋ ฅ
Value: 0.050ยฑ0.152
Value: 2.344ยฑ0.434

์„ฑ๋Šฅ

Validation (60K)

512ํ† ํฐ truncation

์ ์ˆ˜ Precision Recall F1 Support
0 87.53 75.56 81.11 6,735
1 85.79 87.25 86.52 27,932
2 68.29 71.22 69.73 14,252
3 66.76 64.30 65.51 7,830
4 72.18 74.93 73.53 3,251
ํ•ฉ๊ณ„ - macro-F1 75.28 60,000

2048ํ† ํฐ truncation

์ ์ˆ˜ Precision Recall F1 Support
0 87.63 76.39 81.63 6,735
1 86.92 88.58 87.74 27,932
2 72.43 73.95 73.18 14,252
3 71.18 67.94 69.52 7,830
4 73.30 82.01 77.41 3,251
ํ•ฉ๊ณ„ - macro-F1 77.90 60,000

Test (4,096)

512ํ† ํฐ truncation

์ ์ˆ˜ F1 Support
0 94.72 1,091
1 68.84 720
2 59.73 975
3 52.77 647
4 62.03 663
Macro-F1 67.62 4,096
์‹ค์ œ๏ผผ์˜ˆ์ธก 0 1 2 3 4
0 1005 85 0 1 0
1 18 591 109 2 0
2 7 260 597 95 3
3 1 48 215 348 41
4 0 13 116 220 321

2048ํ† ํฐ truncation

์ ์ˆ˜ F1 Support
0 95.24 1,091
1 72.93 720
2 66.84 975
3 54.64 647
4 71.37 663
Macro-F1 72.21 4,096
์‹ค์ œ๏ผผ์˜ˆ์ธก 0 1 2 3 4
0 1010 75 4 1 1
1 18 578 118 6 0
2 2 195 635 121 9
3 0 14 146 362 131
4 0 3 35 182 450

๋ถ„์‚ฐ ํ™œ์šฉ

  1. 512ํ† ํฐ truncation์œผ๋กœ 1์ฐจ ์˜ˆ์ธก
  2. 1์ฐจ ์˜ˆ์ธก์—์„œ ๋ชจ๋ธ์˜ ์˜ˆ์ธก๊ฐ’์ด ํ•˜๋‚˜์˜ ์ ์ˆ˜ ๊ตฌ๊ฐ„(0.5 ๋ฏธ๋งŒ / 0.5-1.5 / 1.5-2.5 / 2.5-3.5 / 3.5 ์ด์ƒ) ์•ˆ์— ๋“ค์–ด๊ฐˆ ํ™•๋ฅ ์ด x% ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ ์ž…๋ ฅ ํ† ํฐ ๊ธธ์ด๋ฅผ ๋Š˜๋ ค 2์ฐจ ์˜ˆ์ธก

image

์ด๋ก  ๋น„์šฉ: 512ํ† ํฐ ์˜ˆ์ธก ๋น„์šฉ์„ 1๋กœ ๋‘๊ณ , ํ† ํฐ ๊ธธ์ด๊ฐ€ n๋ฐฐ๊ฐ€ ๋˜๋ฉด ์—ฐ์‚ฐ๋Ÿ‰์ด n^2์ด ๋œ๋‹ค๋Š” ์ „์ œ ํ•˜์— ์ถ”์ •ํ•œ ์ด๋ก ์  ๋น„์šฉ

์˜ˆ๋ฅผ ๋“ค์–ด, **512 -> 1024, x = 50%**์˜ ๊ฒฝ์šฐ, 20.1% ๋ฐ์ดํ„ฐ๊ฐ€ 1์ฐจ ์˜ˆ์ธก๋งŒ์œผ๋กœ ๋ผ๋ฒจ์„ ํ™•์ •ํ•  ์ˆ˜ ์—†์–ด 1,024ํ† ํฐ ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•จ. ์˜ˆ์ƒ ๋น„์šฉ์€ 1.8๋ฐฐ๊ฐ€ ๋˜๊ณ (20.1%์— ๋Œ€ํ•ด 4๋ฐฐ ๋น„์šฉ ์ถ”๊ฐ€ ์˜ˆ์ธก), ๋Œ€์‹  ์ •ํ™•๋„๋Š” 69.87%->72.07%๋กœ ์ƒ์Šนํ•จ.

ํ•™์Šต ์ƒ์„ธ

ํ€„๋ฆฌํ‹ฐ์˜ ํ‰๊ท ๊ณผ ๋ถ„์‚ฐ์„ ํ•จ๊ป˜ ์˜ˆ์ธกํ•˜๋Š” ๋ถˆํ™•์‹ค์„ฑ ๋ชจ๋ธ๋ง + ํŒŒ์‹ฑ ์—๋Ÿฌ๋ฅผ ํŒ๋‹จํ•˜๋Š” 3-class classification

  • ํ•™์Šต ๋Œ€์ƒ: ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์˜ ๋งˆ์ง€๋ง‰ 6๋ ˆ์ด์–ด + regression head + variance head + 3-class classification head
  • ์†์‹ค ํ•จ์ˆ˜: GaussianNLLLoss(regression) + CrossEntropyLoss(classification)
  • ํ•™์Šต๋ฅ : 3e-5 for 6 layers, 3e-4 for heads
  • ๋ฐฐ์น˜ ํฌ๊ธฐ: 256
  • ํ•™์Šต ๋ฐ์ดํ„ฐ: 567,552 ๋ฌธ์„œ (540K ๋ฌธ์„œ + 4์  ๋ฐ์ดํ„ฐ upsampling)
  • epoch: 4 (8,868 steps)
  • sequence length: 512, 1024, 2048 (4:2:1 ratio)
  • ๋ฐ์ดํ„ฐ ํŠน์ด์‚ฌํ•ญ: 4์  ๋ฐ์ดํ„ฐ๋ฅผ upsampling ํ•˜์—ฌ ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ 10% ์ด์ƒ์ด ๋˜๋„๋ก ์กฐ์ •(์•ฝ 2๋ฐฐ upsampling)

1x 5090์—์„œ ์•ฝ 8์‹œ๊ฐ„(0.5 epoch๋งˆ๋‹ค validation์— ์†Œ์š”๋œ ์ด 3์‹œ๊ฐ„ ํฌํ•จ)

Downloads last month
6
Safetensors
Model size
0.6B params
Tensor type
BF16
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for werty1248/Ko-Edu-Classifier-2k

Dataset used to train werty1248/Ko-Edu-Classifier-2k