그림으로 이해하는 스테이블 디퓨전

Jonas Kim
16 min readApr 1, 2023

--

제이 알라마르Jay Alammar‘The Illustrated Stable Diffusion’를 번역했습니다.

다른 번역본: 중국어, 베트남어.

( V2 2022년 11월: 순방향 확산에 대한 보다 정확한 설명을 위해 이미지를 업데이트했습니다. 이번 버전에는 몇 장의 이미지가 추가되었습니다. )

AI 이미지 생성은 최근 (저를 포함하여) 사람들의 이목을 끌고 있는 AI 기능입니다. 텍스트 설명에서 인상적인 이미지를 만들어내는 능력은 마법 같아서 인간이 예술을 창조하는 방식에 커다란 변화를 가져올 것입니다. 스테이블 디퓨전Stable Diffusion의 등장은 이미지 품질은 물론 속도가 빠르고 리소스 및 메모리 요구량이 상대적으로 낮은 고성능 모델을 대중에게 제공했다는 점에서 이러한 발전 과정에서 굉장히 중요한 이정표입니다.

AI 이미지 생성을 사용해 보면 이것이 어떻게 작동하는지 궁금해집니다. 이 글에서 스테이블 디퓨전의 작동 방식을 간략하게 소개합니다.

스테이블 디퓨전은 다양한 방식으로 사용할 수 있다는 점에서 활용도가 높습니다. 우선 텍스트만으로 이미지를 생성하는 방법(text2img)에 대해 중점적으로 살펴봅시다. 위 이미지는 텍스트 입력 예시와 그 결과로 생성된 이미지를 보여줍니다(실제로 사용된 전체 프롬프트는 여기 있습니다). 텍스트를 이미지로 변환하는 것 외에 또 다른 주요 사용 방법은 이미지를 변경하는 것입니다(따라서 입력은 텍스트 + 이미지입니다).

이제 구성 요소, 상호 작용 방식, 이미지 생성 옵션 및 파라미터의 의미를 설명하기 위해 내부 구조를 살펴봅시다.

스테이블 디퓨전의 구성 요소

스테이블 디퓨전은 다양한 구성 요소와 모델로 구성된 시스템입니다. 단일한 모델이 아닙니다.

내부를 살펴보면, 먼저 텍스트 정보를 텍스트 속 아이디어에 대한 수치적 표현으로 바꾸어주는 텍스트 이해 구성 요소가 있습니다.

개략적인 모습 먼저 조망하고 머신러닝에 대한 상세한 내용은 글 후반부에서 다룰 예정입니다. 다만 이 텍스트 인코더는 특수한 트랜스포머Transformer 언어 모델(정확히 말하면 클립CLIP 모델의 텍스트 인코더)이라고 설명드립니다. 이 모델은 입력 텍스트를 받아 텍스트의 각 단어 또는 토큰을 나타내는 일련의 숫자 목록(토큰당 벡터)을 출력합니다.

그런 다음 해당 정보는 그 자체로 몇 가지 구성 요소로 이루어진 이미지 생성기에 제공됩니다.

이미지 생성기는 크게 두 단계를 거칩니다.

1- 이미지 정보 생성기

해당 구성 요소가 스테이블 디퓨전의 성공 비결입니다. 이전 모델에 비해 성능이 크게 개선된 부분입니다.

이 구성 요소는 이미지 정보를 생성하기 위해 다수의 단계로 실행됩니다. 스테이블 디퓨전 인터페이스 또는 라이브러리의 단계 반복 횟수 파라미터는 기본값이 보통 50 또는 100입니다.

이미지 정보 생성기는 이미지 정보 공간(또는 잠재 공간)에서 작동합니다. 글 후반부에서 이것이 무얼 의미하는지 자세히 설명하겠습니다. 이 속성으로 인해 픽셀 공간에서 작동하는 과거의 확산 모델보다 속도가 빨라졌습니다. 기술적으로 해당 구성 요소는 유넷UNet 신경망과 스케줄링 알고리즘으로 이루어집니다.

