[Generative] Diffusion-based Inversion과 Personalization에 대한 생각

2024. 4. 19. 23:56소개글/에세이

728x90
반응형

 

개인적으로 Generative 관련된 결과를 내다보면, 학습된 모델을 이용해 결과를 얻어 내는 것도 좋지만 나만의 "새로운 컨셉"에 대한 결과를 얻는 것에 더 관심이 많은 것 같습니다. 이를 Personalization이라고 하기도 하는데, 이를 위한 다양한 기법을 비교하던 중 아래와 같은 의문들이 생겼습니다.

  • 새로운 컨셉을 학습시키고 싶은데, 단순히 fine-tuning을 한다면 내가 원했던 특징들도 사라지지는 않을까?
  • 내가 원했던 특징을 남기면서, 특정한 특징을 학습하려면 Fine-tuning 기법 / Personalization 기법 / Inversion기법 어떤 방법을 활용해야하며 무엇이 다르지?
  • 왜 위에서 보았던 다양한 기법들이 어떤 논문에서는 Controling style variants로 분류 되는 것이지?

위와 같은 의문을 해결하고자 Personalization기법들을 어떻게 분류해 생각하면 좋을지, 어떤 상황에서 어떤 기술을 쓸지에 대한 기준을 세우고자, 저만의 분류방법을 구축하는 것이 좋겠다 생각해 아래 내용을 정리해보았습니다.

 

결론만 이야기하고 넘어가자면 아래와 같습니다.

  1. fine-tuningInversion을 활용한 다양한 기법은 Personalization을 위한 방법에 포함되며
  2. Personalization을 정의하기 위해 Control (Condition)이 포함되기도 하기 때문에, 
    "Control을 어떻게 할 것인지"와 "Personalization을 위해 Control을 활용하는것"의 차이를 파악해야합니다.
  3. "Control을 어떻게 할 것인지"에 대한 것은 다른 문제이므로 다른 글에서 다룰 예정입니다.
    ex) ControlNet, T2I-Adapter, IP-Adapater

이 글의 내용중 "1.Inversion이란?" 에는 필자의 의견이 담겨있으니, 참고바랍니다.

<구성>
1. Inversion 이란?
    a. GAN Inversion
    b. Diffusion-based Inversion
    c. Personalization
2. Inversion을 활용한 Personalization
    a. [for better] Stochastic Inversion
    b. [for better] Null-Text Inversion
    c. [inverted concept] Textual Inversion
    d. [inverted concept] Dreambooth
3. Edit을 활용한 Personalization
    a. [Condition] Negative Prompt
    b. [UNet] Prompt to Prompt
    c. [UNet] Plug and Play
    d. [Sampling] Asyrp

글효과 분류1 : 논문 내 참조 및 인용

글효과 분류2 : 용어설명


1. Inversion 이란?

 

Generative Image Synthesis 에 있어서 다양한 task가 존재하지만, 크게 단순히 생성을 목적으로하는 Generation task Img2Img task로 분류된다고 생각해 보겠습니다.

 

Img2Img task가 Generation task와 다른 가장 큰 차이는, 생성된 이미지의 latent space상의 representation을 찾아 표현하는 Inversion 과정이 있는지일 것입니다.

더보기

----------------------------------------------------------
<두가지 Task에 해당하는 예시>

 

1. Img2Img로 분류된 Task에는 아래와 같은 예시들이 있습니다.

 

  • Image Reconstruction : source와 똑같은 이미지를 만드는 Task
  • style transfer : source의 content를 reference의 style로 만드는 Task
  • I2I Translation : source의 content 혹은 style을 어떠한 Condition을 기준으로 바꾸는 Task

 

2. Random Generation으로 분류된 Task 에는 아래와 같은 예시들이 있습니다.

  • T2I : Text를 Condition으로 Image를 랜덤하게 생성하는 Task
  • Inpainting : 주어진 영역을 재구성해 생성하는 Task
  • Image Editting : 주어진 영역을 의도에 맞게 생성하는 Task

물론 정확하게 분류가 되지는 않습니다. 예를 들어, Image Editting을 위해서는 Inversion을 활용한 Img2Img 형태를 활용할 수도 있고, Generation형태를 활용할 수도 있습니다.

 

또한, 위 두 Task모두 Unconditional Task와 Conditional Task로 분류될것이고, Conditional Task의 경우 아래 설명하겠지만, Generation Task라도 "Inversion을 활용한다"라고 볼 수도 있는 상황이 있습니다.

 

따라서 아래와 같은 분류를 일반적으로 설명하기 위한 예시라고 생각하시면 좋겠습니다.
----------------------------------------------------------

[Diffusion-based Generative Tasks]

 

그럼 Img2Img에서 사용하는 이 Inversion이라는 것이 무엇일까요?


a. GAN Inversion

 

아시다시피 GAN은 아래 그림과 같은 특징 Latent Space로부터 Generator를 통해 이미지를 생성하도록 되어있습니다. 

[GAN Architecture]

 

근데 이 Latent Space에 관심이 많아 지게 된 것이 바로 styleGAN의 등장으로 인해서 입니다. styleGAN은 아래 그림과 같이 training data의 분포를 더 잘 표현할 수 있는 latent space인 W space를 제안하며, "disentangled되지 않은 latent vector간의 interpolation시 non-linear한 변화를 야기하는 문제"를 해결할 수 있다고 제안합니다.

** disentangled (↔entangled) : 각 특징들이 잘 구분되어 있는 상태입니다. 완전히 disentangled된 latent space에서는 latent vector간의 interpolation이 linear한 결과를 도출합니다.

