About me
home
Portfolio
home
🌫️

GAN 정리

GAN( Generative Adversarial Network)
생성자와 식별자가 서로 경쟁(Adversarial)하며 데이터를 생성(Generative)하는 모델(Network)
궁극적으로는 구분자(Discriminator)가 실제 데이터와 가짜 데이터를 구분하지 못하게 만드는 것이 목표이다.
GAN은 ‘비지도 학습’에 해당된다.

GAN 개념

1.
제일 처음 0과 1로 인해 마구 뿌려진 Noise라는 쓰레기가 있다. 해당 Noise는 위 수식에서 z라고 표현된다.
2.
해당 쓰레기를 가지고 Generator(위조지폐범이) 위조지폐를 만든다. G가 z를 가지고 만들었으니 만들어진 위조지폐들을 위 수식에서 G(z)라고 하자.
3.
이제 Discriminator(경찰) 이 위조지폐와 실제 지폐를 구분해야 한다. 경찰은 이게 위조지폐라면 0 을 출력하고, 진짜 지폐라면 1을 출력하기로 한다. 위조지폐 G(z) 와 실제 지폐 x 가 경찰 손으로 들어갔을 때, D(G(z))는 위조지폐이기 때문에 0, 실제 지폐는 D(x)는 1을 출력하게 된다.
4.
이렇게 한번 경찰이 해당 지폐들을 구분한 게 한 번의 epoch 가 된다.

GAN수식

Objective 함수

왼쪽에서 G는 V(D, G) 가 최소(min) 가 되려 하고, D는 V(D, G) 최대(max) 가 되려고 한다는 의미이다.

D의 입장

1.
D는 경찰. 가짜데이터에는 0을 출력하고, 진짜 데이터에는 1을 출력
2.
x는 진짜 데이터고, G(z)는 G가 z를 가지고 만든 가짜데이터.
3.
따라서 D는 오른쪽수식중 D(x)=1이 되어야 하며, D(G(z))는 0이 되도록하는것이 목표
D(x)는 0에서 1사이 값을 뽑아낼 수 있으며 따라서 여기서 그나마 가장 크게 뽑을 수 있는 값이 1 → log(1) = 0 이 나오는 게 해당 logD(x) 가 뽑아낼 수 있는 그나마 가장 큰 값
따라서 D가 원하는 최적의 상황은 위와 같았음 (D는 0으로 가까운 숫자로 가기 위해 노력하는것을 최대가 되려 한다 하고, 이를 max로 표현한것)

G의 입장

1.
G는 위조지폐범이다. 경찰과 반대로 G는 D가 가짜 데이터에 대해 1을 출력하게 해야 한다. D가 진짜 데이터를 제대로 구별하는지 아닌지는 별로 상관이 없다.
2.
x는 진짜 데이터고, G(z)는 G가 z를 가지고 만든 가짜 데이터이다.
3.
따라서 오른쪽 수식 중, D(x) = 0이 되어야 하며, D(G(z))는 1 이 되도록 해야 한다.
G가 원하는 상황은 다음과 같다. D가 앞아서 잘 판별하는지는 관심이 없고 D(G(z))가 1이 되게 하는것이 목표
log(1-1)으로 인해 log 0 이 된다면 해당 값은 -infinity를 향하게 된다. 이는 매우 매우 0보다도 작은 무한대의 음수로, 결국 G의 목표는 엄청 엄청 작은 0 보다 작은 음의 무한대를 향하는 것이 목적이라고 볼 수 있다.
따라서 G가 원하는 최적의 상황은 매우 매우 작은 음의 무한대가 되는 방향이 되는 것이다.

DCGAN(Deep Convolutional GAN)

Least Squares GAN (LSGAN)

Decision Boundary 를 기준으로 아래는 진짜 이미지, 위를 가짜 이미지
: 이렇게 진짜로 D에게 인식된 가짜 이미지에 대해 G 입장에서는 D를 잘 속였기 때문에, 더 이상 학습할 의지가 없다.(vanishing gradient) →가짜 이미지의 경우 진짜 이미지와 멀리 떨어져 있는 것을 확인할 수 있다 → 따라서 이 가짜 이미지를 진짜 이미지방향으로 가지고 오자는 게 해당 논문의 아이디어
sigmoid cross entroy loss 대신 least suqre loss를 사용하여 Decision Boundary에서 멀리 떨어진 데이터들에게 penalty를 주자는 것이 LSGAN의 방법

Semi-Supervised GAN (SGAN)

