• Flow Matching์€ ๋žœ๋คํ•œ ๋…ธ์ด์ฆˆ๋ฅผ โ€œ์กฐ๊ธˆ์”ฉ ์ด๋™โ€์‹œ์ผœ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“œ๋Š” ์ƒ์„ฑ ๋ชจ๋ธ ๊ธฐ๋ฒ•
  • ๊ฐ ์œ„์น˜์—์„œ โ€œ์–ด๋А ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€์•ผ ํ•˜๋Š”์ง€โ€ ์•Œ๋ ค์ฃผ๋Š” ํ™”์‚ดํ‘œ ์ง€๋„(์†๋„ ๋ฒกํ„ฐ ํ•„๋“œ)๋ฅผ ํ•™์Šตํ•˜๋Š” ๋ฐฉ์‹
  • ๊ทธ ํ™”์‚ดํ‘œ๋ฅผ ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ด๋™ํ•˜๋Š” ๋ฐ˜๋ณต ๊ณ„์‚ฐ(ODE ํ’€์ด) ๊ธฐ๋ฐ˜ ์ƒ์„ฑ ํ”„๋ ˆ์ž„์›Œํฌ
  • diffusion ๋Œ€๋น„ ํ›จ์”ฌ ์ ์€ ํšŸ์ˆ˜๋กœ ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ํŠน์„ฑ

ํ•ด๋‹น ๊ฐœ๋…์ด ํ•„์š”ํ•œ ์ด์œ 

  • diffusion model์€ ๋…ธ์ด์ฆˆ๋ฅผ ์ง€์šฐ๋Š” ๋ฐ ์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ๋ฒˆ ๋ฐ˜๋ณต์ด ํ•„์š”ํ•ด ๋А๋ฆฐ ์ถ”๋ก 
  • ์‹ค์‹œ๊ฐ„ TTSยท์ด๋ฏธ์ง€ ์ƒ์„ฑ์—๋Š” ๋น ๋ฅธ ์ƒ์„ฑ์ด ํ•„์ˆ˜
  • ๊ธฐ์กด normalizing flow๋Š” ๋ชจ๋ธ ๊ตฌ์กฐ์— ๊นŒ๋‹ค๋กœ์šด ์ˆ˜ํ•™ ์ œ์•ฝ(Jacobian)์„ ์š”๊ตฌํ•˜๋Š” ์„ค๊ณ„ ๋ถ€๋‹ด

ํ•œ ๋ฌธ์žฅ ๋น„์œ : โ€œํ™”์‚ดํ‘œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š” ๋‚ด๋น„๊ฒŒ์ด์…˜โ€

์ง€๋„ ์œ„ ๋ชจ๋“  ์ง€์ ๋งˆ๋‹ค โ€œ์—ฌ๊ธฐ์„œ๋Š” ์ด ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋ผโ€๋Š” ํ™”์‚ดํ‘œ๊ฐ€ ๊ทธ๋ ค์ ธ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•˜์ž. ์ถœ๋ฐœ์ ์— ์„œ์„œ ํ™”์‚ดํ‘œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€๋กœ ํ•œ ๊ฑธ์Œ ๊ฐ€๊ณ , ์ƒˆ ์œ„์น˜์˜ ํ™”์‚ดํ‘œ๋ฅผ ๋ณด๊ณ  ๋˜ ํ•œ ๊ฑธ์Œ ๊ฐ€๊ณ โ€ฆ ์ด๊ฑธ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ชฉ์ ์ง€์— ๋„์ฐฉํ•œ๋‹ค.

  • ์ถœ๋ฐœ์  = ๋žœ๋ค ๋…ธ์ด์ฆˆ (์˜๋ฏธ ์—†๋Š” ๊ฐ’)
  • ๋ชฉ์ ์ง€ = ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ (์˜ˆ: ์Œ์„ฑ์˜ ์ž ์žฌ ํ‘œํ˜„)
  • ํ™”์‚ดํ‘œ ์ง€๋„ = ๋ชจ๋ธ์ด ํ•™์Šตํ•˜๋Š” ๊ฒƒ (= ์†๋„ ๋ฒกํ„ฐ ํ•„๋“œ)
  • ๊ฑธ์–ด๊ฐ€๊ธฐ = ODE๋ฅผ ํ‘ธ๋Š” ๊ฒƒ (๊ทธ๋ƒฅ โ€œ์กฐ๊ธˆ์”ฉ ์ด๋™ ๋ฐ˜๋ณตโ€)

