[CS231n] 13. Generative Models
📗강의노트/CS231n

[CS231n] 13. Generative Models

728x90
반응형



비지도 학습중 세가지의 생성 모델에 대해 볼 것이다. 

지금까지 배운 것은 다 지도 학습이었다. 

Clustering, PCA, Autoencoders 는 비지도이다. 




데이터에 대한 비용이 적다. 




P_data를 통해 P_model을 학습시키고, 이 모델이 P_data와 같은 데이터를 생성하도록 하는 것이다. 




색을 칠할수도 있다. 

데이터의 잠재적인 특징들(latent features)을 잘 학습시켜 놓으면 추후 다른 테스크에도 아주 유용하게 쓰일 수 있다.




3가지에 대해서 말할 것이다. 





이미지 x에 대한 우도(likelihood)인 p(x)를 모델링할 것이다.  

체인룰로 p(x)를 1차원 분포들간의 곱의 형태로 분해한다. 

분포 p에서 도대체 “모든 이전 픽셀”이 의미하는 바가 무엇일까




Pixel RNN




화살표 방향으로의 연결성을 기반으로 순차적으로 픽셀을 생성해낸다. 방향성을 기반으로한 픽셀들간의 종속성을 RNN을 이용하여 모델링한다. (LSTM) 

종속성의 연결성을 기반으로 한 채 계속 뻗어나간다. 




PixelCNN


context영역에 CNN을 적용하여, 픽셀을 생성할 때, 특정 픽셀만을 고려한다. 

이렇게 픽셀을 생성하는 과정에서 각 픽셀 값은 정답 값 (Ground Truth)를 가지고 있을 것이다. 

이러한 과정들을 likelihood를 최대화하는 것과 같다.

Pixel RNN보다 빠르다. 학습 데이터는 이미 우리가 알고있는 값이기 때문에 학습 과정을 병렬화시킬 수 있다. 

학습은 더 빠를지 몰라도 이미지 생성 시간은 여전히 느리다. 




Pixel RNN / CNN은 likelihood p(x)를 명시적으로 계산하는 방법이다. 

가장 큰 단점은 생성 과정이 순차적이기 때문에 상당히 느리다는 것. 





VAE ( Variational auto encoder )


VAE의 경우는 직접 계산이 불가능한 확률 모델을 정의한다. 




Autoencoders는 데이터 생성이 목적이 아니다.  

레이블되지 않은 학습 데이터로부터 저차원의 feature representation을 학습하기 위한 비지도학습이다 . 

x 데이터에서 특징 z로 변환하는 매핑 함수의 역할을 한다, 

z는 x보다 작다. 그래서 기본적으로 AE를 통해 차원 축소의 효과를 기대할 수 있다. 

z가 데이터 x의 가장 중요한 특징들을 잘 담고 있어야 한다.




AE는 원본을 다시 복원한다, 사용될 수 있는 특징들을 학습하는 방식을 취한다. 

Decoder을 통해 입력과 동일한 차원, 유사한 결과를 얻을 수 있다. 원본 데이터를 복원하고 싶은 것이다. 

처음 입력을 다시 복원하기 위해서는 L2같은 loss함수를 이용한다 




loss를 사용하긴 하지만, label은 필요하지 않다. 




AE에서는 학습을 마치면 decoder는 버린다. 

Decoder는 training time에 입력을 복원해서 loss 함수를 계산하는 용도로만 쓰인다. 




Encoder만 가져다 쓰는데, 인코더가 학습한 특징 매핑을 지도학습 모델의 초기값으로 사용할 수 있다. 

그 이후 추가적인 분류기를 붙인다.

AE는 레이블링되지 않은 많은 데이터로부터 양질의 general feature representation을 학습할 수 있는 장점이 있다. 




AE는 입력을 복원하는 과정에서 특징을 잘 학습했고, 학습된 특징은 지도학습 모델의 초기화에 이용할 수 있었다. 

AE가 학습 데이터의 variation을 잘 포착해낼 수 있다는 것이다. 





이제는 새로운 데이터를 생성할 것이고, 이를 위해 모델로부터 데이터를 샘플링할 것이다. 

z는 다양한 종류의 속성을 잘 잡고 있다. 

z를 먼저 샘플링하고, z를 이용해서 이미지 X를 샘플링한다. 




생성모델이 새로운 데이터를 잘 생성하게 하려면 true parameter를 잘 추정해야한다. 




가장 쉬운 방법은 모델 파라미터가 학습 데이터의 Likelihood를 최대화하도록 학습시키는 것이다. 

문제가 된다. 위 적분식은 계산을 할 수 없기 때문이다 .




첫 항은 p(z)이다. 





계산이 intractable하다. 

Posterior density로 나타내보면 아래와 같다. 이도 계산하기 힘들다.

해결책으로는, decoder network가 p(x|z)말고도 추가적인 encoder network를 정의하는 것이다. (p를 근사시키는 q)




VAE에서 우리가 하고싶은 것은 데이터의 확률론적 생성모델을 만들고 싶은 것이다. 