Discriminator 가 진짜인지 가짜 인지만을 구분하는 것이 아니라, Class를 구분하며 추가로 Fake라는 Class 구분한다
ex.
Real Image 0 이 들어왔을 때, Discriminator는 0을 나타내는 one-hot vector를 반환하고, 반대로 Generator에는 노이즈와, 타겟으로 삼은 one-hot vector 7 이 들어가며, 이를 바탕으로 Fake Image 7을 생성하게 된다. 생성된 Fake image 7에 대해 Discriminator 은 Fake라는 one-hot vector 을 반환한다.

CycleGAN

→ 완전히 다른 Unpaired 데이터임에도 효과적으로 학습을 진행하는 방법이 CycleGAN이다.
예시 결과물
방법
1.
여기서 Discriminator은 Real Image B만을 가지고 학습하게 된다. 따라서 B 이미지에 특화된 Discriminator는 Generator 가 Fake Image B를 가지고 왔을 때 해당 이미지가 real 인지 fake 인지를 구분한다.
2.
여기서 기존의 GAN 과 조금 차이나는 부분이 Generator로 들어가는 것은 noize 값이 아닌 실제 이미지 A 라는것 / 해당 이미지 A를 가지고 Generator 은 A가 Discriminator 을 잘 속일 수 있도록 Fake Image B를 생성한다
Real Image B의 모양은 유지하되, Fake Image B를 생성하는 개념
ex. Generator 가 제일 처음 얼룩말 이미지를 가지고 말 모양의 Fake 이미지를 생성하는 데 이를 기반으로 다시 얼룩말 이미지를 생성해 보게 한다. 이렇게 함으로써 Generator 은 마구잡이로 모양을 변경할 경우 다시 얼룩말 이미지로 돌아오기 힘들다는 것을 학습하며, 모양은 유지하며 내부에 색과 같은 값들을 변화시킨다.

PGGAN

4x4 저해상도 이미지부터 1024x1024 고해상도 이미지까지 해상도를 높여가면서 커리큘럼 학습하는 모델
고해상도 이미지는 high dimension이기 때문에, Generator보다 Discriminator학습이 쉽다. real과 fake를 너무 구분하기 쉽다는 의미이다. 또한 메모리 제약과 같은 computation 문제도 있다. PGGAN은 이를 해결하기 위해 학습을 하면서 4x4 resolution부터 1024x1024까지 점차 키워나간다. (Discriminator와 Generator 모두) 4x4와 같은 low resolution에서는 large scale의 feature들을 학습하고, high resolution으로 갈수록 세부적인 feature들을 학습하게 된다. 이렇게 점진적으로 layer를 추가하면서 학습하기 때문에 안정적으로 high resolution image를 만들 수 있다.
해상도가 높아질때마다 생성자는 출력 계층이 한 계층늘어나고 판별자는 입력계층이 한 계층 늘어남
새로운 계층이 추가되면, 학습된 계층과 학습되지 않은 새로운 계층간에 그레디언트 차가 급격하게 커지기 때문에, 이전 계층의 출력에서 새로운 계층의 출력으로 학습이 부드럽게 전이 될 수 있도록 가중치 비율 조절 → 가중합산된 형태로 출력을 결정

점진적으로 이미지를 Upscaling하는 방법을 제안

1.
4x4 컨볼루션으로 시작
Generator: 4x4 크기의 이미지를 생성하는 Convolutional 신경망으로 구성됨
Discriminator: 4x4 크기의 이미지를 입력으로 받아 진위여부를 판별하는 Convolutional 신경망으로 구성
2.
1 epoch
3.
8x8로 업샘플링
4.
Discriminator에는 가장 처음에 8x8의 이미지를 판별하는 Layer를 추가
→ 이때 Generator에 단순히 8x8 크기의 Layer를 추가해서는 안됨
왜냐하면, 4x4 Layer는 학습이 완료되어 진짜에 가까운 이미지를 생성하지만, 그 이미지를 입력으로 받는 8x8 Layer는 아직 학습되지 않은 가중치를 가지고 있기 때문에, 그냥 Layer를 추가하고 학습을 진행 할 경우, 오히려 8x8 단계에서 잘못된 이미지를 출력함으로써, Backpropagation 단계에서 잘 학습된 4x4 Layer의 가중치 조차도 잘못되도록 변경 할 수 있기 때문
smooth fadein 방법
(a) 16x16 Layer를 학습한다.
(b) 32x32 Layer를 추가하는데, 16x16의 이미지를 단순하게 32x32로 UpScaling한 이미지 A와 그 이미지를 32x32 Layer에 넣은 이미지 B를 결합하는데, 임의의 변수 alpha를 사용하여, A*(1-alpha) + B*alpha의 식으로 이미지를 합성하여 출력한다. alpha는 0부터 1까지 점점 증가한다.
(c) 충분히 학습이 되면(alpha가 1이 되면) 더이상 16x16 Layer의 이미지를 생성하지 않고, 32x32 Layer의 이미지만으로 학습을 진행한다.

