티스토리 뷰

AI/CS231n

cs231n 13강 정리 - Generative models

미남잉 2023. 12. 21. 11:50
728x90

이번 포스팅은 cs231n 강의의 Lecture 13 Generative models를 참고하여 공부하였습니다. 

 

2022년에 공부하고 정리한 건데, 개념이 어려웠는지 귀찮았는지 또 정리를 저 이후로 포기했나보네요. 아무쪼록 다시 정리 해보겠습니다.

 

 

Supervised vs Unsupervised Learning

컴퓨터 비전에서 이미지 분류 같은 작업 등을 통하여 많은 발전을 이루었습니다. 크게 data와 label 사이의 관계를 학습한 Supervised와 데이터 자체로서 갖고 있는 특징을 이해하기 위한 시도는 Unsupervised로 연구되어 왔습니다.

그 이후 데이터 갖는 True distribution을 학습하여 데이터에 대한 모든 것을 학습하고 싶은 Densitiy model의 관점으로 접근해 본다면, 이를 통해 generative model을 얻을 수 있습니다.

 

Maximum likelihood

$D={x}$

$L(D) = \Sigma_{x \in D}-logp(x)$

 

밀도 함수는 확률 p(x)가 각 가능한 x에 대해 양의 값을 가지는 함수입니다. 더 클수록 x가 그럴듯하다는 의미가 됩니다. 밀도 함수는 정규화 되어 있습니다. 확률의 합이 1이 되므로 하나의 확률이 크다면 다른 확률은 줄어드므로 서로 compete하는 구조입니다.

 

Generative Modeling

우도(likelihood)를 통해 주어진 데이터에서 얼마나 잘 학습했는지를 수치적으로 보여줍니다. 우도는 모델이 추정하는 관측 데이터의 확률을 의미합니다. 그래서 Generative model은 training data가 주어졌을 때, 비슷한 분포를 가지는 새로운 데이터를 생성하는 것이 역할입니다.

 

Taxonomy of Generative Models

다양한 종류의 모델이 존재하는데 특성에 따라 분리됩니다. 실제 데이터에 근사하고자 하는 모델을 어떻게 정의하느냐에 따라 두 가지 갈래로 나뉩니다.

 

Explicit vs. Implicit

Explicit density은 확률 변수가 어떤 분포를 띄는지를 정의하고 찾는데 초점을 둡니다. 해당 모델은 training data의 likelihood를 높이는 방향으로 학습을 합니다. $x_1, x_i$까지가 각 pixel이 등장할 확률이라면, 해당 pixel들로 구성된 이미지가 나타날 확률은 각 pixel들의 확률곱입니다. 따라서 위와 같은 식으로 나타낼 수 있습니다. Loss도 계산할 수 있어서 학습 정도를 알 수 있습니다.

위에 장점만 보면 loss도 계산할 수 있는 explicit model이 훨씬 유리한 방법같아보일 수 있지만, 모델을 정의하는게 한계가 존재합니다. 데이터가 더 복잡해질수록 분포를 식으로 표현해서 계산하기 어렵기 때문에 implicit model 쪽을 많이 택합니다.


Implicit density은 확률 변수가 어떤 분포를 띄는지 정의하는데는 관심이 없고, 단지 확률 분포를 알기 위해 sample을 생성할 수 있는 수준을 원합니다.

 

Autoregressive Model

그중 한 예시로 Autoregressive model이 있습니다. 이는 자기 자신을 입력으로 하여 자기 자신을 예측하는 모델로 이전 상태의 정보들에 기반하여 조건부 예측을 수행합니다. 이는 텍스트, 오디오, 이미지 등 다양한 종류의 데이터 특성을 반영하기에 좋은 구조입니다.

https://www.nature.com/articles/s41467-021-25756-4/figures/1

연쇄법칙을 이용해서 결합분포를 나누는데, 이걸 Autoregressive model(자기회귀모델)이라고 합니다. 하나의 정보가 이전 정보에 dependen한 것을 의미합니다. Markov assumptio처럼 직전 정보에만 dependant한 것과 거꾸로 x1에서 x(i-1)까지 모두 dependent한 것도 모두 Autoregressive model입니다. 즉, 이전의 n개 정보들을 고려하는 모델을 의미합니다.

 

