Curieux.JY
  • Post
  • Note
  • Jung Yeon Lee

On this page

  • Brief Review

๐Ÿ“ƒGenerative Predictive Control ๋ฆฌ๋ทฐ

generative-model
flow-matching
predictive-control
Flow Matching Policies for Dynamic, Difficult-to-Demonstrate Tasks
Published

October 27, 2025

  • Paper Link
  • Code
  • Video
  1. ์ „๋ฌธ๊ฐ€ ๋ฐ๋ชจ ์—†์ด ์‹œ๋ฎฌ๋ ˆ์ด์…˜์œผ๋กœ ํ•™์Šต ๊ฐ€๋Šฅํ•œ ๋™์  ์ž‘์—…์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์ƒ์„ฑํ˜• ์˜ˆ์ธก ์ œ์–ด(Generative Predictive Control, GPC) ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
  2. GPC๋Š” ์ƒ˜ํ”Œ๋ง ๊ธฐ๋ฐ˜ ์˜ˆ์ธก ์ œ์–ด(Sampling-based Predictive Control, SPC)๋ฅผ ํ†ตํ•ด ๊ณ ํ’ˆ์งˆ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ํ๋ฆ„ ์ผ์น˜(flow matching) ์ •์ฑ…์„ ๊ฐ๋… ํ•™์Šต ๋ฐฉ์‹์œผ๋กœ ํ•™์Šต์‹œํ‚ต๋‹ˆ๋‹ค.
  3. GPC๋Š” warm-start๋ฅผ ํ†ตํ•ด ๋น ๋ฅธ ๋™์  ์‹œ์Šคํ…œ์—์„œ ๋†’์€ ์ฃผํŒŒ์ˆ˜์˜ ์ œ์–ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๋กœ๋ด‡ ์ž‘์—…์—์„œ SPC์™€ ์œ ์‚ฌํ•˜๊ฑฐ๋‚˜ ๋” ๋‚˜์€ ์„ฑ๋Šฅ๊ณผ ํ›ˆ๋ จ ์•ˆ์ •์„ฑ์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

Brief Review