๊ฐ•๋ฌผ์— ๋„์šด ์ข…์ด๋ฐฐ๋ฅผ ๋– ์˜ฌ๋ ค๋„ ๋œ๋‹ค. ๊ฐ ์ง€์ ์˜ ๋ฌผ์‚ด(=ํ™”์‚ดํ‘œ)์„ ๋”ฐ๋ผ ํ˜๋Ÿฌ๊ฐ€๋‹ค ๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•˜๊ตฌ(๋ฐ์ดํ„ฐ)์— ๋„๋‹ฌํ•œ๋‹ค.

ํ•ต์‹ฌ ์šฉ์–ด 4๊ฐœ โ€” ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

์–ด๋ ค์šด ๋ง์‰ฌ์šด ๋ง๋น„์œ 
Probability path๋…ธ์ด์ฆˆ โ†’ ๋ฐ์ดํ„ฐ๋กœ ๋ชจ์–‘์ด ๋ณ€ํ•ด๊ฐ€๋Š” ์ค‘๊ฐ„ ๋‹จ๊ณ„๋“ค์• ๋‹ˆ๋ฉ”์ด์…˜ ํ”„๋ ˆ์ž„ (๋…ธ์ด์ฆˆ๊ฐ€ ์ ์  ์Œ์„ฑ์ด ๋˜๋Š” ์˜์ƒ)
Vector field (์†๋„ ๋ฒกํ„ฐ ํ•„๋“œ)โ€œ์ด ์œ„์น˜์—์„  ์ด ๋ฐฉํ–ฅยท์ด ์†๋„๋กœโ€ ํ™”์‚ดํ‘œ ์ง€๋„๋ฐ”๋žŒ์žฅ(weather map) / ๊ฐ•๋ฌผ์˜ ๋ฌผ์‚ด
ODE solverํ™”์‚ดํ‘œ ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ์ด๋™ํ•˜๋Š” ๋ฐ˜๋ณต๊ฒŒ์ž„์—์„œ ๋งค ํ”„๋ ˆ์ž„ ์บ๋ฆญํ„ฐ ์œ„์น˜ ๊ฐฑ์‹ 
Conditional Flow Matching์ •๋‹ต์„ ์•Œ ๋•Œ ํ™”์‚ดํ‘œ๋ฅผ ๊ฐ€๋ฅด์น˜๋Š” ํ•™์Šต๋ฒ•์ถœ๋ฐœโ†”๋„์ฐฉ์„ ์ง์„ ์œผ๋กœ ์ž‡๊ณ  ๋ฐฉํ–ฅ ์•Œ๋ ค์ฃผ๊ธฐ

์ฝ”๋“œ๋กœ ๋ณด๋Š” ์ƒ์„ฑ ๊ณผ์ •

์‹ค์ œ๋กœ โ€œ์ƒ์„ฑโ€์€ ๊ฒŒ์ž„ ๋ฌผ๋ฆฌ ๋ฃจํ”„(์œ„์น˜ += ์†๋„ ร— ์‹œ๊ฐ„)์™€ ๋˜‘๊ฐ™๋‹ค. CS 2ํ•™๋…„์ด๋ฉด ์ต์ˆ™ํ•œ for๋ฌธ์ด๋‹ค.

# ์ƒ์„ฑ(์ถ”๋ก ): ๋…ธ์ด์ฆˆ์—์„œ ์ถœ๋ฐœํ•ด ํ™”์‚ดํ‘œ(์†๋„)๋ฅผ ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ์ด๋™
x = random_noise()            # ์ถœ๋ฐœ์ : ์˜๋ฏธ ์—†๋Š” ๋žœ๋ค๊ฐ’
dt = 1.0 / num_steps          # ํ•œ ๋ฒˆ์— ๊ฐˆ ๊ฑฐ๋ฆฌ (์Šคํ…์ด ๋งŽ์„์ˆ˜๋ก ์ž˜๊ฒŒ ์ด๋™)
 
