metadata
language:
- ko
license: apache-2.0
library_name: transformers
tags:
- diffusion
- text-generation
- korean
- deberta
- masked-language-model
- experimental
base_model: kakaobank/kf-deberta-base
pipeline_tag: fill-mask
🌀 kf-deberta-gen
Generative Diffusion BERT - 한국어 Diffusion 기반 생성 언어 모델
모델 설명
이 모델은 kakaobank/kf-deberta-base를 기반으로 Discrete Diffusion 방식으로 chat fine-tuning을 수행한 실험적(PoC) 생성 모델입니다.
⚠️ 주의: 이 모델은 개념 검증(Proof of Concept) 단계입니다. 생성 품질이 불안정하며, 반복 생성 등의 문제가 있을 수 있습니다.
핵심 특징
| 항목 | 내용 |
|---|---|
| 기반 모델 | kakaobank/kf-deberta-base (DeBERTa-v2) |
| 학습 방식 | Masked Diffusion Language Model (MDLM) |
| Noise Schedule | Cosine |
| 생성 방식 | Iterative Denoising (Confidence-based) |
기존 MLM과의 차이점
기존 MLM: 15% 고정 마스킹 → 빈칸 채우기만 가능
Diffusion: 0~100% 연속 마스킹 → 전체 시퀀스 생성 가능
사용 방법
기본 사용
from transformers import AutoTokenizer, AutoModelForMaskedLM
tokenizer = AutoTokenizer.from_pretrained("solonsophy/kf-deberta-gen")
model = AutoModelForMaskedLM.from_pretrained("solonsophy/kf-deberta-gen")
Diffusion 생성 (Iterative Denoising)
import torch
import torch.nn.functional as F
def generate_diffusion(model, tokenizer, question, num_steps=15, max_answer_len=80):
model.eval()
device = next(model.parameters()).device
MASK_ID = tokenizer.mask_token_id
CLS_ID = tokenizer.cls_token_id
SEP_ID = tokenizer.sep_token_id
# 질문 토큰화
q_tokens = tokenizer.encode(question, add_special_tokens=False)[:100]
# 초기: [CLS] Q [SEP] [MASK]*N
input_ids = [CLS_ID] + q_tokens + [SEP_ID] + [MASK_ID] * max_answer_len
input_ids = torch.tensor([input_ids[:256]], device=device)
answer_start = len(q_tokens) + 2
# Iterative denoising
for step in range(num_steps):
with torch.no_grad():
logits = model(input_ids).logits
mask_pos = (input_ids[0, answer_start:] == MASK_ID).nonzero().squeeze(-1) + answer_start
if len(mask_pos) == 0:
break
# Confidence 기반 unmask
mask_logits = logits[0, mask_pos] / 0.8 # temperature
probs = F.softmax(mask_logits, dim=-1)
tokens = torch.multinomial(probs, 1).squeeze(-1)
conf = probs.gather(1, tokens.unsqueeze(-1)).squeeze(-1)
k = max(1, len(mask_pos) // (num_steps - step))
top_idx = conf.topk(k).indices
input_ids[0, mask_pos[top_idx]] = tokens[top_idx]
# 결과 추출
answer = input_ids[0, answer_start:]
answer = answer[(answer != MASK_ID) & (answer != tokenizer.pad_token_id)]
return tokenizer.decode(answer, skip_special_tokens=True)
# 사용 예시
answer = generate_diffusion(model, tokenizer, "인공지능이란 무엇인가요?")
print(answer)
학습 정보
Chat Fine-tuning 설정
| 파라미터 | 값 |
|---|---|
| Epochs | 3 |
| Batch Size | 64 |
| Learning Rate | 5e-5 |
| Max Length | 256 |
| Q Max Length | 100 |
| A Max Length | 153 |
| Noise Schedule | Cosine |
| Masking Ratio | 0% ~ 100% |
학습 데이터
| 데이터셋 | 라이선스 |
|---|---|
| OpenLab-NLP/tiny-singleturn-chat-ko | MIT |
| davidkim205/kollm-converations | Apache-2.0 |
| heegyu/hh-rlhf-ko | MIT |
| nlpai-lab/kullm-v2 | Apache-2.0 |
| heegyu/OIG-small-chip2-ko | Apache-2.0 |
| AIdenU/orca_dpo_data_ko | Apache-2.0 |
라이선스
이 모델은 Apache-2.0 라이선스로 배포됩니다.
기반 모델 (kakaobank/kf-deberta-base): MIT
Citation
@misc{kf-deberta-gen,
author = {Hong Seongmin},
title = {Generative Diffusion BERT: Korean Discrete Diffusion Language Model},
year = {2025},
publisher = {Hugging Face},
url = {https://huggingface.co/solonsophy/kf-deberta-gen}
}