머신러닝/GAN

Progressive Growing GAN 소개

hwijin97 2021. 6. 28. 23:05

https://machinelearningmastery.com/introduction-to-progressive-growing-generative-adversarial-networks/

 

A Gentle Introduction to the Progressive Growing GAN

Progressive Growing GAN is an extension to the GAN training process that allows for the stable training of generator models […]

machinelearningmastery.com

 

ProGAN소개

 

점진적으로 증가하는 GAN은 학슴과정을 확장시키고 이건 크고 높은 퀄리티의 생성자모델의 안정적인 학습을 가능케한다.

 

이건 아주작은 이미지에서부터 시작해서, 생성자모델의 출력크기와 판별자의 입력사이즈를 증가시키는 블럭레이어들을 원하는 이미지 사이즈가 될때까지 추가한다.

 

이 접근은 놀랍도록 실제적인 높은 퀄리티의 합성 얼굴을 효과적으로 만들어 낼 수 있다고 입증 되었다.

 

이번 포스트에서, 우리는 커다란 이미지를 만들어내는 점진적 증가 gan을 살펴볼 것이다.

 

이 포스트를 읽은후에, 아래 내용을 알게 될 것이다.

- GAN이 모델의 안정성때문에 커다란 이미지를 잘 만들지 못하지만, 예리한(sharp)이미지를 만들어내는데 효과적이다.

- ProGAN은 훈련중에 모델 사이즈를 점차적으로 증가시키는 진화를 통해서, 커다란 높은 퀄리티의 이미지를 생성하는 GAN을 훈련하는데 안정적이다.

- ProGAN 모델은 실사와 가까운 합성 얼굴이나, 높은 해상도의 물체를 생성할수 있다.

 

step-by-step 예시

 Generative Adversarial Networks with Python

 

Generative Adversarial Networks with Python

Step-by-step tutorials on generative adversarial networks in python for image synthesis and image translation.

machinelearningmastery.com

 

OVERVIEW

1. GAN은 일반적으로 작은이미지에 제한된다.

2. 점직전으로 레이어를 추가시켜 큰 이미지 생성하기

3. 어떻게 GAN을 점진적으로 증가시킬까

4. ProGAN을 통해서 이미지 생성하기

5. ProGAN 모델을 어떻게 설정할까

 

1. GAN은 일반적으로 작은이미지에 제한된다.

 

GAN이 합성 이미지를 생성하는데 딥 컨볼루션 신경망모델의 접근이 효과적이다.

GAN모델을 훈련하는 것은 2가지 모델을 훈련하는 것을 포함한다.

1. 생성기 : 보통 합성이미지를 출력한다.

2. 판별기 : 보통 이미지가 진짜인지 가짜(생성기가 생성한 이미지)인지 구분한다.

이 두모델은 같이 적대적(adversarial) 방식으로 서로 균형을 찾으면서 훈련된다.

 

다른 접근방식과 비교했을때, 그것들 모두 빠르고 선명한 이미지를 만든다.

그런데 GAN의 문제는 작은 데이터셋 사이즈로 제약을 받는다, 보통 200x200은 드물고, 100x100보다 작은 사이즈를 사용한다.

"GAN은 꽤 작은 해상도에서, 그리고 어떤에유로 부족한 다양성을 가지면서 선명한 이미지를 생성하고, 최근의 진전에도 불구하고 훈련은 여전히 불안정하다."

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

높은 해상도의 이미지를 생성하는 것은 GAN모델에서의 도전이다. 생성기가 코다란 구조와 정밀한 디테일을 동시에 출력하는 법을 배워야 하기 때문이다.

 

높은 해상도는 판별기가 찾기쉬운 생성된 이미지의 디테일을 통해 문제들을 일으킬 수 있다. 그리고 훈련과정이 실패한다.

"높은 이미지를 생성하는 것은 어렵다, 높은 해상도는 생성된 이미지를 학습 이미지와 구분하기 더 쉽기 때문이다.

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

 