인코더의 결과는 평균과, 공분산이다. 




이를 바탕으로 위의 분포에서 추출해야한다. 

Encoder/ decoder network는 각각 z와 x에 대한 분포를 생성해야 하며




Data likelihood에 log를 취한 것 이다.  

z는 encoder network로 모델링한 q(z|x) 분포로부터 샘플링한 값이다. 

Log p(x)에 Expectation을 취할 수 있는 이유는 p(x)가 z에 독립적이기 때문이다. 

식을 확장해서 베이즈 룰을 적용해보자.  




어차피 1을 곱해주는 것과 같지만 나중에 도움이 된다. 




세 개의 항으로 나눈다.




KL divergence는 두 분포가 얼마나 가까운지를 알려준다. 







우측 항은 근사분포 q와 관계가 없기 때문에 KL-divergence를 최소화하는 것은 결국 첫 번째항 cross-entropy를 최소화하는 q를 찾아야한다. 




KL divergence에서 두 개의 분포가 모두 가우시안이면 closed form solution으로 풀 수 있다. 

DKL은 사전에서 사후로 바뀌면서 얻은 정보의 양으로 해석할 수 있다. 

앞서 p(z|x)는 계산할 수 없는 항이었다. 그래서 q로 근사시킨 것이었다. 

KL-divergence 특징 : 비대칭적, 0보다 크다! , p q가 같아야만 0이다. 




앞의 두 항만 가지고 잘 해보자! 그레디언트를 이용해 최적화시켜서 실질적으로 계산할 수 있는 lower bound가 된다 




VAE를 학습시키기 위해서는, 앞서 구한 lower bound가 최대화되도록 최적화시키면 된다. 

따라서 data likelihood 의 lower bound를 최적화시키는 것이다. 

맨 우측 항이 0보다 크기 때문에 data likelihood가 적어도 우리가 최대화시킨 lower bound 보다는 항상 높을 것임을 의미한다. 

Lower bound를 최대화시키기 위해서는 파라미터 theta와 pi를 구해야한다. 




첫 항은 모든 샘플 z에 대한 기댓값이다. z는 encoder의 출력이다. encoder로 z를 샘플링하고, 모든 z에 대해서 p(x|z)의 기댓값을 구한다. ( 복원에 대한 것 )
첫 번째 항이 말하고자 하는 것은 첫 번째 항의 값이 크다는 것은 likelihood p(x|z)가 크다는 것이다. 이 값이 크다는 것은 데이터를 잘 복원해내고 있다는 것을 의미한다. 

두 번째 항이 말하고자 하는 것은 KL-divergence가 작아야 한다는 것이다. 우리가 근사시킨 분포(q)와 prior의 분포(p)가 최대한 가까워야 한다. 잠재 변수 z의 분포가 prior 분포( Gaussian )와 유사했으면 좋겠다는 것이다. ( Gaussian을 따를 것이라고 정의하는 것이 합리적이라고 생각하고 모델을 최적화한다. )




Lower bound를 최대화하길 원한다. 




먼저 forward pass이다. 입력 데이터를 encoder에 통과시키면 q(z|x)를 얻을 수 있다.  ( 근사 ) 

여기서 구한 q(z|x)는 KL divergence를 계산할 때 이용할 수 있다. 




q(z|x)를 구했으면, 이 분포로부터 잠재 변수 z를 샘플링한다. 




그리고 샘플링한 z를 decoder에 통과시킨다. 




decoder network의 출력 P(x|z)에 대한 평균과 분산이다. 이를 바탕으로 샘플링을 할 수 있다. 

그리고 training time에는 log p(이미지|z)가 최대(복원된 이미지에 대한 likelihood가 최대)가 되도록 학습하면 된다. 

backprop하여 encoder / decoder의 파라미터 phi, theta를 업데이트하고 이를 통해 train data likelhood를 최대화시킨다. 




VAE 학습이후 데이터 생성시에는 decoder network만 필요하다. 이전에 z는 p(z|x)에서 샘플링했었다. 하지만 여기서는 prior ( Gaussian )에서 샘플링한다. 




z의 각 차원이 독립적이며 이로 인해 각 차원마다 독립적인 해석가능한 요소들이 인코딩될 수 있다. 여기서는 z가 해석 가능하고 아주 다양한 의미론적인 요소들이  잘 인코딩되어있다고 볼 수 있다. 




VAE를 요약해보면, VAE는 Autoencoders의 확률론적 변형 버전이다. 




Pixel CNN은 계산가능한 확률분포를 가정했다. 이를 이용해서 학습 데이터의 likelihood를 최적화했다. 반면 VAEs의 경우는 잠재변수 z를 두고 생성 과정을 정의했다. 잠재 변수 z는 많은 이점이 있지만, 결국 VAE는 계산할 수 없는 확률 분포를 가정하기 때문에 liklehood를 직접 최적화시키지 못하고 lower bound를 최적화시켰다. 

확률 분포를 Explicitly 하게 모델링하는 법을 포기하면??

