🌀 kf-deberta-gen

Generative Diffusion BERT - 한국어 Diffusion 기반 생성 언어 모델

GitHub Space


모델 설명

이 모델은 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}
}
Downloads last month
13
Safetensors
Model size
0.2B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for solonsophy/kf-deberta-gen

Finetuned
(2)
this model

Space using solonsophy/kf-deberta-gen 1