** [styleGAN] A Style-Based Generator Architecture for Generative Adversarial Networks(CVPR'19)

** [styleGAN2] Analyzing and Improving the Image Quality of StyleGAN(CVPR'20)

** [styleGAN3] Alias-free generative adversarial networks (NIPS'21)

[styleGAN에서 제안하는 W space]

** 다양한 Latent Space에 대해 궁금하시면 아래 더보기를 참조하세요

더보기

 -------------------------------------------------------------

 <다양한 Latent Space>

 

GAN Inversion을 위해서는 아래 두가지를 잘 선택해야 합니다.

  • latent space Z
    1. disentangled되어 있어야합니다
    2. 정보를 embed하기 쉬워야 합니다.
  • latent code z ($z\in Z$)
    1. 원본 이미지를 faithfully & photorealistically 하게 복원할 수 있어야 합니다.
    2. downstream 이미지를 editing 할 수 있어야 합니다.

이에 따라 만들어진 Latent space는 아래와 같이 여러가지가 있습니다.

[]

 

1. Z space

위 그림 왼쪽과 같이 distribution으로부터 직접 샘플되는 latent space 값

  • (+) 모든 모델에서 활용될 수 있습니다.
  • (-) normal distribution으로 직접 추출하므로 표현량의 한계가 있고, semantic한 특징에 대해 disentangled가 덜 되어있습니다.

 

2. W space

styleGAN에서 사용되는 latent space로, 위 그림과 같이 native z를 nonlinear mapping network f()를 통해 mapping해 구합니다.

** nonlinear mapping network : 8layer MLP로 구현되어 있음

  • (+) Z-space보다 자유도가 높고 표현력이 좋습니다. 
  • (+) mapping network와 affine transformation덕에, Z-space보다 더 disentangled 되어 있습니다. 
  • (-) 이미지를 복원하기에 충분한 크기가 아니다

이 vector들은 학습된 affine transformation을 통해 style y로 바뀌게 되고 
$$y=(y_s,y_b)$$

AdaIN이라는 normalization 방법을 통해 generator layer에 들어갑니다.

** AdaIN에 대해 궁금하시면 아래 더보기를 참조하세요
$$AdaIN(x_i,y)=y_{s,i}\frac{x_i-\mu(x_i)}{\sigma(x_i)}+y_{b,i}$$

 

예를 들어, 18Layers styleGANstyleGAN2에서 w의 차원은 512입니다.

 

3. W+ space

Image2StyleGAN에서 제안된 latent space로, 추가적인 layer-wise latent space를 활용해 generator layer에 서로 다른 latent vector를 넣는 방법입니다.

**Image2StyleGAN: How to embed images into the StyleGAN latent space?(ICCV’19)

  • (+) W space보다 이미지를 더 잘 복원할 수 있습니다.
  • (-) editability를 희생해서 distortion을 줄이는 방법입니다. 따라서 이후에 (reconstruction - editability tradeoff)를 balance하는 방법들이 등장합니다.

예를 들어, 18Layers styleGAN styleGAN2에서 w+의 차원은 18x512(9216)입니다.

 

4. S space

W space에서 서로 다른 affine transformation을 채널 별로 적용해 얻어냅니다.

** StyleSpace analysis: Disentangled controls for StyleGAN image generation (CVPR’21)

  • (+) semantic한 수준에서 벗어나 spatial한 수준에서도 더욱 disentangled합니다.
  • (+) local translation에 있어서 fine-grained한 컨트롤이 가능합니다. 

예를 들어, 18Layers styleGAN2에서 s의 차원은 9088입니다.

 

5. P space
soap bubble효과를 발견하고, 이를 기반으로 w-space에서 $p = LeakyReLU_{5.0}(w)$를 통해 변환한 방법입니다.
** soap bubble 효과 : Generative 모델의 latent space을 찾을 때, 대부분의 density가 high-dimensional gaussian이 hypersphere의 표면에만 위치하고 있는 현상입니다.

** Improved StyleGAN embedding: Where are the good latents? (arxiv’20)

[PULSE 논문에서 발견한 soap bubble 효과]

 

6. $P_N$ space

joint distribution의 latent code는 multi-variate gaussian distribution일 것이므로, p-space에서 아래 식과 같은 PCA whitening 방식으로 redundancy를 줄이는 방법입니다.
$$\hat{v}=\Lambda ^{-1}\cdot C^T(x-\mu)$$

$\Lambda ^{-1}$ : scaling matrix
C : orthogonal matrix
$\mu$ : mean vector

  • (+) 이 변환을 통해 P-space가 이 되며, 모든 방향에 대해 isotropic(방향에 상관없이 성질을 유지)하게 됩니다.

 

7. $P^+_N$ space

 

W+와 같이 layer별로 $P_N$ space를 처리한 방식입니다.

 -------------------------------------------------------------

 

styleGAN의 구조를 간단히 살펴보면 아래와 같습니다.

 

  1. native z를 mapping network f()를 통해 style vector w로 매핑해줍니다.
  2. 이 vector들은 학습된 affine transformation을 통해 style y로 바뀌게 됩니다.
    ** affine transformation이 무엇인지 궁금하시면 아래 두번째 더보기를 참조하세요
    $$y=(y_s,y_b)$$
  3. AdaIN이라는 normalization 방법을 통해 generator layer에 들어갑니다.
    ** normalization기법에 대해 궁금하시면 아래 첫번째 더보기를 참조하세요
    $$AdaIN(x_i,y)=y_{s,i}\frac{x_i-\mu(x_i)}{\sigma(x_i)}+y_{b,i}$$
  4. 생성된 이미지에 stochastic variation을 주어 synthesis를 control하기 위해 latent code에 noise를 주입합니다.
더보기

 -------------------------------------------------------------

<다양한 Normalization 기법들>

 

1. BN (Batch Norm)

Batch Norm은 채널 간의 평균과 표준편차를 계산해 normalization해주는 방법으로, Feed-Forward 네트워크의 학습을 빠르게 하기 위한 Regularization 방법으로 등장했습니다. 따라서 최초에 style transfer에는 Convolutional layer 뒤에 BN이 붙었습니다.

** Feed-Forward Network : 입력값이 출력까지 한 방향으로 전달되는 단방향 구조를 가진 네트워크. 

$$BN(x)=\gamma (\frac{x-\mu(x)}{\sigma (x)})+\beta$$

위 $\gamma$와 $\sigma$는 학습이 가능한 affine 파라미터라고 부릅니다.

 

2. IN (Instance Norm)

하기 논문에서 BN을 IN으로 대체하니 성능이 굉장히 늘었다고 합니다. BN과 다른 것은, 기존에는 이미지 NHWC 중 "채널(C) 별 NHW에 대한 평균과 표준편차"를 사용했다면, 이번엔 "이미지(N)와 채널(C)별 HW의 평균과 표준편차"를 사용해 normalizing하는 방법입니다.

** Maximizing quality and diversity in feed-forward stylization and texture synthesis (CVPR'17)

$$IN(x)=\gamma (\frac{x-\mu(x)}{\sigma (x)})+\beta$$

 

3. CIN (Conditional Instance Norm)

affine 파라미터 값을 스타일마다 다르게 학습하는 방법입니다. 데이터 중 "같은 스타일"끼리 묶어 일치하는 스타일 파라미터로 학습하는 방법입니다. 하지만 파라미터가 배로 들어나기 때문에 부담이 됩니다.

$$CIN(x)=\gamma ^*(\frac{x-\mu(x)}{\sigma (x)})+\beta ^*$$

 

4. AdaIN (adaptive instance normalization)

위 Normalization기법들이 인풋에 대해 하나의 스타일을 학습하기 위해 사용했던 것과는 다르게, 주어진 스타일을 다른 곳에 adapt시키기 위해 사용하는 normalization 기법입니다.

** Arbitrary style transfer in real-time with adaptive instance normalization (arxiv'17)

 

아래 식과 같이 content input $x$의 평균과 분산을 style input $y$와 일치하도록 조정하며. 위와 다르게, affine parameter들이 없습니다.

$$AdaIN(x)=\sigma (y) (\frac{x-\mu(x)}{\sigma (x)})+ \mu (y)$$

 

5. Cross Normalization

역시나 위 Normalization기법들이 인풋에 대해 하나의 정보를 학습하기 위해 사용했던 것과는 다르게, 주어진 control을 main block에 adapt시키기 위해 사용하는 normalization 기법입니다.

** ControlNeXt: Powerful and Efficient Control for Image and Video Generation (arxiv'24)

 

아래식과 같이 control정보를 main block의 평균과 표준편차만큼 이동시키는 방법으로,  $\boldsymbol{x}_c$는 control의 feature이며, $\boldsymbol{\mu}_m$과 $\boldsymbol{\sigma}_m$는 각각 main block의 평균, 표준편차입니다.

$$\hat{\boldsymbol{x}}_c=\frac{\boldsymbol{x}_c-\boldsymbol{\mu}_m}{\sqrt{\boldsymbol{\sigma}_m^2+\epsilon}}*\gamma$$

 -------------------------------------------------------------

더보기

 -------------------------------------------------------------

<Affine Transformation이란?>

 

점,선,면을 유지하면서 보존할 수 있는 Linear Mapping 방법입니다. 예를 들어, 이 변환 이후에는 선간의 평행이 유지되는 등의 특징이 있습니다.

 

결과적으로는 아래 그림과 같이 평행이동(Translation), 스케일링(Scale), Shear, 회전(Rotatoin)등의 조합으로 볼 수 있습니다.

[https://kr.mathworks.com/discovery/affine-transformation.html]

 -------------------------------------------------------------

 

이후에 Image2StyleGAN은 W+ latent space를 제안하면서 GAN Inversion을 적용했습니다. 특정 attribute의 방향만 찾으면 이미지를 edit할 수 있다고 생각한 것입니다.

  1. Inverting : input 이미지를 원하는 latent 상의 latent vector로 invert 해주는 과정
  2. Edit : 원하는 semantic 변형 방향의 특정 vector를 더해 latent vector를 새로 만들어주는 과정

이런 Inversion을 하는 방법은 3가지로 분류됩니다.

  • 1. Learning-based : 실제 이미지를 latent code에 mapping하도록 encoder E()학습하는 방법으로, styleGAN에서도 이 방법을 활용합니다.
    $$z^*=\underset{z}{arg\ min}\ \boldsymbol\ell(G(E(x,z)),x)$$
  • 2. Optimization-based : 직접적으로 objective function(pixel-wise reconstruction loss)을 활용한 back propagation을 통해, latent code z를 optimization하는 방법입니다. 이 방법은 모든 latent code에 대해 독립적으로 진행해야 해서 굉장히 expensive합니다. 
    $$z^*=\underset{z}{arg\ min}\ \boldsymbol\ell(G(z),x)$$
  • 3. Hybrid : 먼저 Learning-based로 Encoder를 학습한뒤, Optimization-based로 학습하는 방법입니다.

[Learning-based방법과 Hybrid방법]

 

 

위에서 말씀드린 바와 같이, Inversion 과정을 거친 latent code에서 특정 변화를 위한 vector를 찾아 내면 Edit을 진행할 수 있습니다.


b. Diffusion-based Inversion

 

Diffusion 기반의 생성모델의 경우, 어떤 생성된 이미지가 있을 때 이 이미지를 만들게 된 noisy image $x_t$ 혹은 initial noise $x_T$가 latent space상의 representation이므로, 이것을 찾는 것 자체inversion이라고 볼 수도 있습니다.

 

DDPM의 학습과정 통해 Diffusion 기반의 생성모델의 특징을 좀 먼저 살펴보겠습니다.

[DDPM에서 실험한, t step의 sample을 $t_0$로 sample한 결과]

 

위 그림을 자세히보자면, 각각의 그림에서 오른쪽 아래의 noisy image는 forward 과정의 frozen $x_t$이며, 나머지 사진 3개들은  $x_0\sim p_\theta (x_0|x_t)$를 통해 샘플링한 결과입니다. 위 결과에서 보이는 바와 같이, 아래와 같은 두가지 특징이 있습니다.

  1. t가 큰 곳에서(noise와 가까운 곳에서)부터 샘플링한 결과는, 다양한 Semantic 결과를 만들어냅니다.
  2. t가 작은 곳에서(image와 가까운 곳에서)부터 샘플링한 결과는, 기존 이미지와 비슷한 결과를 만들어냅니다.

위 1번과 2번을 통해, noise와 가까운 곳에서는 conceptual한 부분을 결정하고, image와 가까운 곳에서는 perceptual한 부분을 결정한다는 것을 알 수 있습니다. 따라서 Image Reconstruction을 위해서는 image와 가까운 곳의 샘플로부터 denoising을 진행하는 것이 더 옳은 것으로 보입니다.

 


 

따라서, Diffusion-based 생성모델에서 중간의 어떤 feature를 inverted vector라고 생각한다면, 위와 같은 특징을 활용해 t가 작은 곳에서는 DDPM에서도 Inversion이 가능할것으로 보이기도 합니다.

 

DDPM학습과정에서는, autoencoder 형태로 이미지를 넣고 복원하는 과정으로 학습을 하다보니 initial noise $x_T$로부터 이미지가 생성된다는 것을 알게돼, inversion 컨셉이 이미 들어있는 것처럼 볼 수 있는 것은 맞습니다. 

 

하지만 DDPMSampling 과정에 있어서는 아래와 같은 두가지 이유로 inversion이라고 볼 수 없습니다.

 

  1. DDPM은 기본적으로 stochastic하게 생성하니 매번 다른 이미지를 생성하게 되고, intial noise가 있다고 해서 내가 의도했던 이미지라고 단정지을 수 없다.
  2. 학습이 아닌 Sampling 과정에서는, 이미지를 input으로 받아 latent representation을 찾는 과정이 없다.

따라서 1.첫번째 이유를 위해  deterministic한 DDIM sampling을 활용합니다.

 

또한 2.두번째 이유를 위해 img2img task에서는 아래 그림과 같이 diffusion process를 통과시켜 latent 정보를 찾는 inversion과정을 추가하며, 위의 DDPM에서 보인 특징을 활용해 $x_T$가 아닌 중간 $x_t$까지의 feature를 얻어야 원래 이미지의 latent를 더 잘 얻을 수 있습니다.

 

이 방법은 실제로 Stable Diffusion의 img2img에서 활용하고 있으며, SDEdit이라는 논문의 방법을 차용했다고 합니다.

** https://github.com/CompVis/stable-diffusion?tab=readme-ov-file#image-modification-with-stable-diffusion

더보기

----------------------------------------------------------------

<SDEdit>

SDEdit: Guided Image Synthesis and Editing with Stochastic Differential Equations(arxiv'21)

 

guide를 위한 image를 통해, realistic한 이미지를 생성하는 것을 제안한 논문입니다.

 

기존의 reverse SDE가 아래와 같이 진행했다면

$$t_0=1\rightarrow t_N=0$$

SDEdit의 핵심은, 아래와 같이 $t_0$가 1이 아닌 중간 값에서 진행해도 가능하다는 것입니다.

$$t_0=(0,1)\rightarrow t_N=0$$

 

따라서 "guide를 위한 image"를 invert해, realistic ↔ faithful balance가 가능한 적절한 초기 noise 및 특정 timestep을 찾아야하는데, 이렇게 찾아진 초기 noise를 아래와 같이 표현합니다.

** realism : 생성된 이미지가 얼마나 realistic한지

** faithfulness : 생성된 이미지가 guide로 준 이미지와 얼마나 비슷한지

$$x^{(g)}(t_0)\sim N(x^{(g)};\sigma ^2(t_0)I)$$

 

즉, SDEdit은 "guide를 위한 이미지" $x^{(g)}$에, 특정 time $t_0$에 존재하는 gaussian noise($\sigma ^2(t_0)$의 표준편차를 가짐)를 더해 초기 noise를 구한 후, reverse SDE를 진행합니다.

 

time step t는 위에서 언급한 바와 같이 Realism과 Faithfulness간의 tradeoff를 고려해 선택하게 되며 아래와 같은 방법을 이용해 측정합니다.

  • realism :  (synthesized image ↔︎ real image)의 KID를 활용
    ** KID(Kernel Inception Score) : 낮을 수록 실제 이미지와 가깝다는 것을 의미합니다.
  • faithfulness : (synthesized image ↔︎ guide $x^{(g)}$)의 L2 distance를 활용
[Faithfulness와 Realistic간의 tradeoff를 고려한 initial timestep]

위 결과를 보면 아래와 같습니다.

  • $t_0\approx 1$ :  random에 가까운 sample이 나오지만 realistic하다.
  • $t_0\approx 0$ : guide와 비슷한 sample이 나오지만 realistic하지는 않다.

결과적으로 $t_0 \in [0.3,0.6]$에서 가장 동작을 잘했다고 합니다.

----------------------------------------------------------------

 

실제로 Stable Diffusion WebUI에서는 이 t값을 어디까지 쓸 것인지에 대해 Denoising Strength라는 값을 사용합니다.

더보기

----------------------------------------------------------------

<Denoising Strength란?>

 

Strength란 [0.0, 1.0]의 값을 가지며, Input Image에 noise를 얼마나 더할지를 결정하는 파라미터입니다. 

  • Strength ~1.0 : Input Image와 Semantically 비슷한 이미지를 만들기 어렵지만, 다양한 variation을 가지게 만들 수 있습니다.
  • Strength ~0.0 : Input Image와 Semantically 비슷한 이미지를 생성하고 싶을 때 사용할 수 있습니다.

 

실제로 Stable Diffusion WebUIimg2img task를 활용해보면, 아래 그림과 같이 Denoising Strength가 보입니다.

[SD WebUI Denoising Strength]

----------------------------------------------------------------

[Scheduler Inversion을 활용한 Img2Img]

 

또한 ADM에서는, 아래 식 & 그림과 같이 DDIM forward process가 굉장히 작은 step에서는 reverse step과 비슷할것이라 보고, 기존의 forward과정을 reverse과정을 통해 inversion을 진행하기도합니다. (DDIM Inversion)

$$\begin{matrix}
x_{t-1}-x_t&=&\sqrt{\bar{\alpha } _{t-1}}\left [ (\sqrt{1/\bar{\alpha }_t}-\sqrt{1/\bar{\alpha }_{t-1}})x_t+(\sqrt{1/\bar{\alpha }_{t-1}-1}-\sqrt{1/\bar{\alpha }_{t}-1})\epsilon _\theta (x_t) \right ]\\ 
\Rightarrow \\
x_{t+1}-x_t&=&\sqrt{\bar{\alpha } _{t-1}}\left [ (\sqrt{1/\bar{\alpha }_t}-\sqrt{1/\bar{\alpha }_{t-1}})x_t+(\sqrt{1/\bar{\alpha }_{t-1}-1}-\sqrt{1/\bar{\alpha }_{t}-1})\epsilon _\theta (x_t) \right ]
\end{matrix}$$

[DDIM Inversion을 활용한 Img2Img]

 

그럼 이제 이미지를 "invert"하고 복원을 할 수 있는 상황이 되었으니, condition등을 추가해 다양한 img2img task가 가능할 것 같습니다.

 

그럼 Inversion이라는 개념은 위 분류와 같이 Img2Img Task에만 쓰이는 개념일까요?

 

필자는 아니라고 생각합니다. Img2img task가 아닌 Generation task학습과정을 살펴봤을때, condition이 들어갈 때, "어떤 이미지가 해당 condition으로만 만들어진다"면 그 condition (Text, Image, Key Point) 등의 embedding 등 해당 Latent Space에서의 Representation을 찾는 과정을 inversion이라고 볼 수 있고, 실제로 그렇게 보는 논문을 아래에서 소개하겠습니다. 즉,

  • 기존에 img2img에서는, 생성된 이미지가 만들어지게 된 latent representation를 image가 diffusion process로 corrupt되는 과정에서 찾았다면
  • Condition을 활용하는 Generation에서는, 생성된 이미지를 만들게된 condition을 찾을 수 있고 해당 condition이 latent space에서 정의된다면, 그 과정도 inversion이라고 볼 수 있다는 말이죠.

c. Personalization

 

기존에 생성이 가능한 모델에 우리가 원하는 결과를 얻을 수 있도록 만드는 과정을 Personalization이라고 합니다. 어떤 이미지가 어떤 스타일이나 개체를 만들어내는 능력이 이미 있을 때, 내가 원하는 결과를 만들어 내도록 만드는 과정이죠.

 

[Personalizaion 예시 from Dreambooth]

 

 

Personalization이 무엇을 의미하는지에 대해 조금 더 자세히 보기위해, "새로운 Concept"를 학습시키는 다양한 상황을 살펴보고자 합니다.

 

예를 들어 아래와 같은 Generation Model이 있다고 합시다. 기존의 Generation Model이 생성 가능한 영역을 Old Concept이라고 부르겠습니다.

** 이때 Concept을 구분하는 단위는, 강아지/고양이 같은 특정 클래스(개체)일 수도 있고 특정 스타일 일 수도 있습니다.

[Initial Base Model]

 

여기서 Old Concept & New Concept은 꽤나 난해해서 사실 정의하기가 어렵습니다. 예컨데, "눈이 없는 용을 내가 reference로 제공한 그림체로 그리고 싶다"를 제공한다면 기존에 학습되지 않은 개념일까요? 

 

이미 학습된 모델에 "눈이 없는 용"과 "나만의 그림체"가 이미 어떤 latent space상에는 정의되어 있을지도 모릅니다. 

 

따라서 필자는 경험에 의해 New Concept(새로운컨셉)를 아래와 같이 정의하려고 합니다.

"새로운 컨셉이란, 현재 Control(Condition)으로 명시할 수 없는 것"

 

예를 들어, A라는 스타일이 이미 학습되었을지언정, 그 스타일에 대해 명시할 수 있는 Text나 Token 등이 없다면 새로운컨셉으로 정의하겠다는 것입니다.

 

여기서 궁금한 것이 있습니다.

그럼 새로운 컨셉을 어떻게 반영해야할까요?

 

식으로 살펴보면 Condition기반의 Reverse process의 latent space라 할 수 있는 noise를 얻을 수 있는 방법은 $p_\theta (x_{t-1}|x_t,y)$로, 이 식에따라 새로운 컨셉을 학습시키기 위한 선택지는 아래 세가지가 있을 것 같습니다.

  1. 초기 noise $x_T$(정확하게는 이전 step의 $x_t$)를 목적에 맞게 이동
  2. condition y를 목적에 맞게 이동
  3. 네트워크 $p_\theta$를 목적에 맞게 이동

위 세가지를 고려해 학습하는데, 학습할 방법으로는 두가지 정도가 있을 것 같습니다.

  • 3가지의 초기 결과를 얻은 뒤(Inversion) 1가지 이상을 변화의 방향으로 이동시키는 방법(Edit)
  • 3가지를 모두 변화의 방향에 맞게 학습시키는 방법 (Optimization)

 

자 그럼 처음 했던 아래 질문에 대답이 완성됩니다.

왜 다양한 Personalization기법들이 어떤 논문에서는 Controling style variants로 분류 되는 것이지?

 

다양한 Personalization을 위한 방법 중, 새로운 Condition을 이용해 새로운 컨셉을 표현하는 경우, 일부에서는 Control variants로 분류되는 것입니다.

 

결과적으로 필자는, 아래 두가지를 구분해서 바라보는 것이 좋을 것 같습니다.

  • (text, image, keypoint 등) condition을 어떤 방식으로 control을 할지
    ** 이 내용은 맨 처음에 언급했다시피, 다른 글에서 다루고자 합니다.
  • condition을 통해 어떻게 새로운 concept을 implant 시킬지

 


 

조금더 깊게 들어가보겠습니다. 생성모델이 "내가 원하는 결과를 만들기" 위한 Personalization은, Old Concept & New Concept을 기준으로 아래와 같이 다양한 상황이 존재할 수 있습니다.

[Models after Personalization]

  • a. 기존의 모델을 Personalized 영역에 더 적합하게 결과가 나오도록 학습하는 방법
  • b. 기존의 모델을 Personalized 영역의 결과에서만 나오도록 학습하는 방법
  • c. 기존의 모델의 성능을 유지하며, 이전에 보지 못했던 새로운 컨셉을 학습하는 방법
  • d. 기존의 모델이 새로운 컨셉의 결과만 내도록 학습하는 방법

위와 같이 다양한 상황 중, 다양한 기법들은 각각 어떤 것을 Personalization이라고 하고 있는 것일까요?

 

(a)의 경우, 모델이 내가 원하는 영역에서 더 결과가 잘나오도록 하는 것으로, 대표적인 방법이 fine-tuning일 것입니다. 하지만 full fine-tuning은 학습이 오래걸리고, Catastrophic Forgetting문제 때문에 LoRA와 같은 방법을 활용합니다. 

** Catastrophic Forgetting : Continual Learning에서 나온 개념으로, 이전 데이터에 대한 정보를 구분해 제공하는 explicit한 방법이 아닌 implicit한 방법을 통해 학습하면, 새로운 정보 습득이 이전 지식에 미치는 영향을 독립화할 수 없는 문제.

더보기

---------------------------------------------------------------
<LoRA>
LoRA: Low-Rank Adaptation of Large Language Models(arxiv'21)

LoRA(Low-Rank Adaptation)는 NLP 분야에서 제안된 기법으로 다양한 분야에서 domain adaptation이나 다른 task에 적용을 위한 fine-tuning에 사용됩니다.

 

full fine-tuning은 파라미터가 많아 computationally expensive 하기때문에, 기존엔 external module을 새로운 task에 맞게 학습하는 다양한 기법들이 등장했습니다.

  • Adapter기법 : 아래 그림과 같이 기존의 파라미터를 freeze한 뒤 block내에 특정 layer들을 추가해 학습하는 방법입니다. 하지만 이들은 inference time에 있어서 bottleneck이 생기기때문에, 병렬화가 어려운 단점이 있습니다.
    ** Parameter-Efficient Transfer Learning for NLP (arxiv'19)
[Adapter 기법 예시]
  • Prefix tuning 기법 : 아래 그림과 같이 기존의 파라미터를 freeze한 뒤 작은 continuous task-specific vector를 optimize하는 방법입니다. 하지만 이들은 최적화하기가 어렵고, downstream task를 위해 sequence length를 유지해야한다는 단점이있습니다.
    ** Prefix-Tuning: Optimizing Continuous Prompts for Generation (arxiv'21)
[Prefix tuning 기법 예시]

 

LoRA는 pre-trained 모델에 아래 그림과 같이 학습이 가능한 Rank-Decomposition matrices를 추가해 downstream task에 활용한다고 합니다.

 

[LoRA의 구조]

기존에 하기 논문에서 “학습된 over-parametrized 모델은 낮은 intrinsic dimension에 존재하고 있다”라는 insight에서 출발해 fine-tuning을 활용한 model adapation 과정에도 낮은 intrinsic rank가 따로 존재할 것이라는 가정을 합니다.


** Measuring the Intrinsic Dimension of Objective Landscapes (arxiv'18)
** Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning (arxiv'20)

 

또한, 하기 논문에서 inspiration을 얻었다고 합니다. 해당 논문은 조금 자세히 살펴보겠습니다.
** MEASURING THE INTRINSIC DIMENSION OF OBJECTIVE LANDSCAPES(ICLR’18)

  • “실제로 필요한 파라미터는 얼마나 있을까?”라는 질문에서 시작합니다. 따라서 subspace에서 dimension을 천천히 늘려가며 살펴보았습니다.
    • Dimension : native parameter space가 아닌, 더 작은 subspace에서 실험을 진행했으며, solution이 최초로 보이는 순간을 Intrinsic Dimension이라고 불렀습니다.
    • 아래 그림을 예로 parameter space의 dimension이 D이고, ($D\cdot d$ projection)을 위한 orthogonalized된 random normalized unit vector P가 있을때, $\theta^{(d)}$를 학습해서 baseline performance에 도달하는 d를 찾아내는 방식입니다.
      $$\theta^{(D)}=\theta_0^{(D)}+P\theta ^{(d)}$$
[subspace의 intrinsic dimension을 찾는 과정]
  • 결과만 말씀드리면, 예상하는 것보다 항상 적은 파라미터가 필요했다고 합니다

 LoRA로 돌아와 핵심만 얘기하자면, 모델 $P_\Phi (y|x)$의 Pretrained weight $\Phi _0$에서 $\Phi _0 + \Delta \Phi$로 업데이트를 진행하는데, 기존의 fine-tuning은 $|\Delta \Phi|$차원이 항상 $|\Phi _0|$와 같기 때문에 더 작은 dimension으로 표현하는 방식입니다.

 

즉, 작은 low-intrinsic rank를 가지는 subspace로 projection해 아래와 같이 연산하겠다는 뜻입니다.
$$h=W_0x+\Delta Wx=W _0x + BAx$$

 

이런 방식으로 parameter를 10,000배 가까이 줄이고, memroy요구량을 3배가량 줄일 수 있었다고 합니다. 또한, throughput을 늘려 computationally & memory-aspect에서 모두 효율적이었다고합니다.


LoRA는 뒤에 나올 Dreambooth와 함께 사용되기도 합니다.
---------------------------------------------------------------

 

(b)(d)는 아직 보지 못했지만, 사실 이렇게 학습하려고 한다면 기존의 모델을 사용할 필요가 없이 scratch부터 학습하거나, overfitting 시키기 위한 fine-tuning을 진행할 것 같습니다.

** 혹은 (d)의 경우, 뒤에 나올 (c)에서 새로운 컨셉을 condition에 학습시킨뒤, 새로운 컨셉을 표현할 condition을 고정해주면 (d)와 같이 사용할 수도 있을 것 같습니다.

 

(c)의 경우는, 모델이 새로운 컨셉에 대해 학습하는 과정으로, (a)와 같이 fine-tuning을 활용할 수도 있겠지만, 이번 글에서는 아래와 같은 Inversion-Edit 개념을 활용하는 방법들을 살펴보려고 합니다. 이에는 아래와 같은 다양한 방법이 있습니다.

[새로운 Concept을 적용하기 위한 Personalization (c) ]

 

  1. 기존에 생성하던 이미지의 Latent Representation을 파악해, 이에 Edit을 가하는 과정
    ** 위 그림의 $\alpha $, $\beta $, $\gamma $
  2. "New Concept"에 대한 Latent Representation을 Inversion하고, 이에 대한 정보를 통해 내가 원하는 정보를 제공하는 방법
    ** 위 그림의 $\delta $

 

특히 위 $\delta $방법의 경우가 바로, 위에서 Control variants로 분류되었던, 새로운 컨셉을 새로운 latent code로 inversion시켜 사용하는 방법입니다.

 


위에서 언급한 바와 같이, 나머지 글에서는 위와 같은 Personalization (c)와 같이 새로운 컨셉을 학습하기 위한 방법들 중 fine-tuning이 아닌 Inversion과 관련된 기법들을 살펴보고자 합니다.

[c. Personalization for new concept]

 

그럼 이제, 현재 생성하고 있는 이미지에서 필요한 정보만 수정을 잘 해내고 싶다면 결국 아래 두가지를 잘해야할 것 같습니다.

  • Inversion을 잘해야합니다.
    • 기존의 이미지를 잘 얻어내 이후에 Edit을 잘하기 위해서
    • 새로운 Concept 자체를 Inversion을 잘하기 위해서
  • Edit을 적절하게 해야합니다. 

다음 챕터부터는 이 두가지를 기준으로, 위와 그림과 같은 방법들이 어떻게 활용되는지 살펴보려고 합니다.


2. Inversion을 활용한 Personalization

위에서 이미 설명했지만 다시 한번 짚고 가겠습니다. Personalization 방법 중, 이 글에서 정의한 새로운 컨셉을 학습하기 위해서는 아래와 같은 다양한 방법들이 있었습니다.

 

  1. 기존에 생성하던 이미지의 Latent Representation을 파악해, 이에 Edit을 가하는 과정
    ** $\alpha $, $\beta $, $\gamma $
  2. "New Concept"에 대한 Latent Representation을 Inversion하고, 이에 대한 정보를 통해 내가 원하는 정보를 제공하는 방법
    ** $\delta $

이번 챕터 a,b,c,d는 아래와 같이 분류할 수 있습니다.

  • a,b [for better] : Inversion을 잘하기 위한 방법에 대해 살펴보고
  • c,d [inverted concept] : $\delta $ 방법 과 같이 새로운 컨셉을 어떻게 Inversion했는지를 살펴볼 예정입니다.

[$\delta $. 새로운 Condition에 Inversion하는 방법]


a. [for better] Stochastic Inversion

 

Inversion-based Style Transfer with Diffusion Models(CVPR'23)

 

위에서 이야기한 Img2Img Task를 활용했을 때, Text 대신 Style과 관련된 이미지를 통해 shape와 element를 적절하게 control할 수 있는 방법, InST(Inversion-based Style Transfer Method)를 제안한 논문입니다. 

 

구조는 아래 그림과 같이 Tetual Space, Pixel Space, Latent space 세가지 영역으로 구분되어있습니다.

[InST 구조]

  • Textual Space (Textual Inversion) : reference 이미지 y를 받아 CLIP 이미지 Encoder와 Attention-based Inversion 모듈을 통해 text embedding형태로 만들어주는 역할
  • Pixel Space(Stochastic Inversion) : content 이미지 x를 받아 Stochastic Inversion 이라는 방법 추가해 Inversion하는 방법
  • LDMs Latent Space 

먼저, 해당 논문에서는 기존에 학습된 T2I모델이 두개의 표현을 가지고 있다고 합니다.

  • Holistic Representation (전체적인 표현) : Text Condition에 의해 결정됨
  • Detail Representation (상세한 표현) : Random Noise에 의해 결정됨

따라서 Detail한 표현을 위해 inversion을 통한 initial noise가 중요하므로, Stochastic Inversion이라는 방법을 활용했습니다.

 

기존에 Inversion하는 방법에 추가로, 아래와 같은 식을 통해 $\mu _T$를 통한 predicted noise를 기존 이미지에 더해줌으로써 inverted image를 얻어내는 방법을 활용했습니다.

$$\hat{\epsilon }_t =(z_{t-1}-\mu _T(z_t,t))\sigma _t$$

자세하게 이 방법이 왜 의미있을지에 대한 이유에 대해서 나와있지 않지만, 실제로 현업에서 굉장히 유용하다는 의견이 있습니다.


b. [for better] Null-Text Inversion

 

Null-text inversion for editing real images using guided diffusion models(CVPR'23)

 

본 논문은 novel한 inversion을 통해 T2I모델의 editability를 올리는 방법을 제안합니다.

** editability : text condition에 적합하게 edit이 잘 되는 것

 

먼저 task는 Prompt-to-Prompt와 비슷하게 했으며, 간단히 말하면 real Image $I$를 edit 해 $I^*$를 만들기 위해, prompt $P$를 prompt $P^*$로 만들어주어 edit하는 방법입니다. 예컨데, "A baby wearing …"이 던 것을 "A robot wearing..." 으로 바꿔 새로운 이미지를 만들어냅니다.

 

본 논문에서 제안한 방법은 DDIM Inversion을 활용해 유기적으로 동작하는데, 아래 두가지 방법을 통해 동작합니다.

  • Pivotal Inversion : Random Noise Sample이 이미지를 찾아 가는 과정에 fidelity를 올려줄 올릴 방법을 추가하고, 이로 인해 줄어들 editability를 보완해줄 anchor을 제공합니다.
  • Null-text Optimization : 기존의 empty string이 가지는 null embedding을 optimize함으로써, Pivotal Inversion이 반영되도록 학습합니다.

 

 

앞서 소개했던 ADM의 DDIM Inversion방법은, unconditional 한 DM에서는 작은 에러들이 누적되더라도 negligible해서 잘 동작했다고 합니다.

 

하지만 CFG를 활용한 conditional한 모델에서는 아래와 같은 식에서 guidance scale w>1일 때 누적 에러를 증폭해 editability를 많이 떨어트린다고 합니다.

** guidance scale은 높을 수록 더 좋은 fidelity(높은 IS)를 만들지만, diversity를 떨어트립니다(높은 FID).

$$\tilde{\epsilon}_\theta(z_t,c)=w\cdot \epsilon_\theta(z_t,c)+(1-w)\cdot  \epsilon_\theta(z_t,\varnothing)$$

 

하지만 그럼에도 불구하고, guidance scale w>1일 때는 high-fidelity inversion을 가능하게 하므로 이를 활용할 방법을 제안합니다.

 

즉, guidance scale w=1에서는 충분히 editable하므로, w=1일 때 inversion시킨 $z^*_T$를 pivot trajectory 혹은 initial trajactory 라고 부릅니다.

 

그다음, guidance scale w>1일 때의 inverted gaussian noise 벡터인 $z_T$가 pivot trajectory를 따라가도록 학습시키는 방법입니다. 

$$min\left \| z^*_{t-1}-z_{t-1} \right \|^2_2$$

 

자 이제 목적은 알겠지만 어떤 것을 Optimization함으로써 변화를 줄 수 있을까요? 그것이 바로 null-text embedding입니다. 

 

Inversion을 잘되게 하기 위해서 아래의 CFG의 식을 다시 한번 활용합니다.

$$\tilde{\epsilon}_\theta(z_t,c)=w\cdot \epsilon_\theta(z_t,c)+(1-w)\cdot  \epsilon_\theta(z_t,\varnothing)$$

위 식의 $\epsilon_\theta(z_t,\varnothing)$, 즉 null-text embedding(unconditional embedding) $\varnothing $을 활용하는 noise 는 unconditional 할때의 text token인 empty string을 활용해 얻은 embedding을 활용했었습니다.

 

하지만, 이때의 embedding을 optimize함으로써 아래와 같이 위 목적을 이루겠다는 것입니다.

$$min\left \| z^*_{t-1}-z_{t-1}(\bar{z_t},\varnothing _t, c) \right \|^2_2$$

 

하나의 null-text embedding으로 진행하는 것은 Global null-text optimization이라고 따로 부르면서, timestep에 따라서 다르게 $\varnothing _t$를 optimization을 하기도 했다고도 합니다. 실제로 후자의 경우 reconstruction quality가 굉장히 증가했다고 합니다.

[Null-text Inversion의 방법]

 

결과적으로 prompt-to-prompt 방식의 editing을 통해 hight quality 결과를 얻을 수 있었으며, 한번 학습된 unconditional embedding은 다양한 input image에 대해 사용 가능하므로 효율적이라고 볼 수 있습니다.

 

이와 같이 Inversion을 효율적으로 하기 위해 condition의 null embedding을 최적화하는 방법도 있었습니다.

 


c. [inverted concept] Textual Inversion

 

An image is worth one word: Personalizing text-to-image generation using textual inversion(arxiv'22)

새로운 컨셉을 학습시키기 위해 다양한 방법이 있었는데, 각각 아래와 같은 단점이 있었다고 합니다.

  • Re-Training : 굉장히 Expensive합니다.
  • Fine-Tuning : Catastrophic Forgetting의 위험이 있습니다.
  • Noise를 활용한 Inversion-Edit :이미지의 content를 중대하게 변화시키는 단점이 있습니다.

 

그래서 아예 새로운 컨셉을 중간 표현으로 encoding시켜버리는 Textual Inversion방법을 제안합니다. 즉, 아래 그림과 같이 pre-trained T2I모델을 활용해 새로운 컨셉을 의미하는 Pseudo word $S^*$를 넣어 embedding vector인 $v^*$를 학습하는 방법입니다.

[Textual Inversion이 학습하는 방법]

 

새로운 임베딩 $v^*$를 찾기 위해 먼저 총 3~5장의 (이미지, prompt) 쌍을 준비합니다. 이 때 prompt는 CLIP ImageNet template로, "A photo of $S^*$"와 같으며, 타겟 컨셉을 동일하게 의미하는 데이터입니다.

 

text encoder $c_\theta$와 denoising network$\epsilon_\theta$를 모두 freeze한 뒤, 직접적인 LDM loss를 통해 학습을 진행해 임베딩 $v^*$를 학습시킵니다.

** text encoder $c_\theta$는 BERT text encoder를 활용했습니다. text y가 들어오면 token으로 변경한뒤, unique한 embedding vector로 index-based lookup을 통해 링크됩니다.

 

풍부한 Textual Understanding을 활용해 결과적으로 새로운 컨셉을 학습 할 수 있었고, fine-tuning에서 발생하는 Catastrophic문제도 없었다고 합니다.


d. [inverted concept] Dreambooth


DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation (CVPR'23)

 

사실 Dreambooth의 경우는 하나의 concept을 condition에 Invert 했다기보다는, 모델 전체를 full fine-tuning한 방법에 가깝습니다. 설명한 이후에 왜 [inverted concept]으로 분류되었는지 설명하도록 하겠습니다.

 

Dreambooth는 T2I모델이 특정 subject(주제)를 가진 reference를 통해 합성하도록 Few-shot personalization방법을 제안한 논문입니다.

** few-shot : 한 클래스당 몇 개만의 샘플 이미지를 활용해, 새로운 클래스를 인식하도록

** one-shot : 한 클래스의 하나의 샘플 이미지만으로, 새로운 클래스를 인식하도록

** zero-shot : 이전에 학습된 모델만으로, 라벨링 되지 않은 새로운 클래스에 대해 인식하도록

 

pre-trained 된 T2I모델을 특정 subject를 위한 3~5장의 image와 특별한 identifier를 통해 fine-tune을 진행합니다. 이 identifier는 기존 모델에서 weak prior를 가지는(기존에 알려지지 않은) text로 정해야하는 특징이 있습니다.

 

학습은 모든 layer에 대해 진행했는데, fine-tuning을 활용하므로 또한 overfitting, mode-collapse, forgetting prior 등을 주의해야 합니다. 이 때, 두가지 문제가 두드러지게 나타났다고 합니다.

** Mode Collapse : 다양한 이미지를 생성하지 못하는 현상

  1. text-embedding에 대해 condition을 가지고 있는 layer의 language drift 문제
    ** language drift : 기존에 LM에서 보였던 문제로, specific task에 대해 fine-tune할때 syntactic(구문적) & semantic(의미론적) 정보가 사라지는 문제
  2. T2I 모델의 diversity가 사라지는 문제

 따라서 위 두문제를 Class-specific Prior Preservation Loss(PPL)를 통해 해결합니다. 하기 $\lambda $는 기존의 Sqaured Error Loss와 PPL Loss간의 weight를 조절해줍니다.

$$L_{PPL}=\mathbb{E}\left [ w_t\left \| \hat{x}_\theta (\alpha _tx+\sigma _t\epsilon, c)-x \right \|^2_2 +\lambda w_{t'}\left \| \hat{x}_\theta (\alpha _{t'}x_{pr}+\sigma _{t'}\epsilon ', c_{pr}) \right \|^2_2\right ]$$

즉, 위 식의 두번째 term이 prior-preservation term인데, 아래 그림과 같이 prior에 해당하는 정보를 같이 학습 시켜주는 것입니다.

 

 

[PPL Loss]


이를 통해 class prior에 대한 다양한 이미지를 생성 가능함과 동시에, class prior에 포함된 정보를 사라지지 않게 도와준다고 합니다.

 

앞서 언급한 바와 같이, 사실 이 기법은 full fine-tuning기법이지만, 모델의 weight가 바뀐 것과는 별개로 위 Textual Inversion 기법과 같이 하나의 컨셉을 특정 identifier에 invert하기도 했다고 볼 수 있습니다.

 

실제로 논문에서 언급한 바를 활용하면, rare token을 text space에서 invert함으로써 prior를 가지도록 했다고 하고 있습니다.

 

이와 같이 특정 condition에 새로운 컨셉을 invert하는 방법 중 위에서 언급되지 않은 논문들도 있습니다.

** [Custom Diffusion] Multi-concept customization of text-to-image diffusion (CVPR’23) (≒ Dreambooth variants)

** Highly personalized text embedding for image manipulation by stable diffusion (arxiv’23) (≒ Textual Inversion Variants)


3. Edit을 활용한 Personalization

 

다시 한번 복습해보면, Condition기반의 Reverse process는 $p_\theta (x_{t-1}|x_t,y)$로, 새로운 컨셉을 학습시키기 위한 선택지는 아래 세가지가 있습니다.

  1. 초기 noise $x_T$(정확하게는 이전 step의 $x_t$)를 목적에 맞게 이동
  2. condition y를 목적에 맞게 이동
  3. 네트워크 $p_\theta$를 목적에 맞게 이동

 

1번은 다루기 어려우므로, 2번과 3번에 대해 주로 다루게 됩니다.

 

이번 챕터에서는 Personalization을 위해 어떻게 수정을 가하는지에 대한 방법을 살펴보겠습니다. 

 

위 내용에 따라, 아래 챕터 a,b,c,d를 구분해보면 아래와 같습니다.

** 주의할 점은 위 챕터 a,b,c,d중 기존의 GAN inversion에서의 edit의 개념을 정확히 활용해 "latent space에서의 변화의 vector를 사용해 이동하는 방법"은 방법은 d 뿐입니다.
하지만 원하는 방향으로 이동시키는 결과를 낸다는 관점에서 필자의 의견이 들어간 분류입니다.

  • a [Condition] : 아래 $\gamma $방법과 같이, condition을 활용해 새로운 컨셉을 의미하도록 바꾸는 과정
  • b, c [UNet] : 아래 $\alpha $, UNet을 활용해 새로운 컨셉의 방향으로 바꾸는 과정
  • d [Sampling] : 아래 $\beta $, Sampling과정을 활용해 새로운 컨셉의 방향으로 바꾸는 과정

[새로운 Concept을 적용하기 위한 Personalization (c) ]


a. [Condition] Negative Prompt

 

먼저, 학습 혹은 Optimization 없이 condition을 통해 edit을 가하는 방법도 있습니다.

 

이 방법은 정확히는 Inverted된 Latent Representation을 Edit하는 과정이라고만 정의하기는 어렵고, Condition을 통해 원하는 방향으로 결과를 얻어내는 일반적인 방법입니다. 하지만 비슷한 문맥에서 소개하도록 하겠습니다.

[$\gamma $. Condition을 통해 Edit하는 방법]

 

기존에 CFG에서는 Uncondition의 sampling결과Conditional한 sampling결과를 아래와 같은 수식과 같이 활용했습니다. 

$$\epsilon=\omega \epsilon _\theta (x_t,P,t)+(1-w)\epsilon _\theta (x_t, \varnothing, t)$$

 

여기서 w>1이면 guidance strength를 줄 수 있는데, 이를 통해 condition에 적합한 fidelity를 줄 수 있는 것으로 알려져있고, unconditional text prompt인 $\varnothing$은 empty string prompt를 활용해 얻는 embedding을 의미합니다.

 

이때, 뒤에서 자세히 소개할 Plug-and-Play에서 활용된 Negative-prompting방식은, $\varnothing$ 대신 negative prompt 인 $P_n$을 아래식과 같이 활용합니다. 이때 $\alpha $는 기존의 empty string prompt와 negative prompting을 조율하는 파라미터입니다.

$$\begin{matrix}
\epsilon=\omega \epsilon _\theta (x_t,P,t)+(1-w)\left [ \alpha \epsilon _\theta (x_t, \varnothing , t) + (1-\alpha )\epsilon _\theta (x_t, P_n, t) \right ]\\ 
\alpha \in [0,1]
\end{matrix}$$

 

위와 같은 식을 통해, negative prompt로부터의 deviation을 줄 수 있는데, Plug-and-Play에서는 guidance 이미지와 멀어지도록 guidance image를 설명하는 $P_n$을 추가해 이를 적용했고, guidance image가 실루엣과 같은 primitive image 일 때 더욱 잘 적용되었다고 합니다.


하지만 이외에 일반적으로는 아래와 같이 단순하게 활용합니다. 

$$\epsilon=\omega \epsilon _\theta (x_t,P,t)+(1-w)\epsilon _\theta (x_t, P_n, t)$$

즉, negative prompt 자체를 $\varnothing$ 대신 사용하는 경우가 많으며, 실제 SD에서는 1.5에서보다 2.0에서 더욱 negative prompt의 역할이 중요해졌다고 합니다.

** https://www.assemblyai.com/blog/stable-diffusion-1-vs-2-what-you-need-to-know/#negative-prompts

 

이와 같이 negative prompt를 활용해 원하는 결과에 가깝게 만들어 줄 수도 있습니다.

 

이를 적극적으로 활용한 아래와 같은 논문도 있습니다.

** Negative-prompt Inversion: Fast Image Inversion for Editing with Text-guided Diffusion Models(arxiv'23)


b. [UNet] Prompt-to-Prompt

 

Prompt-to-prompt image editing with cross attention control(arxiv'22)

 

다음으로는 UNet의 weight 및 중간 feature를 바꾸어, Edit하는 결과를 가져온 사례입니다.

 

두가지를 소개할 예정인데, 첫번째 방법인 Prompt-to-Prompt는 Optimization 없이 edit이 가능합니다.

[$\alpha $. UNet을 통해 Edit하는 방법]

 

 

T2I 모델을 통해 image-editing을 하기위한 방법으로, 기존에는 유저가 spatial mask를 제공하는 형태를 가졌는데, 이때 mask된 영역의 content나 structure가 무시되는 단점이 있었다고 합니다.


따라서 pre-trained T2I모델을 활용해 text-only로 edit을 진행하기 위해, cross-attention layer의 cross-attention map을 다른 것으로 injection해 “어떤 픽셀이 어떤 prompt의 text를 컨트롤할지”를 반영하는 방법입니다.


이미지 $I$를 Prompt $P$에서 Prompt $P^*$로 edit 함으로써 결과 이미지 $I^*$를 얻고 싶은 상황입니다. 이때, 아래 왼쪽 그림과 같이 가장 직관적인 조치로 random seed를 고정한다고해서, text를 대체할 때 구조를 유지하며 변경되지는 않습니다.

[Attention Map을 활용하기 전과 후]


이는 생성된 이미지의 structure과 appearance는 random seed뿐만아니라 "pixel과 text embeddding간의 interaction"에도 의존하기 때문입니다.


좀 더 자세히 보겠습니다. 기본적으로 DM은 아래 그림과 같이 noisy image $\phi (z_t)$를 Query로 활용하고 textual embedding $\psi (P)$를 Key와 Value로 활용합니다.

[일반적인 Cross Attention]

 

따라서 attention maps는 아래 식 중 M과 같을 것입니다. $M_{i,j}$는 i번째 pixel과 j번째 token간의 weight를 의미합니다.
$$M=Softmax(\frac{QK^T}{\sqrt{d}})\rightarrow \hat{\phi }(z_t)=MV$$

 

이 때, 아래 그림의 attention map을 보면, bear를 넣었을 때(빨간 테두리)bird를 넣었을 때(초록 테두리)의 attention map이 각각 달라지는 것을 볼 수 있습니다.

[모든 timestep에서의 Attention map을 평균한 결과]


결과적으로 prompt $P$에서 $P^*$로 바뀔 때, prompt P일 때의 attention map Mprompt $P^*$일 때의 attention map $M^*$에 대신 넣어준다면, 위와 같이 prompt에 의해 구조변화가 발생하는 문제가 해결될 것이라는 것입니다.
$$\begin{matrix}
\hat{M_t}\leftarrow Edit(M_t, M_t^*, t)\\ 
DM(z_t,P,t,s)\left \{ M \leftarrow \hat{M_t} \right \}
\end{matrix}$$


단, composition(오브젝트의 위치나 구조)은 0에 가까운 timestep($t<\tau $)에서 결정되므로, 이부분의 attention map만 injection합니다. 또한 같은 token이 prompt내의 다른 위치에 있을 수도 있으므로 alignment function A를 활용해 아래와 같이 수정합니다.
$$\begin{matrix}
Edit(M_t, M_t^*, t)&:=&\left\{\begin{matrix}
M_t^*&if\ t<\tau\\ 
M_T&otherwise
\end{matrix}\right.\\ 
Edit(M_t, M_t^*, t)_{i,j}&:=&\left\{\begin{matrix}
(M_t)_{i,j}&if\ A(j)=None\\ 
(M_t)_{i,A(j)}&otherwise
\end{matrix}\right.
\end{matrix}$$


이후에, 새롭게 섞인 Attention map 중 각 token의 attention map간 re-weighting을 통해 영향을 조절해 마무리해줍니다.

[Cross Attention을 대체하는 과정]

 

이 방법을 통해 위 그림에서 볼 수 있는 것과 같이 형태를 유지하며, 원하는 결과를 얻어낼 수 있었다고 합니다.

 

기존의 결과에 특정 UNet을 수정해 원하는 방향의 결과를 얻어 낼 수 있었네요.


c. [UNet] Plug-and-Play

 

Plug-and-play diffusion features for text-driven image-to-image translation(CVPR'23)

UNet을 Edit함으로써 다른 결과를 얻어내는 또 다른 방법 Plug-and-Play를 소개하겠습니다.

 

이 방법 또한 학습을 통한 Optimization없이 기존의 정보를 활용하는 논문입니다.

[$\alpha $. UNet을 통해 Edit하는 방법]

 

 

Plug-and-Play는 T2I 네트워크를 활용해 I2I translation을 수행하는 방법을 제안한 논문입니다.

 

즉, 따로 학습과정 없이 guidance 이미지의 semantic한 결과를 유지하면서, 타겟 text prompt가 의도하는 새로운 결과의 이미지를 생성하는 방법입니다.

 

이 방법의 목적은 아래 두가지를 조율하는 것입니다.

  • guide 이미지와 비슷한 structure를 유지하는 것
  • guide 이미지로부터 deviate해서, text guide에 맞게 변화하는 것

 

먼저, "spatial feature는 UNet의 self-attention에 유지된다"는 사실을 이용해, guidance 이미지self-attention feature를 활용해 structure를 유지하면서 generation시에 활용합니다. 

이 논문에서는 자세한 분석을 통해 T2I 모델의 UNet에서 두가지 특징을 찾아냈습니다.

  • Decoder Layer에 PCA를 적용해 분석해본 결과, 아래와 같은 결과를 얻을 수 있었습니다.
    1. 얕은 layer에서는, forerground-background의 분리나 coarse한 정보들을 담당합니다.
    2. layer 4에서는, 지역적인 semantic정보를 담고 있습니다.
      ex) 팔, 다리, 몸통 등
    3. 깊은 layer에서는, high-frequency의 low-level 정보(디테일한 부분들)을 담고 있습니다.
    4. 위와 같은 특징은 모든 timestep t에서 비슷한 양상을 보입니다.
  • Self-attention layer를 분석해본 결과, spatial feature간의 affinities(관련성)을 통해 layout과 shape detail을 유지한다는 사실을 활용했습니다.
    1. 얕은 layer에서는, attention이 semantic layout에 align되어 있습니다.
    2. 깊은 layer에서는, high frequncy 디테일들이 align되어있습니다.

 

먼저 아래 그림의 위 네트워크와 같이 guidance 이미지 $I^G$가 Reconstruction 과정에서 inversion된 후 denoised된 상황이라고 가정하겠습니다.

** 당연히 DDIM sampling을 사용합니다.

 

위 분석 결과를 기반으로 Reconstruction 과정 정보들을 활용해 Generation Task에서 활용합니다. 활용한 3개의 정보는 아래와 같습니다.

  • Inverted된 초기 noise $x^G_T$를 활용합니다.
  • Decoder layer 4의 output feature를 injection합니다.(guidance feature $f^4_t$)
    ** 이보다 더 깊은 layer의 structure 정보들은 위에서 언급한 두가지 목적의 balance를 위해 활용하지 않았습니다.
  • Self-attention layer 4-11의 matrix를 injection합니다. ($A^l_t = \left \{ q^l_t,k^l_t \right \}$)
    ** 깊은 attention layer를 injection하는 것은 semantic association이 Decoder layer때보다 크지 않았다고 합니다.

$$z^*_{t-1}=\hat{\epsilon }_\theta (x_t, P,t;f_t^4, \left\{ A^l_t \right\})$$

[Plug-and-Play의 과정]


추가적으로 앞서 a. [Condition] Negative Prompt에서 보였던 negative prompt를 활용해 guidance 이미지에서 멀어지도록 하기도 했습니다.

 

결과적으로 전체 DDIM 기반 50 sampling step중 attention layer은 0~25 step, decoder layer는 0~25 step에서 feature를 injection해, 학습없이 높은 quality의 text 기반 결과를 가져 왔다고합니다.

 

이외에도 비슷한 방법을 활용한 아래와 같은 논문이 있습니다.

** Style Aligned Image Generation via Shared Attention (CVPR'24)

** Visual Style Prompting with Swapping Self-Attention (arxiv'24)

** InstanceStyle : Free Lunch towards Style-Preserving in Text-to-Image Generation (arxiv'24)

** 위 Plug-And-PlayStyle-Aligned에서는 Attention의 KeyQuery를 공유하는 반면, Swapping Self-AttentionInstanceStyle 논문에서는 KeyValue를 공유합니다. 논문들을 보면 보통 이미지의 spatial layout(structure, composition)을 가져오고자 할 때 KeyQuery 활용하며, style(color, material, atmosphere)을 가져오고자 할 때 KeyValue 활용하는 경향이 있는 것 같습니다.


d. [Sampling] Asyrp


Diffusion Models already have a Semantic Latent Space(ICLR’23)

 

마지막으로 Sampling과정에서의 변화를 통해 edit을 가하는 논문입니다. 

 

이번에 소개할 Asyrp(ASYmmetric Reverse Process)는 아예 새로운 Latent space까지 정의해서, 해당 Latent space에서 Sampling과정에 대한 수정을 통해 Edit을 진행합니다.

[$\beta $. Sampling을 통해 Edit하는 방법]

 

 

이 논문은 pre-trained DM의 Semantic Latent Space를 파악해 semantic한 image manipulation을 가능하게 한 논문입니다.

 

GAN에서와 같이 정확한 latent vector에 가까운 inversion property를 찾아내고, image editting을 할 수 있는 방법을 제안하고 있습니다.

 

기존에 DDIM에서의 non-Markovian reverse process는 아래와 같았습니다. 

[DDIM의 sampling 과정]

위 식을 아래와 같이 간단하게 표현해보겠습니다.

$$\begin{matrix}
x_{t-1}&=&\sqrt{\alpha _{t-1}}&P_t&(\epsilon ^\theta _t(x_t))&+&D_t&(\epsilon ^\theta _t(x_t))&+&\sigma _tz_t\\ 
&=&\sqrt{\alpha _{t-1}}&P_t&&+&D_t&&+&\sigma _tz_t
\end{matrix}$$

 

Generative Process에서 mode collapse없이 homogeneous editting을 하기 위한 가장 native 한 방법은 아래 식과 같이 CLIP을 이용해 after과 before 간의 cosine distance 변화를 찾아내, 초기 이미지 $x_T$를 업데이트하는 것입니다.

** homogeneity : 특정 latent space에서 변화 $\Delta h_t$를 주어 edit을 했을 때, 다른 이미지에도 적용이 가능한 것

$$L_{direction}(x^{before}\rightarrow x^{after},y^{before}\rightarrow y^{after}):=1-\frac{\Delta x\cdot \Delta y}{\left \| \Delta x \right \|\left \|\Delta y\right \|}$$

 

하지만 이는 DiffusionClip에 따르면 distorted한 결과 혹은 부정확한 manipulation을 초래한다고 합니다.


** Diffusionclip: Text-guided image manipulation using diffusion models ('21)

 

또다른 방법은 $\epsilon ^\theta _t$를 매 sampling step에서 shift하는 방법인데, 아래 reverse process식에서 $P_t$와 $D_t$ 내부의 shifted term $\Delta \epsilon ^\theta _t$가 서로 상쇄되어 $\Delta x_t$가 거의 무시할 수 있는 값에 가까워진다고 합니다.

$$x_{t-1}=\sqrt{\alpha _{t-1}}P_t+D_t+\sigma _tz_t$$

 

따라서 본논문에서는 aymmetric하게 $P_t$에서만 아래와 같이 변화를 줄 것이라고 합니다. 결과적으로 reverse process는 아래와 같습니다.

$$\begin{matrix}
x_{t-1}=\sqrt{\alpha _{t-1}}P_t(\tilde{\epsilon }^\theta _t(x_t))+D_t(\epsilon ^\theta _t(x_t))+\sigma _tz_t\\ 
when\ \Delta \epsilon _t=\tilde{\epsilon }^\theta _t-\epsilon ^\theta _t
\end{matrix}$$

 

이를 그림으로 표현하면 아래와 같습니다. 하기의 $\tilde{\epsilon }^\theta _t$는 shifted된 denoising network의 결과입니다.

[Asymmetric하게 Sampling을 하는 방법]

 

그럼 shifting을 $\epsilon ^\theta _t$ UNet의 어디서 진행할까요?

 

이를 control하기 위해 가장 spatial resolution이 작은 bottleneck이자 high-level semantics가 적은 H-space를 아래와 같이 골랐다고 합니다. 


따라서 shifting(edit)을 진행했을 때, 위의 식은 아래와 같이 변화합니다.

$$\begin{matrix}
x_{t-1}&=&\sqrt{\alpha _{t-1}}P_t(\tilde{\epsilon }^\theta _t(x_t))+D_t(\epsilon ^\theta _t(x_t))+\sigma _tz_t\\ 
&=&\sqrt{\alpha _{t-1}}P_t(\epsilon ^\theta _t(x_t|\Delta h_t))+D_t(\epsilon ^\theta _t(x_t))+\sigma _tz_t
\end{matrix}$$

 

이제 $\Delta h_t$를 찾기만 하면되는데, CLIP에서와 같이 아래와 같은 loss를 통해 찾아냅니다

$$\Delta \epsilon = arg\ min_{\Delta _\epsilon }\mathbb{E}_tL^{(t)}$$

 

하지만, 이를 찾아내기 위해 위의 CLIP loss를 모든 timestep에 대해 구하는 것은 학습이 굉장히 오래걸리므로, 이를 위한 작은 Neural Network $f_t$(2개의 1x1 conv)를 학습해 활용합니다.

$$f_t(h_t,t)\rightarrow \Delta h_t$$

 

결과적으로 새로운 Latent space를 구하고, 아래 그림과 같이 해당 space내에서 edit을 진행하는 새로운 방법을 제안했습니다. 이는 GAN에서의 styleCLIP과 비슷한 면이 있다고 합니다.

** StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery (arxiv'21)

[Asyrp의 결과]

 

이 방법은 Sampling과정에서 일부만 수정을 가해서 Sampling과정에서의 Edit이라고 했지만, 실제 Sampling의 일부에서는 edit을 수행할 때 UNet의 feature를 수정했으므로 UNet을 수정한 부분도 있다고 볼 수 있습니다.

 


 

이상 Personalization과 관련된 내용중 Inversion과 연관되어 있는 부분을 위주로 논문을 살펴보았는데, 관련된 논문이지만 살펴보지 못한 논문의 리스트를 남겨 놓겠습니다.

 

CustomNet: Zero-shot Object Customization with Variable-Viewpoints in Text-to-Image Diffusion Models (arxiv'23)

DreamStyler: Paint by Style Inversion with Text-to-Image Diffusion Models (AAAI'24)

ILVR: Conditioning Method for Denoising Diffusion Probabilistic Models (arxiv'21)


 

728x90
반응형

'소개글 > 에세이' 카테고리의 다른 글

[Spec] 재능, 강점, 그리고 보완  (0) 2023.10.20