Problems
training distribution과 generated distribution간의 substantial overlap이 없다면 gradient가 random direction을 가리킬 수도 있다. High resolution image를 생성하는 경우에는 training image와 generated image를 구분하기가 더 쉬워지는 경향이 있어서 이러한 문제가 더 심화된다. (학습이 불안정)
Assumptions
학습과정에서 low resolution image에 대한 generator와 discriminator로부터 시작하여 layer를 차츰차츰 키워나가면 안정성과 고화질 이미지 두 마리 토끼를 잡을 수 있지 않을까?
Going further
- 보통 image quality와 variation은 trade-off관계. 높은 quality를 유지하면서 variation을 높일 수 있는 방안에 대해 논의해본다.
- Quality와 variation에 대한 새로운 evaluation metric을 제안해본다.
- GAN의 학습과정에서 generator와 discriminator간의 unhealthy competition은 signal magnitude를 차츰 상승시키는 이슈를 발생시키곤 한다. 이런 현상을 막을 수 있는 메커니즘을 제안해본다.
Progressive growing of GANs
Generator와 discriminator의 layer를 대칭적으로 하나씩 쌓아가며 학습하게 되면 이는 large-scale structure를 먼저 파악한 뒤에 finer scale detail로 점점 학습의 주안을 옮겨가는 것과 같다. Layer를 늘리는 시점에 갑작스러운 충격을 막기위해 Highway network의 구조를 사용한다. 이 방법을 이용하면 학습의 안정성 외에도 학습 속도를 획기적으로 올릴수 있다는 장점이 있다. (아주 좋은 품질의 결과물이 2~6배 빠르게 나오기도 한다.) - 아래 Fig2 참고
def lerp(a, b, t): return a + (b - a) * t
def lerp_clip(a, b, t): return a + (b - a) * tf.clip_by_value(t, 0.0, 1.0)
## omitted
if structure == 'linear':
img = images_in
x = fromrgb(img, resolution_log2)
for res in range(resolution_log2, 2, -1):
lod = resolution_log2 - res # lod: levels-of-details
x = block(x, res)
img = downscale2d(img)
y = fromrgb(img, res - 1)
with tf.variable_scope('Grow_lod%d' % lod):
x = lerp_clip(x, y, lod_in - lod)
Increasing variation using minibatch standard deviation
GAN은 training data의 variation에 대한 subset만을 학습하는 경향이 있다. Salimans et al. (2016)은 minibatch discriminator 라는 기법을 통해 각 이미지와 minibatch에 대한 통계정보를 discriminator에 같이 제공함으로써 variation에 대한 학습효과를 증진시키려는 시도를 했다. 이 연구에서는 learnable parameter나 새로운 hyperparameter없이 비슷한 접근을 시도해본다. 절차는 다음과 같다.
- 전체 minibatch에 대해, 각 feature의 각 spatial location의 표준편차를 구한다. (Input: N x Cx H x W, Output: C x H x W)
- 앞서 계산된 값으로 각 spatial location에서 모든 feature에 대한 평균을 구한다. (Input: C x H x W, Output: 1 x H x W)
이를 discriminator의 feature map 중 어딘가에 넣어준다. 실험적으로 마지막 downsample layer 뒤에 넣는 것이 가장 효과가 좋았다. - 아래 Table 2 참고
Normalization in generator and discriminator
GAN은 generator와 discriminator간의 unhealthy competition으로 인해 signal magnitude가 점차 증가되기 쉽다. 이에 대한 해결책으로 이전의 연구들에서 변형된 batch normalization의 사용이 제안되었으나, GAN에서는 이슈는 (BN에서 제기된 문제상황이었던) covariate shift가 아니므로 이 연구에서는 signal magnitude와 competition에 대해 적절히 제한하는 것에 초점을 맞춘다.
-
Equalized learning rate: 기존 방식과 달리 weight의 초기화는 N(0,1)로 하되, runtime 중에 동적으로 weight parameter의 스케일을 조절해주자는 아이디어. He initializer에서 제안된 per-layer normalization constant로 weight parameter를 나누어준다. 사람들에게 즐겨 사용되는 RMSProp이나 ADAM의 경우 gradient update에 대해 normalizing을 해주게 되는데, 이것이 parameter들에 대한 scale과는 별개로 계산되는 것이기 때문에 변동이 큰 parameter에 대해서는 학습에 효과적이지 않을 수 있다. 이 방법을 사용하면 모든 parameter가 같은 dynamic range를 갖게 하므로 동일한 학습속도를 보장할 수 있을 것이다.
def get_weight(shape, gain=np.sqrt(2), use_wscale=False, fan_in=None): if fan_in is None: fan_in = np.prod(shape[:-1]) std = gain / np.sqrt(fan_in) # He init if use_wscale: wscale = tf.constant(np.float32(std), name='wscale') return tf.get_variable('weight', shape=shape, initializer=tf.initializers.random_normal()) * wscale else: return tf.get_variable('weight', shape=shape, initializer=tf.initializers.random_normal(0, std))
-
Pixelwise feature vector normalization in generator: generator와 discriminator의 magnitude가 competition에 의해 통제불능의 상태가 되는 것을 막기위해 각 convolutional layer의 feature layer에 대해 pixel 단위로 normalizing을 해준다. 결과물의 품질에 큰 영향을 준 것은 아니지만 필요시 signal magnitudes가 점차 증가되는 것을 막아주었다.
\[\begin{align} b_{x,y} = \frac{a_{x,y}}{\sqrt{\frac{1}{N}\sum_{j=0}^{N-1}(a_{x,y}^j)^2 + \epsilon}}, \end{align}\]
where \(N\) is the number of feature maps, and \(a_{x,y}\) and \(b_{x,y}\) are the original and normalized feature vector in pixel \((x,y)\), respectively.
def pixel_norm(x, epsilon=1e-8): with tf.variable_scope('PixelNorm'): return x * tf.rsqrt(tf.reduce_mean(tf.square(x), axis=1, keepdims=True) + epsilon)
Multi-scale statistical similarity for assessing GAN results
서로 다른 GAN 간의 성능을 비교하기 위해서는 굉장히 많은 수의 이미지에 대한 평가가 필요하다. 이때 자동화된 성능평가 방법이 있다면 좋을 것이다. MS-SSIM은 large-scale mode collapse를 잡아내는데는 잘 동작하지만, 색이나 질감에 대한 variation이나 training set과 생성 이미지에 대한 유사도까지는 평가하지 못한다는 단점이 있다. 이 논문에서의 전제는 잘 학습된 generator가 생성한 이미지는 모든 스케일에서 training set과 유사한 local image structure를 가질 것이라는 것. Training set과 generated samples에서 Laplacian pyramide를 통해 local image patch를 얻고, sliced Wasserstein distance(이하 SWD)를 이용하여 둘 사이의 유사도를 측정한다.
Experiments
- MS-SSIM에 비해 SWD가 색, 질감, 뷰포인트에 대한 variation을 훨씬 잘 잡아냄. 학습이 중간에 중단된 모델과 학습을 온전히 끝낸 모델간의 결과물을 비교했을때 MS-SSIM는 큰 차이를 잡아내지 못했다. 또한 SWD는 training set과 유사한 생성 이미지의 분포에 대해 잘 찾아내는 모습을 보였다.
- progressive growing은 better optimum에 수렴시키고 training time을 줄이는 효과를 보였다. 약 640만개의 이미지 학습을 기준으로 non-progressive variant에 비해 약 5.4배 빠른 속도를 보였다.
- High resolution output을 보이기 위해 AppendixC의 방법을 사용해 CELEBA의 high-quality 버전을 만들어냈다. (1024 x 1024, 30000 장) Tesla V100 GPU 8개로 4일동안 학습하였고 아주 멋진 결과물을 만들어냈다. (위에 데모 참고)학습에는 LSGAN과 WGAN-GP의 loss function이 각각 사용되었는데, 아무래도 LSGAN이 학습에 좀 더 불안정한 모습을 보였다. LSGAN의 loss function을 사용하는 경우에는 약간의 추가적인 테크닉이 필요한데, 이는 Appendix B를 참고하자.
- Unsupervised setting에서 CIFAR10-inception score를 8.8점 찍음. Best score였던 Grinblat et all., 2017의 7.8점을 훨씬 상회하는 점수.
Discussion
이미지의 micro-structure 향상에 대해서는 아직 갈 길이 멀다. 그래도 이제 CELEBA-HQ같은 경우에는 꽤 설득력있는 결과물 산출이 가능한듯.