ai papers

범용 생성 모델은 왜 정밀 편집에서 흔들리는가: Diffusion Prior와 Constraint의 충돌

Junyoung Park · 2026-09-01 · 8 min

관련 글비디오 인페인팅은 레퍼런스 프레임에서 시작한다 · 같은 마스크, 다른 문제

앞선 글에서 같은 frame을 OSOR과 MaskFlow에 넣어 보았다. 수치만 보면 OSOR이 더 보수적이었다. mask 밖 RGB MAE가 낮았고, 원본과 bit-identical한 pixel도 더 많았다. 그런데 결과를 확대해 보니 정작 생성 영역은 심하게 흐렸다. MaskFlow는 더 넓게 바꿨지만 sofa와 바닥은 훨씬 자연스럽게 이어졌다.

이 결과는 처음 생각했던 것보다 불편했다. 원본을 덜 바꾼 모델이 더 좋은 Inpainting model이라고 말할 수 없었고, 더 자연스러운 이미지를 만든 모델을 합성에 바로 쓸 수도 없었다. preservation과 generation quality가 같은 방향으로 움직이지 않았기 때문이다.

이번 글에서는 이 차이를 모델별 feature가 아니라 문제의 formulation에서 다시 보려고 한다. 왜 강한 generative prior는 복원을 돕는 동시에 원하지 않은 변화의 원인이 되는지, 왜 mask와 prompt를 넣는 것만으로 pixel locality가 보장되지 않는지 수식으로 정리했다.

먼저, 이것은 불가능성 정리가 아니다

범용 model은 필연적으로 정밀 편집을 못 한다고 주장하려는 것은 아니다. task를 완전히 구분하는 condition, 충분한 capacity와 data, 그리고 정확한 spatial constraint가 있다면 하나의 model이 여러 downstream task를 잘 처리할 수도 있다.

문제는 현재의 조건이 그만큼 완전하지 않다는 데 있다. prompt는 의도를 압축해서 전달하고, mask는 위치를 대략 지정하며, 학습 pair는 편집 대상 이외의 변화를 완전히 제거하지 못한다. latent diffusion은 source를 lossy representation으로 바꾼 뒤 전체 sampling path를 통과시킨다. 이 구조에서 locality는 학습이 잘되면 자연스럽게 따라오는 성질이 아니다. 별도로 넣고 검증해야 하는 constraint다.

Generative prior와 source constraint의 교집합, 그리고 여러 editing task가 하나의 shared model에서 source fidelity와 edit strength로 갈라지는 관계를 그린 화이트보드 그림
왼쪽에서 좋은 edit는 prior 안에 있으면서 source constraint도 만족해야 한다. 오른쪽에서는 서로 다른 task가 하나의 model을 공유한 뒤 source fidelity와 edit strength라는 다른 방향의 요구를 만든다.

Inpainting은 정답 복원이 아니라 constrained posterior sampling이다

원본 image를 xx^\ast, known pixel을 읽는 operator를 AA, 실제로 관측한 값을 yy라고 두면 Inpainting 입력은 다음처럼 쓸 수 있다.

y=Ax.y=Ax^\ast.

binary mask가 mm이라면 A=diag(1m)A=\operatorname{diag}(1-m)로 볼 수 있다. 알려진 pixel을 정확히 보존하는 모든 image는 다음 집합에 들어간다.

C(y)={xAx=y}.\mathcal C(y)=\{x\mid Ax=y\}.

문제는 AA가 가려진 영역을 관측하지 않는다는 데 있다. vNull(A)v\in\operatorname{Null}(A)인 변화는 known region에 아무 흔적도 남기지 않는다.

A(x+v)=Ax.A(x+v)=Ax.

따라서 같은 yy를 만드는 서로 다른 background가 무수히 존재한다. 한 장의 사진만 보고 sofa 뒤에 실제로 어떤 나뭇결이 있었는지, 흐린 staff 뒤의 벽이 정확히 어떤 texture였는지 알아낼 수는 없다. model이 커져도 입력에 없는 관측값이 생기지는 않는다.

Diffusion model은 이 빈 정보를 prior로 메운다. inverse problem의 posterior는 보통 다음 형태로 쓴다.

pθ(xy)pθ(x)p(yx).p_\theta(x\mid y)\propto p_\theta(x)\,p(y\mid x).

