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에서 해결될 예정이다