Pixel RNN

Autoregressive 모델을 구성하기 위해서는 데이터간 dependency 순서를 정해주는 것이 핵심적인데 이미지 픽셀의 dependency는 왼쪽위에서 오른쪽 아래 방향으로 정의하고 색깔은 RGB 순서대로 정의합니다. 이때 이미지의 픽셀 하나를 일련의 시퀀스라 생각하고, 모델링을 시행합니다.

이미지 픽셀 하나하나를 일련의 sequence로 생각하여, autoregressive modeling을 수행합니다.

따라서 이미지의 경우엔 임의의 픽셀은 이전 픽셀로부터 영향을 받게 되는 구조입니다.

 

가장 초기의 Pixel RNN은 그 다음 픽셀을 예측하기 위해 이전 시점들의 픽셀을 일렬로 반영하게 되는데, 이런 경우 연산 부하가 크고, 주변부가 아닌 단순한 sequential 특성만을 고려하게 된다. 이를 개선하기 위해 픽셀의 정렬 방법에 따라 Row LSTM, Diagonal BiLSTM이 제안되었고, 이후 시점의 이미지에 masking을 씌워 현재 시점까지의 정보만 활용하도록 구성된 Pixel CNN이 제안되었습니다.



Convolution 연산만을 사용해 모델을 구축하는데, 특히 미래 정보를 반영하지 않기 위해 Masked Convolution을 사용하는 것이 특징입니다. 모델이 이미 본 픽셀을 기반으로만 예측할 수 있도록 특정 픽셀을 마스크하는 일종의 convolution 입니다.

 

PixelCNN

이는 매개변수 픽셀 간 종속성 분포를 캡처하는 DNN입니다. 두 공간 차원을 따라 이미지에서 한 번에 하나의 픽셀을 순차적으로 생성합니다.

 

PixelCNN은 컨볼루션 작업을 사용하여 이미지의 모든 픽셀 분포를 병렬로 학습할 수 있습니다. 그러나 특정 픽셀의 확률을 결정할 때 표준 컨벌루션 레이어의 수용 필드는 자기회귀 모델의 순차적 예측을 위반합니다. 중앙 픽셀의 정보를 처리할 때 컨벌루션 필터는 이전 픽셀뿐만 아니라 주변의 모든 픽셀을 고려하여 출력 특징 맵을 계산합니다. 그런 다음 아직 예측되지 않은 픽셀의 정보 흐름을 차단하기 위해 마스크가 채택됩니다.

 

Masked Convolution layer

마스킹은 고려하지 말아야 할 모든 픽셀을 0으로 만들어 수행할 수 있습니다. 값이 1과 0인 컨볼루셔널 필터와 동일한 크기의 마스크가 생성되었습니다. 컨볼루션 작업을 수행하기 전에 이 마스크에 가중치 텐서를 곱했습니다. PixelCNN에는 두 가지 유형의 마스크가 있습니다.

1. 첫 번째 컨벌루션 레이어에만 적용됩니다. 마스크의 중앙 픽셀을 0으로 설정하여 관심 픽셀에 대한 액세스를 제한합니다. 이런 방식으로 모델이 예측하려는 픽셀(아래 그림에서 빨간색)에 액세스하지 않도록 보장합니다.
2. 모든 후속 컨벌루션 레이어에 적용되며 픽셀에서 자체로의 연결을 허용하여 위 1번 마스크의 제한을 완화합니다. 이는 첫 번째 레이어의 픽셀 예측을 설명하는 데 중요합니다.

 

정리하면 Pixel RNN/CNN은 이전 sequence를 사전확률분포로 바로 다음에 있을 한 target(e.g 픽셀, 음정)을 생성하는 autoregressive 모델입니다. 따라서 다음 추정할 target의 분포는 이전 time step에 있던 target들의 분포 간 곱으로 explicit & tractable하게 표현이 가능합니다.

