Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Progressive Growing of GANs for Improved Quality, Stability, and Variation #76

Open
chullhwan-song opened this issue Feb 1, 2019 · 1 comment
Labels

Comments

@chullhwan-song
Copy link
Owner

chullhwan-song commented Feb 1, 2019

https://arxiv.org/abs/1710.10196
https://github.com/tkarras/progressive_growing_of_gans

@chullhwan-song
Copy link
Owner Author

chullhwan-song commented Feb 1, 2019

Abstract

  • GAN의 새로운 학습 방법 제시.
  • key idea - 점차적으로 Generator와 discriminator를 성장시키는 것.
    • 처음에 low resolution에서 시작해서, 학습과정을 통해 점차 좋은 디테일한 모델의 새로운 layer를 add시키는다. > 점점 고퀄리티를 생성시키는..layer를 추가한다는 의미인듯
    • 이는 전례없는 고퀄리티(unprecedented quality)를 생성 - 10242x10242 image
  • 이외,
    • Generator와 discriminator 해로운 경쟁을 억제시키는 방법제시
    • 새로운 평가 메트릭제시(품질과 편차 측면에서..)
    • we construct a higher-quality version of the CELEBA dataset.
  • 위의 소스가 공개

PROGRESSIVE GROWING OF GANS

image

  • 첫번째 기여는 낮은 해상도에서 시작해서 점차적으로 높은 해상도를 나타내도록 layer를 증가시킨다. 아래의 Fi.g.1 그림을 보면 더 확실하다.
  • 이러한 점진적인 학습은 large-scale의 구조에서 이미지의 분산을 먼저 발견하고 동시에 모든 스케일을 학습하는것 대신에 디테일한 attention으로 전환하도록 한다. ? 어렵다.
  • Generator와 discriminator은 대칭적으로 mirror와 같은 구조를 갖는다.
    image
  • 새로운 layer가 증가시킬때마다 smooth하게 fade in하게 만든다. Fig.2에서 보여준다.
  • 이렇게하면 잘 훈련된 smaller-resolution layer들에 대한 sudden shock를 피할수 있다.
    • 그림에 대한 설명은 본문에는 디테일하게 설명은 안되어 있다..부록에..
      image
  • 이런 학습상의 이익은
    • 초기에 정보의 양이 적기 때문에 작은 이미지들을 생성하는것 자체가 안정적이게 된다.(당연하다. 큰이미지들은 그만큼의 정보를 더 필요로하기 때문)
    • 조금씩 조금씩 해상도를 늘려가면서(그에 따른 layer를 증가.)하는 학습은 그에 맞게 latent vector가 매핑되면서 학습되어간다는 의미.? 그려면서 1024x1024 크기의 해상도까지..
      • 이를 위해, WGAN-GP loss & LSGAN loss를 적용
    • reduced training time
  • 이러한 "growing GANs progressively" 방법은 이전의 Wang(refer가 잘못된듯..논문안에서..매핑이..)의 연구 영감

INCREASING VARIATION USING MINIBATCH STANDARD DEVIATION

  • 잘 이해가 안가서 무식하게 영어를 읽어간다. ㅠ
  • GAN은 학습셋에서, ONLY 서브셋의 변화만 찾으려는 경향이 있다.
  • 그래서, Salimans의 연구에서 이러한 문제를 해결하기 위해 "minibatch discrimination"라는 개념을 들고 나왔다.
    • 이는, 개별 이미지 뿐만 아니라, mini-batch을 통한 통계(statistics)적 feature를 계산한다. 그래서 생성되고 학습된 이미지들이 유사한 통계를 가지고 있다.
    • 이를 위해, discriminator의 목적지로(towards the end of) mini-batch layer를 추가하여 구현하게 되는데(살짝 와닿지 않는다.ㅠ), 그 layer가 큰 tensor를 학습하게 된다. 이는 입력에 대한 활성화를 통해 통계적 배열로 매핑시킨다.
      • This is implemented by adding a mini-batch layer towards the end of the discriminator, where the layer learns a large tensor that projects the input activation to an array of statistics.
    • 통계의 분리된 set은 minibatch 안에서 각 example에 전달되고 각 layer의 결과로 concat된다. 그래서, discriminator는 내부적으로 그러한 통계를 사용할수 있다.
        • A separate set of statistics is produced for each example in a minibatch and it is concatenated to the layer’s output, so that the discriminator can use the statistics internally.
  • 우리는 이 접근을 매우 간단하게 만들면서 드라마틱하게 variation를 향상시킨다.
    • We simplify this approach drastically while also improving the variation.
  • 이러한 간소화된 solution은 새로운 hyper-param도 아니고 학습할 param도 아니다.
    • 각 mini-batch마다 각 spatial location에서 각 feature의 표준편차를 계산한다. > conv feature map에서 각 (w, h)마다 존재하는 channel(feature dim)에 대한 표준 편차를 계산한다는 의미인듯..
    • 이를 위해, 모든 feature와 spatial location에 대한 평균값을 estimates에 의해 계산하고 이는 단하나의 값으로 표현된다.
      • We then average these estimates over all features and spatial locations to arrive at a single value.
    • 우리는 그 값을 복사하고, 모든 spatial location을 concat한다. 그리고 mini-batch상에서 하나의 부가적인 conv feature map을 생성.
    • 이 layer는 discriminator의 어느곳이든 삽입가능하다. 그리고 가장좋은 때는 마지막에 삽입되는 것이 좋다.
      • Appendix A.1에..
