Generative Model
🔎 생성형 모델이란?
사람의 상상력처럼 눈에 안보이는 것까지 만들어내는 모델을 의미한다.
입력만 보고 비슷한 결과물을 새로 생성하는 능력을 가진다.
🔎 GAN이란?
Generator와 Discriminator가 적대적으로 학습(Adversarial Learning)하면서 점점 성능이 개선되는 모델이다.
Generator는 생성자로 데이터를 만들어내는 역할을 한다.
Discriminator는 판별자로 그 데이터가 진짜인지 가짜인지 구분하는 역할을 한다.
❗️ 생성자는 판별자를 속이기 위해 점점 더 정교한 가짜 데이터를 생성하고, 판별자는 가짜 데이터와 진짜 데이터를 더욱 잘 구별하는 방향으로 학습하는 것이다.
생성형 모델 vs 분별 모델
🔸 분별 모델
우리가 흔히 아는 분류기(Classifier)가 분별 모델에 해당된다.
입력 x로부터 정답 y를 예측하는데, 학습 할 때 입력과 정답인 x,y가 다 필요하고, 지도학습을 기반으로 한다.
🔹 생성 모델
데이터를 생성할 수 있도록 입력 x 자체를 모델링 하거나, 입력x와 출력y의 관계 전체를 학습한다.
학습은 복잡하지만, 훨씬 더 유연하고 다양한 데이터를 생성할 수 있다.
x자체를 학습한다는 것은 확률 분포 P(x)를 학습한다는 의미이다.
x,y의 관계 전체를 학습한다는 것은 P(x|y) 혹은 P(x,y)를 학습한다는 의미이다.
P(x|y) : 조건부 생성 모델 - y가 주어졌을 때 어떤 x가 나올 확률
P(x,y) : 공동 확률 분포 - x와 y가 함께 등장할 확률

GAN : Generative Adversarial Network
기본 개념
GAN은 두 신경망의 대결 구조를 통해 학습한다.
GAN의 핵심은 두 모델이 서로 경쟁하면서 동시에 서로 성장한다는 것이다.
판별자는 더 잘 구분하려고 하고, 생성자는 더 정교한 가짜 데이터를 생성해 속이려고 한다.
🔸 생성자 : Generator
가짜 이미지 G(z)를 만들고, 판별자가 이를 진짜(1)라고 착각하도록 학습시킨다.
즉, D(G(z))가 1에 가까워지도록 속이는 것이 목표이다.
🔹 판별자 : Discriminator
진짜 이미지 x는 1로 분류하고 (D(x)=1), 가짜 이미지 G(x)는 0으로(D(G(z))) 분류한다.
즉, 진짜와 가짜를 정확히 구분하는 것이 목표이다.

Generator의 역할
랜덤 벡터 z(노이즈-저차원 랜덤 벡터)를 입력 받아서, 진짜 데이터와 비슷한 가짜 데이터를 생성하는 것이 목적이다.
이 가까 데이터는 확률 분포 P(x)와 최대한 비슷하도록 생성되어야 한다.
Discriminator의 역할
생성자가 만든 이미지가 진짜인지 가짜인지 판별하는 역할을 수행한다.
실제 이미지나 생성된 가짜 이미지를 입력하고, 판별자는 해당 이미지가 진짜라고 판단되면 1을, 가짜라고 판단되면 0을 출력한다.
초반에는 가짜 이미지가 가짜라는 것이 티가 많이 나서 쉽게 판별이 가능하지만, 생성자가 학습할수록 점점 진짜 이미지와 비슷해지기 때문에 판별자도 점점 더 정교한 판단 기준을 배울 수 있게 된다.
Training for Discriminator
🟥 Feedforward : 순전파
노이즈 벡터 z를 사용하여 생성자가 가짜 이미지 G(z)를 생성한다.
판별자는 두 이미지를 평가한다.
D(real x) → 진짜 이미지면 1
D(G(z)) → 가짜 이미지면 0
📍 즉, D는 진짜는 1, 가짜는 0이 되도록 훈련되는 것이다.

