본문 바로가기

인공지능 AI/그림 AI

그림 그려주는 AI : Stable Diffusion AI의 원리 (Latent Diffusion Model)

Text-to-Image AI. 간단한 텍스트 입력만으로 놀라운 그림들을 생성해 내는 AI들이 출시되고 있습니다. 

AI에 대해 전문적인 지식이 없는 일반인들도 쉽게 이용할 수 있는 서비스들이 나오고 있는데, 그중 대표적인 서비스들입니다. 

1) OpenAI사의 DALL-E-2

2) Midjourney (미드저니)

3) Stable Diffusion (스테이블 디퓨전) 

 

그 중 오늘은 Stable Diffusion에 대해 설명하고, 근간이 되는 latent diffusion model의 원리에 대해 다뤄보도록 하겠습니다. 

 

Stable Diffusion이란?

Stable Diffusion(스테이블 디퓨전)은 2022년에 출시된 Open-source 딥러닝 Text-to-Image 모델입니다. 말 그대로 '학습된 모델'이 오픈소스로 누구나 사용할 수 있는 형식으로 무료 공개되었기 때문에 큰 화제가 되었습니다. 현재 많은 사람들, 연구기관, 기업에서 학습된 Stable Diffusion 모델을 복사하여 이를 구동해 일러스트/이미지 생성 서비스를 제공해 주고 있고, 관련하여 추가 발전된 모델, 기능들이 하루가 다르게 쏟아지고 있습니다. 

 LMU Munich[각주:1]의 CompVis 그룹에서 개발한 Deep generative neural network의 일종인 latent diffusion model(잠재 확산 모델)을 이용합니다. 원리는 뒤에서 조금 더 설명하겠습니다. 

 Stable Diffusion은 Stability AI, CompVis LMU, Runway의 콜라보레이션으로 무료 배포되었고, 모델 훈련을 위한 데이터는 LAION [각주:2]의 LAION-5B (58억 5천만 개의 이미지-텍스트 쌍 데이터 세트)를 이용했다고 합니다.

역시나 가장 놀라운 점은 이렇게 학습된 모델을 무료 공개했다는 점과 비전문가인 개인들이 10GB 미만의 VRAM을 가진 GPU만으로도 충분히 구동해볼 수 있다는 점입니다. 그만큼 효율성면에서 뛰어나다는 점이죠. (물론 어느 정도의 성능을 가진 GPU가 있어야 됩니다. 적어도 Nvidia Geforce 30시리즈의 사양 정도는 되어야 안정적입니다.)

 

Stable Diffusion의 원리 - latent diffusion model (잠재 확산 모델)

비전문가의 입장에서 Stable Diffusion의 원리에 대해 궁금해 여러 사이트들과 논문들을 통해 공부해봤고 제가 이해한 바를 설명해 보도록 하겠습니다. 

Stable Diffusion 뿐만 아니라 모든 Text-to-Image AI은 결국 입력된 자연어로부터 그에 맞는 이미지를 생성해내는 딥러닝 AI입니다. 즉, 이미지 생성의 Computer vision 분야와 자연어처리 NLP(Natural Language Processing)이 결합된 모델이라고 할 수 있습니다. 

Diffusion model

일상 속 diffusion - 물속에서 잉크가 확산 되어가는 과정

위의 그림과 같이 물에 파란 잉크를 떨어뜨리면 잉크가 점점 퍼져나가면서 결국엔 전체적으로 파랗게 물들게됩니다. 이것이 우리 일상에 볼 수 있는 흔한 diffusion의 과정인데, 어떻게 확산될지는 정확히 예측하기가 힘들어 확산을 확률적으로 예측하고자 하는 방법들이 있는데 이를 computer vision 분야에 적용한 것이 diffusion model입니다. 

diffusion model 설명

diffusion model을 설명하는 대표적 그림입니다. 원본 이미지에 정규분포 특성을 가진 Gaussian noise를 주입하여 데이터를 점점 흐려지게 하면 결국 pure noise 이미지가 될 것입니다. 이것이 forward diffusion process입니다.

단, noise가 주입되는 각 단계에서의 데이터는 정규분포를 따르며, Discrete Markov Process라고 가정합니다.