Autoregressive 특성 때문에 반드시 사전에 정의한 $t$의 진행 '방향'이 있게 되는데, 수식적으로 말하면 ‘결합분포를 어떠한 곱의 조합으로 표현해내는가’가 되며, 이는 모델 성능에 영향을 미치게 됩니다. 추정할 target pixel의 인근 두 픽셀로부터 추정하고, 또 그 각각의 픽셀은 마찬가지로 자기 인근의 pixel로부터 값을 얻어오는 식으로 recursive하게 풀어서 얻어옵니다. 이때 그 풀어 쓰는 방향에 따라서 Pixel RNN의 세부종류(Row vs Diagonal)가 정해질 수 있습니다.

입력의 순서(ordering)를 어떻게 하느냐에 따라 두가지 방법으로 나뉜다고 했는데, 첫 번째는 Row LSTM으로 i번째 픽셀을 만들 때 위쪽 row와 바로 직전 픽셀을 활용하고, Diagonal BiLSTM는 i번째 픽셀을 만들 때 이전의 모든 픽셀들을 활용합니다.

그 이전의 값을 계속 얻어와야 한다는 특징으로부터 오는 느린 계산속도를 보완하기 위해 해당 receptive field를 Convolution 으로 뚝딱해버리는 PixelCNN 방식도 제안되었는데 계산이 빠른 대신 성능(Log-likelihood)가 그리 좋지 않습니다.

결론적으로 sequential한 구조를 반영하여 데이터 분포를 학습하려는 시도로 PixelRNN, PixelCNN 은 공통적으로 계산할 수 있는(Tractable density) 분포 모델 $p(x)$을 명시적으로(explitcity) 정의하여 train data의 분포를 추정하는 방법이었습니다.

 

 

Variational Autoencoders (VAE)

train data 의 분포를 추정하는 다른 방법으로 계산이 불가능(어려움)한(intractable) 분포 모델을 정의하는 방법인 VAE (Variational Autencoder) 에 대해 알아보겠습니다.

VAE 에서는 train data x 에 대한 data likelihood p(x)가 적분의 형태를 띄고 있습니다. 위의 식은 계산이 불가능(어려움)한(intractable) 특성을 가지고 있기 때문에 직접적으로 위 식을 trian 데이터에 맞게 최적화할 수 없습니다.

따라서 likelihood p(x)의 하한선(lower bound)를 이용해 train data 에 근사하게 만듦으로써 최적화를 진행하는 방법을 사용합니다. 이러한 VAE 를 Explicit density estimation 의 한 종류로, 근사적 분포(Approximate density)를 사용하여 학습 데이터의 분포를 추정하는 것이라고 합니다.

 

Autoencoders는 레이블이 없는 데이터에서 feature representation을 뽑는 비지도 학습법입니다.

1. input data $x$에서 feature vector $z$를 추출합니다. → downsample : Encoder
- $x$에서 의미있는 요소를 추출한게 $z$이기 때문에 대체적으로 $z$의 dimension이 $x$보다 작습니다.
2. feature $z$에서 Recondtructed input data $\hat{x}$를 다시 만들어냅니다. → upsample : Decoder

위 파란색 질문에 대한 내용을 정리하면,

  1. 차원 축소를 하는 이유는 데이터에서 의미있는 데이터 변동 factor를 찾을 수 있는 Feature를 얻기 위해서입니다.
  2. feature representation을 어떻게 학습시킬까요?
  3. original data를 재설계할 수 있는 feature를 학습시킵니다.
  4. Auto-Encoder는 1번으로 $z$를 생성하고, 2번으로 $\hat{x}$ 를 생성해서 최종적으로 $x$와 $\hat{x}$ 차이를 최대한 줄이도록 feature $z$를 학습합니다. 따라서 no labels! $x$와 $\hat{x}$ 만 필요!!
  5. 마지막으로 현실 문제에서 unlabeled 된 데이터는 많고 labeled 된 데이터가 소량 존재 때, unlabeled data 와 auto encoder 를 이용해서 중간 레이어들을 학습시키고, 소량의 labeled 된 데이터로 마지막 몇개의 layer 만 fine-tuning 하는 방법도 가능합니다.

 