pθ(x)p_\theta(x)는 학습 data에서 자연스러웠던 image 쪽으로 끌고 가고, p(yx)p(y\mid x)는 관측값과 맞지 않는 해를 밀어낸다. Diffusion Posterior Sampling이 general inverse problem에서 결합하는 것도 diffusion prior와 measurement likelihood다.

이 식은 Inpainting이 실제 hidden background를 찾아낸다고 말하지 않는다. 관측값과 모순되지 않는 후보 중 prior가 높은 sample을 찾는다. 복잡한 그림, reflection과 defocus에서 그럴듯함과 실제 복원이 갈라지는 이유다.

Video Inpainting이 image 한 장보다 유리한 지점도 여기서 설명된다. 다른 frame에서 가려졌던 영역이 보이면 관측식이 늘어나고 Null(A)\operatorname{Null}(A)가 줄어든다. generative prior가 추측해야 할 공간 자체가 작아진다.

Diffusion objective에는 “나머지는 바꾸지 마라”가 없다

일반적인 denoising objective는 noisy sample xtx_t에서 noise ϵ\epsilon을 예측하도록 학습한다.

Ldiff=Ex,ϵ,t[ϵϵθ(xt,t,c)22].\mathcal L_{\mathrm{diff}} = \mathbb E_{x,\epsilon,t} \left[ \left\|\epsilon-\epsilon_\theta(x_t,t,c)\right\|_2^2 \right].

Editing model에서는 source image xsx_s, instruction cc와 mask mm이 condition에 더 들어간다.

Ledit=E[ϵϵθ(xt,t,xs,c,m)22].\mathcal L_{\mathrm{edit}} = \mathbb E \left[ \left\|\epsilon-\epsilon_\theta(x_t,t,x_s,c,m)\right\|_2^2 \right].

이 objective의 최적해는 학습 data가 가진 conditional distribution의 score를 근사한다. 하지만 loss 어디에도 다음 등식이 자동으로 포함되지는 않는다.

(1m)xout=(1m)xs.(1-m)\odot x_{\mathrm{out}} = (1-m)\odot x_s.

mask 밖을 반드시 보존하는 pixel-space constraint를 다음처럼 두자.

C(xs,m)={x(1m)x=(1m)xs}.\mathcal C(x_s,m) = \{x\mid(1-m)\odot x=(1-m)\odot x_s\}.

output distribution의 support 자체가 이 집합 안에 있어야 strict preservation을 말할 수 있다.

supppθ(xoutxs,c,m)C(xs,m).\operatorname{supp} p_\theta(x_{\mathrm{out}}\mid x_s,c,m) \subseteq \mathcal C(x_s,m).

학습 pair에 외부 tone 변화, 미세한 geometry shift나 재생성 흔적이 포함되어 있다면 diffusion loss를 잘 최소화한 model도 그것을 유효한 edit로 배운다. mask를 condition으로 제공하는 것과 sampling result를 constraint set에 projection하는 것은 다른 일이다.

RePaint는 이 차이를 선명하게 보여준다. 별도 Inpainting network를 다시 학습하지 않고 unconditional DDPM을 prior로 쓰되, reverse process에서 unmasked region을 입력 image의 known information으로 다시 sampling한다. “원본을 보아라”가 아니라 sampling 중 “이 관측값을 다시 넣어라”에 가깝다.

그래도 경계까지 저절로 해결되는 것은 아니다. generated region과 known region이 서로 다른 trajectory를 따라오면 seam이 생긴다. hard constraint가 locality를 보장할 수는 있어도, 자연스러운 transition까지 보장하지는 않는다.

범용 Editing model은 task mixture를 학습한다

범용 Editing data에는 removal만 들어 있지 않다. add, replace, attribute change와 global restyle이 같은 model에 들어간다. task를 τ\tau, 전체 condition을 z=(xs,c,m)z=(x_s,c,m)라고 두면 학습 분포는 다음 mixture로 볼 수 있다.

pmix(xoutz)=τp(τz)pτ(xoutz).p_{\mathrm{mix}}(x_{\mathrm{out}}\mid z) = \sum_\tau p(\tau\mid z) p_\tau(x_{\mathrm{out}}\mid z).