정규분포를 따른다는 것은 평균과 분산으로 데이터를 정의할 수 있다는 것입니다.

그리고 Discrete Markov Process라는 것은 쉽게 말해, 특정 상태(t의 상태)의 확률은 오직 이산적인 바로 직전(t-1)의 상태에만 의존한다는 특성입니다.

즉, t-1의 평균과 분산값을 이용해 t 상태의 데이터 분포를 알 수 있게됩니다.

이런 식으로 noise를 주입해서 각 단계별 데이터의 분포를 알 수 있다면, 반대의 경우도 가능하게 됩니다. 이것이 reverse denoising process입니다.

즉, 순수 noise로부터 이전상태로 되돌리는 역방향 분포를 계산하여 최종적으로 원래의 데이터를 복원하는 과정입니다. 이것을 딥러닝을 통해 원래 데이터와 복원된 데이터 간의 손실함수를 최소화하는 방식으로 학습시키는 것입니다. 

diffusion process(forward)와 denoising process(reverse)

정리하자면, 데이터를 일부러 망가뜨리고(forward diffusion process), 이를 다시 복원하는 확률함수를 학습하는(reverse denoising process) 것입니다. 이렇게 학습이 되면 noise로부터 특정 이미지를 생성해 낼 수 있게 됩니다. 시작을 noise로부터 시작하는 거죠. 이때 특정 이미지를 만들기 위해 자연어처리가 결합됩니다. CLIP [각주:3]이라는 인공신경망을 사용하는데 뒤에서 좀 더 자세히 설명하도록 하겠습니다. 

Latent space

Stable diffusion의 원리가 latent diffusion model을 이용한다고 말씀드렸죠. 위에서 설명드린 diffusion model을 이용하지만 픽셀로 구성된 이미지 대신 latent space라고 하는 잠재 공간에서 작업을 진행합니다. 

laten space(잠재 공간)는 데이터를 n가지 특성에 따라 분류해 놓은 n-dimensional space입니다. 예를 들어 바나나의 이미지는 노랗고, 길다는 특성의 공간상 어딘가에 위치할 수 있겠죠. 학습을 통해 많은 바나나 그림들은 latent space 상에서 비슷한 공간에 위치할 것입니다. 이렇게 픽셀로 이루어진 이미지 데이터를 latent space상의 숫자로 된 벡터값으로 압축, 단순화할 수 있습니다. 따라서 원본 이미지에 대해서 diffusion이 아닌 원본 이미지의 latent vector에 대해 diffusion을 하면 더 효율적으로 계산이 가능한 것입니다.

latent space를 t-SNE [각주:4]라는 방법을 이용해 시각화한 영상이 있어 아래에 첨부드립니다. 이해에 조금 더 도움이 될 것입니다. 

(출처 : Visualization of the DeepSDF latent space using t-SNE)

visualization of the latent space using t-SNE

Model architecture

Stable Diffusion의 이미지 생성 과정 (출처 : Alammar J. The Illustrated Stable Diffusion)

Stable Diffusion의 프로세스는 위의 그림과 같이 크게 3단계로 나눌 수 있습니다. 

1) Text Encoder (CLIPText)

먼저 사용자가 텍스트의 형태로 입력한 자연어 기반 프롬프트를 기계어로 변환하는 작업이 필요합니다. 이것이 Text Encoder인데 GPT에서 사용된 자연어처리 방식 Transformer 언어 모델을 사용합니다(GPT의 T가 Transformer 모델을 의미합니다). 바로 CLIP이라는 인공신경망을 사용하죠. 쉽게 말해 인간이 쓰는 자연어 텍스트를 기계가 이해할 수 있는 숫자로 된 벡터인 토큰으로 변환합니다. 위에서 설명드린 LAION-5B라는 이미지와 텍스트 캡션으로 이루어진 데이터 쌍으로 훈련합니다. 이미지 인코더와 텍스트 인코더의 조합이죠. 아래는 CLIP의 구조입니다. 

CLIP의 구조 (텍스트와 이미지 인코딩 조합으로 훈련된 모델) (출처 : OpenAI, CLIP: Connecting text and images)

2) Image Information Creator (U-Net + Scheduler)

