딥러닝과 표현학습(representation learning) 관점에서의 VAE. Auto-Encoding Variational Bayes 리뷰 (1)

changdaeoh·2021년 5월 20일
0

Paper Review

목록 보기
3/25
post-thumbnail

intro

얼마전부터 표현학습(representation learning)생성모델(generative model)에 흥미가 생겨 다양한 자료들로 열심히 공부중이다.

그러던 중 읽어본 고전논문 VAE의 오리지널 페이퍼를 리뷰해본다. (2개의 글로 리뷰한다. 현재(1) 글은 본문내용보단 표현학습/생성모델 관점에서 VAE를 이해하는 성격의 글이고 리뷰글(2)는 본 논문 내용이 주가되게 구성했다.)

나처럼 생성모델에 관심이 있어 공부하고자 하시는 분들에게 직접적/간접적으로 매우 많은 도움이될만한 논문이라고 생각된다. (단, 직접적인 딥러닝 관련 기술/이론을 다루는 논문이라기보다는 확률, 근사추론의 이론이 주가되고 그에 활용한 모델이 신경망 -오토인코더 구조- 일 뿐인 느낌이라 그냥 딱 딥러닝 측면에서 VAE에 관심이 있으신 분들한테는 수식이 절반이상인 이 논문이 재미없게 느껴지실수도 있겠다.)

본 글은 '4차 산업혁명 연합동아리 TAVE에서 진행하고있는 리서치 세미나' 시간에 본인이 발표할 때 사용한 slide를 가져다가 하나하나 살을 붙여 설명하는식으로 구성해보고자한다.

목차는 다음과 같다.

위에서도 언급했듯이 이 리뷰글(1)는 본문자체의 내용에 관한 설명보다 이를 이해하기 위한 기반지식 -표현학습, 생성모델- 에 대한 설명이 대부분이며, 이 기반지식들의 끝에 본문내용을 연결시키는 식으로 진행된다. 논문의 상세 내용이 궁금하신분들은 리뷰글(2)를 봐주세요!



1. Representation Learning

같은 데이터라도 그것을 다루는 주체나 사용목적에 따라 다양하게 표현될 수 있다. 예를들어 구불구불한 산길을 지나고 있는 자동차의 위치에 관심이 있다고 했을 때, 인공위성은 이것을 (위도,경도,고도)의 3차원 벡터로 나타낼 수 있을 것이고, 네비게이션은 이것을 (기준점으로부터의 거리)의 1차원 벡터로 나타낼 수 있을 것이다.

다음으로 이미지 데이터를 살펴보자. 이미지는 픽셀이라는 단위와 픽셀이 가질 수 있는 폭넓은 수치값을 통해 수치적인 데이터로 다룰 수 있게 되는데, 기계학습 관점에서 보았을 때 각각의 픽셀은 하나의 feature가 되므로 일반적으로 이미지는 매우 고차원적인 데이터가 된다

이토록 많은 차원이 정의되어 있지만, 사실 그 고차원 공간상에서 실제로 우리의 관측 데이터가 분포되어있는(distributed) 공간은 그중에 매우 작은 일부분이다. (슬라이드에 data generating source라고 표현) 생각해보면 당연한것이 4가 상하 또는 좌우로 반토막나있는 이미지나 고양이 목이 몸통과 분리되어 바닥에 놓여있거나 하는등의 이미지들은 일반적으로 관측되지 않을 것이기 때문이다. (이 외에도 무한히 많은 경우의 수를 생각해볼 수 있음)

위의 두 슬라이드를 통해 말하고자 하는 바는 2가지 이다.

1. 데이터는 표현 방식에 따라 다양한 차원 수로 나타낼 수 있다.
2. 실세계(real world)의 관측 데이터는 대체적으로 매우 고차원인데, 그중에 실제로 데이터가 관측되고 생성되는 부분은 매우 작은 부분공간이다.


이는 매니폴드 가설(manifold hypothesis)로 설명할 수 있는데, 관측 데이터의 고차원, sparse한 공간 속에 데이터들이 아주 잘 밀집되어있는 저차원 비선형의 부분공간이 존재한다는 것이다.

