Show-o와 이산 확산(Discrete-Diffusion) 통합 모델

트랜스퓨전(Transfusion)은 연속(continuous) 표현과 이산(discrete) 표현을 섞습니다. Show-o(Xie et al., 2024년 8월)는 반대 방향으로 갑니다. 텍스트 토큰(text token)에는 인과적 다음 토큰 예측(causal next-token prediction)을 사용하고, 이미지 토큰(image token)에는 MaskGIT의 정신을 따르는 마스크 이산 확산(masked discrete diffusion)을 사용합니다. 두 가지가 하나의 트랜스포머(transformer) 안에 들어가며, 하나의 하이브리드 어텐션 마스크(hybrid attention mask)로 묶입니다. 그 결과 VQA, 텍스트-이미지 생성(text-to-image; T2I), 인페인팅(inpainting), 혼합 모달리티 생성(mixed-modality generation)을 하나의 백본(backbone), 모달리티(modality)별 토크나이저(tokenizer) 하나, 하나의 손실 정식화(loss formulation; 다음 토큰 예측을 마스크 예측으로 확장한 형태)로 통합합니다. 이 강의에서는 Show-o의 설계, 즉 마스크 이산 확산이 왜 병렬(parallel) 소수 단계(few-step) 이미지 생성기인지 살펴보고, 트랜스퓨전 및 Emu3와 대비합니다.

유형: Learn 언어: Python (표준 라이브러리, 마스크 이산 확산 샘플러) 선수 지식: Phase 12 · 13 (트랜스퓨전) 예상 시간: 약 120분

학습 목표

  • 마스크 이산 확산을 설명합니다. 토큰을 균일하게(uniform) 마스킹한 뒤 트랜스포머가 복원하도록 만드는 일정(schedule)이 무엇인지 이해합니다.
  • 병렬 이미지 디코딩(parallel image decoding; Show-o, MaskGIT)과 자기회귀 이미지 디코딩(autoregressive image decoding; Chameleon, Emu3)을 속도와 품질 관점에서 비교합니다.
  • 하나의 체크포인트(checkpoint)로 Show-o가 처리하는 세 가지 과제, 즉 T2I, VQA, 이미지 인페인팅(image inpainting)을 명확히 말할 수 있습니다.
  • 마스킹 일정(masking schedule; cosine, linear, truncated)을 고르고 샘플 품질에 미치는 영향을 추론합니다.

문제

트랜스퓨전의 두 손실(two-loss) 학습은 동작하지만 학습 동역학(dynamics)이 더 까다롭습니다. 연속 확산(continuous diffusion) 손실은 이산 다음 토큰 예측(NTP) 손실과 수치 척도(scale)가 다르기 때문입니다. 손실 가중치(loss weight)를 맞추는 일은 그 자체로 하이퍼파라미터 탐색(hyperparameter search)이 됩니다. 구조는 효과적이지만 복잡합니다.

Show-o의 답은 두 모달리티를 모두 이산으로 유지하되(Chameleon처럼), 이미지를 순차 생성하는 대신 마스크 이산 확산으로 병렬 생성하는 것입니다. 학습 목적 함수(training objective)는 다음 토큰 예측을 자연스럽게 일반화한 단일 마스크 토큰 예측(masked-token-prediction)이 됩니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.마스크 이산 확산(masked discrete diffusion)이 자기회귀 이미지 디코딩(autoregressive image decoding)에 비해 해결하는 핵심 한계는 무엇인가요?

2.Show-o가 인과적(causal) 패턴과 양방향(bidirectional) 패턴을 결합한 하이브리드 어텐션 마스크(hybrid attention mask)를 사용하는 이유는 무엇인가요?

0/2 답변 완료

개념

마스크 이산 확산(MaskGIT)

원래 Chang et al.(2022)의 MaskGIT 트릭은 우아합니다. 완전히 마스킹된 이미지에서 시작합니다. 모든 토큰이 특수한 <MASK> 식별자(id)입니다. 각 단계(step)에서 마스킹된 모든 토큰을 병렬로 예측하고, 신뢰도(confidence)가 가장 높은 상위 K개(top-K) 예측을 확정한 뒤 나머지는 다시 마스킹합니다. 약 8~16회 반복(iteration) 뒤에는 모든 토큰이 채워집니다. 한 단계에서 몇 개의 토큰을 풀어줄지(unmask) 정하는 일정은 조정 대상이며, 코사인(cosine) 일정이 잘 동작합니다.

학습은 단순합니다. [0, 1] 구간에서 마스킹 비율(masking ratio)을 균일하게 표본 추출하고, 이를 이미지의 VQ 토큰에 적용한 뒤, 트랜스포머가 마스킹된 토큰을 복원하도록 학습시킵니다. 텍스트에 대한 BERT가 했던 것과 정확히 같은 아이디어를 이미지 생성으로 확장한(scale) 형태입니다.

Show-o: 하나의 트랜스포머, 하이브리드 마스크