확산Diffusion’이라는 단어는 바로 이 구성 요소에서 일어나는 일을 설명합니다. 다음 구성 요소인 이미지 디코더를 통해 최종적으로 고품질 이미지가 생성되도록 정보를 단계적으로 처리합니다.

2- 이미지 디코더

이미지 디코더는 정보 생성기로부터 받은 정보로 이미지를 만듭니다. 최종 픽셀 이미지를 생성하기 위해 프로세스가 끝날 때 딱 한 번 실행됩니다.

이를 통해 스테이블 디퓨전을 이루는 세 가지 주요 구성 요소(각각 별도의 신경망)를 확인할 수 있습니다.

  • 텍스트 인코딩을 위한 클립텍스트ClipText.
    입력: 텍스트.
    출력: 77개의 토큰 임베딩 벡터, 각각 768개의 차원.
  • 정보(잠재) 공간에서 정보를 점진적으로 처리 또는 확산시키는 유넷 + 스케줄러.
    입력: 텍스트 임베딩과 노이즈로 이루어진 다차원 배열(텐서라고도 부르는 구조화된 숫자 목록)의 초기값.
    출력: 처리된 정보 배열
  • 처리된 정보 배열을 사용하여 최종 이미지를 만드는 오토인코더AutoEncoder의 디코더.
    입력: 처리된 정보 배열(차원: (4, 64, 64))
    출력: 결과 이미지(차원: (3, 512, 512), 이것은 (R/G/B, 폭, 높이)를 뜻합니다.)

확산이란 무엇입니까?

확산은 분홍색 ‘이미지 정보 생성기’ 구성 요소 내부에서 일어나는 프로세스입니다. 입력 텍스트를 나타내는 토큰 임베딩과 이미지 정보 배열(잠재적 이미지라고도 함)의 무작위 초기값이 포함된 이 프로세스는 이미지 디코더가 최종 이미지를 만드는 데 사용하는 정보 배열을 생성합니다.

이 프로세스는 단계적으로 진행됩니다. 단계를 거칠 때마다 더 많은 연관 정보가 추가됩니다. 프로세스를 직관적으로 파악하기 위해 무작위 잠재 이미지 배열을 살펴보고 그것이 어떻게 시각적인 노이즈로 바뀌는지 확인해 보겠습니다. 이 경우 눈으로 확인하기 위해서 이미지 디코더를 통과시켜야 합니다.

확산은 다수의 단계로 이루어지며 각 단계는 입력 잠재 이미지 배열에 대해 작동합니다. 입력 텍스트 그리고 모든 학습 이미지로부터 모델이 포착한 전체 적인 시각 정보와 유사하게 또 다른 잠재 이미지 배열을 생성해 냅니다.

이러한 잠재 이미지 집합을 시각화하여 각 단계마다 어떤 정보가 추가되는지 확인할 수 있습니다.

이 과정은 보기만 해도 탄성이 절로 나옵니다.

여기서는 2단계와 4단계 사이에 특히 놀라운 일이 일어납니다. 마치 노이즈 속에서 윤곽이 드러나는 것 같습니다.

확산의 작동 원리

확산 모델로 이미지를 생성하는 아이디어의 핵심은 강력한 컴퓨터 비전 모델을 갖추고 있다는 사실에 기반합니다. 충분히 큰 데이터 세트가 주어지면 해당 모델은 복잡한 연산을 학습할 수 있습니다. 확산 모델은 다음과 같이 문제를 설정하여 이미지 생성에 접근합니다.

이미지가 있고 약간의 노이즈를 생성하여 해당 이미지에 추가한다고 가정해 보겠습니다.

이제 이것을 훈련 샘플로 간주할 수 있습니다. 동일한 방식을 사용하여 이미지 생성 모델의 핵심 구성 요소를 훈련하기 위해 수많은 훈련 샘플을 만들어낼 수 있습니다.