์ด ๋…ผ๋ฌธ์€ ๋กœ๋ด‡ ๊ณตํ•™์—์„œ ๋น ๋ฅธ ๋‹ค์ด๋‚ด๋ฏน์Šค๋ฅผ ๊ฐ€์ง€์ง€๋งŒ ์ „๋ฌธ๊ฐ€ ๋ฐ๋ชจ๋ฅผ ์–ป๊ธฐ ์–ด๋ ค์šด ์ž‘์—…๋“ค์„ ์œ„ํ•ด Generative Predictive Control (GPC)์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์ง€๋„ ํ•™์Šต ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์ƒ์„ฑ ์ •์ฑ…๋“ค์€ ๋ฐ๋ชจ ๋ฐ์ดํ„ฐ์— ํฌ๊ฒŒ ์˜์กดํ•˜๊ณ  ๋А๋ฆฌ๊ฑฐ๋‚˜ ์ค€์ •์ ์ธ(quasi-static) ์ž‘์—…์— ํ•œ์ •๋˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. GPC๋Š” ์ƒ˜ํ”Œ๋ง ๊ธฐ๋ฐ˜ ์˜ˆ์ธก ์ œ์–ด(Sampling-based Predictive Control, SPC)์™€ ์ƒ์„ฑ ๋ชจ๋ธ๋ง ์‚ฌ์ด์˜ ๊นŠ์€ ์—ฐ๊ฒฐ์„ ํ™œ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋ฐฉ๋ฒ•๋ก ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. SPC์™€ ์ƒ์„ฑ ๋ชจ๋ธ๋ง์˜ ์—ฐ๊ฒฐ์„ฑ:
    • ๋…ผ๋ฌธ์€ SPC ์—…๋ฐ์ดํŠธ ๊ทœ์น™์ด ๋…ธ์ด์ฆˆ๊ฐ€ ์žˆ๋Š” ํƒ€๊ฒŸ ๋ถ„ํฌ์˜ ์Šค์ฝ”์–ด(score)์— ๋Œ€ํ•œ Monte Carlo ์ถ”์ •์น˜์ž„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํŠนํžˆ, ์ดˆ๊ธฐ ์ƒํƒœ x์— ์กฐ๊ฑดํ™”๋œ ํƒ€๊ฒŸ ๋ถ„ํฌ p(U | x) \propto g(J(U; x))๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ U๋Š” T ๊ธธ์ด์˜ ์•ก์…˜ ์‹œํ€€์Šค์ด๊ณ , J(U;x)๋Š” ๋น„์šฉ ํ•จ์ˆ˜, g(\cdot)๋Š” SPC ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณ„ ๊ฐ€์ค‘ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • ๋…ธ์ด์ฆˆ๊ฐ€ ์žˆ๋Š” ํƒ€๊ฒŸ ๋ถ„ํฌ p_\sigma(U | x) \propto E_{\tilde{U} \sim \mathcal{N}(U, \sigma^2)}[g(\tilde{U})]๋ฅผ ์ •์˜ํ•  ๋•Œ, ์ด ๋ถ„ํฌ์˜ ์Šค์ฝ”์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค: \nabla_U \log p_\sigma(U | x) = \frac{1}{\sigma^2} \frac{E_{\tilde{U} \sim \mathcal{N}(U, \sigma^2)}[g(\tilde{U})(\tilde{U} - U)]}{E_{\tilde{U} \sim \mathcal{N}(U, \sigma^2)}[g(\tilde{U})]}
    • ์ด๋Š” SPC ์—…๋ฐ์ดํŠธ \bar{U}_k = \bar{U}_{k-1} + \sum_{i=1}^N g(J^{(i)})(U^{(i)} - \bar{U}_{k-1}) / \sum_{i=1}^N g(J^{(i)})๊ฐ€ ์Šค์ฝ”์–ด ์ƒ์Šน(\bar{U}_k \leftarrow \bar{U}_{k-1} + \sigma^2 \nabla_{\bar{U}_{k-1}} \log p_\sigma(\bar{U}_{k-1} | x_{k-1}))์— ๋Œ€ํ•œ Monte Carlo ์ถ”์ •์น˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ฐ๊ฒฐ์„ ํ†ตํ•ด SPC์˜ ํ‰๊ท  ์•ก์…˜ ์‹œํ€€์Šค \bar{U}_k๋ฅผ ์ƒํƒœ x_k์— ์กฐ๊ฑดํ™”๋œ ์ตœ์  ์•ก์…˜ ๋ถ„ํฌ p(U|x_k) \propto g(J(U;x_k))์—์„œ ์ถ”์ถœ๋œ ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. GPC ํ”„๋ ˆ์ž„์›Œํฌ:
    • GPC๋Š” SPC๋ฅผ ํ†ตํ•ด ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ (\bar{U}_k, x_k)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”Œ๋กœ์šฐ ๋งค์นญ(flow matching) ๋ชจ๋ธ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒกํ„ฐ ํ•„๋“œ๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค: \dot{U} = v_\theta(U, x, t)
    • ์ด๋Š” t=0์—์„œ์˜ \mathcal{N}(0, I) ์ƒ˜ํ”Œ U_0๋ฅผ t=1์—์„œ์˜ ํƒ€๊ฒŸ ๋ถ„ํฌ p(U|x_k)๋กœ ๋ฐ€์–ด๋ƒ…๋‹ˆ๋‹ค. ํ•™์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด๋ถ€ ํ”Œ๋กœ์šฐ ๋งค์นญ ์†์‹ค์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค: \mathcal{L}_{GPC}(\theta; U_0, \bar{U}_k, x_k, t) = \left\| v_\theta(t \bar{U}_k - (1-t)U_0, x_k, t) - (\bar{U}_k - U_0) \right\|^2
    • ์—ฌ๊ธฐ์— \bar{U}_k - \bar{U}_{k-1}์™€ \bar{U}_k - U_0 ๊ฐ„์˜ ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„์— ๊ธฐ๋ฐ˜ํ•œ ๊ฐ€์ค‘์น˜ w(\bar{U}_k, \bar{U}_{k-1}, U_0)๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ›ˆ๋ จ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค.
    • GPC๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊ณผ ๋ชจ๋ธ ํ•™์Šต์˜ ์—ฌ๋Ÿฌ ์‚ฌ์ดํด์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์‚ฌ์ดํด์—์„œ ๋ถ€๋ถ„์ ์œผ๋กœ ํ›ˆ๋ จ๋œ ํ”Œ๋กœ์šฐ ๋งค์นญ ์ •์ฑ…์—์„œ ์ƒ์„ฑ๋œ ์ƒ˜ํ”Œ์€ SPC๋ฅผ ๋ถ€ํŠธ์ŠคํŠธ๋žฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์–ด, ๊ฐœ์„ ๋œ ์ƒ˜ํ”Œ๋ง ๋ถ„ํฌ์™€ ๋” ๋‚˜์€ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Algorithm 1์— ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ณ‘๋ ฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ, ๋ณ‘๋ ฌ ๋กค์•„์›ƒ, ๋ชจ๋ธ ํ›ˆ๋ จ ๋‹จ๊ณ„์—์„œ์˜ ๋ณ‘๋ ฌํ™”๋ฅผ ํ†ตํ•ด ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ›ˆ๋ จ๋œ GPC ์ •์ฑ…์˜ ํ™œ์šฉ (Warm-starts):
    • ํ›ˆ๋ จ๋œ GPC ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
      • GPC (์ง์ ‘ ๋ฐฐํฌ): ์ •์ฑ…์„ ์ง์ ‘ ๋ฐฐํฌํ•˜์—ฌ, ํŠนํžˆ warm-starts๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœํ–‰ํ•˜๋Š”(receding-horizon) ๋ฐฉ์‹์œผ๋กœ ์•ก์…˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. warm-starts๋Š” ํ”Œ๋กœ์šฐ ์ƒ์„ฑ ๊ณผ์ •์„ U_0 = (1 - \alpha)\mathcal{N}(0, I) + \alpha \bar{U}_{k-1}์—์„œ ์‹œ์ž‘ํ•˜์—ฌ, ์ด์ „ ์‹œ๊ฐ„ ๋‹จ๊ณ„์˜ ์ƒ˜ํ”Œ๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ๋•๊ณ , ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” โ€œjitteringโ€ ํ˜„์ƒ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.
      • GPC+ (๋ถ€ํŠธ์ŠคํŠธ๋žฉ): ์ •์ฑ… ์ƒ˜ํ”Œ์„ ์ผ๋ฐ˜์ ์ธ ๊ฐ€์šฐ์‹œ์•ˆ ์ œ์•ˆ ๋ถ„ํฌ์—์„œ ์˜จ ์ƒ˜ํ”Œ๊ณผ ํ•จ๊ป˜ SPC์— ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ถ”๋ก  ์‹œ ๊ณ„์‚ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. ์œ„ํ—˜ ์ธ์‹ ๋„๋ฉ”์ธ ๋ฌด์ž‘์œ„ํ™” (Risk-Aware Domain Randomization, DR):
    • ๋Œ€๊ทœ๋ชจ ๋ณ‘๋ ฌ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ SPC ๋กค์•„์›ƒ ์‹œ ์—ฌ๋Ÿฌ ๋ฌด์ž‘์œ„ ๋„๋ฉ”์ธ์—์„œ ๊ฐ ์•ก์…˜ ์‹œํ€€์Šค๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ๋น„์šฉ ๋ฐ์ดํ„ฐ J^{(i,d)}๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ‰๊ท (E_d[J^{(i,d)}]), ์ตœ์•…์˜ ๊ฒฝ์šฐ(\max_d[J^{(i,d)}]), ๋˜๋Š” ์กฐ๊ฑด๋ถ€ ์œ„ํ—˜ ๊ฐ€์น˜(CVaR)์™€ ๊ฐ™์€ ์œ„ํ—˜ ๋ฉ”ํŠธ๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง‘๊ณ„ํ•˜์—ฌ ์ •์ฑ…์˜ ๊ฒฌ๊ณ ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

