-
Glow: Generative Flow with Invertible 1x1 Convolutions 리뷰논문 리뷰 2021. 10. 13. 19:32
들어가며
오늘은 WaveNet-Glow-WaveGlow 3부작의 두번째 주제가 될 Glow 에 대한 글이다
2021.10.13 - [논문 리뷰] - WaveNet: A Generative Model for Raw Audio 리뷰
WaveNet: A Generative Model for Raw Audio 리뷰
들어가며 WaveNet은 Neural Vocoder 에서 중요한 역할을 하는 논문이다. 많은 뉴럴 보코더들이 WaveNet 기반으로 만들어졌으며, WaveNet의 단점(Generation 속도, 병렬 처리 등)을 개선하기 위해 여러 후속 논
artificial-intelligent.tistory.com
2021.10.13 - [논문 리뷰] - WaveGlow: A Flow-based Generative Network for Speech Synthesis 리뷰
딥 러닝에서 Generative model은 매우 중요한 주제이다.
Generative model의 종류에는 GAN, VAE, Flow 3가지 기반이 있다고 한다.그중에 Flow는 다른 GAN, VAE 기반의 방식보다 주목을 받지 못하고 있는것이 사실이다.
(다른 블로그들을 찾아보니 GAN, VAE 는 차원축소가 생기는데 반해 Flow 기반의 모델은 차원축소가 생기지 않아 다른 어플리케이션으로의 적용이 어렵기 때문이라고 하는 것 같다)
Fig. 1. Comparison of three categories of generative models. 출처: Flow-based Deep Generative Models (lilianweng.github.io) 그래도 Flow 기반의 생성모델이 가지는 장점이 있는데 Glow 논문에서는 4가지로 정리를 하고 있다.
- 정확한 latent variable 추론, log-likelihood 평가 : VAE 는 ELBO 를 이용하여 latent variable 의 근사치를 추론하는데 반해 Flow 기반으로 사용하게되면, 정확한 분포를 얻고, 이를 log-likelihood 를 이용하여 학습할 수 있음
- 효율적인 추론과 합성 : 병렬화가 가능하기 때문에 효율이 높음
- 다운스트림 작업을 위한 유용한 latent space : latent space 에 데이터 포인트간의 인터폴레이션을 이용하여 데이터 조작이 가능함
- 상당한 메모리 절약 가능성 : 모델의 깊이와 관계 없이 일정한 양의 메모리만을 필요로 함
그래서 GLOW 가 무엇이고 어떻게 하는가???
Fig. 2. Illustration of a normalizing flow model 출처: Flow-based Deep Generative Models (lilianweng.github.io) Flow 복잡한 분포에 역산 가능한 함수를 여러번 적용시켜 (spherical multivariate Gaussian distrubution과같은) 우리가 알고있는 분포로 변경시키는 방법이다.
위 Fig. 2. 에서 우리가 알고있지 않은 분포인 pk에서 샘플링 하는것이 generate 하는 과정인데, pk 분포를 알고 있지 않으므로, 우리가 알고있는 p0 분포를 가지고 pk 분포를 만들어 내는 것이다.Fig. 3. (a) 는 flow의 한 step, (b) 는 Glow 의 전체 구조 Glow 논문에서의 모델 구조는 Fig. 3. (b)와 같다. 실제의 데이터 x에
Fig.3.(a)에 있는 actnorm, invertable 1x1 conv, affine coupling layer을 하나하나 설명해보자
actnorm은 normalization을 해주는 모듈이다. Batchnorm 처럼 잘 학습시키기위한 모듈인데, batchnorm이 가지고있는 몇가지의 문제점을 해결하기 위해서 제안한 normalization 기법이다.
batchnorm은 minibatch size가 작으면, activation의 노이즈의 분산이 크기 때문에 batchnorm의 성능이 저하되는데, 큰 이미지를 프로세싱하기 위해서는 GPU의 한계 때문에 minibatch의 크기를 줄여야 한다는 문제가 있었다.actnorm은 이를 해결하기 위해 초기 미니배치 데이터에 대해 채널별로 평균0, 분산1 을 갖도록 초기화를 시킨다.
Invertible 1x1 conv 는 Glow 이전에 있었던 NICE, RealNVP 등의 Flow based generative model 에서 feature 을 섞어주기 위해 channel의 순서를 반대로 했던 방법을 고도화 한 것으로, Glow 에서는 1x1 conv 연산을 통해 permutation 의 효과를 냈다.
flow 를 적용하기 위해 이 convolution의 jacovian matrix 의 log determinant 를 구해야 하는데, 결론적으로 cxc weight 를 갖는 matrix W의 log determinant 에 곱하려는 tensor의 h,w 을 dot product한 형태이다.
이 연산의 시간 복잡도는 O(c3) 이다. 효과적인 연산을 위해서는 이를 줄여야 한다. triangle matrix 의 det 는 대각성분의 합이라는 점에서 착안하여 LU decomposition을 이용하여 constant한 시간 복잡도로 이를 해결하였다.Affine Coupling Layers는
feed forward, reverse function, log determinant 의 계산이 효율적인 함수여야한다.
이전의 NICE 논문, RealNVP 에서 이러한 조건을 만족하는 affine coupling layer 를 소개했다. Glow 에서도 이와 동일한 방법을 사용한다.additive coupling layer 은 s=1, log-determinant=0 을 가지는 특별한 경우의 affine coupling layer 이다.
affine coupling layer 은 3가지 기능으로 구성되어있다.
zero initialization, split and concatenation, permutation이다.
zero initialization: affine coupling layer가 동일한 함수를 여러번 수행하기 위해 각 NN 의 마지막 convolution 의 weight 을 0으로 초기화 한다. 매우 깊은 네트워크를 학습시킬때 도움이 된다고 한다.
split and concatenation : 텐서를 반 나누거나 합치는 기능을 한다. split, concatenation 을 함수로 본다면, 둘은 역함수 관계이다
permutation : flow 의 setp 단계는 각 차원이 다른 모든 차원에 영향을 미칠 수 있도록 변수에 대한 permutation이 선행되어야 한다. NICE, RealNVP 는 단순히 차원의 순서를 반대로 하는 것으로 permutation 을 수행하였고, 순서가 정해진 random permutation 등으로도 구현이 가능하다, Glow 에서는 invertable 1x1 convolution 으로 이 기능을 수행하였다.
이러한 방식으로 Glow 에서는 다음과 같은 사실적인 사람 얼굴 사진을 생성했다고 한다.
참고한 블로그 , 코드
Flow-based Deep Generative Models (lilianweng.github.io)
[1807.03039] Glow: Generative Flow with Invertible 1x1 Convolutions (arxiv.org)
rosinality/glow-pytorch: PyTorch implementation of Glow (github.com)
'논문 리뷰' 카테고리의 다른 글
Deep Speech & Deep Speech2 간단 리뷰 (0) 2022.01.15 Listen, Attend and spell (0) 2022.01.01 VQVC+: One-Shot Voice Conversion by Vector Quantization and U-Net architecture 리뷰 (0) 2021.10.13 WaveGlow: A Flow-based Generative Network for Speech Synthesis 리뷰 (0) 2021.10.13 WaveNet: A Generative Model for Raw Audio 리뷰 (0) 2021.10.13