for t in range(num_steps):    # ์˜ˆ: 8๋ฒˆ ๋ฐ˜๋ณต
    v = model(x, t)           # "์ง€๊ธˆ ์œ„์น˜ x์—์„œ ์–ด๋””๋กœ?" โ†’ ํ•™์Šต๋œ ์†๋„(ํ™”์‚ดํ‘œ)
    x = x + v * dt            # ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ๊ฑธ์Œ ์ด๋™
 
# ๋ฐ˜๋ณต์ด ๋๋‚˜๋ฉด x๋Š” ์ง„์งœ ๋ฐ์ดํ„ฐ (์—ฌ๊ธฐ์„  ์Œ์„ฑ์˜ ์ž ์žฌ ํ‘œํ˜„)

num_steps๊ฐ€ ํด์ˆ˜๋ก ์ž˜๊ฒŒ ๋‚˜๋ˆ  ์›€์ง์—ฌ ์ •๊ตํ•ด์ง€๊ณ (ํ’ˆ์งˆโ†‘), ์ž‘์„์ˆ˜๋ก ์„ฑํผ์„ฑํผ ๊ฐ€์„œ ๋นจ๋ผ์ง„๋‹ค(์†๋„โ†‘). Supertonic์˜ total_steps(5~12)๊ฐ€ ๋ฐ”๋กœ ์ด ๊ฐ’์ด๋‹ค.

ํ•™์Šต์€ ์–ด๋–ป๊ฒŒ? โ€” โ€œ์ •๋‹ต์„ ์•Œ ๋•Œ ์ง์„ ์œผ๋กœ ๊ฐ€๋ฅด์นœ๋‹คโ€

ํ™”์‚ดํ‘œ ์ง€๋„๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊นŒ? ํ•™์Šต ๋•Œ๋Š” ์ถœ๋ฐœ์ (๋…ธ์ด์ฆˆ)๊ณผ ๋„์ฐฉ์ (์ง„์งœ ๋ฐ์ดํ„ฐ)์„ ๋‘˜ ๋‹ค ์•Œ๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‘˜์„ ์ง์„ ์œผ๋กœ ์ž‡๊ณ , โ€œ์ด ์ง์„  ๋ฐฉํ–ฅ์ด ์ •๋‹ต ์†๋„์•ผโ€๋ผ๊ณ  ๋ชจ๋ธ์—๊ฒŒ ๊ฐ€๋ฅด์นœ๋‹ค. ์ด๊ฒƒ์ด Conditional Flow Matching์ด๋‹ค.

# ํ•™์Šต: ์ •๋‹ต์„ ์•Œ๊ณ  ์žˆ์œผ๋‹ˆ ์ง์„  ๊ฒฝ๋กœ์˜ "๋ฐฉํ–ฅ"์„ ๊ฐ€๋ฅด์นœ๋‹ค
noise = random_noise()
data  = real_sample()               # ์ง„์งœ ๋ฐ์ดํ„ฐ (์ •๋‹ต)
 
t   = random(0, 1)                  # ์ง์„  ์œ„ ์ž„์˜์˜ ํ•œ ์ง€์ 
x_t = (1 - t) * noise + t * data    # ๋…ธ์ด์ฆˆ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์„ ์œผ๋กœ ๋ณด๊ฐ„
target_v = data - noise             # ์ด ์ง์„ ์˜ ๋ฐฉํ–ฅ(์†๋„) = ์ •๋‹ต ํ™”์‚ดํ‘œ
 
pred_v = model(x_t, t)              # ๋ชจ๋ธ์ด ์˜ˆ์ธกํ•œ ํ™”์‚ดํ‘œ
loss   = mse(pred_v, target_v)      # ์ •๋‹ต ํ™”์‚ดํ‘œ์— ๊ฐ€๊นŒ์›Œ์ง€๋„๋ก ํ•™์Šต