🟪 Backpropagation : 역전파
판별자는 다음 Loss를 최대화하는 방향으로 기울기를 조절한다.
쉽게 풀어서 써보자면, 진짜 이미지는 1에 가깝게 만들고 가짜 이미지는 0에 가깝게 만들도록 하는 것이다.
진짜 이미지를 1에 가깝게 만드는 것은 logD(x), 가짜 이미지를 0에 가깝게 만드는 것은 log(1-D(G(z)))라고 생각하면 된다.
가짜 데이터와 진짜 데이터는 같은 가중치를 가지고 있으나, 은닉층과 출력은 다른 값을 가지기 때문에, 각각의 기울기를 따로 계산하고 나서 합친 후에 업데이트하면 된다.
Training for Generator
🟥 Feedforward : 순전파
랜덤 노이즈 벡터 z를 넣으면 생성자는 가짜 이미지를 생성하여 판별자에게 전달한다.

🟪 Backpropagation : 역전파
기존의 방식은 아래와 같다.
판별자가 해당 값을 0이라고 예측하게 하는 것이다.
따라서 해당 값을 최소화 하는 방향으로 기울기를 감소시키면 된다.
기존의 방식은 판별자의 성능이 너무 좋으면 D(G(z))가 0이 되며 log 1이 되므로, 최종적으로 해당 값이 0이된다.
그럼 기울기가 사라지는 기울기 소실 문제가 발생하여 학습이 되지 않는다는 문제점이 생긴다.
따라서 요즘은 아래와 같은 방법을 흔히 사용한다.
판별자가 진짜라고 착각하게 만드는 것이다.
따라서 해당 값을 최대화 하는 방향으로 기울기를 증가시키면 된다.
이 경우 판별자가 성능이 너무 좋아도 log D(G(z))는 여전히 작은 음수이기 때문에 기울기가 살아있게 된다.
따라서 위의 방법보다는 학습이 더 안정적이고 빠르다.
💡 정리

DCGAN : Deep Convolution GAN
❌ GAN의 단점
GAN은 학습이 매우 불안정하고, 학습률의 영향을 많이 받는다.
학습률을 높게 해주면 거의 모든 경우에 학습에 실패하게 된다.
🔎 개선된 GAN
🔸 Salimans 2016
특징 매칭, 가상 배치 정규화, 미니배치 분별 등의 기법을 적용하였다.
P(x) 대신 P(x,y)를 추정하여 레이블이 있는 샘플을 생성하고, 준지도 학습에 활용한다.
🔹 DCGAN
기존의 GAN은 FC Layer (DMLP)를 사용했는데, DCGAN은 DMLP 대신 CNN 구조를 사용한다.
일반적인 CNN은 이미지를 입력하면 벡터를 출력하는데, DCGAN의 생성자는 반대방향으로 동작한다.
벡터를 입력 받고 업샘플링을 해서 3x64x64x RGB 이미지를 출력한다.
저차원 노이즈 벡터를 실제 이미지처럼 확대하는 방식으로 동작하는 것이다.
GAN을 안정적으로 학습시키기 위한 룰도 함께 제시하였는데, 배치 정규화나 FC Layer 제거, LeakyReLU사용 등이 있다.
대부분의 경우 DCGAN은 GAN보다 더 잘 학습되고, 더 예쁘고 자연스러운 이미지를 생성한다.
🔎 DCGAN의 구조
1️⃣ Pooling Layer 제거
DCGAN은 Pooling Layer를 삭제하고 Conv를 통해 다운 샘플링, Transpose Conv로 업샘플링을 수행한다.
풀링은 정보 손실이 커서 GAN 학습을 불안정하게 만들 수 있기 때문이다.
2️⃣ 배치 정규화 사용
생성자와 판별자 내부에 배치 정규화도 사용한다.
단, 생성자의 출력층과 판별자의 입력층에는 적용하지 않는다.
배치 정규화를 사용하여 내부 분포를 일정하게 유지해서 학습 안정성을 높여준다.
3️⃣ FC Layer 제거
FC Layer를 제거하고, Global Average Pooling을 사용한다.
FC Layer는 파라미터가 너무 많고, 과적합의 위험이 있다.
GAP를 사용하면 구조 단순화와 일반화 성능을 높일 수 있다.
4️⃣ Generator의 활성화 함수
생성자의 활성화 함수는 중간 레이어에는 ReLU를, 마지막 출력층에는 tanh를 사용한다.
tanh를 사용하는 이유는 출력 이미지를 [-1,1] 범위로 맞춰 정규화된 이미지를 만들기 위함이다.
5️⃣ Discriminator의 활성화 함수
판별자의 활성화 함수는 Leaky ReLU를 사용한다.
ReLU는 음수 입력을 다 0으로 만들기 때문에 죽은 뉴런이 생기기 쉽다. LeakyReLU는 음수에도 작은 기울기를 부여하기 때문에 학습이 더 잘된다.