아까 앞에서 설명했듯이, Variational Auto-encoder와 달리, 그냥 Auto-encoder는 생성 모델이 아닙니다. Auto-Encoder가 잘 추출한 feature를 사용해 이미지 클래스를 분류했다면, VAE는 이 feature로 새로운 이미지를 생성할 수는 없을까? 하는 의문에서 출발합니다.


여기 vector $z$가 있습니다. 그리고 $x$는 이 생성모델에 latent vector $z$와 parameter $\theta$를 집어넣은 결과입니다.

  • $z$: latent vector. Gaussian 분포같은 랜덤 노이즈가 들어가기도 함. ( Approximation)
  • $p_θ(z)$: parameter가 θ일때, latent vector $z$를 sampling 할 수 있는 확률밀도함수
  • $pθ(x|z)$: parameter가 θ이면서, $z$가 주어졌을 때 $x$를 생성해내는 확률밀도함수


여기서  $\theta$를 실제 분포와 가깝게 찾는것이 목표입니다. 따라서 $p(z)$에서 $p(x|z)$를 만드는 Decoder network를 복잡한 구조도 핸들링 가능한 neural network로 구성을 하고, $p_θ(x)$는 paremeter가  $\theta$일 때, $x$가 나올 likelihood를 최대화 시키는 방향으로 학습을 합니다.

 

하지만 모든 z에 대해 $p(x|z)$의 적분을 취해줄 수 없다는 문제점이 있습니다. 이게 바로 intractable한 문제입니다. 계산이 불가능하다는 뜻입니다. 그래서 차용한 방식이 VAE입니다.

 

위에서는 decoder network만 있었다면 여기서는 encoder netowrk $q$를 추가합니다. 여기서 $q_{\phi}(z|x)$는 $p_\theta(z|x)$를 근사하는 encoder network입니다.

 

  • Encoder $q_{\phi}(z|x)$ : $x$를 input으로 받아서 mean,covariance추출 후, $z$ space상에서 분포를 생성. $z$는 gaussian 분포를 따른다고 가정.
  • Decoder: gaussian 분포로부터 $z$를 샘플링. 샘플링 한 $z$를 가지고 디코더 $p_{\phi}(z|x)$는 $x$ space 상의 확률 분포를 생성하고, $x$를 이 분포로부터 샘플링합니다.

 

이러한 Encoder-Decoder $x \rightarrow z \rightarrow x$ 구조를 가지기 때문에 Auto-Encoder라고 할 수 있고, 결과적으로 유의미한 feature vector $z$를 얻을 수 있습니다.

 

Variational Inference

변분추론의 목적은 사후분포 $와 유사한 $를 찾아내어 최적화하는 것입니다. 여기서 $는 관측값 $가 주어졌을 때의 특정 확률 변수, 즉 잠재 벡터를 나타냅니다. 변분추론은 $를 직접 학습하는 대신 이미 존재하는 결과인 $로부터 $를 학습합니다. 이때 $와 $를 각각 encoder와 decoder로 지칭합니다.

 

  • 사후분포 (Posterior Distribution): $ p_{\theta}(z|x) $는 관측값 $ x $가 주어졌을 때의 $ z $의 분포입니다. $ z $는 잠재 벡터로 불리며, 이와 반대로 $ p_{\theta}(x|z) $는 Likelihood(가능도)로 불립니다.
  • Variational Distribution: $ q_{\theta}(z|x) $는 사후분포를 정확히 구하기 어려운 경우, 이를 근사하는 변분분포로서 최적화됩니다. KL Divergence를 최소화하는 방식으로 실제 사후분포에 근사합니다.
  • ELBO (Evidence Lower Bound): KL Divergence를 최소화하기 위해 사용되는데, 이는 사후분포를 모르는 상태에서 KL Divergence를 조작하기 어렵기 때문입니다. ELBO는 다음과 같이 나뉩니다:
    • $ \text{ELBO} = \mathbb{E}_{q_{\theta}(z|x)}[\log p_{\theta}(x|z)] - \text{KL}[q_{\theta}(z|x) || p(z)] $
    • 여기서 첫 번째 항은 Reconstruction Term으로, 오토인코더의 재구성 손실을 최소화합니다.
    • 두 번째 항은 Prior Fitting Term 또는 Regularization Term으로, 입력값을 잠재공간에 표현한 분포를 사전분포와 유사하게 만듭니다.

 