이 부분공간을 manifold라고 하며, 매니폴드는 우리가 직접 관측하는 변수들로 표현할 수 없으며, 그 관측변수들의 복잡한 비선형 변환에 의해 정의되는 '잠재변수(latent variable)'에 의해 구성된다고 볼 수 있다.


우리가 어떤 지도학습 task를 수행한다고 할 때, 신경망을 사용했다고 하자. 신경망은 한 층의 출력변수값이 다음 층의 입력이 되는데, 층을 하나 거칠때마다 비선형 변환이 수행되고 이는 input된 특성 공간을 해당층의 출력노드 개수만큼의 차원을 갖는 새로운 공간으로 변환하는 것으로 생각할 수 있다.

훈련이 잘 수행된 뒤, 신경망의 가장 끝부분 층에서의 출력공간은 관측 데이터의 분포 및 특성을 가장 잘 표현하도록 학습된 잠재변수들에 의해 정의되며, 결과적으로 우리의 신경망은 데이터에 내재된 매니폴드를 학습한 것이다.


차원축소나 군집화, 밀도추정 등에 대해서도 매니폴드가설, 잠재변수의 존재와 연관시켜 설명하는 것이 가능한데, PCA를 예로 들면, PCA는 관측 데이터포인트들을 가장 잘 설명하는 선형 매니폴드를 계산하는 방법론인 것이다. 또, 밀도추정이나 군집화 등에 사용되는 가우시안 믹스쳐 모델에는 클러스터 할당변수가 잠재변수로써 고려된다.

지도학습에서든 비지도학습에서든 우리의 학습(learning)과정에는 관측 데이터 속에 숨어있는 잠재변수 및 매니폴드를 추론하는 과정이 주가될 수 있다는 것이다.



2. Generative Modeling


일반적으로 우리에게 익숙한 모델은 분별모델(discriminative model)으로, classification, regression을 위한 대부분의 모델들이 여기에 해당한다. 분별모델들은 데이터 x가 주어졌을 때 정답 y를 예측하는 것을 목적으로 한다.

반면 생성모델(generative model)은 데이터 x 자체의 분포 P(x)를 추정하는 것을 목표로 한다.


위 슬라이드의 오른쪽 그림과 같은 데이터 생성분포 P_data(x)를 추론하는 것이 목적이며, 이를 theta로 parameterize한 P_model(x;theta)을 학습하는 것이 목적이라고 하자.

이러한 목적을 가지는 생성모델의 학습을 다음과 같이 분류할 수 있다. (이안 갓펠로 형님이 gan 튜토리얼 논문에서 생성모델들을 아주 잘 분류해주셨는데, 수많은 자료들에서 인용되고있는 분류트리다.)

데이터의 분포 P(x)를 추정하는데 있어 명시적으로 그 밀도함수를 정의하고 그것을 추정하는 방법(Explicit density)이 있으며, 그러한 과정없이 간접적으로 데이터의 분포를 학습하는(Implicit density) 방법이 있다.

또 Explicit density를 추정하는 방법 중에서도 다룰 수 있는 밀도함수(tractable density)를 가정하여 그것을 직접 추정하는 방법과, intractable 하여 다룰 수 없는 밀도함수를 근사(approximate) 하여 추정하는 방법이 있으며, 그 근사 방법에 따라 Variational Inference를 이용하는 방법, sampling에 기반한 MC방법으로 또 분류할 수 있다.

VAE는 변분추론(variational inference)를 이용하여 근사적인 데이터의 밀도함수를 추정하는 방법에 기반하는 생성모델이다!!


다시 데이터 분포의 추론문제로 돌아와 위와같은 문제를 생각해보자. P(x)를 모델링하는 Pmodel(x;θ)P_{model}(x;\theta)의 모수를 직접 최적화 하는 방식으로 추론하는 것은 매우어렵다. 그 이유는 대부분의 Pmodel(x;θ)P_{model}(x;\theta)는 Intractable한 형태이며, tractable한 형태로 다루려면 분포에 많은 제약을 가해야 한다.

그래서 생각할 수 있는 것은 Latent variable model이다. 잠재변수모델은 데이터 x의 변동에 상당한 영향을 미치는 잠재변수 z의 존재를 가정하고, z -> x의 매핑관계를 학습시키는 모델이다. 즉, 분별모델에서 우리가 일반적으로 학습하는 것이 x -> y : P(y|x)라면, 잠재변수를 이용한 생성모델에서 우리가 학습시키고자 하는 것은 z -> x : P(x|z)인 것이다.

