생성형 모델 첫 번째, GAN
이런 생성기법은 없는 걸 만들어내는 것이기에 정답이 없는 비지도 학습임.
가짜 data 를 만드는데, 이게 진짜와 엄청 유사하도록 만드는 것이 목표!
Generator와 Discriminator의 견제로 이루어진 모델.
Generator는 가짜 정보를 생성하고,
Discriminator는 이 정보를 판독하는 것! 가짜다 vs 진짜다 이렇게.
구조가 어떻게 되냐면,
1. real data로 Discriminator가 분리하는 과정
만약 real data가 입력(x)이라면,
D(x) 가 Discriminator가 입력을 받아 내놓은 출력값.
근데 이 출력값은 0~1 사이인데,
1에 가까우면 x가 real data라고 판별됐다는 뜻,
0에 가까우면 x가 fake data라고 판별됐다는 뜻.
즉, D(x) 가 1에 가까울 수록 D가 잘한 것!
2. Generator가 만든 데이터를 Discriminator가 분리하는 과정
이젠 D에 G가 생성한 데이터를 넣을 것.
Latent Data (z) 가 입력으로 들어감. 무작위 데이터임. 그냥 아무것도 아닌 데이터임.
얘를 G가 입력으로 받아서 새로운 데이터 G(z) 를 만듦.
그담에 이걸 D에 입력으로 넣을 것.
그럼 D는 출력으로 하나의 값 D(G(z)) 을 내놓을 건데, 그 값은 0~1 사이임.
이 값도 1에 가까울 수록 입력이 real data라는 뜻!
즉, D(G(z))가 1에 가까우면, D가 생성된 데이터를 real 이라고 생각한 것이므로, G가 잘한 것, D가 못한 것!
근데 만약 값이 0에 가까우면, D가 생성된 데이터를 fake라고 생각한 것이므로, G가 못한 것, D가 잘한 것!
결과적으로,
진짜인지 아닌지 분류하는 것이기에
GAN모델은 binary 분류로 볼 수 있음!
G가 못만들면 D가 구분을 잘 하겠지,
그럼 점점 G가 잘 만들기 시작하겠지.
그러다가 D가 이제 G가 생성한 fake data와 real data를 구분이 어려워서,
출력 결과가 0.5가 나와.
그럼 real과 fake가 거의 동등한 것이라고 볼 수 있기에,
G가 data를 정말 잘 생성한 것!
Discriminator 입장에선?
D(x)를 최대화, D(G(z))를 최소화하는 것이 좋음!
Generator 입장에선?
D(G(z))를 최대화하는 것이 좋음!
파이썬 코드
import torch
import torch.nn as nn
import numpy as np
## 모델 만들기
D = nn.Sequential(
nn.Linear(784, 128),
nn.ReLU(),
nn.Linear(128, 1),
nn.Sigmoid()
)
G = nn.Sequential(
nn.Linear(100, 128),
nn.ReLU(),
nn.Linear(128, 784),
nn.Tanh()
)
criterion = nn.BCELoss()
d_optimizer = torch.optim.Adam(D.parameters(), lr=0.01)
g_optimizer = torch.optim.Adam(G.parameters(), lr=0.01)
## 모델 학습시키기
batch_size = 32
x = np.zeros((batch_size, 28, 28))
while True:
real_labels = torch.ones(batch_size, 1)
fake_labels = torch.zeros(batch_size, 1)
d_optimizer.zero_grad()
g_optimizer.zero_grad()
outputs = D(x)
d_loss_real = criterion(outputs, real_labels)
## D(x)의 결과가 1에 가까워지도록 Discriminator 학습
z = torch.randn(batch_size, 100)
outputs = D(G(z))
d_loss_fake = criterion(outputs, fake_labels)
## D(G(z))의 결과가 0에 가까워지도록 Discriminator 학습
d_loss = d_loss_real + d_loss_fake
d_loss.backward()
d_optimizer.step()
z = torch.randn(batch_size, 100)
outputs = D(G(z))
g_loss = criterion(outputs, real_labels)
g_loss.backward()
g_optimizer.step()
## D(G(z))의 결과가 1에 가까워지도록 Generator 학습
GAN 기술을 사용한 예시
CycleGAN - 도메인 적응 기법
먼가. 일반화된 형태를 입력으로 주고 구체화된 결과를 내놓길 바라는 건가?
컬러카메라 영상 -> 적외선 영상
같은 장소의 여름 사진 -> 겨울 사진
그냥 사진 -> 모네가 그린 듯한 사진
말 -> 얼룩말
Super Resolution GAN (SRGAN)
저해상도 -> 고해상도
'AI > 인공지능' 카테고리의 다른 글
강화학습 (1) | 2024.06.12 |
---|---|
최적화, Optimization (0) | 2024.06.12 |
VAE, Diffusion (vision transformer 추가하가( (3) | 2024.06.11 |
LLM (0) | 2024.06.10 |