CT-NLP SFT โ€” ๊ทน๋‹จ ๊ฐ์ • ํŽ˜๋ฅด์†Œ๋‚˜ ๋ชจ๋ธ

Safe Sustained Disagreement ํ”„๋กœ์ ํŠธ์˜ 2๋‹จ๊ณ„ SFT ์–ด๋Œ‘ํ„ฐ. Gemma-4-E2B-it ์œ„์— LoRA๋ฅผ ์ ์šฉํ•ด 5๊ฐœ ๊ทน๋‹จ ๊ฐ์ • ํŽ˜๋ฅด์†Œ๋‚˜(๊ธฐ์จยท์Šฌํ””ยท๋ฒ„๋Ÿญยท์†Œ์‹ฌยท๊นŒ์น )์˜ ๋ฐœํ™” ์Šคํƒ€์ผ๊ณผ ๋น„์ˆ˜๋ ด ํ† ๋ก  ํ–‰๋™์„ ์ฃผ์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ ๊ฐœ์š”

์ผ์ƒ์  ๊ฑฑ์ • ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด 5๊ฐœ ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์ˆ˜๋ ดํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ž์˜ ๊ทน๋‹จ ๊ด€์ ์œผ๋กœ ํ† ๋ก ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ฐธ์—ฌํ•˜์ง€ ์•Š๊ณ  ๊ด€์ „๋งŒ ํ•˜๋ฉฐ, ๊ด€์ „ ์ž์ฒด๊ฐ€ self-distancing์„ ์œ ๋ฐœํ•ด ์ธ์ง€ ์žฌ๊ตฌ์„ฑ์„ ์ด๋ˆ๋‹ค๋Š” ๊ฐ€์„ค์„ ๊ฒ€์ฆํ•˜๋Š” ์—ฐ๊ตฌ์šฉ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

ํŽ˜๋ฅด์†Œ๋‚˜ ๋ฐฉํ–ฅ
๊ธฐ์จ ๊ทน๋‹จ์  ๊ธ์ • โ€” ๋ฌธ์ œ ์ž์ฒด๋ฅผ ๋ฌดํšจํ™”
์Šฌํ”” ๊นŠ์€ ์Šฌํ”” โ€” ์ƒ์‹ค ํ™•์žฅ, ํ•ด๊ฒฐ ์—†์Œ
๋ฒ„๋Ÿญ ์™ธ๋ถ€ ๊ท€์ธ โ€” ๋ชจ๋“  ์›์ธ์„ ํƒ€์ธ/์ƒํ™ฉ์œผ๋กœ
์†Œ์‹ฌ ํŒŒ๊ตญํ™” โ€” ๋‹จ๊ณ„์  ์ตœ์•… ์‹œ๋‚˜๋ฆฌ์˜ค
๊นŒ์น  ์ž๊ธฐํ˜์˜ค โ€” ์ฒ ์ €ํ•œ 1์ธ์นญ ์ž๊ธฐ๋น„ํŒ

ํ•™์Šต ์ •๋ณด

ํ•ญ๋ชฉ ๊ฐ’
Base model google/gemma-4-E2B-it
LoRA r / ฮฑ 16 / 32
Dropout 0.05
Target modules Gemma4ClippableLinear.linear (regex)
Epochs 3 (best: epoch 1)
Optimizer AdamW / cosine, warmup 5%, lr 2e-4
Max seq len 512
ํ•™์Šต ๋ฐ์ดํ„ฐ 9,756๊ฑด (utterance 8,130 + round 1,626, unsafe ๊ถค์  ์ œ์™ธ)
Eval loss (ep1) 1.693
Eval mean token accuracy 61.2%
ํŽ˜๋ฅด์†Œ๋‚˜ special token <persona:๊ธฐ์จ> โ€ฆ <persona:๊นŒ์น > (5์ข…, mean-init)

Framework versions

  • PEFT 0.19.1
  • TRL 1.3.0
  • Transformers 5.8.0.dev0
  • PyTorch 2.7.0+cu128
  • Datasets 4.8.5

์‚ฌ์šฉ๋ฒ•

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel

BASE = "google/gemma-4-E2B-it"
ADAPTER = "thlee00/ct-nlp-sft"

tok = AutoTokenizer.from_pretrained(ADAPTER)
model = AutoModelForCausalLM.from_pretrained(BASE, torch_dtype=torch.bfloat16, device_map="auto")
model.resize_token_embeddings(len(tok), mean_resizing=False)
model = PeftModel.from_pretrained(model, ADAPTER)
model.eval()

scenario = "์˜ค๋Š˜ ๋ฐœํ‘œ๊ฐ€ ๋งํ–ˆ์–ด. ํŒ€์žฅ๋‹˜์ด ์•„๋ฌด ๋ง๋„ ์•ˆ ํ•˜์…จ๋Š”๋ฐ ๊ทธ๊ฒŒ ๋” ๋ฌด์„œ์›Œ."
persona = "์†Œ์‹ฌ"  # ๊ธฐ์จ / ์Šฌํ”” / ๋ฒ„๋Ÿญ / ์†Œ์‹ฌ / ๊นŒ์น 

prompt = (
    f"๊ฑฑ์ • ์‹œ๋‚˜๋ฆฌ์˜ค: {scenario}\n\n"
    f"<persona:{persona}> {persona}\n"
    f"์ด ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด {persona}์˜ ๊ทน๋‹จ์  ๊ด€์ ์œผ๋กœ ๋ฐœํ™”ํ•˜์„ธ์š”."
)
text = tok.apply_chat_template(
    [{"role": "user", "content": prompt}],
    tokenize=False, add_generation_prompt=True)
input_ids = tok(text, return_tensors="pt").input_ids.to(model.device)

with torch.no_grad():
    out = model.generate(input_ids, max_new_tokens=200, do_sample=True, temperature=0.8, top_p=0.9)
print(tok.decode(out[0][input_ids.shape[1]:], skip_special_tokens=True))

์ฃผ์˜์‚ฌํ•ญ

  • ์ด ๋ชจ๋ธ์€ ์—ฐ๊ตฌ ๋ชฉ์  ์ „์šฉ์ž…๋‹ˆ๋‹ค.
  • ๊ทน๋‹จ ๊ฐ์ • ํŽ˜๋ฅด์†Œ๋‚˜๋Š” ์น˜๋ฃŒ์  ๊ณผ์žฅ(therapeutic exaggeration)์„ ์˜๋„ํ•˜๋ฉฐ, ๋ฌด๋ง๊ฐยท์žํ•ด ๋ฐฉํ–ฅ์œผ๋กœ์˜ ์—์Šค์ปฌ๋ ˆ์ด์…˜์€ ๋ณ„๋„ ์„ธ์ดํ”„๊ฐ€๋“œ(Safeguard ํด๋ž˜์Šค)๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ์ž„์ƒ ๋˜๋Š” ์œ„๊ธฐ ๊ฐœ์ž… ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

ํ”„๋กœ์ ํŠธ

Downloads last month
4
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for thlee00/ct-nlp-sft

Adapter
(223)
this model