StyleGAN

PGGAN,Style transfer (AdaIN) 등 사전지식을 필요로함
style-based generator는 크게 두가지 network로 이루어져 있음.
1.
Mapping Network
2.
Synthesis Network

1. Mapping Network

baseline인 PGGAN의 문제는 세부적인 attribute를 조절하지 못한다는 것. 이 단점을 해결하기 위해 latent sapce Z(Gaussian)에서 samping한 z를 intermediate latent space W의 w로 mapping해주는 non-linear mapping network를 사용
이 mapping network는 8-layer MLP로 구성되고, 512차원 z를 512차원 w로 mapping해주는 역할을 한다. 이러한 mapping network를 사용하는 이유는 feature들의 disentanglement를 보장하기 위해서다.
cf. disentanglement
기존의 GAN같이 entangle되어 있다면 오른쪽 아래의 수염을 가진 남성의 사진이 나오게 된다. 즉 수염을 추가한 것 뿐만 아니라 다른 feature들이 동시에 변한 것이다. 이는 수염이라는 feature에 다른 feature들이 correlated되어 있기 때문이다 → entangle
(a)실제 데이터의 분포
(b)PGGAN의 경우
데이터의 분포를 Gaussian으로 가정하므로, Z space는 원래의 분포가 Gaussian에 맞춰 구부러져 모델링되는 것이다. 때문에 원래 분포보다 뒤틀림이 생기고, 보다 entangle되어야 한다.
(c)styleGAN
이러한 entanglement를 방지하고자, mapping network를 통해 intermediate latent space로 한번 보내서 less entangle하게 만드는 것이다. latent space Z보다 less entangle한 intermediate latent space W에서 이미지를 생성하게 되어 style을 interpolation하는 과정에서 더 linear하게 동작할 수 있다.

2. Synthesis Network

mapping network를 통해 sampling한 z vector를 w vector로 만들었음. 이제 w vector로 이미지를 synthesis하는 방법
PGGAN는 4x4부터 1024x1024까지, 총 9개의 layer가 있는 progressive growing구조이다. 낮은 resolution의 layer에서는 얼굴형이나 피부색, 머리 스타일 같은 대략적인 특징을 만들고, 높은 resolution으로 갈 수록 머리 색이나 세부적이고 세밀한 특징을 만들게 된다. 이러한 동작으로 고화질의 이미지를 잘 생성할 수 있는 것이다. StyleGAN에서도 이 progressive growing 구조를 유지하여 고화질의 이미지를 만들어낸다.
synthesis network는 4x4부터 1024x1024 resolution feature map을 만드는 총 9개의 style block으로 이루어져 있다. 마지막에는 RGB로 바꿔주는 layer가 있어 이미지 channel에 맞춰준다. Style block의 input은 전 style block의 output인 featuremap이다. 하나의 style block당 두번의 convolution을 진행한다.
Style block의 세부 구조
a) Style Modules (AdaIN)
b) Constant input
c) Stochastic variation

a) Style Modules (AdaIN)

convolution을 거친 featuremap이 AdaIN의 content이미지의 역할이고 w가 style이미지의 역할.
feature map은 statistic하게 normalization되고 w으로 부터 나온 scaling factor와 곱해지고, bais factor가 더해진다. normalize연산은 AdaIN,IN과 동일하게 당연히 channel specific하게 진행된다.

b) Constant input

style-based generator는 w를 입력으로 받기 때문에, 더이상 PGGAN이나 다른 GAN과 같이 z에서 convolution연산을 하지 않아도 됨. 때문에 synthesis network는 4x4x512 contant tensor에서 부터 시작한다.

c) Stochastic variation

Gaussian에서 sampling한 nosie를 Convolution의 output인 featuremap에 더해준다(sum) B block을 통해 featuremap 사이즈에 맞게 변형된다. (B 역시 학습되는 parameter)
이를 통해 stochastic variation을 추가할 수 있다. 여기서 Stochastic variation이란 머리카락의 배치이나 모공, 주근깨 같이 아주 세밀하고 때에 따라 달라지는 특징들을 말한다.
(a) 모든 layer에 noise
(b) No noise → stochastic variation control 불가. 머리카락 같은 정보의 디테일이 많이 떨어지는 것을 확인할 수 있다.
(c) fine noise → 세밀한 강도의 stochastic variation
(d) coarse noise →강한 강도의 stochastic variation
Course noise : 세기가 강한 머리의 곱슬거림,appearance of larger background features
Fine nosie :세밀한 곱슬거림, finer background detail, 모공

Style mixing

StyleGAN의 특징 중 하나는 localization.
style의 특정 subset을 변경하는 것이 이미지의 특정 부분을 변경하는데 효과를 낸다는 것