GAN Generative Adversarial Network
생성자와 판별자라는 두 개의 신경망을 이용해서 이미지를 생성하는 기술이다.
생성자: 자 여기 고양이 이미지를 가져왔어(내가 만듬)
판별자: 나 진짜 고양이 그림 있는데, 이거 뭐임? 가짜 아님?
생성자: 응 속을때까지 만들께
전문가의 경쟁을 기반으로 성능을 뽑겠다 라는 구조인데,
주축이 둘이다 보니깐 서로 균형을 맞추기가 어렵다.
위조가 너무 뛰어나거나 판별이 너무 떨어지면 제대로 학습이 이루어지지 않는 '학습 불안정성' 문제가 있다.
어차피 요즘은 Stable diffusion이 주류이기 때문에 굳이 다루지는 않겠다.
Stable diffusion
사진에 노이즈 추가 훈련: 사진을 준비하고 노이즈를 추가하면서 완전히 알아보지 못할 '지글지글 노이즈 이미지'를 만들어버린다. 이 과정에서 랜덤 노이즈를 얻게 된다.
노이즈 제거 훈련: '지글지글 노이즈 이미지'에서 어떤 노이즈를 제거해야 '고양이 사진'이 되는지 학습한다.
새로운 이미지 생성: '랜덤 노이즈'와 함께 '노이즈 제거 기술'을 통해 이미지를 만든다. 그냥 제거하는게 아니라 "우주복", "고양이"라는 커맨드가 있으면 그 커맨드에 맞게 노이즈를 깍아나간다.
위 과정은 아래와 같이 표현이 가능한데 중요한건 중앙에 NOISE가 생성되는 것이다.