이제, VAE에서 어떤식으로 잠재변수모델을 활용하여 데이터 x의 분포를 모델링하였는지 알아보자.



3. Variational Auto Encoder

지금까지의 전개 흐름을 위 슬라이드 한장에 담아보았음.


잠재변수모델을 활용해 데이터의 분포를 모델링 할 것이라고 하였는데, 문제가 있다.

우리가 z -> x의 매핑, 더 자세히는 'P(x|z) : z가 주어졌을 때 x의 사후분포(posterior distribution)' 를 모델링하여 학습시키고 싶은데, 잠재변수는 말그대로 잠재(latent)변수여서 직접 관측하거나 측정하는게 불가능하다는 것이다.

이를 해결하기 위한 방법은 잠재변수 z 또한 어떤 분포를 가지고 있다고 가정하고, 그 분포를 추정하여 z의 확률밀도함수 P(z)로부터 z를 샘플링한 뒤 그것을 이용하여 P(x|z)를 학습시키는 것이다.


그런데 z의 분포인 P(z)를 직접 추정하는 것 또한 어려운 일이기 때문에 논문 저자는 z의 marginal한 분포가 아닌 데이터 x가 주어졌을 때 z의 사후분포 P(z|x) 가 있다고 가정하고 이로부터 z의 사후표본을 샘플링하여 P(x|z)에 전달해 학습시키고자 하였다.

이제 생성모델을 학습시키기 위한 전반적인 뼈대가 완성되었다. 이는 위 슬라이드의 우측 그림과 같다.

x를 input하여 P(z|x)를 추론하고, 그로부터 z를 샘플링하여 P(x|z)에 전달하여 학습시킨뒤, 그 학습된 모델로부터 x와 유사한 새로운 데이터를 생성! P(z|x)는 신경망기반 인코더(encoder)로 두어 x to z의 매핑을 담당하도록 하고, P(x|z)는 마찬가지로 신경망기반 디코더(decoder)로 두어 z to x의 매핑을 담당하도록 한다.

참고로 인코더와 디코더 모델은 진짜 확률분포 그 자체를 추정하여 줄력하는게 아니라 그 확률분포의 모수(예를들면 정규분포의 평균과 분산)들을 출력하는 것이다.

그런데 아직 해결되지 않은 문제가 있다.
P(z|x)를 추정해야하는데, 이게 수학적으로 intractable 하다는 것이다.
이에 대한 해결책은 아래와 같다.

변분추론(variational inference)은 구하기 힘든 확률밀도함수 (p(z|x))를 더 단순한 함수(q(z|x))로 근사하여 그것을 대신 추정하는 방법이다.


이제 x의 marginal 로그가능도를 최대화 하는 식을 아래 슬라이드와 같이 전개할 수 있다. 이때, x의 사후분포인 P(x|z), z의 marginal 분포인 p(z), 그리고 z의 근사된 사후분포인 q(z|x)에 대하여 각각 분포의 가정이 필요하며, 모두 tractable하고 우리에게 익숙한 분포들로 가정되었다. 논문에선 모두 정규분포로 가정하였지만, 다른 익숙한 분포들에도 사용할 수 있다고 한다.

x의 로그가능도가 결과적으로 ELBO(evidence lower bound) + KL divergence term으로 분해되는데, KLD는 항상 양수라는 성질이 있어 ELBO는 log p(x)의 하한이 되고, 우리는 이 intractable한 log p(x)를 직접 최대화 하는 대신에 tractable한 ELBO를 최대화 하는 방식으로 전체 encoder-decoder 모델을 학습시킬 수 있다.


아주 나이스하다. 근데 아직 문제가 남아있다...

전체 모델링 프로세스 중간 encoder와 decoder를 연결하는 부분에 z의 샘플링 과정이 포함되는데, 이 sampling operation은 미분이 불가능하다는 것이다. 이렇게되면 decoder 부분에서 흘러오는 gradient를 encoder에 전달하는게 불가능하다.