커다란 이미지, 1024x1024사이즈, 는 또한 방대한 메모리를 필요로하고, 이는 현재 메인메모리에 비해 적은 GPU메모리에 제공하기 제약이 있다.

예를 들어, 배치 사이즈(각 훈련반복에 모델 가중치를 업데이트하기 위해 사용되는 이미지의 뭉치)는 큰 이미지들이 메모리에 모두 적제될만한 값을 가져야한다. 보통 작은 이미지들보다 적은 배치사이즈를 요구한다. 이것은 많은 반복을 야기해서 더많은 불안정성을 야기한다.

 

"커다란 해성도는 메모리제약 때문에 더작은 패치사이즈를 필요하게하고, 더나아가 훈련 안정성을 타협한다."

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

추가적으로, GAN모델의 훈련은 여전히 불안정하다, 모델 학습 프로세스의 안전성을 향상시키는 경험적 기술이 있는 경우에도 마찬가지이다.

 

2. 점직전으로 레이어를 추가시켜 큰 이미지 생성하기

안정적으로 커다란 이미지의 GAN모델을 훈련시키는데 발생하는 문제들의 해결방법은 점진적으로 훈련과정중에 레이어의 개수를 증가시키는 것이다.

 

이 접근법은 Progressive Growing GAN, Progressive GAN, PGGAN 으로 불린다.

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

 

"우리의 주요 업적은 GAN을 훈련하는 방법론이다. 이는 조그만 이미지에서 시작해서, 점차 레이어를 추가해 해상도를 높이는 것이다."

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

 

ProGAN은 매우작은 이미지(ex 4x4)에서 시작하는 일반적인 구조의 생성기와 판별기를 사용한다.

훈련동안, 컨볼루션 레이어들의 새로운 블록들은 조직적으로(systematically) 생성기와 판별기에 추가된다.

 

 

생성기와 판별기 모델에 점진적으로 레이어를 추가하는 예시. https://arxiv.org/abs/1710.10196

레어어의 증가는 생성기와 판별기 모델 모두 거친 수준(coarse-level) 디테일을 배우고, 이후에 섬세한 디테일을 효과적으로 배울 수 있도록한다.

"이 점진적인 성격은 훈련에서 이미지 분포의 커다란 범위의 구조를 먼저 발견하게 하고, 주의를 돌려 저 섬세한 번위의 디테일을 발견하도록한다. 모든 범위를 동시에 배워야하는 것 대신이다."

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

이 접근은 높은 해상도의 높은 퀄리티 이미지 생성을 가능케한다. 예를들어 1024x1024의 존재하지않은 사실적인 연예인 얼굴같은.

 

3. 어떻게 GAN을 점진적으로 증가시킬까

ProGAN은 훈련중에 추가적인 레이어로 확장되는 두모델 생성기와 판별기를 수용할 수 있는 수용력을 요구한다.

이건 ReLU와 Batch 정규화 개발 이전에 딥러닝 개발에서 흔하게 사용된 훈련 방식인 greedy layer-wise 와 꽤나 비슷하다.

참조 : How to Develop Deep Learning Neural Networks With Greedy Layer-Wise Pretraining

근데 greedy layer-wise 의 과정과는 달리, 

ProGAN은 레이어 블럭을 추가하는데 블럭을 직접적으로 추가하는 것보다, 단계적으로 블럭을 추가한다.

 

"네트워크에 레이어가 추가될 때, 우리는 레이어를 부드럽게(smoothly) 스며들게(fade in) 한다.

이거는 이미 잘 훈련된 작은 해상도 레이어에 갑작스런 충격을 회피한다."

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

 

더욱이, 모든 레이어들은 훈련과정 동안 훈련가능한 상태로 유지된다. 새로운 레이어가 추가될 때 이미 존재하는 레이어도 포함이다.

 

"두 네트워크(생성기, 판별기)에 존재하는 모든 레이어는 훈련 과정 통틀어서 훈련 가능한 상태로 남아있다."

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

 