def minibatch_stddev_layer(x, group_size=4):
    with tf.variable_scope('MinibatchStddev'):
        # Minibatch must be divisible by (or smaller than) group_size.
        # Minibatch 안에 여러개로 나눈다는 의미인듯 - groupe단위
        group_size = tf.minimum(group_size, tf.shape(x)[0])    
        s                 = x.shape                                             # [NCHW]  Input shape.

        # [GMCHW] Split minibatch into M groups of size G.
        # GxM<=N, batch size(N)을 G개로 나누는데, 1개의 G는 M개라는 의미.
        y = tf.reshape(x, [group_size, -1, s[1], s[2], s[3]])   
        y = tf.cast(y, tf.float32)                              # [GMCHW] Cast to FP32.

        y -= tf.reduce_mean(y, axis=0, keepdims=True)           # [GMCHW] Subtract mean over group.
        y = tf.reduce_mean(tf.square(y), axis=0)                # [MCHW]  Calc variance over group.
        y = tf.sqrt(y + 1e-8)                                   # [MCHW]  Calc stddev over group.
        y = tf.reduce_mean(y, axis=[1,2,3], keepdims=True)      # [M111]  Take average over fmaps and pixels.
        y = tf.cast(y, x.dtype)                                 # [M111]  Cast back to original data type.
        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]  Append as new fmap.

NORMALIZATION IN GENERATOR AND DISCRIMINATOR

  • GAN은 Generator와 discriminator간의 불필요한 해로운 경쟁으로 인해 시그널의 강도가 커지는 경향이 있다.
  • 이를 위해, 초기 연구에서 batch norm의 variant를 이용. > eliminate covariate shift. 하지만 이 연구에서는 이러한 문제가 발생되지 않았다.
  • 따라서, GAN에서는 시그널의 크기와 경쟁의 측면을 제약(constraining)해야 한다고 믿는다.
  • 두가지 ingredients를 포함된 접근방법이고 이들은 학습 param을 가지지 않는다.

EQUALIZED LEARNING RATE

  • weight 초기화를 그냥 간단하게 0~1사이로 맞추고, 명시적으로 runtime에서 scale함.
    • image
      • c : per-layer normalization constant from He’s initializer
      • w : weight

PIXELWISE FEATURE VECTOR NORMALIZATION IN GENERATOR

  • Generator와 discriminator의 잘못된 경쟁을 막기위해, Generator의 Conv layer 이후에, unit length로 각 feature vector를 normalization한다.
    • local response normalization 적용
      image
      • N - feature map의 크기
      • a_x_y : pixel (x, y)에서의 original vector
      • b_x_y :pixel (x, y)에서의 normalized vector
      • 이 방법은 실험결과에 대한 변화가 없지만, 위에서 언급한 시그널의 크기가 갑자기 커지는 현상를 막아줌.
# Pixelwise feature vector normalization.
# rsqrf = 1./sqrt
x * tf.rsqrt(tf.reduce_mean(tf.square(x), axis=1, keepdims=True) + epsilon)

MULTI-SCALE STATISTICAL SIMILARITY FOR ASSESSING GAN RESULTS

  • GAN 평가 방법
  • 실제로 "tedious, difficult, and subjective"이렇다. > 평가가 어렵고 애매하다는 의미
  • We build on the intuition that a successful generator will produce samples whose local image structure is similar to the training set over all scales.
  • 그래서, multi-scale statistical similarity 고려
    • local image patches drawn from Laplacian pyramid representations of generated vs target images

EXPERIMENTS

image
image
image
image
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant