안녕하세요, 약 한 달 전에 텍스트 Diffusion 모델을 처음부터 구현해서 공개했습니다. 최근 Geeknews를 보다가 문득 생각나서 이제야 올려봅니다.


만들게 된 계기

Andrej Karpathy의 MicroGPT를 보고 "이렇게 짧은 코드로 GPT의 핵심을 설명할 수 있구나"라는 인상을 받았습니다. 마침 Diffusion도 공부하고 싶던 참이라, 둘을 합쳐서 "Diffusion을 같은 방식으로 이해할 수 있는 코드를 만들면 재밌겠다" 는 생각으로 시작한 교육용 프로젝트입니다.


AR vs Diffusion: 뭐가 다른가요?

LLM 시대의 텍스트 생성은 거의 전부 Autoregressive(AR) 방식입니다. 왼쪽에서 오른쪽으로 토큰을 하나씩 예측하는 방식이죠.

Discrete Diffusion은 반대입니다. 전체 시퀀스를 한꺼번에 놓고, 노이즈(마스킹)에서 점진적으로 복원합니다.

이름 "emma"를 예로 들면:  
  
Forward (학습 - 노이즈 추가):  
  t=0 :  e m m a   ← 원본  
  t=25:  e _ m a   ← 일부 마스킹  
  t=50:  _ _ m _   ← 더 마스킹  
  t=100: _ _ _ _   ← 완전 마스킹  
  
Reverse (생성 - 노이즈 제거):  
  t=100: _ _ _ _   ← 빈 상태로 시작  
  t=75:  _ m _ _   ← 확신 높은 위치부터 복원  
  t=50:  e m _ a  
  t=0 :  e m m a   ← 완성  

AR이 "단어를 한 글자씩 쓰는 것"이라면, Diffusion은 "십자말풀이를 푸는 것"에 가깝습니다.


구현 구조

세 가지 버전이 있어서 난이도별로 선택해서 볼 수 있습니다.

  • train_minimal.py — 2-layer MLP / NumPy만 사용 (가장 단순)
  • train_pure.py — 3-layer MLP + skip connection / NumPy만 사용
  • train.py — 4-layer Transformer / PyTorch 사용

세 버전 모두 동일한 diffusion 루프를 공유합니다. 디노이저 아키텍처만 다릅니다.
학습 데이터는 32,000개의 영어 이름, 파라미터는 170K~239K 수준입니다.

바로 실행해볼 수 있습니다:

pip install numpy  # 최소 버전  
python train_minimal.py  

피드백이나 PR 환영합니다!