이 예제에서는 이미지(0 수준의 크기, 노이즈 없음)부터 완벽한 노이즈(4 수준의 크기, 완벽한 노이즈)에 이르기까지 몇 가지 수준의 노이즈 크기를 보여줍니다. 이미지에 추가할 노이즈 크기는 쉽게 제어할 수 있으므로 수십 단계로 나누어 훈련 데이터 세트의 모든 이미지에 대해 각 이미지당 수십 장의 훈련 샘플을 생성할 수 있습니다.

이 데이터 세트를 사용하여 노이즈 예측기를 훈련하고 특정한 설정에서 실행했을 때 실제로 이미지를 생성하는 훌륭한 노이즈 예측기를 얻을 수 있습니다. 머신러닝 경험이 있다면 이러한 훈련 단계가 익숙할 것입니다.

이제 이미지를 생성하는 방법을 살펴보겠습니다.

노이즈 제거를 통한 이미지 페인팅

학습된 노이즈 예측기는 노이즈가 있는 이미지와 노이즈 제거 단계의 수를 입력받아 노이즈 슬라이스를 예측할 수 있습니다.

샘플링된 노이즈를 예측하여 이미지에서 노이즈를 빼면 모델이 학습한 이미지와 더 유사한 이미지를 얻을 수 있습니다(정확히 이미지 그 자체가 아니라 픽셀 배열의 분포, 즉 하늘은 보통 파란색이고 땅 위에 있으며 사람은 두 눈을 가지고 있고 고양이는 뾰족한 귀를 갖고 특정한 모양을 평범하게 하고 있는 픽셀 배열의 세계).

훈련 데이터 세트가 미학적으로 아름다운 이미지로 구성된 경우(예: 스테이블 디퓨전이 훈련한 라이온 애스테틱스LAION Aesthetics)라면, 결과 이미지도 미학적으로 아름다운 경향이 있습니다. 로고 이미지로 훈련하면 로고 생성 모델이 생성됩니다.

이것으로 노이즈 감소 확산 확률 모델에서 기술된 확산 모델에 의한 이미지 생성 부분의 설명을 마칩니다. 이제 확산에 대한 이해를 바탕으로 스테이블 디퓨전뿐만 아니라 Dall·E 2와 구글의 이미젠Imagen의 주요 구성 요소를 알게 되었습니다.

지금까지 설명한 확산 프로세스는 텍스트 데이터를 사용하지 않고 이미지를 생성한다는 점에 유의하세요. 따라서 이 모델을 배포하면 멋진 이미지가 생성되겠지만 피라미드 이미지일지, 고양이 이미지일지 아니면 전혀 다른 이미지일지 제어할 방법은 없습니다. 다음 절에서는 모델이 생성하는 이미지 유형을 제어하기 위해 프로세스에 텍스트를 통합하는 방법에 대해 설명드리겠습니다.

속도 향상: 픽셀 이미지 대신 압축 (잠재 이미지) 데이터에 대한 확산

이미지 생성 프로세스의 속도를 높이기 위해 스테이블 디퓨전 논문에서는 픽셀 이미지 자체가 아닌 이미지의 압축된 버전에서 확산 프로세스를 수행합니다. 논문에서는 이것을 ‘잠재 공간으로의 이동’이라고 부릅니다.

이 압축(및 이후 압축 해제/페인팅) 과정은 오토인코더를 통해 수행됩니다. 오토인코더는 인코더를 사용하여 이미지를 잠재 공간으로 압축하고 디코더를 사용하여 압축된 정보만으로 이미지를 재구성합니다.

이제 압축된 잠재 이미지에서 순방향 확산 프로세스가 수행됩니다. 노이즈 슬라이스는 픽셀 이미지가 아닌 이러한 잠재 공간에 적용된 노이즈 슬라이스입니다. 따라서 노이즈 예측기는 실제로 압축된 표현(잠재적 이미지 공간)에서 노이즈를 예측하도록 훈련됩니다.

(오토인코더의 인코더를 사용한) 순방향 프로세스는 노이즈 예측기를 훈련하기 위한 데이터를 생성하는 방법입니다. 학습이 완료되면 (오토인코더의 디코더를 사용한) 역방향 프로세스를 실행하여 이미지를 생성할 수 있습니다.

이 두 가지 흐름은 LDM 및 스테이블 디퓨전 논문의 그림 3에 나와 있습니다.

이 그림에는 ‘조건화’ 구성 요소가 추가로 표시되어 있는데, 이 경우 모델이 생성할 이미지를 설명하는 텍스트 프롬프트입니다. 이제 텍스트 구성 요소를 자세히 살펴보겠습니다.

텍스트 인코더: 트랜스포머 언어 모델

텍스트 프롬프트를 받아 토큰 임베딩을 생성하는 언어 이해 구성 요소로 트랜스포머 언어 모델을 사용합니다. 공개된 스테이블 디퓨전 모델에서는 클립텍스트(GPT 기반 모델)를 사용하지만, 논문에서는 버트BERT를 사용했습니다.

언어 모델의 선택은 이미젠 논문에서 매우 중요한 것으로 나타났습니다. 더 큰 언어 모델로 교체하는 것이 더 큰 이미지 생성 구성 요소로 교체하는 것보다 생성 이미지 품질에 더 많은 영향을 미쳤습니다.

더 크고 더 우수한 언어 모델은 이미지 생성 모델의 품질에 상당한 영향을 미칩니다. 출처: 사하리아Saharia 등이 쓴 구글 이미젠 논문. 그림 A.5.

스테이블 디퓨전 초기 모델은 오픈AI에서 공개한 클립텍스트 사전 학습 모델을 사용했습니다. 이후 모델들은 클립 변종이지만 새로 공개되고 규모가 훨씬 큰 오픈클립OpenCLIP으로 변경될 가능성이 있습니다. (2022년 11월 업데이트: 실제로, 스테이블 디퓨전 V2는 오픈클립을 사용합니다) 이 새로운 배포판에는 파라미터 6,300만 개의 클립텍스트와는 달리 파라미터 최대 3억 5,400만 개 규모의 텍스트 모델이 포함되어 있습니다.

클립 학습 방법

클립은 이미지와 캡션의 데이터 세트로 학습됩니다. 4억 개의 이미지와 캡션으로만 구성된 다음과 같은 데이터 세트를 상상해 보세요.

실제로 클립은 웹에서 크롤링한 이미지와 해당 이미지의 ‘alt’ 태그를 학습했습니다.

클립은 이미지 인코더와 텍스트 인코더의 조합입니다. 훈련 과정은 이미지와 캡션을 함께 입력한다고 생각하면 간단합니다. 이미지와 캡션을 각각 이미지 인코더와 텍스트 인코더로 인코딩합니다.

그런 다음 코사인 유사도를 사용하여 결과 임베딩을 비교합니다. 학습 프로세스를 처음 시작하면 텍스트가 이미지를 올바르게 설명하더라도 유사도가 낮게 나타날 것입니다.

두 모델을 업데이트하여 다음으로 임베딩할 때 결과 임베딩이 비슷해지도록 만듭니다.

이 작업을 데이터 세트 전체에 걸쳐 대규모 배치 크기로 반복하면 인코더가 개 이미지와 ‘개의 사진’이라는 문장의 임베딩이 유사하게 생성되도록 만듭니다. 워드투벡word2vec과 마찬가지로 훈련 과정은 서로 매칭되지 않는 이미지와 캡션의 음성 샘플을 포함해야 하며, 모델은 이들에게 낮은 유사도 점수를 부여해야 합니다.

이미지 생성 프로세스에 텍스트 정보 입력하기

텍스트를 이미지 생성 프로세스의 일부로 만들려면 텍스트를 입력으로 사용하도록 노이즈 예측기를 조정해야 합니다.

이제 데이터 세트에 인코딩된 텍스트가 포함됩니다. 우리는 잠재 공간에서 작업하기 때문에 입력 이미지와 예측된 노이즈가 모두 잠재 공간에 있습니다.

유넷에서 텍스트 토큰이 어떻게 사용되는지 더 잘 이해하기 위해 유넷 내부를 자세히 살펴봅시다.

