1. PG GAN의 등장배경

GAN은 분명 놀라운 모델이 맞지만 몇가지 문제점이있었다

 

1. High-Resolution이미지 생성 문제

고해상도에서는 생성된 이미지가 train이미지와 다르다는 것을 판별하기가 훨씬 쉽기 때문에 고해상도 이미지를 생성하는것이 어렵다 또한 메모리 문제 때문에 더 작은배치를 줘야하고 이 때문에 학습 안정성이 떨어질 위험이 있다

 

2. Variation problem

GAN에서 generative model이 꼭 training data distribution의 전체를 표현할 이유가 없다 따라서 train data의 일부 distribution만 학습 되는 경우가 있다 이 경우 variation을 보장할 수 없다 

 

3. Mode collapse

Generator가 discriminator를 속이는데 성공한 경우 성적을 위해 속이는데 성공한 이미지만 주구장창 만드는 경우가 있다 

 

4. 학습불안정성

generated distribution과 training distribution이 겹치는 부분(overlap)가 적다면 이 두 집단을 구분하기가 너무 쉽기 때문에 분포들간의 거리를 측정할 때 gradient는 random한 방향을 가르켜 버릴 수 있다

 

2. PG GAN의 아키텍쳐와 고해상도 이미지 생성 문제에 대한 해답

고해상도 이미지 생성에 대한 문제를 위해 PGGAN은 아주 작은 4x4이미지 부터 시작해서 하나씩 층을 쌓아 1024x1024이미지에 도달하는 아키텍쳐를 구성하였다 이 방식은 고해상도 이미지를 만들면서도 안정적인 합성이 가능하며 처음 시작할 때 아주 작은 이미지로 시작하기에 훈련속도와 메모리 사용량 또한 개선되는 장점이 있다 

이 그림은 어떻게 층을 쌓아 나가는 지에 대한 설명이다

fromRGB, toRGB레이어는 1x1 Conv 레이어로서 이미지 전환을 수행한다

a에서 c로 전환되는 걸 묘사하는 그림이며 b에서 α 는 0에서 1로 증가하여 a에서 c로 전환된다

a에서 이미지는 16x16으로 진행된다 하지만 α값이 1에 가까워져가며 전환되다가 마지막에 c에와서는 32x32이미지 층이 쌓이게 된다

3. Variation Problem을 해결하기 위한 Mini-batch discrimination

앞서 말했듯 생성된 이미지가 훈련이미지의 모든 분포를 나타내도 되지 않기에 일부만 표현하여 문제가 되었다 따라서 기존에는 각 이미지에 독립적으로 discriminator가 평가하였으나 이제는 미니 배치 안의 이미지들이 얼마나 유사한지를 검사한다

 

다음은 mini-batch standard deviation layer 코드이다

def minibatch_stddev_layer(x, group_size=4):
    with tf.variable_scope('MinibatchStddev'):
        group_size = tf.minimum(group_size, tf.shape(x)[0])  # 미니배치는 group_size로 나눠 떨어져야함
        s = x.shape                                             # [NCHW]  Input shape.
        y = tf.reshape(x, [group_size, -1, s[1], s[2], s[3]])   # [GMCHW] group_size로 쪼갠다
        y = tf.cast(y, tf.float32)                              # [GMCHW] Cast to FP32.
        y -= tf.reduce_mean(y, axis=0, keepdims=True)           # [GMCHW] 평균을 빼준다
        y = tf.reduce_mean(tf.square(y), axis=0)                # [MCHW]  분산 계산
        y = tf.sqrt(y + 1e-8)                                   # [MCHW]  표준편차 계산 1e-8은 수식안정화용도
        y = tf.reduce_mean(y, axis=[1,2,3], keepdims=True)      # [M111]  fmaps and pixels의 평균 구하기
        y = tf.cast(y, x.dtype)                                 # [M111]  원래 타입으로 다시 cast
        y = tf.tile(y, [group_size, 1, s[2], s[3]])             # [N1HW]  Replicate over group and pixels.
        return tf.concat([x, y], axis=1)                        # [NCHW]  새로운 fmap Append

 

4. Normalization in Generator and Discriminator

GAN은 두 모델간의 과도한 경쟁으로 인해 신호크기가 증가하기 쉽다 따라서 이를 방지하기 위해 주로 BatchNormalization을 써왔으나 GAN은 이미지를 다루기에 batch를 크게 주기 어렵고 이 방식은 직접적인 방법이 아니기에 PGGAN에서는 다른 방식을 활용하였다

4-1. Equalized Learning Rate

batch size가 작기 때문에 BatchNormalization을 쓰기 어렵고 따라서 initilization이 중요하다

이 논문에서는 정규분포(평균0, 표준편차1)로 initalize하고 학습중에는 각 레이어마다 He's initilizer로 얻어지는 normalization constant(c)를 통해 동적으로 scaling한다 