위에서 Stable Diffusion은 latent diffuion model 기반이라고 말씀드렸습니다. 이 부분이 바로 그것에 해당합니다. 

임의의 원본 이미지가 VAE [각주:5]라는 인코더로 latent space 상에 다차원 숫자 구조로 변환되고, diffusion 과정(위에서 forward process)을 거쳐 노이즈로 변환됩니다. 이 노이즈를 우리가 원하는 그림 (정확히는 latent space상의 그림 정보)으로 변환되는 과정이 denoising 과정(reverse process)입니다. 이때 U-Net이라는 신경망과 Scheduler라는 알고리즘을 사용하는 겁니다. 

U-Net이라는 신경망은 아래 그림과 같이 U자 형태의 구조로 생겼다고 해서 지어진 이름이며, 의료용 사진의 해상도 개선을 위한 모델로도 많이 이용되었다고 합니다.

U-Net의 구조 (출처 : Olaf Ronneberger et.al., U-Net: Convolutional Networks for Biomedical Image Segmentation)

Contracting 수축 과정(Enconder)과 Expansive 팽창 과정(Decoder)을 거치며 latent space상의 벡터를 denoise 한다고 보시면 됩니다. 이때 사용자가 원하는 특정 조건의 그림을 뽑아내기 위해서 1)의 과정에서 CLIP으로 인코딩된 토큰값이 입력으로 추가로 들어갑니다. 반복된 U-Net step을 통해 최종적으로 사용자가 원하는 이미지 정보를 가진 latent vector를 출력합니다. 

3) Image Decoder (VAE)

2)에서 이미지가 VAE라는 Autoencoder를 통해서 latent space 상의 벡터로 변환된다고 말씀드렸습니다. 

마찬가지로 이번에는 반대로 2)의 마지막 단계에서 출력된 원하는 이미지 정보의 latent space상의 벡터를 다시 VAE를 통해 픽셀 이미지로 변환하는 과정입니다. 

 

이제 Stable Diffuion의 원리를 검색하면 흔히 나오는 아래의 그림을 좀 더 쉽게 이해할 수 있을 것 같습니다. 

Stable Diffusion 모델 아키텍쳐

정리하면 

  1. 사용자 텍스트 프롬프트를 받아 CLIP으로 토큰으로 변환, 임베딩 (위 그림에선 오른쪽 Conditioning 과정)
  2. 랜덤 픽셀 이미지를 VAE로 latent space로 인코딩하고 확산된 랜덤 노이즈를 U-Net에서 역확산(denoising), 이 때 conditioning 된 프롬프트 정보 토큰이 입력됨 (Crossattention)
  3. 반복된 denoising U-Net 단계를 거쳐 최종 latent space상의 정보 벡터를 VAE로 픽셀 이미지로 최종 디코딩.

 

마무리

  • Stable Diffusion은 학습된 모델이 공개된 오픈소스 딥러닝 Text-to-Image 모델입니다. 
  • Stable Diffusion은 noise로부터 이미지를 복원해 내는 Diffusion model의 원리를 이용합니다. 
  • Stable Diffusion은 픽셀 이미지가 아닌 latent space라는 압축된 잠재공간의 정보벡터를 diffusion, denoising 하는 latent diffusion model을 이용하기 때문에 좀 더 효율적이고 빠르다.
  • Stable Diffusion은 크게 CLIP, U-Net, VAE의 3가지 인공신경망으로 구성되어 있다.   

무료 오픈 소스 Stable Diffusion AI에 대해 알아보았습니다.

전체적인 원리를 이해하는데 조금은 도움이 되셨길 바라는 마음으로 이번 포스팅은 마무리하겠습니다. 

 

참고자료

  1. Ludwig-Maximilian University of Munich [본문으로]
  2. Large-Scale Artificial Intelligence Open Network : 대규모 머신러닝 학습 모델, 데이터 세트를 제공하는 것을 목표로 한 비영리 조직.  [본문으로]
  3. Contrastive Language-Image Pre-training [본문으로]
  4. 고차원의 복잡한 데이터를 2차원으로 차원 축소하는 방법 [본문으로]
  5. Variational AutoEncoder [본문으로]