Show-o는 MaskGIT를 인과 언어 모델(causal language model) 트랜스포머 안에 넣습니다. 어텐션 마스크(attention mask)는 다음과 같습니다.

  • 텍스트 토큰: 인과적(causal). 표준 LLM과 같습니다.
  • 이미지 토큰: 이미지 블록 내부에서는 완전 양방향(full bidirectional). 마스킹된 토큰이 예측 중 다른 모든 이미지 토큰을 볼 수 있어야 하기 때문입니다.
  • 텍스트-이미지 결합: 텍스트는 이전 이미지를 참조하고, 이미지는 이전 텍스트를 참조합니다.

학습은 다음 사이를 오갑니다.

  1. 텍스트 시퀀스에 대한 표준 다음 토큰 예측(NTP).
  2. T2I 표본: 텍스트 → 이미지 구조에서 이미지 토큰을 마스킹하고, 마스크 토큰 예측 손실을 사용합니다.
  3. VQA 표본: 이미지 → 텍스트 구조이며, 텍스트 토큰에는 사실상 NTP를 사용합니다.

통합 손실(unified loss)은 <MASK> 토큰에 대한 교차 엔트로피(cross-entropy)입니다. 이 손실은 텍스트 NTP와 이미지 마스크 확산을 모두 포괄합니다. 텍스트 NTP는 "마지막 토큰만 마스킹된" 특수한 경우로 볼 수 있고, 이미지 마스크 확산은 무작위 부분집합(random subset)이 마스킹된 경우입니다.

병렬 샘플링(Parallel sampling)

Show-o는 이미지를 약 16단계에 생성합니다. 자기회귀(autoregressive)처럼 토큰마다 1000번 이상 순전파(forward pass)를 돌리는 대신, 확산(diffusion)처럼 약 20단계 정도를 돌립니다. 각 단계에서 마스킹된 모든 토큰을 병렬로 예측하고, 신뢰도가 높은 상위 K개를 확정(commit)한 뒤 반복합니다.

비교하면 다음과 같습니다.

  • Chameleon / Emu3(토큰에 대한 자기회귀): 이미지 한 장당 N_tokens번의 순전파가 필요합니다. 보통 1024~4096번입니다.
  • 트랜스퓨전(연속 확산): 약 20단계이며, 각 단계가 전체 트랜스포머 순전파입니다.
  • Show-o(마스크 이산 확산): 약 16단계이며, 각 단계가 전체 트랜스포머 순전파입니다.

Show-o는 비슷한 규모의 Chameleon보다 빠르며, 트랜스퓨전과 단계 수는 비슷하지만 단계당 비용이 더 낮습니다. 연속 MSE 손실 대신 이산 어휘(discrete vocab) 로짓(logit)을 다루기 때문입니다.

하나의 체크포인트가 처리하는 과제

Show-o는 프롬프트 형식(prompt format)에 따라 추론(inference)에서 네 가지 과제를 지원합니다.

  • 텍스트 생성: 표준 자기회귀 텍스트 출력.
  • VQA: 이미지 입력, 텍스트 출력.
  • T2I: 텍스트 입력, 이미지 출력. 마스크 이산 확산을 사용합니다.
  • 인페인팅(Inpainting): 일부 토큰이 마스킹된 이미지를 입력하고 빠진 부분을 채웁니다.

인페인팅 능력은 마스크 예측 학습에서 공짜로 얻어집니다. VQ 토큰 격자(grid)의 일부 영역을 마스킹하고, 나머지 토큰과 텍스트 프롬프트를 함께 넣은 뒤 마스킹된 토큰을 예측하면 됩니다.

마스킹 일정

한 단계에서 몇 개의 토큰을 풀어줄지를 정하는 일정은 품질을 좌우합니다. Show-o는 코사인 일정을 권장합니다.

mask_ratio(t) = cos(pi * t / (2 * T))   # t = 0..T

단계 0에서는 모든 토큰이 마스킹된 상태이고(비율 1.0), 단계 T에서는 아무것도 마스킹되지 않습니다. 코사인 일정은 예측이 가장 유익한 중간 범위(mid-range) 비율에 질량을 집중시킵니다. 선형(linear) 일정도 동작하지만 더 빨리 정체(plateau) 상태에 들어갑니다.

Show-o2

Show-o2(2025년 후속 연구, arXiv 2506.15564)는 Show-o를 확장한 모델입니다. 더 큰 LLM 기반, 더 나은 토크나이저, 개선된 마스크 일정을 사용합니다. 구조 패턴 자체는 동일합니다.

Show-o의 위치

2026년 분류 체계(taxonomy)에서 Show-o의 위치는 다음과 같습니다.

  • 이산 토큰 + NTP: Chameleon, Emu3. 단순하지만 추론이 느립니다.
  • 이산 토큰 + 마스크 확산: Show-o, MaskGIT, LlamaGen, Muse. 병렬 샘플링이 가능하지만, 토크나이저 때문에 여전히 손실(lossy)이 있습니다.
  • 연속 + 확산: 트랜스퓨전, MMDiT, DiT. 품질은 가장 높지만 학습이 더 복잡합니다.
  • 연속 + VLM 내 흐름 정합(flow matching in a VLM): JanusFlow, InternVL-U. 가장 최신 흐름입니다.