새로운 레이어 블럭을 추가하는 단계에는 생성기 출력 또는 판별기 입력으로 연결되는 skip 연결을 사용하는데, 기존에 존재하던 레이어와, 새롭게 추가된 레이어가 가중치를 통해서 더해진다. 가중치는 새로운 블럭의 영향을 통제하고, 0또는 아주 작은 숫자부터 선형적으로 1까지 훈련을 반복할때마다 증가하는 파라미터 알파(alpha)를 사용한다.

 

생성기, 판별기 모델에 새로운 레이어를 추가하는 예시, 출처 :Progressive Growing of GANs for Improved Quality, Stability, and Variation.

 

생성기 Growing

생성기에 32x32 이미지출력인 컨볼루션 레이어 블럭을 추가한다.

이 새로운 레이어의 출력은 기존 레이어 16x16레이어에서 nearest neighbor interpolation을 통해 32x32로 upsampling 된 레이어와 결합한다. 보통 많은 GAN에서 생성기에 transpose 컨볼루션 레이어를 사용하는 것과는 다르다.

 

(최단 근접 보간법 : 정보를 알수 없는 픽셀에 관해서, 가장 가까운 픽셀의 정보를 그대로 사용한다.)

https://en.wikipedia.org/wiki/Nearest-neighbor_interpolation

"이미지 해상도를 두배늘리는데 nearest neighbor 필터링을 사용한다."

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

 

업셈플된 16x16 레이어는 (1-alpha)의 가중치를 지니고, 새로운 32x32레이어는 alpha의 가중치를 지닌다.

alpha 는 초기에 작아서, 확장된 16x16이미지에 가장큰 비중을 둔다. 훈련 반복이 진행될 때마다, 새로운 32x32 레이어에 더 더많은 가중치를 부여하고 결국엔 모든 가중치를 32x32 레이어에 부여한다.

 

"가중치를 전환하는 동안, 더 높은 해상도 레이어를 가중치 alpha가 0 에서 1로 선형적으로 증가하는 residual 블록처럼 취급한다."

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

 

판별기 Growing

판별기에서는, 생성기에서 32x32 이미지가 출력되고 판별기에 입력되기 때문에, 판별기에도 downsampling 하는 추가적인 작업이 필요하다.

입력 이미지 (32x32)는 average pooling 을 통해서 16x16으로 downsampling 되서, 기존 모델에 존재하던 16x16 컨볼루션 레이어를 통과 시킬 수 있게된다. 또한, 새롭게 추가된 32x32 레이어 블럭을 통과한 후, average pooling으로 16x16으로 downsampling 되서 동일하게 기존 모델의 16x16 컨볼루션 레이어에 진입한다. 이것도 보통 GAN에서 2x2 컨볼루션 레이어를 downsampling 하는데 사용하는 것과 다르다.

 

두개의 downsampling 된 입력들은 가중치를 통해서 결합된다. 처음엔 단순히 16x16으로 downsampling된 이미지에 full 가중치를 가지고, 선형적으로 새로운 레이어 블럭의 출력값쪽으로 full 가중치를 갖도록 전이된다.

 

4. ProGAN을 통해서 이미지 생성하기

Progressive Growing GAN이 만들어낸 인상적인 이미지 결과들을 리뷰해보도록한다.

https://youtu.be/G06dEcZ-QTg

 

 

Progressive Growing of GANs for Improved Quality, Stability, and Variation.

인공 연예인 얼굴 사진들

CELEBA-HQ 을 사용해서, 훈련해 만들어낸 1024x1024 사이즈의 존재하지않는 연예인 얼굴 사진들.

흥미롭게, 이 얼굴 생성 모델은 8개의 Tesla V100 GPU 8개를 4일동안 돌려서 얻었다.

 

"우리는 8개의 Tesla V100 GPU로 4일간 훈련시켰다. 더욱이 연이은 훈련 반복의 결과사이에 질적인 차이를 느끼지 못할 때이다. 훈련 수행에서 출력 해상도에 맞춰서 적응가능한 미니배치 사이즈를 사용했다, 그결과 사용가능한 메모리 자원을 최적으로 활용했다."

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

 

 

 

인공 물체사진

LSUN 데이터셋을 사용해서 256x256 픽셀의 이미지를 만들어 낸다.

Progressive Growing of GANs for Improved Quality, Stability, and Variation.

 

5. ProGAN 모델을 어떻게 설정할까

우리가 커다란 모델을 개발하는데 흥미가 없거나, 자원이 없더라도, Progressive Growing GAN을 구현할 때의 배치 디테일은 유용하게 사용될 것이다.

 

생성자, 판별자 모델 모두 컨볼루션 레이어 블럭을 통해서 성장(grow)되고, 각각 3x3 filter 사이즈를 사용하고, LeakyReLU (alpha = 0.2) 활성화 레이어를 사용한다. upsampling에는 nearest neighbor sampling을 사용하고

downsampling 에는 average pooling 을 사용한다.

 

"두 네트워크들은 훈련 과정에서 하나하나 소개한 3-layer block들로 대부분 구성되어 있다. 우리는 두 네트워크의 모든 레이어에 leaky ReLU (0.2) 활성화 함수를 사용한다. linear 활성화를 사용하는 마지막 레이어는 제외한다."

 Progressive Growing of GANs for Improved Quality, Stability, and Variation, 2017.

 

생성기는 512개의 가우시안 분포를 가지는 랜덤 잠재 벡터를 사용한다. 또한 출력 레이어에는 보통 흔하게 사용되는 hyperbolic tangent (tahn) 활성화함수 대신, 1x1 filter 사이즈와 linear 활성화 함수 (h = cx) 를 사용한다.

 

Wasserstein GAN loss + gradient penalty (WGAN-gp)를 사용한다. least squares loss도 좋은 결과를 보였지만, WGAN-gp 만큼은 아니었다.

Improved Training of Wasserstein GANs

 

Improved Training of Wasserstein GANs

Generative Adversarial Networks (GANs) are powerful generative models, but suffer from training instability. The recently proposed Wasserstein GAN (WGAN) makes progress toward stable training of GANs, but sometimes can still generate only low-quality sampl

arxiv.org

 

판별기와 생성기 배치, Progressive Growing of GANs for Improved Quality, Stability, and Variation.

배치 정규화를 사용하지 않는 대신에, 두가지 새로운 기술을 사용한다. 

1. MiniBatch standard deviation

판별기 마지막 downsampling 레이어 이후에, minibatch 표준편차 레이어를 추가한다.

 

개인의 이해를 바탕으로 한 설명 :

minibatch size 64의 512x4x4 의 feature map 이 있으면, 64개의 i 번째 feature의  x , y 값들의 표준편차를 구한다.

64x512x4x4 의 값을 1x512x4x4 으로 줄여지고, 512개의 feature들의 평균을 구한다. 그러면

1x512x4x4 에서 1x1x4x4 의 형태로 줄어들어 이 feature을 입력으로 받았던 64x512x4x4 각 batch에 추가한다.

결국 64x513x4x4의 사이즈가 된다.

 

2. PixelWise normalization

 

개인의 이해를 바탕으로 한 설명 :

batch normalization 대신 실시하는 정규화 방식으로, 각 컨볼루션 레이어가 종료될 때 실시한다.

예를 들어 batch size n , 512x4x4 을 입력으로 받아 pixelwise 정규화를 실시한다고 하자.

정규화된 i 번째 feature map의 x, y 값 을 구하기 위해서, 모든 feature map 의 x,y 값의 제곱을 합의 평균의 제곱근 을 나눈다. b_xy = a_xy / root( sigma_j=0 to N-1 ( a_j_xy ** 2 ) + 10**-8 )

결국 root( sigma_j=0 to N-1 ( a_j_xy ** 2 ) + 10**-8 ) 값을 4 x 4 행렬로 만든후에, 모든 64x512x4x4 에 나눠주면된다.