zz가 원하는 task와 범위를 완전히 구분하면 mixture 자체는 문제가 아니다. 실제 입력은 그렇지 않다. “쿠션을 지워라”는 prompt는 같은 색의 다른 쿠션도 지울지 말해주지 않는다. object mask는 contact shadow를 포함할지, 앞쪽 물체를 유지한 채 뒤쪽 사람만 제거할지 표현하지 못한다. mask 안의 보이지 않는 background는 애초에 condition에 없다.

이 모호함은 conditional entropy로 남는다.

H(XoutXs,C,M)>0.H(X_{\mathrm{out}}\mid X_s,C,M)>0.

범용 task가 늘어난다고 항상 entropy가 커지는 것은 아니다. condition이 충분히 자세하고 model이 task를 분리해 학습한다면 함께 좋아질 수 있다. 다만 finite data와 shared representation에서 서로 다른 유효 output이 같은 condition 주변에 모이면, model은 사용자가 원한 intervention 하나를 알아낼 근거가 없다. 우리가 결과의 랜덤성이라고 부르는 것 중 일부는 sampling noise가 아니라 condition의 정보 부족이다.

학습 data도 이 문제를 더한다. Object Removal pair가 정확한 counterfactual이 되려면 제거 대상 외의 모든 것이 같아야 한다. 범용 editor가 만든 before/after pair를 사용하면 data 규모는 늘지만, upstream editor가 바꾼 nuisance까지 supervision에 섞인다. 반대로 task-specific pair만 엄격하게 고르면 support는 깨끗해지는 대신 실제 촬영에서 드문 defocus, reflection과 depth overlap이 빠지기 쉽다.

Guidance scale이 이미 두 목적을 따로 움직인다

SDEdit은 입력에 noise를 더한 뒤 pretrained SDE prior로 denoising한다. 시작 noise level t0t_0가 작으면 원래 stroke를 거의 유지하고, 커질수록 입력에서 멀어지는 대신 prior가 더 강하게 개입한다.

SDEdit에서 시작 noise level t0가 커질수록 입력 stroke에 대한 충실도는 줄고 자연 image prior의 영향이 커지는 Figure 33 크롭
SDEdit Figure 33의 비교만 크롭했다. 작은 t0에서는 stroke 구조가 남고, 큰 t0에서는 더 자연스러운 church image가 되지만 입력의 구조와 identity는 크게 달라진다. 논문 원문

여기서 faithfulness와 realism은 하나의 scalar quality가 아니다. t0t_0를 바꾸면 두 목적 사이에서 위치가 달라진다. 더 좋은 model이 이 축을 없앤 것이 아니라, 같은 sampling 안에서 어느 쪽에 더 의존할지를 조절한다.

InstructPix2Pix는 이를 image와 text의 두 guidance로 더 직접적으로 쓴다.

ϵ~θ=  ϵθ(zt,,)+sI[ϵθ(zt,cI,)ϵθ(zt,,)]+sT[ϵθ(zt,cI,cT)ϵθ(zt,cI,)].\begin{aligned} \tilde\epsilon_\theta =\;&\epsilon_\theta(z_t,\varnothing,\varnothing)\\ &+s_I\left[\epsilon_\theta(z_t,c_I,\varnothing)-\epsilon_\theta(z_t,\varnothing,\varnothing)\right]\\ &+s_T\left[\epsilon_\theta(z_t,c_I,c_T)-\epsilon_\theta(z_t,c_I,\varnothing)\right]. \end{aligned}

sIs_I는 source image를 닮게 만드는 방향이고, sTs_T는 instruction을 더 강하게 적용하는 방향이다.

InstructPix2Pix에서 image guidance sI와 text guidance sT에 따라 source preservation과 edit intensity가 달라지는 Figure 4 크롭
InstructPix2Pix Figure 4. 아래로 갈수록 image guidance sI가 커져 입력 구조가 더 남고, 오른쪽으로 갈수록 text guidance sT가 커져 cyborg edit가 강해진다. 논문 원문

두 방향은 같은 vector가 아니다. source를 더 강하게 붙잡는다고 instruction following까지 좋아지지 않고, edit를 강하게 만든다고 보존성이 유지되지도 않는다. 범용 Editing에서 preservation과 edit strength가 별도 hyperparameter로 나타나는 이유다.

Latent에서 보존해도 pixel은 같지 않다

현재의 대형 image model은 주로 pixel이 아니라 VAE latent에서 diffusion을 수행한다. encoder와 decoder를 E,DE,D라고 쓰면 source는 다음 경로를 지난다.

