본문 바로가기
CS231n 공부하기

Lecture 13 | Generative Models

by 고공이 2021. 1. 12.

본 글은 다음 영상을 참고하여 정리한 것입니다.

www.youtube.com/watch?v=5WoItGTWV54&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv&index=13

 


비지도 학습의 유형인 Generative Model을 살펴볼것이다.

 

• PixelRNN 과 PixelCNN

• Variational Autoencoders (VAE)

• Generative Adversarial Networks (GAN)

 

지도학습과 비지도학습의 차이점

 

비지도학습은 데이터에 라벨이 없어서 그만큼 싸고, 기본구조를 많이 나타내기 때문에 그만큼 어렵지만 공부하면 좋다.

 

왜 관심이 있는가

Generative Models 로 데이터로부터 우리가 원하는 샘플을 만들 수 있기 때문! etc. 초고해상도 사진, 상품 겉모양 따서 원하는 색깔로 채색하기, 시계열 데이터 등등

특히, Generative Models 로 만든 시계열 데이터는 시뮬레이션이나 planning 에 사용되는데 이는 강화학습 애플리케이션 용이다. 강화학습은 나중 강의에서 다시 한번 살펴보자.

 

Generative Model 의 분류

우리는 PixelRNN / PixelCNN, Variational Autoencoders, GAN 만 다룰 것이다.

 

PixelRNN / PixelCNN


Fully visible belief network

Explicit density model

각 픽셀 x의 확률

 

1차원 제품 이미지의 x의 likelihood 를 decompose 하기 위해 체인 규칙을 사용한다.

이러한 픽셀의 분포는 복잡하게 이루어졌는데 이를 모델링을 할려면 신경망을 이용해야 한다.

신경망은 복잡함을 표현하기 좋은 방법이기 때문이다.

 

PixelRNN

위 그림처럼 화살표를 따라 모서리부터 시작해 픽셀을 생성하는 방법.

이전 픽셀에 대한 의존성을 바탕으로 RNN 의 LSTM 을 이용한다. 

순차적으로 생성되지만 실제로는 매우 느리다는 단점이 있다.

 

PixelCNN

PixelCNN

PixelRNN 과 유사해 코너부터 시작해서 이미지 픽셀을 생성한다.

이미 존재하는 회색영역(특정 영역)에서 CNN 을 통해 이전의 픽셀에 대한 의존성을 바탕으로 새로운 픽셀을 생성한다. 

이러한 과정들이 likelihood 를 최대화해 학습을 진행하는 것이다. (Training : maximize likelihood of training images)  

픽셀 값의 Softmax loss 을 최대로 출력하고, 0~ 255을 가지고 훈련시킨다. 

PixelRNN 보다는 빠르다.

 

Variational Autoencoders (VAE)


VAE

VAE 는 잠재 변수 z 를 가진 intractable 밀도 함수로 정의한다.

직접적으로 최적화할 수 없고, likelihood 의 하한을 최적화한다.

 

Autoencoders

Autoencoder 는 레이블이 지정되지 않은 training data 의 lower-dimensional 의 feature represenation 을 학습하기 위한 비지도 접근 방법이다.

인코더는 다양한 형태로 계속 변하고 있다.

보통 z 는 x 보다 작은 차원을 갖는데(z < x) 이를 dimensionaliy reduction 이라고 한다.

그 이유는 의미있는 데이터 변동 요인을 찾을 수 있는 기능(데이터의 중요한 특성만 가지고 가는 기능)을 z 가 이를 수행하기 때문. z 는 x 의 중요한 기능이다.

 

 

x 를 encoder 를 통해 더 낮은 차원의 z 로 mapping 하여 x 와 크기가 같고 비슷한 hat x 로 다시 디코더한다.

디코더도 인코더와 동일한 타입을 사용하고 변하고 있다.

 

 

입력 데이터 x 를 재구성하기 전에 L2 손실함수를 사용한다.

여기서 주목해야 할 것은 이 훈련 과정에서 손실함수은 있어도 외부 레이블은 없다는 것이다.

네트워크를 통과하고 계산하기 위해 훈련 데이터와 손실함수만 사용한다.

 

이 학습을 진행하면 이제 디코더를 버릴 수 있다. encoder 만 사용한다.

 

이 때, featrue mapping 을 사용한 encoder 가 학습한 특징을 supervised model 의 초기값으로 이용할 수 있다.

이때 외부 레이블을 취할 수 있고, 표준 손실 함수 softmax 를 사용한다.

- autoencoder 를 이용하면 라벨이 없는 많은 데이터로부터 양질의 general feature represetation 을 학습할 수 있는 장점이 있다.

 

그러면 autoencoder 로 새로운 이미지를 생성할 수 있을까

 