์ˆ˜๋งŽ์€ (๋…ธ์ด์ฆˆ, ๋ฐ์ดํ„ฐ) ์Œ์œผ๋กœ ์ด ํ•™์Šต์„ ๋ฐ˜๋ณตํ•˜๋ฉด, ๋ชจ๋ธ์€ โ€œ์–ด๋–ค ์œ„์น˜์—์„œ๋“  ๋ฐ์ดํ„ฐ ์ชฝ์œผ๋กœ ๊ฐ€๋Š” ํ™”์‚ดํ‘œโ€๋ฅผ ๊ทธ๋ฆด ์ค„ ์•Œ๊ฒŒ ๋œ๋‹ค. ์ƒ์„ฑํ•  ๋•Œ๋Š” ๋…ธ์ด์ฆˆ๋งŒ ์ฃผ๊ณ  ์ด ํ™”์‚ดํ‘œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.

diffusion๊ณผ ๋น„๊ต: โ€œ์•ˆ๊ฐœ ๋‚€ ๋ฏธ๋กœโ€ vs โ€œ๋ปฅ ๋šซ๋ฆฐ ๊ณ ์†๋„๋กœโ€

flowchart LR
    subgraph DIFF["Diffusion โ€” ์•ˆ๊ฐœ ๋‚€ ๋ฏธ๋กœ"]
        A1[๋…ธ์ด์ฆˆ] --> A2[ํ•œ ๋ฐœ์ง] --> A3[ํ•œ ๋ฐœ์ง] --> A4[...์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ๋ฒˆ] --> A5[๋ฐ์ดํ„ฐ]
    end
    subgraph FM["Flow Matching โ€” ๊ณ ์†๋„๋กœ"]
        B1[๋…ธ์ด์ฆˆ] --> B2[์„ฑํผ] --> B3[์„ฑํผ 5~12๋ฒˆ] --> B4[๋ฐ์ดํ„ฐ]
    end
ํ•ญ๋ชฉDiffusionFlow Matching
๊ฒฝ๋กœ๋…ธ์ด์ฆˆ๋ฅผ ๋”๋“ฌ์œผ๋ฉฐ ์กฐ๊ธˆ์”ฉ ์ œ๊ฑฐ (๊ตฌ๋ถˆ๊ตฌ๋ถˆ)๊ฑฐ์˜ ์ง์„  ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ์ด๋™
์Šคํ… ์ˆ˜์ˆ˜์‹ญ~์ˆ˜๋ฐฑ์ˆ˜~์ˆ˜์‹ญ (์ ์Œ)
์†๋„๋А๋ฆผ๋น ๋ฆ„ (์‹ค์‹œ๊ฐ„ ์ ํ•ฉ)
๋น„์œ ์•ˆ๊ฐœ ์† ํ•œ ๋ฐœ์ง์”ฉ ๊ธธ์ฐพ๊ธฐ์ง์„  ๋„๋กœ ๋ช‡ ๋ฒˆ์— ๋„์ฐฉ

Supertonic์—์„œ์˜ ์—ญํ• 

  • Supertonic์˜ text-to-latent ๋ชจ๋“ˆ์ด flow matching์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ์Œํ–ฅ ์ž ์žฌ ํ‘œํ˜„์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  • ์‚ฌ์šฉ๋ฒ•์˜ total_steps(5~12)๊ฐ€ ๋ฐ”๋กœ ์œ„ for๋ฌธ์˜ **๋ฐ˜๋ณต ํšŸ์ˆ˜(num_steps)**๋‹ค. ํด์ˆ˜๋ก ํ’ˆ์งˆโ†‘ยท์†๋„โ†“.
  • โ€œ์ ์€ ์Šคํ…์œผ๋กœ ๋น ๋ฅธ ์ƒ์„ฑโ€์ด๋ผ๋Š” ํŠน์„ฑ ๋•๋ถ„์— GPU ์—†์ด CPU๋งŒ์œผ๋กœ๋„ ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊นŒ์šด TTS๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Supertonic์€ ํ•™์Šต ๋ฐ์ดํ„ฐ์— ๋…ธ์ด์ฆˆ(๋ถ€์ •ํ™•ํ•œ ๋ผ๋ฒจ)๊ฐ€ ์žˆ์–ด๋„ ํ”๋“ค๋ฆฌ์ง€ ์•Š๋„๋ก Self-Purifying Flow Matching ๊ธฐ๋ฒ•์„ ๋”ํ–ˆ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