과제에 따라 골라야 합니다. 오픈 가중치(open-weights) 모델 하나로 T2I + 인페인팅 + VQA를 적당한 속도로 제공하고 싶다면 Show-o를 고릅니다. 품질이 최우선이고 두 손실 배관(two-loss plumbing)을 감당할 수 있다면 트랜스퓨전을 고릅니다.

사용해보기

code/main.py는 Show-o 샘플링을 모사(simulate)합니다.

  • 16개 VQ 토큰으로 이루어진 장난감(toy) 격자입니다.
  • 프롬프트와 현재 마스킹이 해제된 토큰을 기반으로 로짓을 예측하는 모의 "트랜스포머"입니다.
  • 코사인 일정을 사용하는 8단계 병렬 마스크 샘플링입니다.
  • 중간 상태(intermediate state), 즉 마스크 패턴의 변화와 최종 토큰을 출력합니다.

직접 실행해서 단계마다 마스크가 어떻게 풀리는지 확인해 보세요.

산출물 만들기

이 강의는 outputs/skill-unified-gen-model-picker.md를 만듭니다. 이해(VQA, 캡셔닝)와 생성(T2I, 인페인팅) 모두를 필요로 하고 오픈 가중치 제약이 있는 제품이 주어지면, Show-o 계열, 트랜스퓨전/MMDiT 계열, Emu3 / Chameleon 계열 중 하나를 구체적인 트레이드오프(trade-off)와 함께 고릅니다.

연습문제

  1. 쉬움: 마스크 이산 확산은 약 16단계로 표본을 생성합니다. 왜 1단계로는 안 될까요? 단계 0에서 모든 토큰을 한꺼번에 풀어주면 무엇이 깨질까요?

  2. 중간: 마스크 확산에서는 인페인팅이 공짜로 얻어집니다. Show-o의 인페인팅이 전문(specialist) 모델보다 더 나을 수 있는 제품 활용 사례를 하나 제안해 보세요.

  3. 중간: 코사인 일정과 선형 일정을 비교합니다. T=8에서 단계별로 풀린 토큰 수를 추적해 보세요. 어느 쪽이 더 균형 잡혀(balanced) 있습니까?

  4. 어려움: 512x512 Show-o 이미지는 1024 토큰입니다. 어휘 크기 K=16384이면 모델은 1024 * log2(16384) = 14,336 bits, 약 1.75 KiB의 데이터를 출력합니다. 스테이블 디퓨전(Stable Diffusion)은 51251224 bits = 6,291,456 bits, 약 768 KiB의 원본 픽셀을 출력합니다. 압축비(compression ratio)는 얼마이며, 그 대신 어떤 품질을 얻습니까?

  5. 어려움: LlamaGen(arXiv:2406.06525)을 읽어보세요. LlamaGen의 클래스 조건부 자기회귀 이미지 모델(class-conditional autoregressive image model)은 Show-o의 마스크 방식과 어떻게 다릅니까?

핵심 용어

용어흔한 설명실제 의미
마스크 이산 확산(Masked discrete diffusion)"MaskGIT 스타일"마스킹된 토큰을 예측하도록 학습시키고, 추론에서는 신뢰도가 높은 예측부터 반복적으로 마스킹을 푸는 방식입니다.
코사인 일정(Cosine schedule)"Unmask schedule"추론 단계 동안 마스크 비율이 줄어드는 방식입니다. 신뢰도 증가를 중간 범위에 집중시킵니다.
병렬 디코딩(Parallel decoding)"All tokens at once"각 단계에서 마스킹된 토큰 전체를 한 번의 순전파로 예측하고 상위 K개를 확정하는 방식입니다.
하이브리드 어텐션(Hybrid attention)"Causal + bidirectional"텍스트 토큰에는 인과적, 이미지 블록 내부에는 양방향 어텐션을 적용하는 마스크입니다.
인페인팅(Inpainting)"Fill-in generation"일부 토큰이 마스킹된 이미지를 조건으로 빠진 토큰을 예측하는 생성입니다. 학습 목적 함수에서 자연스럽게 따라 나옵니다.
확정 비율(Commitment rate)"단계당 Top-K"반복마다 완료로 선언하는 토큰 수입니다. 추론 속도와 품질의 트레이드오프를 조절합니다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

unified-gen-model-picker

Pick between Show-o / Transfusion / Emu3 / Janus-Pro families for a product that needs both multimodal understanding and generation with open weights.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.제품 팀이 T2I, 인페인팅(inpainting), VQA를 적당한 속도로 모두 처리하는 단일 오픈 가중치(open-weight) 모델을 원합니다. 어떤 아키텍처 계열이 가장 적합한가요?

2.Show-o 이미지를 1단계에서 모든 토큰을 한꺼번에 풀어주면(unmask) 무엇이 저하되고, 그 이유는 무엇인가요?

3.Show-o가 추론에서 선형 일정(linear schedule) 대신 코사인 마스킹 일정(cosine masking schedule)을 권장하는 이유는 무엇인가요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다