zs=E(xs),x^s=D(zs).z_s=E(x_s),\qquad \hat{x}_s=D(z_s).

lossy autoencoder에서는 일반적으로 D(E(xs))=xsD(E(x_s))=x_s가 아니다. Latent Diffusion도 계산량을 줄이면서 detail을 유지할 수 있는 perceptual compression 지점을 찾는 데서 출발한다.

mask 밖 latent를 source와 똑같이 유지한다고 해도

(1mz)zout=(1mz)E(xs)(1-m_z)\odot z_{\mathrm{out}} =(1-m_z)\odot E(x_s)

pixel space에서 다음 등식이 따라오지는 않는다.

(1m)D(zout)=(1m)xs.(1-m)\odot D(z_{\mathrm{out}}) =(1-m)\odot x_s.

decoder의 receptive field가 mask 경계를 가로지르고, compression 과정에서 high-frequency detail이 손실되기 때문이다. latent blending은 unwanted change를 줄이는 좋은 장치지만 bit identity의 증명은 아니다. 원본 pixel을 최종 output에 다시 composite하는 bypass가 있어야 그 수준의 contract를 만들 수 있다.

여기서도 대가가 생긴다. object의 shadow와 reflection이 mask 밖으로 이어지는데 원본을 그대로 덮으면 제거 흔적이 남는다. effect mask를 넓히면 더 자연스럽게 지울 수 있지만 source preservation 영역은 줄어든다. constraint를 세게 만드는 일과 constraint의 범위를 정확히 찾는 일은 별개의 문제다.

OSOR의 blur와 MaskFlow의 drift를 다시 보면

앞선 실험은 이 formulation을 증명하는 benchmark는 아니다. sample 한 장으로 architecture의 원인을 단정할 수는 없다. 그래도 관찰된 failure를 분류하는 데에는 도움이 된다.

OSOR은 removal이라는 좁은 task와 latent composition을 사용해 mask 밖을 더 잘 보존했다. 대신 one-step restoration이 선택한 fill은 과도하게 smooth했고, sofa와 바닥의 texture가 무너졌다. constraint 쪽에는 가까웠지만 우리가 원한 posterior sample의 품질이 낮았다.

MaskFlow는 더 넓은 Editing prior로 구조와 texture를 더 자연스럽게 만들었다. 반면 다른 cushion까지 바꾸고 outside-mask difference도 더 컸다. prior 쪽에서 더 좋은 sample을 찾았지만, intervention scope가 우리가 기대한 constraint와 완전히 일치하지 않았다.

둘 중 하나가 모든 축에서 우월하지 않았던 이유를 이제 조금 다르게 말할 수 있다. 두 model이 같은 objective에서 성능만 달랐던 것이 아니라, prior와 constraint를 결합하는 방식과 학습 distribution의 support가 달랐다.

더 큰 model 하나로 끝나지 않는 이유

범용성과 downstream 성능 사이의 trade-off는 model size만 키우면 사라지는 단순한 capacity 문제가 아니다. 적어도 현재 구조에서는 네 문제가 함께 남는다.

  1. 가려진 실제 background는 single image에서 식별되지 않는다.
  2. denoising objective는 preservation constraint를 자동으로 보장하지 않는다.
  3. prompt와 mask가 task와 intervention scope를 완전히 설명하지 못한다.
  4. latent compression과 decoder가 pixel identity를 다시 흔든다.

반대로 이 trade-off가 영원히 해결 불가능하다는 뜻도 아니다. 더 많은 관측값, explicit depth와 object relation, task를 분리하는 condition, constraint-aware sampler와 pixel bypass가 들어가면 feasible set을 훨씬 좁힐 수 있다. 중요한 것은 더 강한 prior와 더 강한 constraint가 서로를 대신하지 않는다는 점이다.

다음 글에서는 이 전제를 production pipeline으로 가져가려고 한다. OSOR의 낮은 outside-mask MAE만 보면 blur를 놓치고, MaskFlow의 자연스러운 fill만 보면 semantic spillover를 놓친다. 그렇다면 어떤 metric과 quality gate로 실패를 나누고, 어느 시점에 다른 model이나 human review로 넘겨야 할까. Image Inpainting 결과를 Video propagation에 넣었을 때 오류가 어떻게 커지는지도 그때 함께 보려고 한다.