ELBO 최적화 과정

ELBO는 KL Divergence를 최소화하는데, 사후분포를 모르는 상태에서 KL Divergence를 직접 조작하기 어려우므로, ELBO를 최대화하여 KL Divergence를 간접적으로 최소화합니다. 따라서 encoder와 decoder를 학습하게 됩니다.

 

 

Variational Auto-Encoder(VAE)는 입력 이미지 $x$를 잘 표현하는 잠재공간(latent space)을 찾기 위한 모델입니다. VAE의 주요 목적은 관측 데이터인 $x$의 잠재 특성을 효과적으로 추출하는 것입니다. 그러나 사후분포를 직접적으로 계산하기 어려워, 이를 근사하기 위해 variational inference 기법을 활용합니다.

VAE는 이러한 variational inference 기법을 통해 학습됩니다. 이 과정에서, 잠재 분포를 사전 분포와 유사하게 만들어지며, 이로 인해 VAE는 Generative Model의 특성을 갖게 됩니다.

따라서 VAE는 새로운 이미지나 데이터를 생성할 수 있는 능력을 가지게 됩니다. 반면, 일반적인 AutoEncoder는 입력 데이터를 잠재 공간으로 인코딩하고 다시 디코딩하는 기본적인 구조를 가집니다.

AutoEncoder는 단순히 데이터의 표현을 학습하고 재구성하는 역할만 수행하므로, Generative Model로서의 특성을 갖지 않습니다.

 

 

Generative Adversarial Networks


PixelCNN은 $P(x)$를 직접적으로 Chain Rule을 사용하여 정의합니다. 반면에 VAE는 latent variable $z$를 통해 $P(x)$를 간접적으로 모델링하며, 이 과정에서 Lower Bound를 최적화합니다. GAN은 $P(x)$를 명시적으로 정의하지 않고, implicit한 방식으로 training distribution을 학습하려고 합니다.

GAN에서 Generator는 Gaussian random noise를 입력으로 받아, 이를 실제 데이터 분포와 유사한 분포로 변환하는 역할을 합니다. 즉, Generator는 random noise를 사용하여 가짜 데이터를 생성하고, Discriminator는 이 가짜 데이터와 실제 데이터를 구분하는 능력을 키워 나갑니다.

Generator를 학습시키기 위해서는, Discriminator가 생성된 가짜 데이터를 실제 데이터와 최대한 구분하지 못하도록 만들어야 합니다. Discriminator는 이 두 종류의 데이터를 분류하는 데 있어서 좋은 성능을 내도록 학습됩니다. 이러한 과정에서, Discriminator는 Generator에게 어떤 방향으로 진행해야 하는지의 정보를 제공하여, Generator가 더 진화하고 향상될 수 있게 합니다. 이렇게 Generator와 Discriminator는 서로의 학습 과정을 통해 경쟁하며, 결국에는 Generator가 실제 데이터 분포와 유사한 데이터를 생성할 수 있도록 학습됩니다.

 

Training GANs

GAN은 Generator와 Discriminator 간의 두 플레이어 게임 구조를 가진 모델입니다. Generator는 주어진 random noise \( z \)를 바탕으로 가짜 이미지를 생성하며, 반면 Discriminator는 이러한 생성된 가짜 이미지와 실제 훈련 데이터셋에 포함된 진짜 이미지를 구별하려고 합니다.

이 과정에서 Generator는 Discriminator를 최대한 속이기 위해 더 진짜와 같은 이미지를 생성하려고 노력하며, Discriminator는 생성된 이미지가 얼마나 진짜인지 판별하는 능력을 강화하려고 합니다. 이런 경쟁적인 학습 과정을 통해 Generator와 Discriminator는 서로를 이길 수 있는 전략을 계속해서 발전시켜나갑니다. 결과적으로, Generator는 실제 이미지와 거의 구별하기 힘든 가짜 이미지를 생성하게 되며, Discriminator는 생성된 이미지를 더욱 정확하게 판별할 수 있게 됩니다.

 

 