🔎 DCGAN의 학습 과정
정답 레이블이 부족한 상황에서도 GAN을 잘 써먹을 수 있다.
GAN을 반지도 학습에 응용할 수 있다.
비지도 학습으로 GAN을 학습시킨 뒤, 판별자의 중간 레이어 출력값을 통해 특징을 추출한다.
이미지 벡터도 연산 가능하며, 이렇게 생성된 이미지를 학습 데이터로도 사용 가능하다.
DiscoGAN : Discover Cross-Domain Relations with GAN
🔎 Disco GAN이란?
DiscoGAN이란 서로 다른 도메인 A와 B간의 1:1 대응 관계를 학습하고, 변환된 이미지를 다시 원래 도메인으로 복원할 수 있도록 설계된 모델이다.

🔎 DiscoGAN의 구조
DiscoGAN은 두 개의 생성자와 두 개의 판별자로 구성이 된다.
🔹 A > B > A
1. 도메인 A의 이미지 xA을 생성자AB에 입력하여 도메인 B의 스타일을 가진 이미지 xAB를 생성한다.
2. 해당 이미지 xAB를 생성자 BA에 넣어 xABA로 복원하게 된다.
3. 이 때 복원된 이미지 xABA가 원래 입력 xA와 최대한 유사하도록 학습하며, 이를 복원 손실을 통해 측정한다.
4. 동시에 판별자 DB는 xAB가 실제 도메인 B이미지와 구분되지 않도록 훈련한다.
🔸 B > A > B
1. 도메인 B의 이미지 xB을 생성자BA에 입력하여 도메인 A의 스타일을 가진 이미지 xBA를 생성한다.
2. 해당 이미지 xBA를 생성자AB에 넣어 xBAB로 복원하게 된다.
3. 이 때 복원된 이미지 xBAB가 원래 입력 xB와 최대한 유사하도록 학습하며, 이를 복원 손실을 통해 측정한다.
4. 동시에 판별자 DA는 xBA가 실제 도메인 A이미지와 구분되지 않도록 훈련한다.

CycleGAN : Cycle-Consistent GAN
🔎 CycleGAN이란?
CycleGAN은 서로 다른 도메인 간의 이미지 스타일 변환을 라벨 없이 학습할 수 있도록 설계된 생성형 모델이다.
예를 들어, 그냥 말을 얼룩말로, 사진을 고흐 풍 그림으로, 여름 풍경을 겨울 풍경으로 바꾸는 등의 변환이 가능하다.
🔎 CycleGAN의 구조
CycleGAN은 2개의 생성자와 2개의 판별자로 구성되어 있다.
🔹 생성자
생성자 A2B
도메인 A의 이미지를 도메인 B 스타일로 변환한다.
생성자 B2A
도메인 B의 이미지를 도메인 A 스타일로 변환한다.
생성자는 아래와 같이 3부분으로 나뉜다.
Encoding
컨볼루션으로 특징을 추출한다.
Transformation
Residual Block을 통해 이미지 스타일을 변경한다.
Decoding
DeConv로 이미지를 복원한다.

🔸 판별자
판별자 A/B
생성된 이미지가 해당 도메인의 진짜 이미지와 구분되지 않도록 판별한다.
판별자는 일반적인 CNN 구조로 구성되어 있고, 입력 이미지가 진짜인지, 생성자가 만든 가짜 이미지인지 판별한다.