그저 샘플링만 잘하면 그만이다. 그것이 바로 GAN이다. 

GAN에서는 우리가 직접 확률분포를 모델링하지 않는다. 

GAN에서는 2 - Player game 이라는 방식으로 학습 분포를 학습한다. 

가지고 있는 분포가 아주 복잡하기 때문에 여기에서 직접 샘플링을 하는 것은 불가능하다. 


GAN ( Generative Adversarial Networks )




GAN에서는 입력으로 random noise vecotor(z)를 받는다. 벡터의 차원 수는 우리가 명시한다. 그리고 입력 z가 생성 네트워크를 통과하면 학습 분포로부터 직접 샘플링된 값을 출력한다. 




Generator vs discriminator 


Generator(위조범)는 discriminator(경찰)를 속이는 것이 목표이다. 

Discriminator는 입력 이미지가 실제인지, 거짓인지 구별하는 것이 목표다. 




Minmax game의 형태로 같이(jointly) 학습시킬 것이다. 

Generator network인 “G”의 파라미터인 theta_g는 최소화 시켜야한다. ( 실수를 최소화 )

discriminator network인 “D”의 파라미터인 theta_d는 최대화 시켜야한다.( 상대 실수 최대화 ) 

좌측에 보이는 식 log D(x)는 실제 데이터 x에 대한 discriminator의 출력값이다. log D(x)는 실제 데이터(x)가 데이터 분포 p_data에 속할 Likelihood이다. 

우측의 식에서 z ~ p(z)가 의미하는 것은 generator에서 샘플링한다는 것이다. 
그리고 D(G(z))는 생성된 가짜 이미지 G(z)에 대한 discriminator의 출력이다. 

D(G(z))는 가짜 데이터에 대한 것이므로 0일수록 좋다. 

discriminator 입장에서 보면 objective function을 최대화시킨다는 것은 진짜인지 가짜인지를 잘 구별해낸다는 의미이다!

generator 입장에서 보면 objective function이 작을수록 좋으므로 , D(G(z))가 1에 가까울수록 좋다. 




GAN을 학습시키려면 generator & discriminator를 번갈아가면서 학습시킨다. 

discriminator 입장에서 보면 objective function을 최대화시키는 theta_d를 학습하기 위해 "gradient ascent"를 이용한다. 

그리고 generator는 반대로 "gradient descent"를 이용한다. Theta_G를 학습시켜서 objective function이 최소가 되도록 한다. Generator를 학습 시킬때는 우측 항만 필요하다. 왜냐하면 theta_g가 오른쪽에만 있기 때문이다. 

실제로는 generator의 objective function이 학습이 잘 안된다는 점이다. 
Loss landscape는 D(G(x))에 대한 것이다. 

그래프는 1-D(G(x))에 대한 것이다. 우리는 Loss가 최소가 되길 원하는데 Loss의 기울기가 오른쪽으로 갈수록 점점 커진다. 

다시 말해 discriminator가 generator를 잘 속이고 있으면 그레디언트도 점점 더 커진다는 것이다. 




이러한 이유로, generator를 학습시키는것은 상당히 어렵다! 학습 능력을 향상시키기 위해서는 그레디언트를 개선시키기 위해서, objective function을 조금 변경해줘야한다. generator에서도 gradient ascent를 이용할 것이다. 

discriminator가 잘 맞출 likelihood를 낮추는 것에서 discriminator가 틀릴 likelihood를 최대화 시키는 쪽으로 학습한다!!

Log(D(G(x)))를 maximizing하는 방향으로 학습하는 것이다. 

그래프를 다시 보면, 초록색 선은 이제 왼쪽의 gradient가 커졌다. 안좋은 샘플을 생성하고 있는 부분이다. ( gradient descent로 개선 ) 반면에 좋은 샘플들을 생성해내고 있는 부분인 오른쪽이 더 평평해졌다. 

두 그래프다 discriminator를 속이는 것이지만, 틀릴확률을 최대화하는 것이 더 잘 작동된다.

그리고 이렇게 두 네트워크를 동시에 학습시키는 것 자체가 어렵다. 그리고 loss landscape에 관련한 이슈들 또한 학습 과정에 영향을 미친다. 




학습 순서는 discriminator을 조금 학습시키고, 그 다음 generator를 학습시키는 방식이다. 




정리해보자면 GAN setup에서는 generator / discriminator를 학습시켜야 한다. 

Generator는 noise z를 입력으로 받아 가짜 이미지를 생성한다. 

CNN 아키텍쳐를 GAN에 적용한 연구가 GAN의 성능을 극적으로 끌어올린다.

바로 DCGAN이다. 




노이즈 벡터 z를 다음과 같은 과정으로 샘플 출력으로 변환시킨다. 




위와 같이 재미있는 일들도 GAN을 통해 해낼 수 있다. 




많은 GAN들이 등장하고 발전했다. 




GAN Zoo에 많은 종류의 GAN이 있다. 




요약이다. 






728x90
반응형