VAE

먼저 z 를 샘플링하고, 샘플링한 각각의 z 의 latent factors (잠재 요인) 를 사용해 이미지 x를 샘플링한다.

이 모델은 가우시안 같은 심플한 prior p(z) 를 선택하고, conditional p(x|z) 를 사용해 우리가 원하는 이미지 생성한다. 하지만 conditional p(x|z) 는 매우 복잡하기 때문에 이를 해결하기 위해서 neural network(신경망)을 사용하는 것이다. => decoder network

 

그럼 이 모델을 어떻게 학습시킬까?

이 모델의 매개변수(model parameter) 가 training data 의 likelihood 를 최대화할 수 있도록 학습시킨다.

latent z 를 사용해서 가능한 모든 것을 기대하면서 연속적인 z 값을 얻는다.

 

여기서 문제점은 이 적분을 다루기 힘들다는 것. 계산할 수 없다. (계산할 수 없는 이유는 영상에서 자세히 알려주기 때문에 영상을 확인하길 바란다.)

이를 해결하기 위해 decoder network 를 사용하는 것 외에 encoder network 인 q(z|x) 를 를 추가 정의하여 모델링을 할 수 있다. 이때 q(z|x) 는 p(z|x) 에 근사한 것이다.

 

Encoder and Decoder Network in VAE

 각각 평균과 대각 공분산(diagonal cov) 을 출력하고, 이를 가지고 각각 z와 x 에 대한 분포를 생성하여 실제 값을 뽑기 위해 이 분포로부터 샘플링을 한다.

이러한 네트워크들을 encoder network 는 recognition / inference , decoder network 는 generation network 라고 부르기도 한다.

 

그 다음은 encoder network 와 decoder network 를 수학적으로 접근하는데 자세한건 영상으로 확인하자. 

 

VAE 를 이용한 데이터 생성

장점: 생성 모델에 대한 원칙적 접근 방법이다. 생성모델에서 q(z|x) 와 같은 추론이 가능하다.

단점: 엄밀히 따지면 PixelRNN / CNN 보다 좋은 최적화 방법은 아니다(likelihood 의 하한을 계산하기 때문에). 흐릿하고 품질이 낮다.

 

Generative Adversarial Networks (GAN)


PixcelCNN 은 다루기 쉬운 밀도 함수를 정의하고, training data 의 likelihood 를 최적화한다.

VAE 는 잠재변수 z 를 가진 다루기 힘든 밀도 함수를 정의한다. 직접 최적화하지는 못하고, likelihood의 하한을 최적화하도록 유도한다.

 

그렇다면 밀도 함수를 모델링하는 것을 포기하고, 샘플을 얻을 수 있다면?

GAN 은 밀도 함수를 적용하지 않고 게임 이론으로 접근한다.

2 player game 의 training 분포를 사용해 생성하는 것을 학습한다.

 

우리는 복잡하고 고차원의 샘플을 원한다. 하지만 이것을 직접적으로 할 방법이 없다.

이를 해결할 방법은 random noise 같은 간단한 분포의 샘플을 얻는 것이다.

이러한 간단한 분포로부터 변환(transformation) 을 학습하여 우리가 원하는 training 분포로 접근한 것이다.

GAN 에서는 입력으로 random noise 벡터(z) 를 받는다. 입력 z 가 Generator Network 를 통과해 training 분포로부터 직접 샘플링된 값을 얻는 것이다.

 

Training GANs: Two-player game

Generator network: 가짜 이미지 생성

Discriminator network: 실제와 가짜 이미지를 구별

 

Two-player game

 

generator 는 player 1로 참여해 가짜 이미지를 생성하여 discriminator 를 속이는 것을 목표로 한다.

discriminator 은 player 2로 참여해 실제 이미지와 가짜 이미지를 구별하는 것이 목표다.

 

minimax game

이렇게 두 플레이어를 통해 minimax game 의 형태로 같이 학습시킨다.

 

discriminator 는 objective function 을 최대화시키기 위해 D(x)을 1에 가깝게, G(z)는 0에 가깝게 해야 한다 (D 의 파라미터인 세타 d 를 최대화시키고, G 의 파라미터인 세타 g를 최소화시키는 게 목표). 이런 원리로 실제 데이터와 가짜 데이터를 분류한다.

 

반면 Generator 는 objective function 을 최소화시키는 게 좋으므로 G(z)을 1에 가깝게 해야 한다. 그럼 discriminator 는 생성된 가짜 데이터가 실제로 진짜 데이터라고 생각한다. 즉, Generator 가 진짜 같은 가짜 이미지 샘플을 생성하고 있음을 의미한다.

 

generator 에서도 gradient ascent 를 사용하는 이유