🔹 Cycle Consistency Loss
CycleGAN의 핵심은 Cycle Consistency Loss이다.
이는 변환된 이미지를 다시 원래 도메인으로 변환했을 때, 원본 이미지와 최대한 같아야 한다는 제약이다.
이를 통해 라벨이 없는 데이터에서도 도메인 간 변환을 안정적으로 할 수 있는 것이다.

CycleGAN 사용 예시

Stable Diffusion
🔎 Stable Diffusion 이란?
Stable Diffusion이란 텍스트 설명(프롬프트)를 바탕으로 고해상도 이미지를 생성하는 모델이다.
LDM(Latent Diffusion Model)이라는 방식을 사용해 효율성과 품질이 높다.
기존 이미지 생성 모델인 GAN 등은 직접 픽셀 공간에서 이미지를 생성하는데, 해당 모델은 이미지를 잠재 공간(latent space)으로 압축하고 해당 공간에 노이즈를 추가하고 제거하는 과정을 거쳐 이미지를 생성한다.

🔎 압축과 생성 : Semantic vs Perceptual Compression
일반 오토 인코더+GAN은 저해상도 이미지를 압축하거나 재구성할 때 Perceptual Compression영역에서 작동했다.
반면 Stable Diffusion은 LDM을 활용해 Semantic Compreesion 수준까지 도달했다.
즉, 의미 단위까지 압축하고 복원할 수 있어 품질이 우수하다.

💡 구조 및 작동 방식
🔹 Forward Diffusion : 순방향 확산
학습 이미지에 점차적으로 노이즈를 추가하여 무작위 이미지로 만든다.
예쁜 고양이 이미지도 시간이 지나면 점점 구분이 불가능할 정도의 노이즈 이미지가 된다.

🔸 Reverse Diffusion : 역방향 확산
노이즈에서 이미지로 복원하는 과정이다.
U-Net 구조를 통해 매 단계마다 노이즈 양을 예측하고 제거한다.
수십~수백 번의 반복을 통해 원래 이미지로 복원한다.


🛠️ 기술적 문제와 해결법
❌ 문제점
이미지 공간에서 바로 계산을 하면 계산량이 너무 많아져 계산이 매우 매우 느려진다. 현존하는 최고의 GPU를 사용한다고 해도, 하나의 GPU로는 계산이 불가능하다.
❗️ 해결법
위와 같은 문제를 잠재 확산 모델(latent diffusion model)을 사용하여 해결할 수 있다.
고차원의 이미지 공간에서 작동시키는 것이 아니라, 잠재 공간에서 이미지를 압축한 뒤 연산을 수행하는 것이다.
이미지를 잠재 공간으로 압축하는 데는 가변 자동 인코더(variational autoencode-VAE)를 사용하고, 이미지를 복원할 때는 디코더가 잠재공간에서 원래 이미지로 복원한다.
잡음 이미지를 생성한다고 했지만, 실제로는 잠재 공간상의 무작위 텐서를 생성하는 것이다.
또한 잡음을 이용해 이미지를 손상시키는 것이 아니라, 잠재 공간상의 이미지 표현을 잠재 잡음을 사용해 손상시키는 원리이다.

샘플링 흐름
1. 무작위 잠재 공간 벡터(행렬)을 생성한다.
2. U-Net기반 잡음 예측기가 노이즈를 예측한다.
3. 예측된 노이즈를 제거하고 latent 벡터를 정제한다.
4. 이를 반복하여 최종 잠재 이미지를 완성한다.
5. VAE decoder가 최종 이미지를 복원한다.

'CS > 기계학습' 카테고리의 다른 글
| [기계학습] GML - Representation Learning (1) | 2025.06.16 |
|---|---|
| [기계학습] GML - Ranking (2) | 2025.06.16 |
| [기계학습] RNN (5) | 2025.06.14 |
| [기계학습] 대표적인 CNN 모델 (2) | 2025.06.13 |
| [기계학습] CNN 기초 (1) | 2025.06.13 |