์‹คํ—˜ ๊ฒฐ๊ณผ:

๋…ผ๋ฌธ์€ ์ง„์ž(inverted pendulum)๋ถ€ํ„ฐ ์ธ๊ฐ„ํ˜• ๋กœ๋ด‡(humanoid standup)์— ์ด๋ฅด๋Š” 7๊ฐ€์ง€ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด GPC๋ฅผ ํ‰๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. GPC๋Š” Multi-modal ์ถ”๋ก ์ด ํ•„์š”ํ•œ push-T ์ž‘์—…๊ณผ ๋น ๋ฅธ ๋™์—ญํ•™์ด ํ•„์š”ํ•œ double cart-pole๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ๋†’์€ ์ œ์–ด ์ฃผํŒŒ์ˆ˜์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, warm-starts๋Š” double cart-pole๊ณผ ๊ฐ™์€ ๋™์  ์‹œ์Šคํ…œ์—์„œ ๋ถ€๋“œ๋Ÿฌ์šด ๊ณ ์ฃผํŒŒ์ˆ˜ ์ œ์–ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. GPC๋Š” SPC์™€ ์œ ์‚ฌํ•˜๊ฑฐ๋‚˜ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ณด์˜€๊ณ , GPC+๋Š” ๋ชจ๋“  ์˜ˆ์‹œ์—์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค์˜ ์„ฑ๋Šฅ์„ ๋Šฅ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ›ˆ๋ จ ์•ˆ์ •์„ฑ ์ธก๋ฉด์—์„œ๋Š” ์ง€๋„ ํ•™์Šต์˜ ์žฅ์ ์„ ๋ณด์˜€๊ณ , ์œ„ํ—˜ ์ธ์‹ DR ์ „๋žต์€ ๋ชจ๋ธ ์˜ค์ฐจ๊ฐ€ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ •์ฑ…์˜ ๊ฒฌ๊ณ ์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์žฅ ํฌ๊ณ  ์–ด๋ ค์šด humanoid standup ์˜ˆ์‹œ์—์„œ๋Š” GPC ์ •์ฑ…๋งŒ์œผ๋กœ๋Š” ์•ˆ์ •์ ์ธ ์„ฑ๋Šฅ์„ ๋‚ด๊ธฐ ์–ด๋ ค์› ์œผ๋ฉฐ, GPC+๋งŒ์ด ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ˜„์žฌ ๋ฐฉ๋ฒ•์˜ ํ™•์žฅ์„ฑ ํ•œ๊ณ„๋ฅผ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก  ๋ฐ ํ•œ๊ณ„:

GPC๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ๋ฐ๋ชจํ•˜๊ธฐ ์–ด๋ ค์šด ๋™์  ์ž‘์—…์— ๋Œ€ํ•œ ํ”Œ๋กœ์šฐ ๋งค์นญ ์ •์ฑ…์„ ํ•™์Šตํ•˜๊ธฐ ์œ„ํ•œ ์œ ๋งํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. SPC์™€์˜ ์—ฐ๊ฒฐ์„ฑ์„ ํ†ตํ•ด ์ „๋ฌธ๊ฐ€ ๋ฐ๋ชจ ์—†์ด ์ง€๋„ ํ•™์Šต์„ ์œ„ํ•œ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , warm-starts๋Š” ์‹œ๊ฐ„์  ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ ์‹ค์‹œ๊ฐ„ ๊ณ ์ฃผํŒŒ์ˆ˜ ์ œ์–ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ํ•œ๊ณ„๋กœ๋Š” ๊ฐ€์žฅ ๋ณต์žกํ•œ ์ž‘์—…์—์„œ์˜ ์ œํ•œ๋œ ํšจ๊ณผ์„ฑ, ๋น„๊ต์  ๋†’์€ ์ƒ˜ํ”Œ ๋ณต์žก์„ฑ(๋‹จ์ผ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ์ƒ์„ฑ์— N๋ฒˆ์˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•„์š”), ๊ทธ๋ฆฌ๊ณ  ์•ก์…˜ ์‹œํ€€์Šค ํ‘œํ˜„์˜ ๋‹จ์ˆœ์„ฑ ๋“ฑ์ด ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ ์—ฐ๊ตฌ๋Š” ๊ฐ€์น˜ ํ•จ์ˆ˜ ํ•™์Šต ํ†ตํ•ฉ, ํ•˜๋“œ์›จ์–ด ๊ฒ€์ฆ, ์ผ๋ฐ˜ํ™”๋œ Multi-task ์ •์ฑ… ํ›ˆ๋ จ, ๊ทธ๋ฆฌ๊ณ  ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” ์ƒ์„ฑ ๋ชจ๋ธ๋ง ๋“ฑ์„ ํฌํ•จํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Copyright 2024, Jung Yeon Lee