Discriminator network & Generative network

Discriminator의 학습 과정은 주어진 실제 이미지와 가짜 이미지를 구별하는 능력을 강화하는 것을 목표로 합니다.

Discriminator는 실제 이미지를 입력으로 받았을 때 가능한 한 1에 가까운 출력을 내야 하며, 가짜 이미지를 입력으로 받았을 때는 0에 가까운 출력을 내도록 학습됩니다.

이 학습 목표를 수식적으로 표현하면,  $(V(D, G))$ 를 최대화하는 것이라고 할 수 있습니다. 여기서 $(V(D, G))$는 Discriminator와 Generator 사이의 Value Function으로, Discriminator의 성능을 나타냅니다. Discriminator가 잘 판별할수록 이 값은 증가하게 됩니다.

Discriminator를 학습시킬 때, Generator는 학습 과정 중에 고정되어 있습니다. 즉, Discriminator의 학습 과정에서는 Generator가 생성하는 가짜 이미지는 고정된 상태로 사용되며, 이 가짜 이미지의 품질에 따라 Discriminator의 성능이 점차 향상됩니다.

 

GAN의 핵심은 Generator와 Discriminator 간의 경쟁적인 게임을 통해 모델을 학습하는 것입니다. 이 경쟁은 min-max game으로 표현되며, 이는 다음과 같은 목적 함수로 나타낼 수 있습니다:

$는 Discriminator $와 Generator $간의 Value Function입니다. Discriminator는 이 함수를 최대화하려고 하며, 반면 Generator는 최소화하려고 합니다.

  1. Discriminator의 목표: 주어진 실제 데이터 $에 대해 Discriminator는 출력 $가 1에 가깝게 만들고, Generator가 생성한 가짜 데이터 $에 대해서는 출력 $가 0에 가깝게 만드는 것입니다.
  2. Generator의 목표: Generator는 Discriminator가 실제와 가짜 데이터를 잘 구별하지 못하도록 만드는 것입니다. 즉, Generator의 출력 $(를 1에 가깝게 만드는 것이 목표입니다.

결과적으로, 이 두 목표를 동시에 달성하기 위해 Gradient Ascent 방법을 사용하여 Generator와 Discriminator를 번갈아가며 학습시킵니다. Discriminator를 먼저 학습한 후에는 Generator를 학습시키며, 이러한 과정을 반복하면서 두 모델을 균형 상태로 이끌어가게 됩니다. 이러한 균형 상태에서는 Generator가 실제 데이터와 유사한 가짜 데이터를 생성하게 되며, Discriminator는 두 종류의 데이터를 정확하게 구별하게 됩니다.

 

test time에서 Generative Adversarial Network (GAN)의 Generator 부분은 주로 활용됩니다. 이는 생성자가 실제 데이터와 유사한 가짜 데이터를 생성하는 데 사용되기 때문입니다.

  1. VAE와의 비교: VAE (Variational Autoencoder)에서는 잠재 변수 $로부터 샘플링하여 Generator 부분을 통해 새로운 데이터를 생성합니다. VAE는 확률적 잠재 변수를 사용하여 데이터의 다양한 표현을 학습하므로, 새로운 데이터 생성 시에는 이 잠재 변수에서 샘플링한 후 Generator를 통해 디코딩합니다.
  2. GAN의 Generator: GAN에서는 Generator가 주어진 잠재 공간의 랜덤 벡터 $ 에서 가짜 데이터를 생성하는 역할을 합니다. 특히, 훈련이 완료된 후에는 Generator는 실제 데이터와 유사한 이미지나 데이터를 생성할 수 있습니다. 따라서 test time에는 Generator만 활용하여 원하는 수의 가짜 데이터 샘플을 생성할 수 있습니다.

 

요약하면, test time에 VAE나 GAN을 사용할 때, 주로 Generator 부분을 활용하여 새로운 데이터 샘플을 생성합니다. VAE는 잠재 변수에서 샘플링 후 Generator로 디코딩하는 반면, GAN에서는 Generator가 랜덤 벡터를 받아 가짜 데이터를 생성하는 역할을 합니다.

 

 

728x90
댓글