Nvidia Labs가 GAN의 train속도 및 안정성향상을 위해 개발한 기술. 전체 해상도 img에 바로 GAN을 도입❌
4×4 pixel의 저해상도 img로 G, D를 훈련 → 훈련과정층에 점진적 추가 → 해상도를 높인다.
점진적 훈련
∙ [Vanilla GAN]: [G]: 처음부터 복잡한 고해상도 img로 작동 이는 train초기, 고수준의 구조학습속도가 느릴 수 있다.
그렇다면, 저해상도 Img를 출력하게 경량 GAN을 훈련시키고 이를 기반으로 해상도를 점진적으로 높이는게 낫지 않을까?
4×4 pixel의 저해상도 img로G, D를 훈련 → 훈련과정층에 점진적 추가 → 해상도를 높인다.
progressive training
이를 progressive training, 점진적 훈련이라 한다.
∙ (a) [Generator]: ProGAN은 Interpolation을 이용, 4×4 pixel로 압축된 trainset부터 시작해 단계적으로 훈련한다. 그 후, z(latent input noise vector)를 4×4×3 img로 변환하게 생성자를 훈련시킨다.
[Discriminator]: 4×4×3인 input img를 하나의 스칼라 예측으로 변환한다. 생성자와 판별자를 확장하려면 층을 추가해야하는데, 이는 위 그림과 같다. toRGB: feature map을 RGB img로 변환하는 합성곱층 fromRGB: RGB img를 feature map으로 변환하는 합성곱층 ∙ (b), (c) [Generator]: ∙ transition단계: 새로운 UpSampling과 Conv층이 기존 신경망에 추가. 기존에 훈련된 toRGB층의 출력유지를 위해 Skip Connection이 추가. 새 층은 처음에 α로 masking된다. (α는 transition단계동안 0에서 1로 점진적으로 증가, 기존 toRGB층의 출력을 줄이고 새 toRGB층의 출력을 늘림.) 이는 새 층으로 이전될 때, 신경망이 받을 변화의 충격을 회피시킨다. 즉, 기존 toRGB층을 통과하는 data가 사라지면 신경망은 stabilization단계로 들어간다.
∙ stabilization단계: 이 단계에서 기존 toRGB층을 통한 data흐름없이 추가훈련으로 신경망의 출력을 fine-tuning한다. [Discriminator]: 판별자 또한 비슷한 과정을 진행한다. 여기서 DownSampling과 Conv층을 추가한다. 이번에는 신경망이 시작될 때, input_img바로뒤에 추가된다.
기존 fromRGB층은 residual connection으로 연결되며 transition단계에서 새층으로 전환됨에따라 점진적으로 제거된다. stabilization단계에서는 판별자가 새 층으로 fine-tuning한다. 이 과정은 4×4 img부터 전체 해상도 img인 1024×1024에 도달할 때까지 계속된다.
주요 기술.
∙ minibatch standard deviation
특성값의 표준편차를 모든 픽셀과 mini-batch에 걸쳐 평균, (상수)특성으로 판별자에 추가하는 층이다. 장점: 생성자가 출력에서 더 많은 다양성을 부여하는데 도움이 됨. mini-batch에서 다양성이 낮으면 표준편차가 작아지고, 판별자는 이 특성으로 real/fake batch를 구별가능하게 되어 생성자를 독려하게 한다.
∙equalized learning rate
보통 신경망의 가중치는 He initialize로 초기화한다. 이를 통해 입력개수가 많아지면 가중치가 0에 가까운 값으로 초기화되어, train과정의 안정성이 향상된다. 특히 이때, Adam이나 RMSProp을 사용하는데, 여기서 문제가 발생한다.
이런 optimizer들은 weight에 대한 gradient update를 정규화한다. 즉, update크기가 weight크기와 무관하다. 하지만 범위가 큰 가중치(= input이 적은 층)가 범위가 작은 가중치(= input개수가 많은 층)보다 조정하는데 상대적으로 오래걸림을 의미한다. 이로인해 ProGAN에서 생성자와 판별자의 여러층에서 train속도간 불균형이 발생하기에 균등 학습률을 활용한다.
ProGAN은 표준정규분포로 초기화된다. 즉, 층이 호출될 때마다 He초기화 계수에 따라 가중치의 크기가 조정된다.
cf) He initialize: 표준편차가 층에대한 입력개수의 제곱근에 반비례한 Gauss분포
∙Pixel-wise Normalization
ProGAN은 Batch Normalization이 아닌, 픽셀별 정규화를 사용한다. - 각 픽셀의 feature vector가 단위길이로 정규화, - signal이 신경망으로 전파되어 제어불능상태가 되는 문제를 방지.
2. StyleGAN
prev.
StyleGAN은 ProGAN논문의 초기 아이디어를 기반으로한다. (사실 판별자는 동일, 생성자만 바뀌었다.)
GAN 훈련 시, 고수준특성에 해당하는 latent space vector구별이 어렵다. ex) 주근깨를 많이 넣으려 latent space img를 조정하면 배경색이 바뀌는경우.
StyleGAN은 다양한 지점에서 Style vector를 신경망에 명시적으로 주입, 일부는 고수준특성(ex. 얼굴방향)을 일부는 저수준특성(ex. 처피뱅, 시스루뱅, ...)을 제어한다.
Mapping Network: f
input noise z∈Z를 다른 latent space w∈W로 변환하는 간단한 FFN.
목적: 생성자는 noise있는 input vector를 후속 style생성층에서 쉽게 선택가능하게 서로 다른 변동요소로 해체가능. 이를 통해 synthesis과정(주어진 style을 갖는 img생성과정)과 이미지 스타일선택과정(mapping신경망)을 분리한다.
Synthesis Network
mapping network가 제공하는 style로 실제 Img생성. 위 그림에서 볼 수 있듯, style벡터 w는 합성신경망 여러지점에서 매번 다른 밀집연결층 A를 통해 주입된다. A는 bias벡터 yb와 scale벡터 ys 2개를 출력한다.
이 벡터가 신경망의 해당지점에 주입해야할 특정 style을 정의한다. 즉, 생성될 img를 특정 style방향으로 이동시키는 방법을 합성신경망에 전달한다. 이 조정은 Adaptive Instance Normalization층으로 이뤄진다.
∙ Adaptive Instance Normalization.
AdaIN층은 reference style의 편향 yb과 스케일 ys을 이용해 각 feature map x의 평균과 분산을 조정하는 신경망층이다. AdaIN층은 층간 Style정보가 새지 않게 방지해 각 층에 주입되는 Style벡터가 해당 층의 특성에만 영향을 미치게 한다. 이를통해 원본 z벡터보다 훨씬 덜 얽힌 latent vector w를 만들 수 있다.
cf) ProGAN구조기반이기에 점진적으로 훈련된다. 즉, latent vector w를 통해 생성된 img를 완전히 제어가능하며 합성신경망 여러지점에서 w벡터를 바꿔 다양한 수준의 style을 변경가능하다.
∙Style Mixing.
trick을 사용, 생성자가 훈련 중 인접한 style간 상관관계를 활용불가능하게한다. = 각 층에 삽입된 style이 가능한 얽히지 않게 함.
하나의 latent vector z만 sampling하지 않고 두 style vector(w1, w2)에 대응하는 두 latent vector(z1, z2)가 sampling된다.
그 후, 각 층에서 w1, w2 둘 중 하나를 random하게 선택해 vector간의 가능한 모든 상관관계를 끊는다.
∙Stochastic variation.
합성신경망은 개별 머리카락의 batch나 얼굴뒤 배경같은 stochastic detail을 위해 합성곱층 다음에 (학습된 broadcasting층 B를 통해) noise를 추가한다. 여기서도 noise가 주입되는 깊이가 img에 미치는 영향의 정도를 결정한다.
또한, style입력과 Noise입력에는 img에서 충분한 분산을 생성할만큼의 확률성이 이미 존재한다.
출력결과.
여기서 두 Source A, B이미지는 다른 w벡터로 생성된다. 두 img를 합치려고 A의 w벡터를 CNN에 통과, 어느 특정지점에서 B의 w벡터로 바꾼다.
🤔이런 변경이 초기해상도에 발생하면? 자세, 얼굴모양, 안경같이 B에 있는 큰 특징의 Style이 A로 전달된다.
🤔 이런 변경이 좀 나중에 발생하면? B에서 색깔, 얼굴의 미세형태같은 미세특징의 Style이 A로전달된다. (이때, A의 큰 특징은 유지됨.)
3. StyleGAN2
prev.
이 모델은 StyleGAN기반으로 생성품질향상을 위해 몇가지 주요 변경사항이 있다. StyleGAN과는 생성자, 판별자 모두 다르다. artifact: 물방울처럼 번진것 같은 현상StyleGAN2는 위 그림같이 img의 Artifact가 거의 발생하지 않는다. 이런 Artifact는 StyleGAN의 AdaIN층으로 인해 발생하는것으로 밝혀졌다.
Weight Mod와 Demod
Artifact문제 해결을 위해 아래 그림 (d)처럼 AdaIN층을 제거하고 가중치 변조(modulation)와 복조(demodulation)단계로 대체한다.
w는 합성곱의 가중치로 runtime에 StyleGAN2의 변조∙복조단계에서 직접 update된다. 이에비해 StyleGAN의 AdaIN층은 텐서가 신경망을 통과할 때 해당 텐서에 대해 작동한다. StyleGAN의 AdaIN층은 단순 instance normalization에 이은 Style변조(scale+bias)에 해당한다. StyelGAN2는 위 그림처럼 Conv층의 출력이 아닌 Runtime에 Conv층의 Weight에 직접 Style변조 및 정규화(복조)를 적용한다.
StyleGAN2에서 각 Dense layer는 하나의 Style벡터 si를 출력한다. (i: 해당하는 Conv층에 있는 input channel index) 이 Style벡터는 아래식처럼 Conv층의 가중치에 적용되는데, 이를 변조단계라 한다: w'i,j,k = si∙wi,j,k (j: 층의 output channel index , k: 공간차원 Index) 이후 가중치를 정규화해 다시 단위표준편차를 갖도록해 train안정성을 보장하는 복조단계를 거친다: w''i,j,k = w'i,j,k / √∑i,kw'i,j,k2 + ε
결과적으로 간단한 변경을 통해 물방을 artifact방지는 물론 Style벡터로 생성된 Img제어 + 출력품질을 높인다.
Path Length Regularization
StyleGAN구조에 또다른 변경사항이 있는데, Loss Function에 경로길이규제(Path Length Regularization)라는 추가적인 penalty항을 주는 것이다.
latent space에서 어느 방향이든 고정된 크기의 거리이동 시 img에 고정된 크기변화가 발생하는 것이 좋다. 그렇기에 latent space를 가능한 매끄럽고 균일하게 하는것이 선호된다.
위 속성을 장려하기위해 Gradient Penalty가 있는 일반적 Wasserstein Loss로 아래항 최소화를 목적으로 한다: 손실함수 규제항 효율성을 위해 16-batch마다 적용하는 Lazy Regularization기법으로 두드러진 성능저하가 발생하지도 않는다.
No Progressive Training
또 다른 주요변경사항은 training방식으로 일반적 점진적 train채택이 아닌, 생성자의 Skip Connection과 판별자의 Residual Connection을 활용 →신경망을 하나로 훈련한다.
즉, 더는 각기 다른 해상도에서 독립적으로 훈련하고 혼합할 필요가 없다.
training 진행시, 생성자가 판별자를 속이기 위해 진짜같은 img를 만들어야하는데,
위 그림은 고해상도 층이 진짜같은 img를 만드는데 점차 지배적이게 됨을 보여준다.
∙ Attention을 사용하지 않는 GAN기반 모델은 Convolution feature map이 local한 정보만 처리 ∙CNN은 channel수를 늘려야만 receptive field가 넓어져 좀 더 넓은 범위를 포착가능. ∙ 이 과정에서 고수준특징을 잡기위해 정확한 위치정보를 잃는 단점이 발생.
→ Self-Attention을 도입한 SAGAN으로 이런 문제를 해결. 붉은 점: 몸통부분 픽셀 (즉, Attention이 몸통부분의 픽셀에 집중.) 초록 점:배경부분 픽셀 (이 Attention은 머리와 뒷배경에 집중.) 파란 점:꼬리부분 픽셀 (이 Attention은 멀리 떨어진 다른 꼬리픽셀에 집중.) Attention을 사용하지 않고 이렇게 넓은 범위의 pixel-independency를 유지하기란 어려운데, 특히나 새 꼬리처럼 길고 얇은 구조의 경우, 픽셀의존성 유지가 더욱 어렵다.
BigGAN
DeepMind에서 개발한 모델로 SAGAN의 아이디어를 확장시켰다. ImageNet에서 훈련된 BigGAN으로 생성된 img 물론, 추가된 내용중 매우 혁신적인 내용도 존재한다:
∙ Truncation Trick : train 시, latent분포로 z~N(0,I)를 사용하지만 sampling 시, truncated normal distribution을 사용한다 (= truncated_threshold보다 작은 z를 sampling한다.) 이때, truncated_threshold가 작을수록 다양성은 줄어들지만 생성sample신뢰도는 커진다.
임계값은 좌측부터 2, 1, 0.5, 0.04
BigGAN의 batch_size는 2048로 SAGAN의 256보다 8배 더 크다. 각 층의 channel_size도 약 50% 증가했다.
즉, SAGAN보다 BigGAN은 구조적으로 향상되었는데, 여기서 Shared Embedding과 Orthogonal Regularization이 포함된다. latent vector z를 첫번째 층뿐만아니라 Generator의 층마다 사용한다.
VAE에서 학습한 표현이 연속적이 아닌, 이산적일 수 있음을 기반으로 만들어졌다. 사후붕괴로 인해 연속적 latent space 형성하는 VAE에서 흔히 발견되는 몇가지 문제를 피하여 고품질결과를 출력한다.
[사후붕괴; posterior collaps]: 지나치게 강력한 Decoder로 학습된 latent spacce가 유용하지 않은 경우.
cf) OpenAI의 DALLE∙1 또한 VQ-VAE와 유사한 이산 latent space의 VAE를 활용한다.
Discrete Latent Space
해당 인덱스에 연관된 학습된 벡터목록(= codebook)을 의미한다.
[VQ-VAE의 Encoder]: input_img를 codebook과 비교가능한 더 작은 vector_grid로 축소하는 역할. 그 후 각 grid정사각형 벡터에 가장 가까운 codebook vector를 decoder로 전달해 decoding한다.
codebook: 길이가 d(= embedding_size)인 학습된 벡터의 목록. 이 길이는 encoder 출력과 decoder 입력의 channel수와 일치한다.
Codebook은 주어진 img내용을 이해하고 Encoder Decoder가 공유하는 학습된 이산적인개념의 집합이다. 이를 통해 Encoder가 grid사각형 라벨을 Decoder에게 의미있는 특정 code vector로 채울 수 있다. ∴ VQ-VAE의 손실함수는 Encoder의 출력벡터가 Codebook의 벡터에 최대한 가까워지도록하는 2가지항(alignment loss, commitment loss)으로 만들어진 재구성 손실이다. 이 항이 일반적인 VAE에 있는 Encoding된 분포와 표준정규분포사이 KLD로 대신한다. 다만, VQ-VAE는 새 img생성할 때마다 Decoder에 전달할 때, code grid를 어떻게 sampling해야할 지 의문점이 존재한다. 이 문제를 해결하기위해, PixelCNN으로 이전 codevector가 주어지면, Grid의 Codevector를 예측한다. 즉, "VAE처럼 prior분포가 전적이 아니라 모델에 의해 학습"된다.
VQ-GAN은 위 그림구조와 같으며, VQ-VAE구조에 몇가지 주요변경사항을 적용한다:
① Loss에 적대적항을 추가하는 GAN판별자를 포함. 다만, VQ-GAN에도 VQ-VAE가 여전히 들어가며, GAN판별자는 VAE대체가 아닌 추가적 구성요소이다.
②GAN판별자는 전체img를 한번에 보지 않고, img의 작은 patch의 real/fake를 예측 판별자예측의 개별요소는 patch기반이기에 patch style을 사용해 결정을 내린다. VAE는 실제보다 더 흐릿한 img를 생성하는데, 판별자는 더 선명한 img생성을 독려한다.
③ VQ-GAN은 input pixel을 VAE Decoder의 output pixel과 비교하는 단일 MSE재구성손실을 사용하지 않는다. 대신, Encoder의 중간층과 이에 해당하는 Decoder층에서 feature map간 차이를 계산하는 "perceptural Loss항"을 사용한다.
④ PixelCNN대신 Transformer를 모델의 AR부분으로 사용. Code Sequence를 생성하게 train. Transformer는 VQ-GAN이 완전히 train된 후 별도의 단계에서 train. sliding window내의 token만 사용한다.
ViT VQ-GAN
[Vector-quantized Image Modeling with Improved VQGAN]논문은 VQ-GAN을 더 확장한 버전이다. VQ-GAN의 Convolutional Encoder-Decoder를 Transformer로 교체한다.
∙ Encoder: ViT
img를 일련의 8×8patch로 나누고 이 patch를 tokenize하여 Encoder Transformer에 input으로 주입한다.
구체적으로, ViT VQ-GAN은 겹치지 않는 input_patch를 먼저 펼친 후 저차원 embedding공간으로 투영하고, Positional Embedding을 추가. 그 후, 이 sequence를 ViT에 주입. 만들어진 embedding은 학습된 codebook에 따라 quantize된다.
Decoder Transformer모델이 이런 code를 처리. 전체 Encoder-Decoder모델은 하나의 End2End로 훈련된다: 기존 VQ-GAN모델처럼 훈련의 두번째 단계에서 AutoRegressive Decoder Transformer를 사용해 Code Sequence를 생성한다.
따라서 ViT VQ-GAN에는 GAN Discriminator와 학습된 CodeBook이외에도 총 3개의 Transformer가 존재한다. ViT VQ-GAN으로 생성된 ImageNet Sample Image
5. 요약
prev.
ProGAN[2017]: 선구적으로 개발한 점진적 훈련개념
StyleGAN[2018]: 특정 style벡터 생성 (by mapping신경망 & 다양한 해상도 style삽입)
StyleGAN2[2020]: path length regularization같은 추가개선사항 + AdaIN를 가중치 변조∙복조단계로 대체 이는 신경망을 "점진적으로 훈련하지 않고도" 점진적 해상도개선이라는 좋은 속성을 유지시킴.
SAGAN[2018]: Attention개념을 GAN에 포함, 공간차원에 정보를 분산시켜 장거리 종속성을 감지.
BigGAN[2018]: 위 아이디어를 확장, 더 큰 신경망을 훈련
VQ-GAN[2021]: 여러 유형의 생성모델을 결합, 이산잠재공간이 있는 VAE의 개념을 도입, VQ-VAE를 기반으로 판별자가 적대손실항을 추가해 덜 흐릿하게 VAE가 생성하게함.
ViT VQ-GAN[2021]: 위 아이디어를 확장, Transformer로 Encoder-Decoder를 교체