우리가 이미지 생산하다고 지지리 복고 하는건 중앙 NOISE를 가지고 한다는 것이다.
천천히 그라데이션과 같이 이미지가 점점 노이즈에 잡아먹히듯이, 노이즈가 확산(diffusion)되고 이미지 복원시 역확산 과정을 거치기 때문에 디퓨전 모델이라고 불린다.
Stable은? 걍 회사명이다.
디퓨전 모델?
기존에도 여러 디퓨전 모델이 존재했다.
다만 Stable의 디퓨전 모델이 유명해진 이유는 연산 방식에 있다.
이미지 공간은 생각보다 엄청 크다.
512x512 이미지를 생각해보자 하나의 이미지에 262,144개의 픽셀이 있다.
그리고 각 픽셀은 RGB 3개의 색 채널을 가지고 있다.
즉 하나의 이미지에는 786,432의 차원을 가지고 있다는 것이다.
(추가적인 복합 특징 정보를 담는 영역도 따로 있긴하다)
텍스트 생성은? 방식마다 다르지만 50,000~100,000 정도로 이루어진 단어 어휘사전에서 다음 적절한 단어를 선택하는 것이다.
"나는 오늘 점심을 ___"
즉 선형 구조를 가진다는 것이다.
(물론 어휘 차원, 임베딩 차원 등등 별개에 차원이 있는걸로 알지만, 중요한건 아니니 넘어가자)
텍스트가 선형 구조를 가질때 이미지는? 전 차원에 대한 복잡한 고려가 필요하다.
예를들어 코가 위에 달렸으면 입은 그 아래에 달려야하지 않겠는가
즉 텍스트 생성은 생성하는 단어 하나에 대한 선택지를 위해 순차적 선택을 할 때
이미지 생성은 이미지를 구성하는 모든 픽셀의 색상 값을 동시에 결정하는 공간적 조합을 고려한다.
Stable Diffusion은?
애는 연산을 조금 효율적으로 하려한다.
거대한 벽화(512x512 픽셀)을 그리는 대신 **작은 스케치북(64x64 픽셀)**에 밑그림을 그리는 방식을 쓴다.
이를 잠재 공간이라고 부르는데 스케치북이 작으면 작업이 빨라지지만 너무 많은 디테일을 담기 어렵다.
(참고로 진짜 그림을 그리는건 아니고 압축된 핵심 데이터를 생성한다)
"작은 스케치북에 밑그림 그리는 거면 디테일은 어디서 챙겨요?"
VAE(Variational Autoencoder)라는 개념이 존재한다.
잠재 공간에서 생성되는 64x64 데이터는 고화질 이미지 생성을 위한 정보가 압축된 설계도다
VAE는 수백만 장의 고화질 이미지를 가지고 미리 특별 훈련을 받는다.
압축 훈련(Encoder): 고화질 이미지의 핵심 정보(형태, 질감, 색상, 구도 등)를 손실 없이 64x64 크기의 잠재 공간 데이터로 압축하는 방법을 배운다.
복원 훈련(Decoder): 설계도에 압축된 핵심 정보를 원래의 고화질 방법으로 복원하는 방법을 배운다.
즉 VAE는 단순히 이미지를 확대나 업스케일링하는게 아닌 모델과 복원 전문가 사이에 핵심 정보 교환이다.
텍스트 인코더
사실 순서상 따지고보면 먼저 접하는 요소지만 지금에 와서 설명하자면
"우리가 입력한 텍스트를 어떻게 설계도로 바꿀 것인가"의 문제가 있다.
컴퓨터는 고양이를 모른다 숫자를 이해할 뿐이다.
이러한 문제에 대표적인 해결방법을 우리는 이미 알고있다. 바로 임베딩이다.
CLIP: 스테이블 디퓨전의 텍스트 인코더
CLIP은 다음과 같은 방식으로 동작한다.
방대한 자료 학습: 이미지와 그 이미지에 달린 텍스트 설명 쌍을 학습한다.
(고양이 사진) - "귀여운 고양이가 소파 위에서 잠자고 있다."
(소고기 떡국 사진) - "대충 떡이 있고 계란 지단이 아닌 계란이 있고...."
연관성 찾기 훈련: CLIP은 두 개의 뇌를 가지고 동시에 훈련을 진행한다.
이미지 뇌: 사진을 보고 숫자 정보(이미지 벡터)로 요약
텍스트 뇌: 텍스트 설명을 보고 숫자 정보(텍스트 벡터)로 요약하는 법
2가지 종류의 전문가가 협업을 하는 모습을 보니 GAN이 생각 날 수 있지만 중요한건 여기서는 서로 데이터를 맞추는 과정이 있다.
경쟁이 아닌 협업이기 떄문에 효율이 잘 나온다.
위 과정을 수억번 반복하면 CLIP은 단어를 번역하는 것을 넘어, 단어가 가진 **'개념', '분위기', '느낌'**까지 숫자로 표현하는 능력을 얻게 된다.
잠재공간
아까 텍스트 인코더로 우리의 프롬프트가 번역되어 만들어진 **'창작 설계도'**를 받아서 그림을 그릴 준비를 하는 공간이다.
이미 설명된 개념이니 넘어가고, 지금 다시 이야기하는 이유는 잠재 공간에서 64x64 정보를 생성하는데 세부적인 전문가가 있기 떄문이다.
개념을 조정하자면 잠재 공간은 사실상 노이즈로 가득 찬 작업실이다.
인코더가 생성한 창작 설계도를 가지고 **작업실(잠재공간)**에서 작업을 할 메인 아티스트가 필요하다.
U-Net과 스케줄러: 노이즈를 깍아봅시다.
이 단계는 한번이 아닌 계속 반복되는 **핵심 작업 루프(Loop)**다.
먼저 메인 아티스트인 U-Net이 현재의 노이즈 캔버스와 창작 설계도를 동시에 보고 예측을 한다
"설계도에 고양이를 만들려면 이 노이즈 덩어리에서 이 부분의 노이즈를 제거해야해"
U-Net은 노이즈를 직접 지우지는 않는다. 그저 예측할 뿐이다.
그 다음은 스케줄러의 실행이다.
작업 루프라고 스케줄러는 반복해주세요~ 가 아니다.
스케줄러는 예측을 넘겨받고 실제로 노이즈를 캔버스에서 깍아낸다.
"이번 단계에서는 내가 정한 방식(Euler a)에 따라서 예측된 노이즈의 10%만 부드럽게 제거해서 다음 단계로 넘어가자"
이러한 과정은 우리가 설정한 스텝만큼 반복되며 노이즈가 제거된다.
Step 1: 노이즈 100% -> 95%
Step 2: 노이즈 95% -> 90%
...
Step 20: 노이즈 5% → 노이즈 0% (완성된 설계도)
설계도가 완성되면? 찍어야지
이제 설계도가 완성되면 아까 말했단 VAE 디코더를 통해서 고화질 이미지가 완성되는 것이다.
심화 개념으로 들어가면 수식으로 복잡하고, 저마다의 방식도 다른데 나중에 기회가 되면 좀 더 다뤄보고자 한다.