discriminator 는 objective function 이 최대가 되는 세타를 학습하기 위해 graident ascent 를 이용하고, 반대로 Generator 에서는 graident descent 를 사용한다.

하지만, 실제로는 generator 의 objective function 의 학습이 잘 안된다.

 

loss 가 최소가 되길 원하는데 위 그림처럼 오른쪽으로 갈수록 loss 기울기가 점점 커진다. 이는 G(x) 가 1에 가까울수록 기울기가 커진다는 말이다. 즉, discriminator 가 잘 속고 있으면(학습된 generator 가 열일하는 곳) gradient 가 점점 커진다.

 

반대로 말하면 gradient 가 작으면 discriminator 가 속고 있지 않고, 잘 구별한다. generator 가 열일하지 못한다.. generator 가 잘 학습되지 않은 것...

 

초반에 생성된 샘플이 좋지 않을 경우 그래프의 기울기가 거의 편평하다.. gradient 작다... generator 가 아직 잘 학습되지 않았다... discriminator 을 잘 속이기 위해 학습을 더 많이 시켜야한다.... 

 

이러한 이유로 Generator 을 학습시키는 것은 상당히 어려운 일이다. 

그래서 Generator 에서도 graident ascent 를 이용하는것이다.

discriminator 가 잘 맞출 likelihood 를 최소화시키는 방법 대신에 틀릴 likelihood 를 최대화 시키는 쪽으로 학습을 진행한다. 그래서 아래 그래프에 음수를 붙여 플립시킨다!

 

그러면 생성된 샘플이 좋지 않는 부분도 더 많은 학습이 이루어질 수 있게 된다!

 

 

전체 GAN 학습 알고리즘

하지만 discriminator 와 generator 를 동시에 학습시키는 게 상당히 어렵다.

그래서 discriminator 를 조금 학습시키고, generator 를 학습시키는 단계별로 학습을 진행한다.

 

k step의 discriminator network 학습에 대해 알아보자.

p(z) dptj 노이즈 z 를 미니 배치 샘플링을 한다. 

훈련 데이터의 실제 샘플인 x 에서도 미니 배치 샘플링을 한다. 

샘플링한 노이지를 generator 에 통과시키면 가짜 이미지가 생성된다.

그러면 미니배치 만큼의 (가짜 이미지의 미니배치) (실제 이미지의 미니배치)가준비된다.

이 미니배치들을 사용하여 discriminator 에서 gradient 를 진행하고, discriminator의 매개변수를 업데이트한다.

이것을 일정 횟수(k)만큼 반복하면서 discriminator 을 학습시키는 것이다.

 

어느정도 discriminator 를 학습시키고 나면 두번째로 generator 학습시킨다.

여기서는 노이즈 샘플의 미니 배치만 샘플링한다. 

이를 generator 을 통해 통과하고, 이를 최적화하기 위해 backprop 을 수행한다. 

그래서 가능한 한 많이 generator 가 discriminator 을 속이도록 훈련시킨다.

 

몇번을 학습시켜야하는지 명확한 규칙은 없고, 문제에 따라 다 다르다.

 

GANs 을 이용해 생성된 samples
GANs 을 이용해 생성된 samples (CIFAR-10)

 

Convolutional Architectures

GAN 이 더 잘 생성할 수 있도록 도와주는 아키텍처이다.

 

Convolutional Architectures 을 이용해 생성된 샘플들
Interpretable Vector Math 를 이용
Interpretable Vector Math 를 이용

이런 작업들도 가능하다.

이렇게 각 이미지의 샘플을 생성하여 z 벡터의 평균을 취해보자.

그러면 웃는 남자, 선글라스 쓴 여자의 샘플을 얻을 수 있다.

 

2017년에 GAN 을 활용한 것들


요약

● PixelRNN 과 PixcelCNN 은 다루기 쉬운 밀도 함수(tractable density function)인 likelihood p(x) 를 명시적으로 계산해내고, training data 의 likelihood 를 최대화하여 최적화시킨다. good sample 을 만들어 낼 수 있으나 순차적인 생성으로 느리다는 단점이 존재한다.

 

VAE 는 잠재변수 z 를 가진 다루기 힘든 밀도 함수(intractable density function)를 정의한다. 직접 최적화하지는 못하고, likelihood의 하한을 최적화하도록 유도한다. (생성모델에 대한 추론 허용)

 

GAN 은 밀도 함수를 적용하지 않고 게임 이론으로 접근한다. 2 player game 의 training 분포를 사용해 생성하는 것을 학습한다. 복잡하고 고차원의 샘플을 직접적으로 만들 수 없기 때문에 random noise 같은 간단한 분포로부터 변형을 학습하여 우리가 원하는 training 분포로 접근한다.

 

 

댓글