그래서 저자는 reprameterization trick을 제안하였다.

평균이 mu, 표준편차가 sigma인 정규분포의 표본인 z
수학적으로 mu + sigma*epsilon , epsilon ~ N(0, I)와 동일하다.

따라서 epsilon을 N(0, I)로부터 샘플링하여 그것의 선형변환을 통해 정의한 z = mu + sigma*epsilon 로부터 미분값 dz/dmu, dz/dsigma를 구하는게 가능하며, mu와 sigma는 인코더의 수많은 파라미터들에의해 계산된 최종 encoder 출력변수이므로 모든 인코더의 파라미터들에 대한 그레디언트를 계산할 수 있고, decoder와 연결되어 두 확률분포 p(x|z), q(z|x)에 대한 전체 모델을 최적화 할 수 있게되는 것이다.

본 논문에는 없는 다른 튜토리얼 자료로부터 VAE학습의 실험결과를 가져와보았다. 학습 데이터는 MNIST 손글씨 데이터셋으로, loss함수 결정에 따른 latent space의 시각화 결과이다.

LOSS함수로써 ELBO를 사용하는데, 그 ELBO가 두 가지 part로 나뉜다.

하나는 원본 input x와 생성된 x hat간에 유사한 정도를 측정하는 reconstruction term, 그리고 다른 하나는 z의 근사된 사후분포인 q(z|x)와 z의 사전분포(prior) p(z)를 최대한 유사하도록 하는 KLD term이다.

재구성손실 term만을 사용하여 학습시킬 경우, 손글씨 종류에 따라 잘 분리된 잠재변수 공간을 얻기는 하나, 우리가 가정한 z의 사후분포인 정규분포와는 거리가 멀어보이기에 z|x 샘플의 품질이 좋지못할 것으로 우려된다.

KLD term만을 사용하여 학습시킬경우 우리가 z에 대해 가정한 정규분포 모양이 아주 예쁘게 잘 학습된다. 그러나 손글씨 레이블간에 분리가 되어있지않고 마구 뒤섞여있어 z를 통해 생성되는 데이터를 통제할 수 없을것으로 추정된다.

두 term을 모두 사용하여 학습시킬경우, 모양도 예쁘고 레이블간 분리도 잘 되어있다. 이 경우 우리는 학습된 z space를 보고 그에따라 적절한 z값을 골라 디코더 모델에 인풋하면, 원하는 데이터를 생성할 수 있을것이다. (데이터 생성을 직접 통제할 수 있음!!!!)


학습된 잠재변수공간으로부터 샘플링한 z를 디코더에 그대로 전달하여 생성한 데이터의 결과는 위와같다.

위 결과는 우리가 명시적으로 어떠한 잠재 특성을 사전에 정의하지 않고도 데이터에 내제된 잠재적인 특성인 '숫자가 기울어진 정도, 숫자의 두께', '얼굴의 각도, 웃는 정도'를 자동으로 학습시킬 수 있다는 점을 시사한다.



Reference

레퍼런스가 진짜 알짜배기 들이니까 생성모델, vae에 관심있으신 분들은 한번씩 찾아서 봐보세요. 대박입니다.




그냥 수많은 딥러닝 모델중 하나로 VAE를 바라보면, 그 구현 자체는 매우 단순하며 특별한 점이 없어보인다. 그런데 그 모델을 구현하기 위한 단순한 수식 속에 내포된 아이디어와 이론들은 매우 아름다울 지경이다.

insight,

일반 오토인코더는 주 목적이 representation의 학습에 있다고 볼 수 있어, x -> z 매핑을 수행하는 encoder를 잘 학습시키기 위해 뒷단에 decoder를 붙인 느낌이라면, variational autoencoder는 주 목적이 generation에 있어, z -> x의 매핑을 수행하는 decoder를 잘 학습시키기 위해 앞단에 encoder를 붙인 느낌이라고 볼 수 있다.

둘은 모델 구조는 거의 같지만, 그 목적 및 뿌리가 전혀 다르다고 볼 수 있겠다.

역시 딥러닝은 너너어어너ㅓㄴ어ㅓㅓ어ㅓ무 재밌다아ㅏㅏ아❤

profile
말보다는 행동

0개의 댓글