Unsupervised Learning
> 레이블이 없는 학습 데이터를 가지고 데이터에 숨어있는 기본적인 구조를 학습
Ex) clustering, PCA, Autoencoders(레이블 없이도 feature representation을 학습),
density estimation(분포 추정) – 점들이 더 많이 밀집되어 있는 곳에 분포가 더 크도록 적절히 모델링
> Supervised Learning : 레이블을 통해 X에서 Y로 가능 함수 매핑 된 것을 학습한다.
> Unsupervised Learning : 데이터의 숨겨진 구조를 학습한다. 레이블이 없기 때문에 데이터에 대한 비용이 적고 데이터를 많이 모을 수 있다.
Generative Models
> Unsupervised Learning의 일종으로 분포에서 새로운 동일한 샘플들을 생성하는 것이 목적
> p_model이 p_data와 같은 데이터를 생성하도록 학습시켜야 한다.
> P_model의 분포를 추정하는 방법이 중요하다.
명시적(Explicit)으로 분포를 정의해주기
간접적(implicit)인 방법(분포를 정의하지 않기)
> Super-resolution, colorization 등등 Generative model을 이용한다.
> 일반적인 특징을 찾을 때 유용한 latent representation을 추론할 수 있으며 추후에 다른 task에 유용하게 쓰일 수 있다.
<직접적인 분포 추정>
- PixelRNN/CNN – 계산이 가능한 확률모델
- VAE – 근사적 밀도추정
<간접적인 분포 추정>
- GAN
PixelRNN and PixelCNN
> 이미지 x에 대한 우도 p(x)를 chain rule에 의해 1차원 분포들간의 곱의 형태로 분해
> 이미지 내의 모든 픽셀에 대한 joint likelihood는 모든 픽셀의 likelihoods의 곱의 형태
> FVBN은 확률의 chain rule을 사용해서 n-dimensional vector x를 one-dimensional probability distribution으로 decompose하는 방법이다.
> previous pixel값을 순서를 정의해야 한다. 분포p에서 given 모든 이전 픽셀이 의미하는 바는?
> corner부터 Pixel을 순차적으로 생성한다.
> 방향성을 기반으로 한 픽셀들간의 종속성을 사용해서 RNN 모델링
> 순차적인 생성 방식이기 때문에 느리다는 단점을 가지고 있다.(모든 픽셀이 생성될 때 까지 반복적으로 네트워크를 수행해야 한다.)
> 픽셀을 생성할 때 PixelRNN처럼 이전의 모든 픽셀을 고려하는 것이 아니라 픽셀을 생성할 때 주위의 특정 픽셀들만을 고려한다. 각 픽셀에서 CNN을 수행한다.
> ground truth label이 있는 학습 데이터로 likelihood가 최대화하도록 학습시킬 수 있다.
> 0 - 255사이의 분류문제라고 간단히 생각하자 (softmax loss 사용)
> label은 입력데이터의 loss를 계산할 때 만 사용한다. 추가적으로 label을 생성하지 않아도 된다. (비지도학습)
> 정리 : 이미지 내의 각 픽셀들의 분포를 알고 싶다. 이를 위해서 likelihood를 최대화하도록 잘 학습을 시켜서 입력인 학습 데이터를 잘 생성하도록 한다.
> PixelRNN보다 빠르다. Train데이터는 이미 알고 있는 값이기 때문에 학습과정을 병렬화시킬 수 있다.
그러나 이미지를 생성하는 test Time에서는 여전히 sequentially하게 생성하기 때문에 느리다.
> 초기 픽셀의 분포를 선택하는 방법은 Train시 학습 데이터의 픽셀 값을 가져온다.
Test time에는 uniform distribuition을 사용하거나 첫 픽셀만 학습 데이터에서 가져온다.
Variational Autoencoders (VAE)
> VAE는 직접 계산이 불가능한 확률 모델을 정의한다. (근사적 밀도 추정)
> 직접 최적화시킬 수 없기 때문에 likelihood(p(x))의 하안(lower bound)를 구해서 최적화시켜야만 한다.
Autoencoders
> VAE에 들어가기 앞서 Autoencoder에 대해서 간략히 알아보자.
> 학습 데이터로부터 저 차원의 feature representation을 학습하기 위한 방법이 Auto encoder이다.
> input X로부터 어떤 특징 ’z’ 를 학습하기를 원한다. Encoder는 일반적으로 Neural network를 사용한다.
그 외 ReLU, CNN, sigmoid 사용
> 특징 ‘z’ 를 Decoder에 넣어 X와 동일한 차원이며 유사한 데이터(X̂)를 복원한다.
이때 Decoder는 Encoder와 대칭적인 모델이어야 한다.
> 복원된 이미지의 픽셀 값과 입력 이미지의 픽셀 값이 같도록 하기 위해서 L2 Loss를 줄여나간다.
> 학습이 완료되면 decoder는 제거하고 학습된 Z를 이용해서 다른 Classification 문제를 해결한다.
> Auto Encoder는 레이블이 되지 않은 많은 데이터로부터 양질의 general feature representation을
학습할 수 있는 장점이 있다.
> 데이터가 부족한 Supervised model의 초기 가중치로도 이용할 수 있다.
- Variational Autoencoders (VAE)
> Z(속성)들이 어떤 distribution을 따르는지, prior(사전확률)로
Gaussian distribution을 선택한다. (일반적으로, AE에서 나온 Z와는 다른 것이니 오해하지말자)
> Z를 먼저 샘플링, Z를 이용해서 이미지 X를 샘플링 한다.
> 생성모델이 새로운 데이터를 잘 생성하게 하려면 true parameter를 잘 추정해야 한다.
> FVBN방식으로 모델 파라미터가 학습 데이터의 likelihood를 최대화하도록 학습시켜야 한다.
> p(x)를 FVBN방식을 따라 Z에 대한 기대값으로 나타내었다.
이때 likelihood를 최대화 시킬려고할 때 계산이 안 된다는 문제점이 발생한다.
> P(X|Z)말고도 추가적인 Encoder network(q(Z|X))를 정의하여 계산 문제를 해결한다. (P(x)가 들어가는 부분 적분 계산이 되지 않는다.)
> Encoder network(q(Z|X))를 통해서 P(X|Z)를 근사 시킨다.
> data likelihood(p(x))의 하안을 구하고 계산이 가능하도록 만들어준다.
> Encoder/Decoder network를 통해서 Z와 X에 대한 분포를 생성하며, 이 분포로부터 샘플링해서 q(z|x), P(x|z)을 얻어 내야 한다.
> log p(x)를 z에 대한 기대값의 형태로 나타낸다. z는 q(z|x)로 샘플링 한 값이다.
> log p(x)를 Bayes`Rule로 확장, 임의의 상수를 곱해준다.
> 식을 3개의 항으로 나눈다.
> 첫 번째 항은 Decoder network이다. 샘플링을 통해서 계산가능하며 이때 ‘re-parametrization trick’ 기법을 이용한다. 일반적인 Sampling은 미분 가능한 연산을 할 수 없다. Sampling하는 값이 매번 다르기 때문에( stochasticity한 성질),
그러기에 re-parametrization trick를 이용해 미분 가능하도록 만들며 backprob을 시행 한다.
> 두 번째 항은 q(z|x)와 p(z)간의 KL divergence term, 두 개의 분포가 모두 가우시안 분포이기에 closed form solution으로 풀 수 있다.
> 세 번째 항은 q(z|x)와 p(z|x)간의 KL divergence term, p(z|x)은 계산할 수 없는 항이다. (intractable),
KL divergence term은 두 분포 사이의 거리이기 때문에 항상 0보다 크거나 같은 특징을 가진다.
* cf) KL divergence는 두 분포간의 거리를 얼마나 가까운지 알려준다.
> 세 번째항은 항상 0보다 크다는 것을 기억하고, 계산할 수 있는 앞의 두 개의 항을 이용하여 lower bound를 구해보자.
> VAE를 학습시키기 위해서 앞서 구한 lower bound가 최대화되도록 최적화시키면 된다. (알맞은 theta와 phi 구하기)
> data likehood는 최대화시킨 lower bound보다 항상 높을 것이다.(세 번째 항이 항상 0보다 크기 때문에)
> lower bound에 대해서 다시 정리하자면 첫 번째 항은 z를 sampling하고 모든 z에 대해서 p(x|z) 기댓값을 구한 것 (decoder), 값이 클수록 잘 복원해내고 있다는 것을 의미한다.
> 두 번째 항은 KL divergence가 작아야 한다. 우리가 근사시킨 분포(q)와 prior의 분포(p)가 최대한 가까워야 한다. 잠재 변수 z의 분포(posterior)가 prior 분포(가우시안)와 유사했으면 좋겠다는 뜻이다.
<train과정>
X(입력 데이터)를 encoder에 통과시켜 q(z|x)를 얻는다
q(z|x)의 분포로부터 latent 변수 z를 샘플링 한다.
샘플링한 z를 decoder network에 통과시켜 p(x|z)의 분포를 얻어낸다.
Log p(x(i)|z)가 최대가 되도록 학습을 한다. (복원된 이미지에 대한 likelihood가 최대)
Encoder/Decoder의 파라미터 phi와 theta를 업데이트
> VAE를 학습시키고 난 후에는 데이터 생성시에 Decoder network만을 사용한다.
> train time에서는 z를 p(z|x)(posterior)에서 샘플링을 하였다. 그러나 데이터 생성과정에서는 Piror(Gaussian)에서 샘플링을 한다.
> Z의 각 차원을 independent 하다고 가정했기에 각 차원마다 독립적인 해석 가능한 요소들이 인코딩 될 수 있다. (Z1은 웃음의정도, Z2는 머리의 pose)
> 간략히 말해서, VAE는 Autoencoders의 확률론적 변형 버전이다.
Autoencoder는 deterministic하게 X를 받아서 Z를 만들고 다시 X를 복원했더라면, VAE는 분포와 샘플링 개념이 추가 되었으며 계산할 수 없는 형태를 계산할 수 있도록 근사시키는(Variational) 방법을 선택하였다. (p(z|x)를 계산못하니 q(z|x)로 근사하였다.)
> pixelRNN/CNN은 계산 가능한(tractable) 확률분포를 가정했으여 이를 이용해서 학습 데이터의 likelihood를 최적화시켰다.
> VAE는 잠재변수 Z를 두고 생성 과정을 정의하였다. 그러나 계산할 수 없는 확률분포를 가정하였기 때문에 likelihood를 직접 최적화시키기 못하고 하안(lower bound)를 최적화시켰다.
GAN
> 직접 확률분포를 모델링하지 않는다(Implicit density, 간접적인 분포추정). 게임이론의 접근법을 취한다.
2 – player game이라는 방식으로 학습 분포를 학습한다.
> GAN은 복잡한 고차원 학습 분포로부터 샘플링, 분포가 복잡하기 때문에 직접 샘플링을 하는 것은 불가능하다.
> 해결책은 Gaussian random noise같은 단순한 분포에서 우리가 원하는 학습 분포로 변환시킨다. (Neural network 사용)
> Random noise 벡터(z)를 입력으로 받는다. 입력z가 Generator Network를 통과하면 학습 분포로부터 샘플링 된 값을 출력한다.(이미지 생성)
- Generator : 사실적인 이미지를 생성하여 discriminator를 속이는 것이 목표
- discriminator : 생성된 이미지가 ‘실제’ 인지 ‘거짓’ 인지를 구별한다.
> discriminator가 학습이 잘 되어 진짜인지 가짜인지를 잘 구별 할 수 있다면 Generator도 discriminator를 속이기 위해서 실제와 같은 이미지를 만들 수 있게 되는 것이 기본 컨셉
> Minmax game이라고 생각하였을 때, Discriminator가 가짜 이미지를 다 구별할 것을 가정(최대 손실)하고 Generator가 실제 이미지가 비슷한 이미지를 만들어낸다는 것을 생각하자(손실 최소화)!
> 첫 번째 항은 실제 데이터(x)에 대한 discriminator의 출력 값, 실제 데이터(x)가 데이터 분포 p_data에 속할 likelihood이다.
Discriminator는 objective function을 최대화 해야 한다. 파라미터 thera_d를 최대화,
D(x)의 경우 실제 데이터이므로 값이 1(real)에 가까울수록 좋다. D(G(X))는 가짜 데이터에 대한 것이므로 0(fake)일수록 좋다.
> 두 번째 항의 z ~ p(z)은 generator에서 샘플링 한다는 의미, D(G(z))는 생성된 가짜 이미지(G(z))에 대한 discriminator의 출력이다.
Generator는 objective function을 최소화 해야 한다. 파라미터 theta_g를 최소화,
D(G(Z))가 1(real)에 가까울수록 좋다.
> GAN의 학습방법은 generator와 discriminator를 번갈아 가면서 학습을 시킨다.
> discriminator는 objective function이 최대가 되는 theta를 학습하기 위해 gradient ascent를 이용한다.
> generator는 objective function을 최소화 시키기 위해서 gradient descent을 이용한다.
> generator의 objective function이 학습이 잘 되지 않는다.
> generator의 objective function을 그려보았을 때 0(가짜)에 가까울 때 gradient가 평평하고, 1(실제)에 가까울 때 gradient가 커지는 양상(학습이 활발히 진행)을 보이고 있다. 그러나 우리는 0(가짜)에 가까울 때 학습을 더 많이 할 수 있어야 되므로 0에 가까울때 gradient가 커야 한다.
> gradient을 개선시키기 위해서 Gradient descent 대신 Gradient ascent를 사용
> Discriminator가 정답을 잘 맞출 likelihood를 최소화 시키는 방법 대신 Discriminator가 틀릴 likelihood를 최대화 시키는 쪽으로 학습시킨다. ( log(1-D(G(Z))) -> logD(G(Z)) )
GAN 학습 순서는 위 과정을 따른다. 우선 discriminator를 조금 학습 시키고 generator를 학습시킨다.
P(Z)에서 미니배치만큼 noise sampling, 학습 데이터 x에서 sampling
샘플링 한 noise를 generator에 통과시켜 가짜 이미지 생성
진짜 이미지(학습데이터에서 sampling한 것)와 가짜 이미지를 사용하여 discriminator 파라미터를 업데이트 및 학습을 한다.
Discriminator가 어느 정도 학습이 된다면 generator를 학습을 시작한다.
generator를 학습을 위해 P(Z) 노이즈를 샘플링한다.
샘플링된 노이즈를 generator에 통과시켜 generator를 최적화 학습시킨다.(discriminator를 속이는 방식으로)
위와 같은 방식으로 Discriminator와 generator를 번갈아 학습시킨다.
> 학습 시에는 Generator Network와 Discriminator Network 둘 다 학습, 이미지를 생성할 때는 Generator Network만 사용한다.
<참고자료>
[1] http://jaejunyoo.blogspot.com/2017/01/generative-adversarial-nets-2.html http://dl-ai.blogspot.com/2017/08/