4-2. Pixelwise Feature Vector Normalization in Generator

generator에서 매 conv layer 후에 feature맵을 정규화 합니다 

b는 다음 feature map, a는 이전 feature map, N은 feature map의 개수이다

따라서 Pixel 단위로 normlization을 수행한다 

 

5. 결론

위와 같은 해결책을 통해서 그간 GAN이 갖고 있는 문제들을 상당수 해결하였다 하지만 여전히 특성들이 entangle하다는 점 즉 하나의 특성을 바꾸면 다른 특성도 같이 바뀌는 문제등이 있다 이는 다음 포스팅인 styleGAN에서 해결될 예정이다

'AI > GAN' 카테고리의 다른 글

GAN  (0) 2024.05.09

논문 출처 : https://arxiv.org/pdf/1406.2661

1. 이름이 GAN인 이유

GAN은 Generative Adversarial Nets의 약자로서 적대적생성 네트워크이다

이러한 이유가 붙은 이유는 GAN은 두 모델의 경쟁으로 인해 학습하는 녀석이기 때문이다

 

GAN에는 두 모델이 존재한다 하나는 가짜 이미지를 생성하는 Generative model이고 다른 하나는 가짜인지 진짜인지 판별해내는 Discriminative model이다

간단하게 Generative model을 G, Discriminative model을 D라 부르겠다

G는 학습을 통해 D를 속일 수 있는 이미지를 만드는 것을 목표로 한다

D는 학습을 통해 G의 이미지를 걸러 내는 것을 목표로한다

이렇게 적대적인 관계로서 경쟁하며 학습하기에 이 모델의 이름이 GAN이다 

 

2. 어떻게 경쟁하는가 

서로 경쟁하는 관계를 수식으로 나타내면 위와 같다

E는 조건을 만족하면 1이고 만족하지 못하면 0이다 따라서 첫항의 의미는 x가 Pdata(x)즉 실제 이미지에 해당하면 1이며

둘째항의 의미는 z가 Pz(z) 즉 노이즈에 해당하면 1이란 의미이다

G(z)는 G가 만들어낸 그림을 의미하고 D(x)는 x가 진짜일 확률 이다

앞부분 log D(x) 는 실제 이미지에 대한 판별기의 판단 확률을 의미하고

뒷부분 log(1-D(G(z)))는 G가 생성한 이미지에 대한 판별기의 판단확률을 의미한다

 

보다시피 G는 V(D,G)를 최소로 만드려하고 D는 최대로 만드려한다

만일 D의 성능이 최대라면 logD(x) = log 1 = 0이 되며 log(1-D(G(z))) = log (1-0) = 0 이되어 0이 최대이며 0에 가까울수록 좋다는 것을 알 수 있다

반대로 G의 성능이 최대라면 lod D(x)항은 G의 성능과 무관하므로 넘어가고 log(1 - D(G(z))) = log( 1-1) = -inf 가 되어 V(D,G)의 값이 작을 수록 좋다는 것을 알 수 있다

 

3. GAN의 장단점

우선 장점은 학습에 있어 역전파만이 필요하며 마르코프 체인(과거와 현재의 상태를 보고 미래를 예측할수있는 상태)이 필요하지 않으며 학습에 추론이 필요하지 않다 또한 매우 선명한 분포를 지닐 수 있다는 점이다

반면에 단점은 생성된 데이터의 분포를 확실하게 표현하는 것이 없다는 것과 학습할때 G와 D가 균등해야하는 점이다 만일 G가 D에 비해 과도하게 학습된다면 충분한 다양성을 지닐 수 없는 'Helvetica scenario'에 빠질 수 있다 

 

또한 논문에서 제공되는 예시를 보면 mnist같이 상당히 해상도가 낮은 사진들을 예시로 삼았음을 볼수 있는데 이는 GAN이 높은 해상도의 이미지에 대해서는 약한 모습을 보이기 때문이다 이를 극복하는 것은 다음 포스팅인 PGGAN에서 극복할 것이다

 

참조

GAN 논문리뷰 https://velog.io/@minkyu4506/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0GANGenerative-Adversarial-Nets-%EB%A6%AC%EB%B7%B0

 

[논문리뷰]GAN(Generative Adversarial Nets) 리뷰

안녕하세요. 밍기뉴와제제입니다. 이번에는 GAN을 리뷰해보겠습니다.

velog.io

https://velog.io/@nochesita/%ED%99%95%EB%A5%A0%ED%86%B5%EA%B3%84-%EB%A7%88%EB%A5%B4%EC%BD%94%ED%94%84-%EC%B2%B4%EC%9D%B8-Markov-Chain

 

[확률/통계] 마르코프 체인 Markov Chain

오늘의 나는 과거의 내가 만든 것

velog.io

 

'AI > GAN' 카테고리의 다른 글

Progressive Growing of GAN  (0) 2024.05.10

+ Recent posts