(텍스트가 제외된) 유넷 노이즈 예측기의 레이어

먼저 텍스트를 사용하지 않는 확산 유넷을 살펴봅시다. 입력과 출력은 다음과 같습니다.

내부를 들여다보면 다음을 알 수 있습니다:

  • 유넷은 잠재 이미지 배열을 변환하는 일련의 레이어로 구성되어 있습니다.
  • 각 레이어는 이전 레이어의 출력에 대해 작동합니다.
  • 일부 출력은 (잔차 연결을 통해) 네트워크의 추후 처리에 전달됩니다.
  • 시간 단계는 시간 단계 임베딩 벡터로 변환되며, 이것이 레이어에서 사용됩니다.

텍스트가 포함된 유넷 노이즈 예측기의 레이어

이제 텍스트에 대한 어텐션을 포함하도록 이 시스템을 변경하는 방법을 살펴보겠습니다.

텍스트 입력(전문 용어: 텍스트 조건화)을 지원하기 위해 필요한 시스템의 주요 변경 사항은 레스넷ResNet 블록 사이에 어텐션 레이어를 추가하는 것입니다.

레스넷 블록이 텍스트를 직접 확인하지는 않습니다. 하지만 어텐션 레이어는 잠재 이미지에 텍스트 표현을 병합합니다. 그 다음에 오는 레스넷이 통합된 텍스트 정보를 처리하는데 다시 활용됩니다.

결론

이 글을 통해 스테이블 디퓨전의 작동 원리를 직관적으로 이해하셨기를 바랍니다. 이외에도 많은 개념이 얽혀 있지만, 위의 구성 요소에 익숙해지면 이해하기 훨씬 쉬울 것입니다. 아래 참고 자료는 제가 유용하다고 생각하는, 다음 차례로 볼만한 훌륭한 자료 모음입니다. 수정 사항이나 피드백이 있으면 트위터로 저에게 연락해 주세요.

참고 자료

감사의 말

이 글의 이전 버전에 대한 피드백을 제공해 주신 로빈 롬바흐, 제레미 하워드, 하멜 후세인, 데니스 소머스, 얀 시디아킨, 프레디 바거스, 안나 골루베바, 그리고 AI를 위한 코히어Cohere For AI 커뮤니티에 감사드립니다.

기여

이 문서를 개선할 수 있도록 도와주세요. 가능한 방법은 다음과 같습니다.

  • 트위터 또는 풀 리퀘스트로 피드백이나 수정 사항을 보내주세요.
  • 시각적 자료에 캡션과 대체 텍스트를 제안하여 문서의 접근성을 높이는 데 도움을 주세요(풀 리퀘스트로 보내주는 것이 제일 좋습니다).
  • 다른 언어로 번역하여 블로그에 게시합니다. 링크를 보내주시면 여기에 링크를 추가해 드리겠습니다. 이전 문서의 번역자들은 번역 과정을 거치면서 개념을 얼마나 더 깊이 이해하게 되었는지 항상 언급했습니다.

논의

이미지 생성 모델과 언어 모델의 중첩에 대해 토론하고 싶으시다면 디스코드Discord의 코히어Cohere 커뮤니티의 #images-and-words 채널에 들어와 자유롭게 글을 게시해 주세요. 이 채널에서는 다음과 같이 중첩되는 영역에 대해 논의합니다.

  • 양질의 이미지 생성 프롬프트를 생성하기 위해 언어 모델 미세 조정하기
  • LLM을 사용하여 주제를 분할하고 이미지 캡션 프롬프트의 구성 요소 스타일 지정하기
  • 이미지에서 프롬프트로 전환하기(클립 인터로게이터Clip Interrogator와 같은 도구 사용)

인용

이 저작물이 연구에 도움이 되었다면 다음과 같이 인용해 주세요.

@misc{alammar2022diffusion, 
title={The Illustrated Stable Diffusion},
author={Alammar, J},
year={2022},
url={https://jalammar.github.io/illustrated-stable-diffusion/}
}

2022년 10월 4일에 작성됨

--

--