당신은 주제를 찾고 있습니까 “variational autoencoder 설명 – 딥러닝 Ch3.3 VAE“? 다음 카테고리의 웹사이트 https://ppa.charoenmotorcycles.com 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.charoenmotorcycles.com/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Smart Design Lab @ KAIST 이(가) 작성한 기사에는 조회수 6,059회 및 좋아요 129개 개의 좋아요가 있습니다.
VAE란? VAE는 Input image X를 잘 설명하는 feature를 추출하여 Latent vector z에 담고, 이 Latent vector z를 통해 X와 유사하지만 완전히 새로운 데이터를 생성하는 것을 목표로 합니다.
variational autoencoder 설명 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 딥러닝 Ch3.3 VAE – variational autoencoder 설명 주제에 대한 세부정보를 참조하세요
KAIST 스마트설계연구실 강남우 교수(전 숙명여대)의 딥러닝과 설계 강의입니다.
www.smartdesignlab.org
variational autoencoder 설명 주제에 대한 자세한 내용은 여기를 참조하세요.
VAE 설명 (Variational autoencoder란? VAE ELBO 증명)
Variational autoencoder, 줄여서 VAE는 generative model의 한 종류로, input과 output을 같게 만드는 것을 통해 의미 있는 latent space를 만드는 …
Source: process-mining.tistory.com
Date Published: 4/29/2021
View: 1809
[정리노트] [AutoEncoder의 모든것] Chap4. Variational …
(Chap1, Chap2, Chap3의 내용들은 Variational AutoEncoder를 설명하기 위한 배경지식을 쌓는 과정이 아니었을 까요?) 그럼 Chap4. Variational …
Source: deepinsight.tistory.com
Date Published: 5/7/2021
View: 5882
Variational AutoEncoder (VAE) 설명
Variational AutoEncoder (VAE) 설명. 31 Jul 2020 | Machine Learning Paper_Review. 목차. 1. Auto-Encoding Variational Bayes 논문 리뷰. 1.1. Introduction; 1.2.
Source: greeksharifa.github.io
Date Published: 8/2/2021
View: 3326
(2) VAE (Variational AutoEncoder) – IT Repository
Variational inference란? 이상적인 확률분포를 추정하기 위해서, 다루기 쉬운 분포를 가정하고 이 확률분포의 모수를 바꿔가며 이상적인 확률분포에 근사 …
Source: itrepo.tistory.com
Date Published: 10/21/2021
View: 1424
Variational AutoEncoder란? – simpling
VAE는 Autoencoder와는 다르게 latent variable을 Gaussian 분포 같이 잘 알려진 Prior 분포를 설정하고 거기에 맞출 수 있어서 이미지 등을 만들 때 …
Source: simpling.tistory.com
Date Published: 5/18/2021
View: 1574
[Deep Learning] VAE (Variational Auto Encoder) 개념 정리
https://hugrypiggykim.com/2018/09/07/variational-autoencoder%EC%99%80- … 데이터가 주어졌을때 분포가 데이터를 얼마나 잘 설명하는가
Source: huidea.tistory.com
Date Published: 9/7/2021
View: 7083
[VAE] Auto-Encoding Variational Bayes 논문 정리(1)
일단 VAE를 살펴보기 전에 먼저, VAE 모델의 기본 구조인 오토인코더에 … P(x)를 알 수 있고, 그럼 Z에 대한 X에 대해서 설명할 수 있는 것인데, …
Source: di-bigdata-study.tistory.com
Date Published: 10/3/2022
View: 5793
Variational Autoencoder (VAE) 설명 (cs231n 참고) – jinyo의 뇌
기존 강의는 pixelCNN의 설명부터 시작한다. VAE는 intractable한 (조절이 까다로운?) latent(잠재) vector z에 대한 density function을 알아내려 …
Source: wingnim.tistory.com
Date Published: 7/16/2021
View: 413
딥러닝 개념 1. VAE(Variational Auto Encoder) – velog
VAE의 decoder는 encoder가 만들어낸 z의 평균, 분산을 모수로 하는 정규분포를 … 추가로, z를 생성하는 과정을 설명하면, zero-mean Gaussian에서 …
Source: velog.io
Date Published: 12/21/2022
View: 6884
주제와 관련된 이미지 variational autoencoder 설명
주제와 관련된 더 많은 사진을 참조하십시오 딥러닝 Ch3.3 VAE. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 variational autoencoder 설명
- Author: Smart Design Lab @ KAIST
- Views: 조회수 6,059회
- Likes: 좋아요 129개
- Date Published: 2020. 5. 31.
- Video Url link: https://www.youtube.com/watch?v=GbCAwVVKaHY
1) VAE(Variational Auto-Encoder)
VAE란?
VAE는 Input image X를 잘 설명하는 feature를 추출하여 Latent vector z에 담고, 이 Latent vector z를 통해 X와 유사하지만 완전히 새로운 데이터를 생성하는 것을 목표로 합니다. 이때 각 feature가 가우시안 분포를 따른다고 가정하고 latent z는각 feature의 평균과 분산값을 나타냅니다.
예를 들어 한국인의 얼굴을 그리기 위해 눈, 코, 입 등의 feature를 Latent vector z에 담고, 그 z를 이용해 그럴듯한 한국인의 얼굴을 그려내는 것입니다. latent vector z는 한국인 눈 모양의 평균 및 분산, 한국인 코 길이의 평균 및 분산, 한국인 머리카락 길이의 평균 및 분산 등등의 정보를 담고 있다고 생각할 수 있겠습니다.
z → x p θ ∗ ( z ) p θ ∗ ( x | z ( i ) )
수식을 약간 곁들여 이를 표현하면 위와 같이 나타낼 수 있습니다.
p(z): latent vector z의 확률밀도함수. 가우시안 분포를 따른다고 가정
p(x|z): 주어진 z에서 특정 x가 나올 조건부 확률에 대한 확률밀도함수
θ: 모델의 파라미터
VAE의 구조
Input image X를 Encoder에 통과시켜 Latent vector z를 구하고, Latent vector z를 다시 Decoder에 통과시켜 기존 input image X와 비슷하지만 새로운 이미지 X를 찾아내는 구조입니다.
VAE는 input image가 들어오면 그 이미지에서의 다양한 특징들이 각각의 확률 변수가 되는 어떤 확률 분포를 만들게 됩니다. 이런 확률 분포를 잘 찾아내고, 확률값이 높은 부분을 이용하면 실제에 있을법한 이미지를 새롭게 만들 수 있을 것입니다.
VAE의 수식적 증명
모델의 파라미터θ가 주어졌을 때 우리가 원하는 정답인 x가 나올 확률이 pθ(x) 높을 수록 좋은 모델이라고 할 수 있습니다. 즉 pθ(X)를 최대화 하는 방향으로 VAE의 파라미터θ를 학습시키게 됩니다.
VAE는 Intractable Density를 구할 수 있으며, 여러 수식을 전개하여 Lower Bound 값을 구할 수 있다.
VAE 장단점
장점 : 확률 모델을 기반으로 했기 때문에, 잠재 코드를 더 유연하게 계산할 수 있다.
단점 : Density를 직접적으로 구한것이 아니기 때문에 Pixel RNN/CNN 과 같이 직접적으로 Density를 구한 모델보다는 성능이 떨어진다.
AE vs. VAE
VAE(Variational AutoEncoder)는 기존의 AutoEncoder와 탄생 배경이 다르지만 구조가 상당히 비슷해서 Variational AE라는 이름이 붙은 것입니다. 즉, VAE와 AE는 엄연히 다릅니다.
AutoEncoder의 목적은 Encoder에 있습니다. AE는 Encoder 학습을 위해 Decoder를 붙인 것입니다.
반대로 VAE의 목적은 Decoder에 있습니다. Decoder 학습을 위해 Encoder를 붙인 것입니다.
VAE는 단순히 입력값을 재구성하는 AE에서 발전한 구조로 추출된 잠재 코드의 값을 하나의 숫자로 나타내는 것이 아니라, 가우시안 확률 분포에 기반한 확률값 으로 나타낸다.
AE : 잠재 코드 값이 어떤 하나의 값
VAE : 잠재 코드 값이 평균과 분산으로 표현되는 어떤 가우시안 분포
아래 그림은 MNist 데이터를 각각 AE와 VAE로 특징을 추출해 표현한 그림이다. 각 점의 색깔은 MNIST 데이터인 0~9의 숫자를 나타낸다. AE가 만들어낸 잠재 공간은 군집이 비교적 넓게 퍼져있고, 중심으로 잘 뭉쳐있지 않지만, VAE가 만들어낸 잠재 공간은 중심으로 더 잘 뭉쳐져 있는 것을 확인 할 수 있다. 따라서 원본 데이터를 재생하는데 AE에 비해서 VAE가 더 좋은 성능을 보인다는 것을 알 수 있다. 즉 VAE를 통해서 데이터의 특징을 파악하는게 더 유리하다.
Reference
VAE 설명 (Variational autoencoder란? VAE ELBO 증명)
Variational autoencoder, 줄여서 VAE는 generative model의 한 종류로, input과 output을 같게 만드는 것을 통해 의미 있는 latent space를 만드는 autoencoder와 비슷하게 encoder와 decoder를 활용해 latent space를 도출하고, 이 latent space로부터 우리가 원하는 output을 decoding함으로써 data generation을 진행한다. 이번 글에서는 VAE가 무엇이고, 어떻게 작동하는지를 최대한 쉽게 살펴보겠다.
* 이 글은 MLE 및 bayes theory에 대한 기본적인 이해가 있다고 가정한다.
구조 및 학습
많은 generative model들이 그렇듯이, VAE 또한 현실과 비슷한 데이터들을 만들어내는 것을 목적으로 한다. 이를 달리 말하면 VAE는, input data의 true distribution인 p(x)를 approximate하는 것을 목적으로 한다. 이를 위해서 VAE는 다음 그림과 같이 encoder, decoder, 그리고 latent space로 구성된 구조를 가진다. 그리고 VAE는 학습 단계에서 이 encoder과 decoder의 parameter를 학습하는 것을 목적으로 한다.
VAE의 구조
Encoder
Encoder는 input을 latent space로 변환하는 역할을 한다. 이 때, encoder는 input 데이터의 posterior, 달리 말하면 input x가 주어졌을 때 latent vector z의 분포, 즉 위 그림에서 나타나듯이 q(z|x)를 approximate하는 것을 목적으로 한다. 우리가 이 q(z|x)를 가장 잘 나타내는 분포로 정규분포(예시)를 선택한다면, q(z|x)를 approximate할 때는 이 정규분포를 나타내는 평균(mu)과 표준편차(sigma)의 parameter를 찾는 것이 목적이 될 것이다.
Decoder
Decoder는 encoder와 반대로 latent space를 input으로 변환하는 역할을 한다. 이 때, decoder는 input의 true distribution, 달리 말하면 latent vector z가 주어졌을 때 x의 분포, 즉 위 그림에서 나타나듯이 p(z|x)를 approximate하는 것을 목적으로 한다. 어떤 z라는 vector가 주어짐에 따라 다시 데이터 x를 generate하는 역할을 하기 때문에, decoder가 generative model의 역할을 하게 된다.
Latent space
Latent space는 말 그대로 어떤 숨겨진 vector들을 말한다. 이 latent space가 주어져야, decoder는 이를 활용해 data를 generate할 수 있다. 만약 우리가 여기서, VAE가 autoencoder처럼 input과 output을 똑같이 만드는 것을 목적으로 한다고 하자. 그러면 이 목적으로 만들어진 latent space는 항상 input과 같은 모양의 데이터를 만들어낼 수밖에 없을 것이다. 이를 방지하기 위해 우리는, noise를 sampling하여 이로부터 latent space를 만든다. 예를 들어, 어떤 표준 정규분포 (평균이 0이고 표준편차가 1인 정규분포)로부터 하나의 noise epsilon을 샘플링하여 얻고, 이에 encoder로부터 얻은 분산을 곱하고 평균을 더해서 latent vector z를 얻는 것이다. 이를 reparametrization trick이라고 부른다.
ELBO
그렇다면 위와 같은 구조를 가지는 VAE를 학습할 때는 어떤 loss를 최소화해야 할까? 이에 대한 답을 얻기 위해 우리는, maximum likelihood 접근법을 택한다. 즉, p_theta(x)를 maximize하는 theta를 찾는 것을 목적으로 하는 것이다. 이를 식으로 표현하면, 다음과 같은 loglikelihood를 maximize하는 것과 같다.
log-likelihood of VAE
이를 전개하면 다음과 같다.
VAE의 maximum likelihood 증명
첫 번째 줄에서 두 번째 줄로 넘어갈 때는 bayes rule을 사용했고, 두 번째 줄에서 세 번째 줄로 넘어갈 때는 분모와 분자에 같은 q 식을 곱해주었다. 그리고 세 번째 줄에서 네 번째 줄로 넘어갈 때는 KL divergence의 정의를 활용했다. 이제 위 마지막 식을 maximize하는 parameter theta를 찾으면, 우리가 원하는 likelihood를 maximize하는 parameter를 찾을 수 있는 것이다.
마지막 식을 하나씩 살펴보자. 우선 맨 처음에 있는 항은 encoder로부터 z를 sampling하고, 다시 이 z로부터 decoder를 활용해서 p(x|z)를 계산함으로써 계산할 수 있다. 그리고 두 번째 있는 항은 q와 p가 둘 다 정규분포이기 때문에, 정규분포 두 개 사이의 KL divergence는 쉽게 계산이 가능하다. 하지만 세 번째 항은 우리가 p(z|x)를 알 수가 없기 때문에 계산하는 것이 불가능하다. 하지만 우리는 KL divergence가 항상 양수라는 것을 안다. 그래서 우리는 마지막 식을 다음과 같은 부등식으로 표현할 수 있다.
ELBO
우리는 이 마지막 부등식의 우항을 evidence lower bound, 줄여서 ELBO라고 부른다. 이 ELBO를 maximize함으로써 likelihood 또한 maximze할 수 있는 것이다. 이 ELBO를 좀 더 자세히 살펴보면, 첫 번째 항은 p(x|z)와 q(z|x) 사이의 negative cross entropy와 같다. 그렇기 때문에 이는 encoder와 decoder가 autoencoder처럼 reconstruction을 잘 할 수 있게 만들어주는 error라고 할 수 있기 때문에 reconstruction error라고 부른다. 다음으로, 두 번째 항은 posterior q(z|x)와 prior p(z) 간의 KL divergence와 같다. 그렇기 때문에 이는 posterior와 prior가 최대한 비슷하게 만들어주는 error라고 할 수 있고, 이는 VAE가 reconstruction task만 잘 하는 것을 방지하기 때문에 regularization error라고 부른다.
Data generation
위에서 살펴본 구조로 ELBO를 maximize하면서 encoder와 decoder를 학습한 후, 우리는 이 학습된 decoder를 활용해서 우리가 원하는 data를 generate해야 한다. 이 과정에서는 아래 그림과 같은 generator를 활용해서 data를 generate한다.
VAE의 data generation
즉, 표준 정규분포에서 어떤 z를 sampling하고, 이 z를 decoder의 input으로 넣어서 우리가 원하는 새로운 데이터를 만들어내는 것이다.
이번 글에서는 VAE의 구조와 함께 VAE가 어떻게 학습되는지, 그리고 VAE가 어떻게 data를 generate하는지에 대해 알아보았다. 최대한 쉽고 직관적이게 써 보려고 했는데.. 쉽지 않네..
격리를 하고 재택근무를 통해서 체력을 비축하면 블로그 글이 올라옵니다.. ^^.. 내일 탈출
반응형
[정리노트] [AutoEncoder의 모든것] Chap4. Variational AutoEncoder란 무엇인가(feat. 자세히 알아보자)
AutoEncoder의 모든 것
본 포스팅은 이활석님의 ‘AutoEncoder의 모든 것’에 대한 강연 자료를 바탕으로 학습을 하며 정리한 문서입니다. 이활석님의 동의를 받아 출처를 밝히며 강의 자료의 일부를 인용해왔습니다.
AutoEncoder의 모든것
안녕하세요 Steve-Lee입니다. 앞서 Chap 3. 에서는 AutoEncoder에 대해 살펴보았습니다. 이번 시간에는 Variational AutoEncoder에 대해 알아보도록 하겠습니다.
강연자이신 이활석님께서는 ‘사실 앞에서 다뤘던 내용들은 모두 Variational AutoEncoder를 설명하기 위함’이라고 하셨습니다. 다시 말해 우리가 주목해야 할 Chapter는 바로 ‘Chapter 4 – Variational AutoEncoder’가 아닌가 생각합니다.
(Chap1, Chap2, Chap3의 내용들은 Variational AutoEncoder를 설명하기 위한 배경지식을 쌓는 과정이 아니었을 까요?)
그럼 Chap4. Variational AutoEncoder 시작하겠습니다.
Prologue
Chap4는 수식이 많아서 딱 주무시기 좋아요
-네… 저도… 많이 졸았었습니다…
VAE를 처음 제대로 공부해야겠다고 마음먹었을 때 제가 봤던 영상이 바로 AutoEncoder의 모든 것입니다. Chap4. Variational AutoEncoder 영상을 틀고 10분 뒤 졸고 있는 제 자신을 발견했었죠…ㅎㅎ
강연자 이활석님의 말씀처럼 Chap4를 처음 들었을 때 잠이 미친 듯이 몰려왔습니다… 소귀에 경 읽기였을까요… 화려한 수식과 방대한 내용들은 제 귀에 한 편의 아름다운 자장가로 들려왔었습니다…(죄송합니다 이 명 강의를….!! ㅠㅠ)
이번 포스팅을 통해 Variational AutoEncoder의 기본과 핵심을 다시 정리하며 향후 연구에서 AutoEncoder를 활용할 수 있는 기반을 잘 닦고 싶습니다.
※ Chap4는 수식이 많아 강의 슬라이드를 매우 많이 인용해 왔습니다. ※
강의 슬라이드는 이곳에서 받으실 수 있습니다.
그럼 시작하겠습니다!
Generative Model이란 무엇인가?
Variational AutoEncoder는 Generative Model입니다. 잠깐, Generative Model이란 무엇일까요?
단어에 내포된 의미를 해석해보면 ‘무언가를 생성’해주는 모델이라는 느낌을 받을 수 있습니다. 구글링을 해보면 Google Developer에서는 Generative Model에 대해 다음과 같이 설명합니다.
Generative model can generate new data instance. // 새로운 data instance를 생성 할 수 있다
model can generate new data instance. // 새로운 data instance를 할 수 있다 Discriminative models discriminate between different kinds of data instanes. // Discriminative model은 data instance를 종류에 따라 나눌 수 있다
Generative models capture the joint probability p(X, Y), or just p(X) if there are no labels. // Generative models은 확률분포를 포착 합니다.
Generative Model이란 결국 새로운 data instance를 생성해내는 모델입니다.
단어 그대로 ‘생성’을 하는 특성을 가지고 있는 모델인 것이죠. 그리고 여기서 ‘생성’이란 단순히 Data Instance를 생성하는 것이 아닌 Training Data의 distribution을 근사하는 특성을 가지고 있습니다.
예를 들어 고양이, 강아지의 이미지 데이터를 Generative Model의 입력으로 준다면 우리는 입력 데이터와 상당히 유사한 분포(distribution)를 갖는 새로운 이미지를 얻게 됩니다. Deep Learning Model 중 널리 알려진 Generative Model로는 GAN 모델을 들 수 있겠네요.
고양이와 강아지를 구분하는 Discriminat Model과 달리 Generative Model은 새로운 Sample을 생성해줍니다. 그것도 기존의 Sample과 매우 유사한 녀석들로 말이죠!
이번 시간에 다룰 Variational AutoEncoder(이하 VAE로 표기)도 Generative Model의 일종입니다. 그리고 여기서 한 가지 짚고 넘어가야 할 점이 있습니다. 바로 ‘VAE와 AE는 전혀 관계가 없다는 점입니다’
수학적으로 AutoEncoder와 Variational AutoEncoder는 전혀 관계가 없습니다.
정리하면
AutoEncoder의 목적은 Manifold Learning 입니다 AE는 네트워크의 앞단을 학습하기 위해 뒷단을 붙인 것입니다 입력 데이터의 압축을 통해 데이터의 의미있는 manifold를 학습합니다
입니다 Variational AutoEncoder는 Generative Model 입니다 뒷단(Decoder, 생성 )을 학습시키기 위해 앞단을 붙인 것입니다 그런데 공교롭게도 그 구조를 보니 AE와 같은 것입니다 VAE는 Generative Model입니다. 기억하세요!
입니다
그림을 통해 이해하면 VAE가 왜 Variational AutoEncoder라고 불리는지 이해할 수 있습니다. VAE는 Generation을 위해 Encoder Network를 추가한 AutoEncoder와 유사한 네트워크 구조를 가지고 있습니다.
저는 VAE라는 표현이 너무나도 재미있는 표현이라고 생각합니다.
몇 가지 주요 키워드들을 살펴봤습니다.
#생성모델, #확률분포, #AutoEncoder
이제 VAE의 학습과정을 하나씩 배우면서 어떤 특징이 있는지 살펴보도록 하겠습니다!
Again, AE는 Manifold Learning, VAE는 Generative Model.
두 모델은 단지 이름과 모양만 비슷합니다!
Viewpoint1. Generative Model
VAE의 샘플 생성과정에 대해서 살펴보겠습니다
우선 VAE를 Generative Model관점에서 살펴보도록 하겠습니다. VAE가 최종적으로 원하는 것은 무엇일까요??
앞서 말했듯이 고양이와 강아지 데이터가 있다면 기존에 Training DB에 가지고 있던 고양이, 강아지와 유사한 샘플을 생성해 내는 것이 목적일 것입니다. 이를 조금 더 추상화시켜볼까요?
결국 VAE 네트워크가 학습을 통해 출력하고자 하는 결과는 Training DB에 있는 데이터 x가 나올 확률을 구하는 것 이 목적입니다.
우리는 VAE 네트워크의 출력 값을 우리가 정한 모델에 대한 파라미터의 MLE(Maximum Likelihood Estimation) 값을 통해 구할 것입니다. 그리고 한 가지 더 살펴볼 점이 있습니다.
단순히 샘플을 생성해내는 것이 아닌 컨트롤러(controller)로 생성된 이미지를 조정을 할 수 있다면 어떨까요?
VAE 네트워크를 살펴보면 Generator는 Latent Variable z로부터 샘플을 생성합니다. 이때 마치 controller처럼 이미지를 조정하는 z vector를 추출할 수 있다면 어떨까요? 고양이에 귀여움을 조절하여 귀여운 고양이를 생성하는 상상을 할 수 있을까요??
이처럼 VAE 네트워크의 z vector(이하 Latent Vector로 정의하겠습니다)는 controller의 역할 을 하게 됩니다.
정리 VAE는 Generative Model이다 z vector로 생성되는 이미지를 controller 할 수 있다
단 두 문장을 설명하기 위해 장황하게 표현했네요…ㅎㅎ 하지만 이런 그림을 가지고 하나씩 다가가면 이해하는데 도움이 되리라 생각합니다.
Prior Distribution p(z)
기존 Training DB에 있던 샘플과 유사한 샘플을 생성하기 위해서 우리는 prior값을 활용합니다.
여기서 잠깐,
Q1. 만약 prior값이 normal distribution값을 띈다고 가정하고 sampling을 한다면 sampling 된 값은 manifold를 대표하는 값을 가질 수 있을까요?
정답은 Yes입니다. (제겐 조금 신기한 부분이었습니다.)
학습을 수행하는 네트워크가 Deep Neural Network이기 때문에 가능하다고 합니다. Network의 앞 단에 있는 한, 두 개의 layer는 manifold를 잘 찾기 위한 역할을 수행할 수 있다고 합니다.
즉 한, 두 개의 layer가 복잡한 latent space를 익히는 데 사용될 수 있다고 합니다. 따라서 prior distribution으로 간단한 distribution(e.g normal distribution)을 해도 걱정하지 않으셔도 됩니다.
아래의 슬라이드에는 그 내용이 보다 자세히 적혀 있습니다…!
Q2. 그렇다면 MLE를 직접적으로 사용하면 되지 않을까요?
📌 MLE를 direct로 사용하면 되지 않는 이유를 아는 것 이 VAE를 이해하는 길입니다
한 가지 가정을 해보겠습니다.
우리는 p(x|g 𝜃(z))의 likelihood 값이 높기를 원합니다.
생성기(Generator)에 대한 확률 모델을 가우시안으로 할 경우, MSE관점에서 더 가까운 것이 더 p(x)에 기여하는 바가 크게 됩니다. MSE가 더 작은 이미지가 의미적으로는 더 가까운 경우가 아닌 이미지들이 많기 때문에 현실적으로 올바른 확률 값을 구하기는 어렵습니다.
예를 들면 좀 더 직관적으로 다가옵니다.
위의 슬라이드에서 (a)에서 일부가 잘린 데이터가 (b), (a)의 화소 값을 조금 옮긴 값을 (c)라고 가정해봅니다. 의미론적으로는 (a)와 (c)의 값이 더 유사하지만 MSE를 구하면 (a)와 (c)의 MSE(Mean Square Error) 값이 더 큽니다.
이처럼 MSE가 더 작은 이미지가 의미적으로 더 가까운 경우가 아닌 이미지들이 많기 때문에 prior에서 sampling을 하게 되면 문제가 발생하게 되는 것입니다.
그래서 등장한 방법이 바로 Variational Inference입니다.
Variational AutoEncoder
Variational Inference와 VAE Generator의 학습과정
이제는 prior에서 sampling 하는 것이 아닌 이상적인 sampling함수를 통해 samplilng을 수행합니다. 그리고 우리가 원하는 결과는 네트워크의 출력 값이 x와 가까워지는 것입니다. 이를 위해 다음의 3-step을 밟습니다.
Step 1. 의미론적으로 가까운 sample들을 생성시키는 z 정의
Step 2. z를 생성할 수 있는 이상적인 sampling 함수 정의
Step 3. x를 given으로 주어 학습을 수행
x를 보여줄 테니 적어도 x를 잘 generate 하는 이상적인 sampling함수를 생각해봐!
p(z|x)가 아닌 이상적인 sampling함수인 qΦ(z|x)를 추정하고 이상적인 sampling함수가 정의되었다면 z vector로부터 Input x와 유사한 데이터를 생성할 수 있게 됩니다.
그런데 우리는 그 이상적인 sampling함수를 모르기 때문에 Variational Inference(변분 추론)을 사용합니다.
Variational Inference
True posterior: 우리가 추정하고자 하는 확률분포
Approximation class: 우리가 다루기 쉬운 확률 분포(e.g Gaussian, Bernulli) Gaussian일 경우 확률분포를 결정짓는 파라미터 μ와 𝜎를 추정 Φ 를 잘 바꿔가며 True posterior를 추정(Approximation) 학습이 잘 될 경우, True posterior를 잘 approximation 하는 함수를 가지고 z생성 생성된 z를 통해 sample을 생성(x는 잘 나오겠지!)
term 정리 true posterior: p(z|x) – how likely the latent variable is given the input prior: p(z) – how the latent variables are distributed without any conditioning approximation function(sampling function): q(z|x)
한번 정리하고 가겠습니다.
학습이 잘 되기 위한 z sample을 잘 만들어 내는 함수 가 있었으면 좋겠다
가 있었으면 좋겠다 Variational Inference 방법으로 확률 분포중에 Target Distribution을 잘 나타내는 Distribution을 찾는다 e.g) 확률분포를 Gaussian으로 정한다면 μ와 𝜎를 추정 → 추정된 값을 통해 Approximation
잘 찾은 z로부터 Sampling을 해서 Generator를 생성하면 잘 될 것 같다
이제는 Variational AutoEncoder의 학습과정을 수식으로 알아보도록 하겠습니다. 위의 가정들이 수식에 어떻게 녹아들어 있는지 생각해보면서 본다면 도움이 될 것이라 생각합니다.
ELBO(Evidence LowerBOund)
자 그러면 이제 그 유명한 ELBO를 찾아 한 번 떠나보겠습니다.
결론부터 말하자면 우리가 찾기 원하는 값은 p(x) 값을 최적화시킨 값입니다.
✅ 우리가 원하는 것은 Training DB에 있는 input data와 유사한 분포를 갖는 값을 갖기를 원하는 거예요! ← 계속 반복됩니다
p(x)의 최댓값을 구하기 위해서 log값을 씌워줄 수 있고 log(p(x))값은 다음과 같이 전개가 됩니다.
Slide 7. 수식부분은 발표 슬라이드에 상세하게 정리되어있어 인용하였습니다.
log(p(x))값을 정리하면 우리는 ELBO(Φ) 값과 KL(qΦ(z|x)||p(z|x))값을 얻게 됩니다.
결과적으로 우리가 원하는 것은 log(p(x)) 값의 최적화이기 때문에 EBLO(Φ) + KL에서 ELBO(Φ)의 값을 최적화합니다.
KL은 두 확률 분포(qΦ(z|x)와 p(z|x)) 사이의 거리로 0 이상의 값을 가집니다. 이 수식은 계산이 불가능하기 때문에 ELBO(Φ)를 최대화하는 문제로 해결하는 것입니다.
두 확률분포 간의 거리는 항상 0 이상이기 때문에 최적 화식은 ELBO term 이상의 값이 됩니다. 때문에 우리는 최적화 식을 Evidence Lower BOund ‘ELBO’라고 합니다.
한편 우리는 각각의 term이 의미하는 것을 이해할 수 있어야 합니다.
ELBO( Φ)
KL(q Φ(z|x)||p(z|x))
이를 위해 ELBO 수식을 조금 더 전개해 보도록 하겠습니다.
ELBO를 계산해보자
Slide 8. 앞에서 구한 ELBO 수식을 조금 더 전개해 보도록 하겠습니다.
ELBO 수식을 전개해보면 EqΦ(z|x)[log(p(x|z))] – KL(qΦ(z|x)||p(z))의 수식을 얻게 됩니다. (KL term이 하나 더 보이네요?? 당황하지 않으셔도 됩니다)
슬라이드 7의 수식과 연계해보면 다음의 최종 수식을 얻을 수 있습니다.
VAE ELBO수식 정리
수식에서 중요한 것은 각 term이 무엇을 의미하는지 이해하는 것입니다.
각각의 term이 무엇을 의미하는지 이해할 필요가 있습니다.
앞서 슬라이드 7에서 두 확률분포 간의 거리인 KL term은 계산을 할 수 없기에 앞에 ELBO를 최적화시켜줘야 한다고 언급했습니다. 따라서 우리가 최적화를 시켜야 할 값은 ‘Reconstruction term’과 ‘Regularization term’입니다.
결론적으로 다음의 수식을 최적화하는 문제로 정의할 수 있게 됩니다.
결론적으로 위의 두 term을 최적화 시켜주면 우리가 원하는 샘플을 얻을 수 있게 되는 것입니다.
VAE 우리가 너에게 바라는 점은 두 가지야.
첫 째, 이상적인 샘플링 함수로 부터 생성한 z값으로부터 (Training DB에 있는) input data와 유사한 데이터를 생성해줘 ← Generattion
둘 째, 이상적인 sampling함수의 값이 최대한 prior값과 같도록 만들어줘 ← Condition
ELBO 정리하기
마지막으로 ELBO 수식을 정리해보도록 하겠습니다.
위의 수식과 네트워크가 이해된다면 VAE를 보다 잘 이해할 수 있을 것입니다!
지금까지 배웠던 내용을 다시 한번 정리해 보겠습니다.
결국 우리의 목적은 Generator를 학습시키는 것입니다.(VAE는 generative model이라고 했죠?)
그런데 prior만 가지고 학습을 시키면 학습이 잘 되지 않기 때문에 우리는 이상적인 sampling 함수를 도입하는 것입니다.
이상적인 sampling 함수는 바로 qΦ(z|x)입니다.
x를 evidence로 주고, x에 대해서 Generator가 잘 학습할 수 있도록 만들어주는 z를 sampling 하기 위해서 qΦ(z|x)를 도입한 것입니다.
그리고 sampling 한 값이 input값과 같아줬으면 하기 때문에(Reconstruction Term), 𝜃를 최적화시키는 MLE문제로 풀 수 있습니다.
↑위의 키워드들이 연결이 되시나요?! 반복해서 읽어보시길 바랍니다!
<결론>
ELBO term을 Φ에 대해 maximize 하면 이상적인 sampling함수를 찾는 것이다
Φ에 대해 maximize 하면 이상적인 sampling함수를 찾는 것이다 ELBO term을 𝜃에 대해 maximize 하면 MLE 관점에서 Network의 파라미터를 찾는 것이다
이제 위의 슬라이드를 보면 이해가 가겠죠?
Reparameterization Trick
한 가지 주의할 점은 Sampling과정에서 Backprop을 진행할 때 문제가 발생한다는 점입니다.
아래 슬라이드와 같이 ‘Reparameterization Trick’을 사용하면 Backpropagation이 가능하도록 도와줍니다.
(수학적으로 증명이 되었기에 사용하시면 됩니다)
Summary
Optimization Term과 Network를 함께 보고 이해해보겠습니다.
Training DB에 있는 Input data와 비슷한 분포를 가지는 데이터를 생성(Generate!) 하기 위해 우리는 이상적인 sampling함수를 도입했습니다.(바로 qΦ(z|x)!)
Gaussian 확률분포를 따르는 이상적인 sampling 함수로부터 z를 sampling 합니다. 이때 계산을 위해 ‘reparameterization trick’을 사용해 sapling의 term과 𝜎를 곱해주고 여기에 𝜇값을 더해줍니다.
학습 과정으로는 ELBO term을 Φ에 대해 maximize 하면 이상적인 sampling함수를 찾는 것이며 ELBO term을 𝜃에 대해 maximize 하면 MLE 관점에서 Network의 파라미터를 찾는 것입니다.
이때 Training DB에 있는 Input Data와 비슷하게 복원되어야 한다는 조건(condition)은 ‘reconstruction term’에 녹아있고, reconstruction이 잘 된 이상적인 sampling함수의 z값이 prior(p(z))와 같았면 좋겠다는 조건(condition)을 ‘regularization term’에 녹여주면 되는 것입니다.
AutoEncoder와 Variational AutoEncoder
그렇다면 AutoEncoder로 학습한 것과 Variational AutoEncoder로 학습했을 때 가장 큰 차이는 무엇일까요?
결론부터 말씀드리면 AutoEncoder는 ‘prior에 대한 조건(Condition)’이 없기 때문에 의미있는 z vector의 space가 계속해서 바뀌게 됩니다. 즉 새로운 이미지를 생성할 때 z 값이 계속해서 바뀌게 됩니다.
반면 Variational AutoEncoder의 경우 prior에 대한 Condition을 부여했기 때문에 z vector가 prior과 같은 분포를 따릅니다. e.g prior가 Normal distribution이라면 z vector도 같은 분포를 갖는다.
따라서 prior에서 sampling을 하면 됩니다.
data 생성 후 Manifold를 비교해보면 VAE는 (Condition 부여시)Normal Distribution을 띄는 반면 AutoEncoder의 분포는 생성시점마다 변화하는 것을 볼수 있습니다. (강연 영상의 GIF를 참고하시면 좋습니다!)
VAE를 통해 학습이 잘 되었다면 z값을 2D공간에 투영을 시켰을 때 같은 데이터들에 대해서는 z값이 뭉쳐지고 다른 데이터들은 흩어지게 됩니다.
그리고 오른쪽 그림과 같이 z vector는 데이터의 중요한 특성들을 담고 있죠!
어떤 데이터인지, 두께, 로테이션이 어떻게 되는지를 단 2개의 vector로 표현하고 있답니다. 정말 멋지군요.
마치며
지금까지 우리는 Generative Model 중 하나인 VAE에 대해 배워보았습니다.
처음 VAE를 공부할 때는 개념의 이해부터 최적화 수식까지 머릿속이 복잡하기만 했었는데 정리하고 또 정리하면서 조금씩 개념이 잡혀가는 것 같습니다.
생성 모델이라는 점에서 너무나도 흥미롭고 이후 어떤 연구들이 진행되었는지 궁금해지네요.
다음 시간에는 Variational AutoEncoder Architecture들에 대해 살펴보도록 하겠습니다. Conditional VAE, Adversarial VAE 등에 대해 다뤄보도록 하겠습니다.
제 포스팅이 조금이나마 도움이 되셨으면 좋겠습니다. 이상 Steve-Lee였습니다. 감사합니다!
Reference
AutoEncoder의 모든 것 강의 슬라이드
강의 슬라이드 AutoEncoder의 모든 것 강의
Variational AutoEncoder (VAE) 설명
class CVAE ( tf . keras . Model ): def __init__ ( self , latent_dim ): super ( CVAE , self ). __init__ () self . latent_dim = latent_dim self . encoder = tf . keras . Sequential ( [ tf . keras . layers . InputLayer ( input_shape = ( 28 , 28 , 1 )), tf . keras . layers . Conv2D ( filters = 32 , kernel_size = 3 , strides = ( 2 , 2 ), activation = ‘relu’ ), tf . keras . layers . Conv2D ( filters = 64 , kernel_size = 3 , strides = ( 2 , 2 ), activation = ‘relu’ ), tf . keras . layers . Flatten (), # No activation tf . keras . layers . Dense ( latent_dim + latent_dim ), ]) self . decoder = tf . keras . Sequential ( [ tf . keras . layers . InputLayer ( input_shape = ( latent_dim , )), tf . keras . layers . Dense ( units = 7 * 7 * 32 , activation = tf . nn . relu ), tf . keras . layers . Reshape ( target_shape = ( 7 , 7 , 32 )), tf . keras . layers . Conv2DTranspose ( filters = 64 , kernel_size = 3 , strides = 2 , padding = ‘same’ , activation = ‘relu’ ), tf . keras . layers . Conv2DTranspose ( filters = 32 , kernel_size = 3 , strides = 2 , padding = ‘same’ , activation = ‘relu’ ), # No activation tf . keras . layers . Conv2DTranspose ( filters = 1 , kernel_size = 3 , strides = 1 , padding = ‘same’ ), ]) @ tf . function def sample ( self , eps = None ): if eps is None : eps = tf . random . normal ( shape = ( 100 , self . latent_dim )) return self . decode ( eps , apply_sigmoid = True ) def encode ( self , x ): # encoder의 Output은 (batch_size, latent_dim * 2) 이다. # 각 mini-batch에서 이를 반으로 쪼갠다. # logvar: Linear Layer를 통과한 후 음수의 값을 가질 수도 있기 때문에 이와 같이 표기한다. mean , logvar = tf . split ( self . encoder ( x ), num_or_size_splits = 2 , axis = 1 ) stddev = 1e-8 + tf . nn . softplus ( logvar ) return mean , stddev def reparameterize ( self , mean , stddev ): # 보조 노이즈 변수: eps eps = tf . random . normal ( shape = mean . shape ) z = mean + eps * stddev return z def decode ( self , z , apply_sigmoid = False ): logits = self . decoder ( z ) if apply_sigmoid : probs = tf . sigmoid ( logits ) return probs return logits optimizer = tf . keras . optimizers . Adam ( 1e-4 )
(2) VAE (Variational AutoEncoder)
How Can We Close to the Actual Distribution?¶
어찌되었든 두 PDF ($p_{\theta^\ast}~(z)$와 $p_{\theta^\ast}~(x|z^{(i)})$)가 각각의 실제 PDF에 근사하도록 만들면 된다는 것을 알겠는데 어떻게 근사하도록 만들 수 있을까요?
PDF의 값은 가능도이며, 가능도를 최대로 만드는 PDF가 실제와 유사하다고 추정할 수 있는 분포라는 것을 최대 가능도 추정에서 학습했었습니다.
즉, 우리는 최대 가능도 추정을 사용해서 PDF를 실제의 분포에 근사할 것입니다.
그러면 가능도를 계산해봅시다.
(1)
가능도를 계산하기 위한 확률밀도함수 $p(x)$는 아래와 같습니다.
$p_\theta(x) = \displaystyle \int p_\theta(z) \cdot p_\theta (x|z) dz$
그러나 이를 적분할 수가 없습니다.
왜냐하면 $p_\theta(z)$는 우리가 Gaussian 이라는 것을 알고 있습니다.
그러나 단순한 Gaussian에서 고차원 데이터로 향하는 매핑인 $p_{\theta}~(x|z)$는 굉장히 복잡할 것입니다.
따라서, $p_\theta (x|z)$는 모든 샘플을 샘플링해야지만 알 수 있습니다.
(샘플링을 해야지만 알 수 있다는 이야기는 이미지라고 생각했을 때, z를 통해 원본같은 x’을 만들어 내는 함수를 알고 있다면 이미 원본 x의 PDF를 알고 있다는 이야기가 되어버리기 때문입니다.)
그러면 전체 z에 대해서 적분을 하기위해서 Latent space z에 대해서 무한번 샘플링을 해야합니다.
PDF를 정의할 수 없으므로 $p_{\theta}~(x|z)$는 nn을 통해 근사할 수 밖에 없습니다.
(2)
아래는 Bayesian rule에 의해 계산된 사후확률입니다.
$p_\theta(z|x) = p_\theta(x|z) \cdot \dfrac{p_\theta(z)}{p_\theta(x)}$
수식을 보면 이미 눈치채셨겠지만, 가능도 함수가 계산 불가능하면 사후확률도 계산 불가능합니다.
따라서, PDF를 정의할 수 없는 $p_\theta(z|x)$ 역시 nn을 통해 근사할 수 밖에 없습니다.
여기서 각 조건부 확률의 의미를 생각해 봅시다.
$p_\theta(x|z)$는 x에서 z로 가는 매핑, 즉 Encoder 입니다.
$p_\theta(z|x)$는 z에서 x로 가는 매핑, 즉 Decoder 입니다.
이 두 개의 구조를 우리는 확률밀도함수로 나타낼 수 없기 때문에 nn을 사용합니다.
Q. 왜 PDF를 정의할 수 없는 경우에 nn을 사용하나요?
우리는 nn 역시 MLP이든 CNN, RNN이든 수학적으로 나타냈었습니다.
이 때문에 nn으로 인코더와 디코더를 표현하면 수학적인 모델링이 가능하지 않은가 라고 생각할 수 있습니다.
개인적으로 공부하면서 이 부분이 헷갈려서 생각을 해본 결론은 “PDF는 알 수는 없다.” 입니다.
nn으로 레이어를 쌓았을 때에 그 레이어와 오퍼레이션에 대한 수학적 모델링을 통해 구현된게 맞습니다.
z와 x의 분포를 나타내기 위한 함수인 PDF는 모델 파라미터인 수많은 Weight와 bias들을 통해 계산된 값입니다.
따라서, Weight와 bias의 분포를 알아야지 PDF를 정의할 수 있게 됩니다.
그러나 Gradient에 의해 업데이트 되는 이 파라미터들은 어떠한 분포를 통해 업데이트되는 것이 아닙니다.
우리는 이 파라미터들의 분포를 알 수가 없습니다.
따라서, nn은 PDF를 알 수는 없지만 샘플링은 가능한 구조입니다.
(혹시 제가 이해한게 잘못된 것이라면 지적해주시면 반영하여 수정하겠습니다.)
Variational AutoEncoder란?
이활석님의 명강의 ‘오토인코더의 모든 것’ , VAE와 ELBO에 대해 슬라이드로 잘 정리한 블로그, Variational AutoEncoder(VAE)에 대한 논문을 참조하였다.
VAE는 Autoencoder와는 다르게 latent variable을 Gaussian 분포 같이 잘 알려진 Prior 분포를 설정하고 거기에 맞출 수 있어서 이미지 등을 만들 때 편리한 생성 모델이다. 이를 이해하기 위한 기초 개념들이 중요한 것이 많아 정리한 것을 남긴다.
VAE 구조
VAE 구조
위의 그림은 VAE의 과정을 표현한 것이다. 강아지 사진이 입력으로 들어가면 Encoder에서 데이터에 대한 분포를 나타내는데, 가우시안 분포를 가정하여 mean과 std로 출력한다. 이 분포에 대한 데이터를 전부 사용할 수 없으니 샘플링을 하게 되고 이때 Reparameterization trick을 사용한다. Reparameterization trick은 $\epsilon$을 N(0,1)에서 샘플링해서 std에 곱해주고 mean과 더해주는 방법으로 샘플링을 직접 하는 것을 막는 방법이다. 이것을 사용하지 않으면 출력된 mean과 std에 대한 가우시안 분포에서 직접 샘플링을 해야 하는데 그렇게 되면 deterministic하지 않기 때문에 역전파가 불가하다. 이에 대한 그림은 아래와 같다.
“An Introduction to Variational AutoEncoders(2019)” – Kingma et al.
샘플링한 Latent variable은 z라고 부르고 이것을 사용해 Decoder를 통과시켜 원래 데이터를 생성시키게 된다. AutoEncoder는 Manifold로 차원 축소를 잘 해내는 것이 목적이지만 Variational AutoEncoder는 latent variable z가 Gaussian distribution을 따른다고 가정하여 생성에 쓰고자 하는 것이 목적이다. z는 gaussian 분포이므로 나중에 굳이 Encoder를 사용하지 않고 뽑고 싶은 데이터에 대해 gaussian 샘플링을 해주면 되므로 생성 모델에 적합하다.
Encoder – x를 잘 나타내는 z를 생성하는 sampling 함수 $q_{\phi}$
VAE는 데이터 셋에 있는 데이터들과 유사한 분포를 가지는 데이터를 생성하는 것이 목적이다. 그런데 데이터 x를 잘 나타내는 함수가 필요하다. 이런 함수를 직접 구하진 못하므로 잘 알고있는 함수(ex. gaussian) $q_{\phi}$를 근사시키는 Variational Inference 방법을 적용한다.
모든 x에 대해 z가 생성될 확률은 1이므로 $ \int q(z|x) dz = 1 $로 표현 가능하다. 그러므로 P(x)에 log를 취해서 식을 전개해보면 다음과 같이 표현된다.
$$ log P(x) = log P(x) \int q(z|x) dz $$
$$ = \int q(z|x) log P(x) dz $$
베이즈 룰에 의해 $ log P(x) = log \frac {P(x|z) P(z)} {P(z|x)} = log P(x|z) + log P(z) – log P(z|x) $ 이므로 위의 식을 다음과 같이 전개한다.
$$ = \int q(z|x) [log P(x|z) + log P(z) – log P(z|x)] dz $$
$$ = \int q(z|x) log P(x|z) dz + \int q(z|x) (log P(z) – log P(z|x)) dz \pm \int q(z|x) log q(z|x) dz $$
확률 밀도 함수 $ q(z|x) $ 를 따르는 x에 대한 P(x|z)의 기댓값은 q(z|x)를 따르는 샘플들로 근사할 수 있다. 이를 Monte Carlo Approximation이라고 하며 다음과 같이 나타낼 수 있다. $ \int q(z|x) log P(x|z) dz = E_{q(z|x)} [log P(x|z)] $ 이를 위의 식에 반영하면 다음과 같다.
$$ = E_{q(z|x)}[log P(x|z)] – \int q(z|x) logq(z|x) dz + \int q(z|x) log q(z|x) dz + \int q(z|x) log P(z) dz $$
$$ + \int q(z|x) log q(z|x) dz – \int q(z|x) log P(z|x) dz $$
이제 $ KL(p, q) = \int p(x) log p(x) dx – \int p(x) log q(x) dx $식을 이용하여 식을 바꿔주면 다음과 같다.
$$ = E_{q(z|x)} [log P(x|z)] – KL(q(z|x), P(z)) + KL(q(z|x),P(z|x)) \cdots (1)$$
마지막 항의 P(z|x)는 x의 분포가 매우 복잡하여 나타내지 못하므로 구하지 못한다. 따라서 생략하여 표현하고 KL-divergence는 항상 0보다 큰 값을 가지므로 최종적으로 다음과 같이 표현할 수 있다.
$$ log P(x) \ge E_{q(z|x)} [log P(x|z)] – KL(q(z|x),P(z)) $$
데이터 x가 나올 확률 P(x)를 최대화하면 Network를 잘 학습시킨다고 할 수 있다. 위의 식을 앞으로 Evidence Lower Bound(ELBO)라고 부른다.
다른 해석도 가능하다.
(1)식에서 마지막 항 $ KL(q_{\phi}(z|x), P(z|x)) $는 z가 x를 잘 표현하는 이상적인 sampling 함수 P와 $q_{\phi}$ 함수의 거리를 나타낸다. 이 두 함수의 차이를 줄이면(KL을 minimize 하면) 이상적 sampling 함수에 가까워지는 $q_{\phi}$를 얻게 되는데 P(z|x)는 x의 분포가 매우 복잡하여 구하지 못한다. 대신 위의 그림처럼 ELBO를 Maximize 하여 간접적으로 $KL(q(z|x), P(z|x))$를 minmize 하는 방법을 사용한다. 이를 Variational Inference라고 한다.
Decoder – z로부터 x를 잘 생성하는 함수 $g_{\theta}$
Decoder에 z를 줬을 때 x가 나오게 나올 확률을 maximize 하게 해야 한다. 식으로는 $ E_{q_{\phi}(z|x)}[log (P(x|g_{\theta}(z))]$가 된다. 이는 Likelihood를 Maximize 하는 문제가 되어 풀 수 있다. ($q_{\theta}$를 통과한 값이 어떤 분포를 가정하냐에 따라 다른 loss function을 사용한다. gaussian(sigma=1인)이라면 mse, bernoulli 라면 cee를 사용한다(자세한 내용은 여기를 참조))
그런데 수식으로 보면 이미 ELBO안에 들어가 있다. 그러므로 최종 optimization 식은 다음과 같다.
$$ argmin_{\phi, \theta} \sum_{i} -E_{q_{\phi}(z|x_{i})}[log(P(x_{i}|g_{\theta}(z)))] + KL(q_{\phi}(z|x_{i})|P(z)) $$
첫 항은 Reconstruction Error로 x로부터 z를 생성하였고 z를 decoder에 넣었을 때 데이터 x를 얼마나 잘 생성해 냈는지를 의미한다.
두 번째 항은 Regularization term으로 데이터 x가 Encoder를 통해 나온 z가 P(z)와 유사하게 분포하도록 만들어 준다. 이는 나중에 모델을 생성할 때 사용하는데 편리함을 준다. P(z)와 $q(z|x)$는 gaussian distribution을 가정하므로 KL-divergence를 쉽게 구할 수 있다(자세한 내용은 여기를 참조).
Encoder $q_{\phi}$의 출력은 gaussian, Decoder $g_{\theta}$의 출력은 beroulli를 따른다고 가정하면 각각의 Error는 다음과 같이 계산된다.
$$ Reconstruction Error : -\sum_{j=1}^{D} x_{i, j} log p_{i, j} + (1-x_{i, j}) log (p-p_{i, j}) $$
$$ Regularization term : \frac {1} {2} \sum_{j=1}^{J}(\mu_{i, j}^{2} + \sigma_{i, j}^{2} – ln(\sigma_{i, j}^{2})-1)$$
반응형
[Deep Learning] VAE (Variational Auto Encoder) 개념 정리
728×90
반응형
위 강의 링크 내용을 정리해서 요약한 내용입니다.
추가 참고 link :
https://di-bigdata-study.tistory.com/4
VAE (Variational Auto Encoder)
0. ae와 vae 의 차이점?
– ae 의 핵심은 원래의 데이터를 복원 (x –> x), 핵심은 Z를 잘 임베딩 하는 것 (manifold learning)
+) 원래의 DB를 고차원의 공간에 잘 표현하는 것이 manifold learning 의 목적
– 반면 vae는 원래의 데이터를 새로운 유사한 데이터로 재생성(x –> x’)해 내는 것 (generative model)
–> 둘은 목적 자체가 완전히 다른 모델 !!!!
1. vae 구조 뜯어보기
(AE는 encoder –> z –> decoder)
1) encoder (gaussian)
– input – Xi
– output – gausian encoder를 거친후 두 개의 벡터를 반환
기존의 AE모델은 n차원의 벡터를 반환했다면
VAE에서는 n차원의 평균(μ), n차원의 표준편차(σ) 값을 반환 → n개의 분포가 생김 → n개의 정규 분포에서 Z를 샘플링
2) Z를 샘플링 – Reparametererization Trick
– 샘플링을 하는 것은 미분가능한 수식을 나타낼 수 없음 (backpropagation 안됨) → Reparametererization Trick 적용 !!
– Reparametererization Trick : 표준 정규분포에서 샘플링을 한 값 ϵ 을 표준편차 σ에 곱한 뒤 μ 더함 → μ + ( ϵ * σ )
→Z를 표준 정규 분포로 만드는 과정이라 이해 !
3) decoder (bernoulli)
– input – $Z_{i}$ (표준 정규분포)
– output – Pi
2. loss function
+) loss function
확률을 normal (=gaussian) distribution 정규 분포라 가정하면 ==> 회귀니까 손실함수는 MSE
확률을 bernoulli distribution, 이산확률 분포라 가정 ==> 분류니까 손실함수는 Cross entropy
—> decoder를 통과해서 나온 $p_{i}$가 베르누이 분포를 띄고있기 때문에 Cross entropy 적용
+) 가능도 Likelihood
L(distribution|data) = likelihood
여기선 입력 데이터는 고정되어있지만 분포는 변하는 상황, 데이터가 주어졌을때 분포가 데이터를 얼마나 잘 설명하는가
+) Maximum Likelihood
각각의 관측값에 대해서 총 가능도가 (모든 가능도의 곱) 최대가 되게 하는 분포를 찾는 것
최대가능도 추정법(Maximum Likelihood Estimation, MLE)은 주어진 표본에 대해 가능도를 가장 크게 하는 모수
𝜃 를 찾는 방법이다.
Loss 는 크게 원본의 이미지를 구현하기 위한 목적 함수 Reconstruction error와
Encoder output인 평균과 표준편차를 정규화 하는 Regularization error 가 있다.
1) Reconstruction Error – AE 의 loss function
– VAE에서 decoder의 output $p_{i}$ 는 베르누이 분포(이진분류) 를 따른다고 가정
– predicted value $p_{i}$ 와 target value $x_{i}$ 의 차이를 구하기 위해 cross entropy 계산
2) Z가 normal distribution을 따라야 한다는 Regularization error – KL divergence
표준 정규분포에서 샘플링 된 값 p(z)과
encoder output 인 $q_{\phi}(z|x_{i})$ 의 차이가 적도록 KLdivergence 계산
3. loss function 뜯어보기
1) decoder output이 X일 확률 – $p_{\theta}(x)$ 를 구해보자
– decoder input은 $p_{\theta}(z)$ output은 $p_{\theta}(x|z^{(i)})$
– 우리는 training data의 likelihood를 최대화하는 확률 분포를 갖는게 목표
즉, decoder output이 X일 확률 $p_{\theta}(x)$ 를 최대화하는 확률 분포를 갖는게 목표
2) $p_{\theta}(x)$ 를 최대화 해보자 !
– 아까 우리는 $p_{\theta}(x^{(i)}$의 값을 최대화 하는 것이 목표였음
– 우선 $p_{\theta}(x)$ 앞에 로그를 씌움
여기서 $p_{\theta}(x)$ 는 encoder를 거친 z를 입력 받은 뒤 다시 decoder를 거쳐 나온 값이므로
z가 encoder의 확률 distribution을 따름–> $z~q_{\phi}(z|x^{i})$
– 이후 식을 베이즈 정리를 적용하고 아래와 같이 쭉쭉 전개하면
– 이렇게 전개된 맨 마지막 식을 아래의 수식을 참고해서 바꾸면.. 2번째항 3번째 항은 KL divergence 식으로 바꿀 수 있음
(KL divergence : 두 확률분포의 차이를 계산하는 데에 사용하는 함수)
(p는 true 확률, q는 추정 확률)
첫번째 : Z에서 X가 나올 확률 (decoder 의 true 값)
두번째 : encoder의 output $q_{\phi}(z|x)$ 과 Z와 distribution $p_{\theta}(z)$ 의 차이
세번째 : encoder의 output $q_{\phi}(z|x)$ 과 $p_{\theta}(z|x)$의 차이
하지만 세번째 항에서 p(z|x)는 계산 할 수 없음
(다만 KLD 차이기 때문에 0보다 크거나 작다는 것만 알 수 있음)
세번째 항이 항상 0보다 크거나 같으므로 위 사진 처럼 부등식으로 표현이 가능하다. 이를 ELBO라 부른다.
+) Q 그럼 p(x|z)랑 p(z)는 어떻게 구하는 건지…
p(z)는 vae에서 표준 정규분포라고 가정을 한다.
p(x|z)는 z라는 표준 정규 분포가 주어졌을 때 , xi를 가질 확률 –> decoder
그러나 p(z|x)는 구할 수 없음 – 역방향
3) ELBO (evidence lower bound)
– ELBO를 maximize함으로써 likelihood 또한 maximze할 수 있는 것임
– ELBO를 maximize 하는 학습 파라미터 decoder 파라미터 $\phi$, encoder 파라미터 $\theta$ 구하기
4) 최종적으로 Maximize 을 minimize로 바꾸면
–> Reconstruction error :
x가 주어졌을 때 $q_{\phi}$ 인코더 네트워크를 지나서 z 생성 –> $q_{\phi}(z|x)$
그 z가 $q_{\theta}$ 디코더 네트워크를 지났을 때 –> $q_{\theta}(z)$
xi가 등장할 확률
–> Regularization :
x가 주어졌을 때 $q_{\phi}$ 인코더 네트워크를 지나서 z 생성 –> $q_{\phi}(z|x)$
우리가 가정한 분포 (표준정규분포) p(z)와 유사하도록 만드는 것
3. Optimization (이제 계산을 해보자)
1) reconstruction error
가정 1. $p_{\theta}$는 베르누이를 따른다고 가정 –> cross entropy로 계산
decoder의 아웃풋이 x가 등장할 확률 (classification)
– 모든 z에 대해서 적분한다는 것은 불가능 ! 따라서 몬테 카를로 테크닉을 활용
# 몬테카를로 테크닉
몬테카를로 : “샘플링” 이라고 이해하면 됨
어떤 분포를 가정하고 그 분포에서 굉장히 여러번 샘플링을 해서 평균을 내면
전체에 대한 기댓값과 샘플링한 것들의 기댓값은 같아질꺼다~ 하는 컨셉
– 따라서 몬테카를로 기법 적용 (무수히 여러번 샘플링을 해서 모집단의 평균 찾기) –> 하지만 계산량이 너무 많아짐
– 결국 샘플링을 한번만 한 뒤 이걸 대표값이라 하고 위의 식 계산 (L을 1로 가정함)
+) 하지만 샘플링 과정은 미분이 안됨 –> Backpropagation 불가능 –> 그래서 적용한게 reparameterization trick
( 자세한 설명은 맨뒤에..)
==> 최종적으로 $log(p_{\theta}(x_{i}|z^{i}))$
이제 $p_{\theta}$ 가 어떤 확률 분포를 따르는지 가정하느냐에 따라서
reconstruction error 수식이 바뀜
가정 a. $p_{\theta}$는 베르누이 분포를 따른다고 가정 –> Cross entropy 계산
– decoder의 output : x가 등장할 확률 Pi
– 일단은 z가 들어가서 pi로 복원이 되면, 차원이 5라고 한다면 각각 5개에 대한 확률을 계산
확률 곱으로 표현해서 –> 합으로 바꾼뒤
– (2번째줄) 따라서 $p_{\theta}(x_{i}|z^{i})$ 를 베르누이 식으로 바꿈 (2번째줄)
– (3번째줄) 위의 식은 cross entropy 식으로 바꿔서 계산
가정 b. $p_{\theta}$는 가우시안 분포 (정규분포) 를 따른다고 가정 –> squared Error 계산
decoder의 아웃풋이 x의 평균과 표준편차
2) regularization
– 가정 1. encoder output인 $q_{\phi}(z|x)$ 는 정규분포를 띈다
– 가정 2. p(z)는 표준 정규분포를 띈다.
– 이 두 분포를 같게 만들어준다 –> KL divergence를 통해서
+) reparameterization trick
** 샘플링하는 과정에서 Reparametererization Trick 을 사용 : 이게 샘플링을 최적화 하는 방법 중에 하나 (미분 가능하게 바꿔줌)
– 미분가능한 식으로 만들기 위해 표준정규분포에서 샘플링을 한 뒤 (epsilon)
– encoder output의 std에 곱해주고 거기에 mean 값을 더해 Z를 만듦
– 따라서 좌측에서는 Z가 정규 분포로 부터 샘플링을 한다는 정보만 있을 뿐 미분을 위한 식을 도출 할 수 없었는데,
우측에서는 표준 정규분포의 epsilon을 활용해 식을 만들어냄
+) 이게 무슨 의미가 있나?
샘플링된 표준 정규 분포를 encoder output과 연결시켜 같이 학습 될 수 있도록 함
5. 결론
– 생성모델에 대한 수학적인 접근이 이뤄짐
– Decoder 를 통해 생성된 학습 데이터는 기존의 input 데이터와 닮아있다. (아주 다른 형태의 데이터가 나오긴 어려움)
– 그러나 생성의 품질이 GAN 모델만큼 좋지는 못함
+) next step – 추천 알고리즘에서의 vae 활용
1. multi vae (Variational Autoencoders for Collaborative Filtering)
” likelihood p_{\theta}(x_{u}|z_{u})가 다항분포를 따른다”
Mult-VAE는 VAE 와 다르게 가우시안 베르누이 분포가 아닌 다항분포를 likelihood function에 적용
Generative model은 유저 u에대한 k차원의 latent zu로 샘플링하여 $f_{\theta}: \R^{k} \rightarrow \R^{|I|}$ 로 차원 변경을 해주고 상호작용 $n_{u}$ 를 multinomial distribution에서 도출
2. RecVAE
728×90
반응형
[VAE] Auto-Encoding Variational Bayes 논문 정리(1)
오늘은 VAE 논문을 정리해보려고 한다.
지난번에 정리했던 ResNet 논문에 비해서 수식이 굉장히 많이 나오고, 통계지식들이 많이 요해지는 논문이라서 개인적으로 이해하는데 굉장히 오래걸렸다..
🔥 AE vs VAE
AE의 구조
일단 VAE를 살펴보기 전에 먼저, VAE 모델의 기본 구조인 오토인코더에 대해서 살펴보자.
오토인코더는 이와 같이 인코더, 디코더, 그리고 latent variable인 z로 구성이 되어있다.
어떤 input이 들어오면 인코더에서는 차원축소가 일어나고, 축소된 z가 decoder로 들어가면 다시 input형태로 복원된 output이 나오게 된다. 이때 이 오토인코더의 목적은 차원축소이기 때문에 왼쪽의 인코더를 학습하기 위해서 디코더는 그냥 따라붙은 그러한 형태라고 생각할 수 있다.
이번엔 이번 논문의 주제인 VAE다. VAE는 방금 살펴본 AE와는 반대로 디코더를 위해서 왼쪽의 인코더가 따라 붙은 형태이다. 즉, VAE는 인코더를 거치면 평균, 그리고 표준편차 이렇게 두개의 벡터를 아웃풋으로 내게 되는데 이 두가지를 결합해서 어떤 normal distribution을 만들게 되고, 그렇게 만든분포에서 sampling을 통해 z를 만들고, 그 z가 다시 decoder를 통과해 어떤 기존의 input데이터와 유사한 새로운 데이터들을 생성할 수 있다. 따라서 이 VAE는 확률 분포를 이용해 어떤 새로운 데이터를 생성하는 것을 목적으로 개발된 모델이고, 따라서 generative model이라고 불린다.
🔥 Generative model
Generative model
그렇다면 이 generative model이 어떤 원리로 이미지를 생성하는지 살펴보도록 하자.
Generative model은 어떤 데이터, 예를 들어 이미지 데이터가 들어오면, 그 이미지에서의 다양한 특징들이 각각의 확률 변수가 되는 어떤 확률 분포를 만들게 된다. 예를들어 위의 예시에서는 어떤 인간의 얼굴 데이터가 들어오고 우리가 hidden layer에서 dimension을 2라고 설정했다면, 이렇게 코의 길이 , 눈의 모양과 같이 두개의 특징에 대한 값들이 catch가 되고, 그 두가지 특징들에 대한 확률 분포를 표현한다면 결합 확률 분포 형태로 나타나게 된다.
-> 따라서 우리가 입력데이터의 두가지 특징에 대해 이렇게 확률분포를 잘 학습했다고 가정한다면, 이런식으로 확률값이 높은 부분에서 이미지를 샘플링하면 여기 보이는 것과 같이 실제로 있을 법한 그럴싸한 이미지가 나오게 된다. 반대로 확률값이 낮은 부분에 대한 데이터를 샘플링하게 된다면 그때의 값은 상대적으로 덜 있음직한 어색한 데이터가 된다. 즉, 결국 생성모델의 목표는 이미지 데이터의 분포를 잘 근사하는 이 모델을 만드는 것이 되고, 모델을 잘 만든다면 이와 같이 새로운 데이터들을 잘 생성할 수 있게 된다.
🔥VAE _Decoder
이제 본격적으로 Generative model인 VAE가 어떻게 새로운 데이터를 생성할 수 있도록 학습되는지 수식적으로 살펴보자.
먼저 VAE는 인코더가 아니라 디코더를 위한 것이라고 언급을 했는데 즉, 뭔가 Z가 있으면 X를 만들어 내고 싶은 목적에서 시작된 것이다. 따라서 만약에 latent variable인 z의 확률분포를 p(z)라고하고, z가 주어졌을 때 x의 확률분포는 이렇게 p(x|z)라고 표현을 했다면, DECODER가 이것들을 이용해 generation process를 진행하는 과정에서 어떻게 모델 파라미터를 학습 하는지에 대해서 생각을 해보아야 한다. VAE는 generative model이기 때문에 generative model의 목적을 다시 한번 생각해보면 입력데이터의 분포를 잘 근사하는 모델을 생성하는 것인데 즉, 어떤 네트워크의 출력값이 있을 때 우리가 원하는 정답인 x가 나올 확률이 높길바라는 것이라고 할 수있다.
따라서 VAE에서도 우리는 x의 likelihood를 최대화하는 확률분포를 만들고 싶은 것이 목적이 되고,
즉 p(x)를 최대화 하고싶은 것이기 때문에 p(x)를 위와 같은 적분식으로 표현해보게 된다.
(위의 적분식은 베이즈 공식을 통해 나온식으로, x와 z가 동시에 일어날 확률을 모든 z에 대해서 적분했다는 의미로 결국 x의 liklihood가 된다 )
🔥VAE _Encoder/ Variational Inference
그럼 이제 이걸 그냥 적분한 값을 풀수만있다면, P(x)를 알 수 있고, 그럼 Z에 대한 X에 대해서 설명할 수 있는 것인데, 문제는 얘를 계산할 수가 없다는 것이다. 왜 그런지 살펴보면 먼저 p(z)는 우리가 가우시안을 따른다고 가정한다면 얻어낼 수 있고, p(x|Z)는 decoder부분에 해당하기 때문에 뉴럴 네트워크로 만들수 있다.
그런데 모든 z에 대해서 p(x|z)를 모든 z에 대해서 적분을 하는 것이 intractable하기 때문에 결국 계산이 불가능하다. 그래서 그럼 베이즈 공식을 통해 식을 변형해 보기도 하지만, 결국 살펴봐도 식에 우리가 모르는 값인 p(x)가 있기 때문에 계산을 할 수가 없게 된다.
그래서 우리는 ! 그 대안으로 인코더를 정의해 주게 된다. 따라서 이 인코더의 역할은 실제 우리가 알고싶은 P(z|x)를 뉴럴네트워크로 가장 근사화하는 Q(z|x)를 구할 수 있는 네트워크가 된다는 것이다.
(p는 우리가 알고싶은 true값, q는 p를 근사화하는 추정값)
그리고 이러한 아이디어를 바로 Variational inference라고 합니다.
🔥ELBO
그럼 이제 encoder의 도움을 받아서 어떻게 학습을 시키는지 수식의 유도과정을 간단히 살펴보자. 먼저 우리의 목표는 data likelihood인 이 p(X)를 최대화 시키고 싶은 것이기 때문에, 이 값에 log를 먼저 씌워준다. 그리고 그것을 expectation 즉 기댓값 형태로 나타내게 되는데, 이때 log p(X)는 그대로 두고 z가 encoder를 거쳐서 나오는 확률 분포를 따를때의 기댓값으로 이렇게 표현하게 된다. 그리고 이제 베이즈 공식을 사용해서 p(x)값을 변형해서 표현해준다. 이제 동일하게 q(z|x)를 분모분자에 동일하게 곱해주고 앞에 log가 씌워져있기 때문에 log안의 분수를 이와 같이 덧셈과 뺄셈으로 풀어주게 되면, 여기서 이제 두가지 개념으로 최종식을 완성시켜주게 된다.
먼저, expectation 개념을 이용해서 이와 같이 적분 형태로 바꿔줄 수 있다. 그리고나서 이제 식을 한번더 변형을 해주게 되는데, 이때 사용하는 개념이 바로 KL divergence 다. 이 KL divergence는 간단히 말하면 두 확률분포의 차이를 계산하는 함수라고 할 수 있는데, 식이 아래에 나와있는 것과 같은 형태로 나타나게된다. 따라서 우리가 구한 이 적분 식과 모양이 똑같기 때문에 다시 적분식을 변형해주면 최종적으로 이렇게 KL을 이용한 식이 나오게 된다.
최종 ELBO
이렇게 최종 식만 가져와서 다시 살펴보도록 하자. 결국 우리의 목표는 이 최종식을 maximize하면 되는 것인데 여기서도 우리가 계산할 수 없는 하나의 값이 존재한다 바로 p(z|x)값 인데, 여기서 p는 true값이고 q는 우리가 모르는 p(z|x)를 추정하기 위한 추정값이 되기 때문에 따라서 x가 주어졌을 때 z의 true값은 우리가 계산할 수 없다. 하지만 우리는 얘가 KL divergence라는 것을 알고, 앞에서도 말했듯이 두 확률 분포의 차이를 계산하는 이러한 함수이기 때문에 항상 0보다 크거나 같다라는 정도는 우리가 알수있게 되고, 그럼 이부분이 0보다 크거나 같다면 이 앞의 부분을 LOWER BOUND로 해서 maximization시켜주면 결국 이 전체식을 maximize한 것과 같다는 결론에 이르게 된다.
따라서 우리가 최적화 시켜야하는 이 최종 부분을 Evidence LowerBOund)라고 해서 ELBO라고 부르게 된다.
이제 이렇게 구한 ELMO를 이용해서 VAE의 최종 loss function이 어떻게 되는지는
다음 글에서 다루겠습니다
Variational Autoencoder (VAE) 설명 (cs231n 참고)
기존 강의는 pixelCNN의 설명부터 시작한다.
VAE는 intractable한 (조절이 까다로운?) latent(잠재) vector z에 대한 density function을 알아내려 한다.
다만 바로 직접적으로 모델을 학습시킬 수는 없고, 대신 likelihood 의 lower bound를 derive and optimize한다고 써있는데 아래에서 더 자세히 알아보도록 하자.
우선 VAE의 배경이 되는 Autoencoder는 data를 만들어내기 위하여 사용하지 않고, label 되어있지 않은 트레이닝 데이터로부터 lower dimensional feature을 unsupervised learning을 통해 배운다.
input data x가 있고 이 데이터로부터 feature z를 생성하도록 Encoder을 학습시킬 것이다.
원래의 인코더는 linear + nonlinearity를 통해서 설계되었고 그 후 Deep, fc 모델을 통해서, 그리고 그 후에는 ReLU CNN을 통해서 설계되어 왔다.
주로, z는 x보다 dimensionality가 축소된다. 그 이유는 z는 x로부터 뽑힌 가장 중요한 정보들만을 담고 있어야 하기 때문이다.
이 autoencoder을 학습시키는 방법은 x를 통해 x를 복원하는 방법을 사용한다.
주로 이 모델은 conv를 이용해서 설계한다.
그냥 데이터만 복구시키면 의미있는 feature들만 남는 이유는 무엇일까?
바로 손실된 적은 양의 정보(z)를 통해서 원본을 복구하기 위해서 의미있는 feature만 남기기 때문이다.
이제 마지막으로 훈련이 끝나면 디코더를 삭제하면 의미있는 feature들을 만들어내는 decoder이 완성된다.
이 encoder로부터 나온 데이터를 feature로 추가적인 모델을 붙여서 classifier의 전처리로 사용할 수도 있다.
좋은 feature을 뽑기 때문이다.
VAE의 경우 우리의 트레이닝 데이터가 latent 한(관찰 불가능한) z 로부터 생성되었다고 생각한다. (기존 아이디어를 거꾸로 뒤집음)
z는 어떤 벡터이고, 각 z는 우리의 training data의 다양한 feature 나타내고 있다고 보자.
자 이제 우리 새로운 generation process로써, z 이전 단계에서 z를 sample 할 것이다. (강의에선 prior이라고 한다)
다시말해서 z의 분포가 어떻게 되어있는지에 대한 Z에 대한 prior을 정할 것이고, 이 prior은 가우시안 등이 될 수 있다.
그후 우리는 조건부 확률 p(x|z)를 통해 x를 만들것이다.
우리는 이 (가우시안 등으로 된 simple한) p(z)를 통해서 p(x|z)를 통해 이미지를 만들어낼 것이다. 이건 복잡하니까 뉴럴 네트워크로 만들게 된다. 이걸 디코더 네트워크라고 하자.
(p(z)를 가우시안이라고 일단 정해보자)
어떻게 학습시킬 수 있을까?
일단 우리가 하려는게 training data같은 데이터가 복원이 잘 되게 하는 모델 파라미터를 학습하는 것임을 기억하자.
일단, p(x) 를 z에 대한 적분 식으로 표현할 수 있다. 그렇지만 그 과정이 구현이 되지 않는다.
p(z)는 simple한 가우시안으로 정했고 그렇기에 얻어낼 수 있다.
또한 p(x|z) 는 디코더 네트워크이기 때문에 연산이 가능하다.
그렇지만 저 적분기호(인터그랄)를 처리할 수가 없다.
또한 베이즈 룰을 통해서 변형한 posterior density 또한 구할 수가 없다.
그래서 우리는 그 대안으로 추가적인 인코딩 네트워크 q(z|x)를 정의해서 p(z|x)를 알아내도록 (샘플링하도록) 하자!
VAE의 경우
인코더는 x를 입력으로 받아서 z|x의 mean 과 (대각 행렬의) covariance 를 구하려고 한다.
디코더는 z를 입력으로 받아서 x|z의 mean과 covariance를 구하려고 한다.
이걸 봐서는 잘 이해가 안간다. (난 강의 들으면서 여기서 약간 설명이 이해가 안갔다)
그래서 다른 (내가 이해한대로) 설명을 덧붙이겠다.
지금까지의 내용 정리를 하자면 우리는 이상적인 z의 확률 분포를 모르기 때문에 임의의 가우시안 분포에서 z를 샘플링 하기로 했다.
그걸 처리하려고 만들어진 모델이 q라고 하자. 결국 q(z|x)는 p(z|x)와 근사한 가우시안을 구하는 역할이다.
그리고 z를 알았다면 x는 p(x|z)를 수행하는 디코더 네트워크를 통해 샘플링 할 수 있게 된다.
그리고 이것을 maximum likelihood estimation 을 통해 최적화 한다.
아래에 그 식 전개를 소개한다.
우선 첫줄, z에 관련없으니 그냥 저렇게 바꿀 수 있다.
베이즈 룰을 이용하여 두번째 줄로 만든다.
셋째줄에 위아래에 같은 q 관련 값을 곱한다. (추후의 식 처리를 편하게 하기 위해서)
넷째줄에서는 그 값들을 세 부분으로 나눈다. (log니까 더할 수 있다 당연히도)
마지막엔 이걸 정리하는데,
첫 번째 항은 디코더 네트워크를 통해 p(x|z)를 계산 가능하다.
저 영어로 써있는 differentiable through reparam이라고 되어있는 ( 무책임하게 see paper이라고 되어있어서 빡치는 ) 부분에 대한 설명은, 그냥 일반적인 방식으로 sampling을 하면 중간에 chain rule이 끊겨서 gradient 를 구할 수가 없으니까 다른 방법을 쓰자는 것이다. 그 트릭이랄게, 별로 특별할 것도 없는데
임의의 정규분포 N(0,1)로부터 상수 a를 샘플링 한다.
그리고 기존의 우리가 구한 변수 (평균 + a*분산^2) 을 통해 backprop을 가능하게 하자는 것.
(실제로 수식적으로 같은 표준편차의 그것이 뽑히며, 변수의 값이 직접 조작되지 않았으니 gradient descent가 가능)
두번째 term은 뭐라는지 잘 모르겠다; 알려주실분? ㅜㅜㅜㅜㅜㅜ
세번째 term은 계산할 수는 없지만 0보다 크다는 것은 항상 자명하다.
여튼 결국 이를 통해 lower bound를 추적할 수 있다고 한다. (맨 오른쪽 term도 0 이상이니 왼쪽 두 항을 최소로!)
p(x|z)랑 KL divergence term이 미분이 가능하니까 backprop이 가능하다.
그래서 위의 lower bound를 알게 되었기 때문에 우리는 저 lowerbound를 최대화 함을 통해서 확률 p를 최대한 높일 것이다.
왼쪽 term에 대한 직관적인 해석은 z로부터 최대한 말 되는 x를 뽑아내라 하는 것이다.
z를 보고 최대한 reconstruction 잘 하라는 것.
오른쪽 trem은 저 KL을 최대한 작게 만들라는 것이다.
다시말해 q(z|x)와 p(z)를 최대한 일치하게 만들라는 것.
다시말해 x를 통해 인코딩 될법한 z를 잘 뽑아라.
매 minibatch 마다 forward pass를 진행하고 backprop을 진행하자.
(그 과정에서 우리가 만든 x->z를 원본 z랑 최대한 맞추려고 하고, x 는 생성된 x와 최대한 맞추려고 하면 됨니다.)
이렇게 VAE를 모두 만들었다면,
디코더 네트워크만 가지고서 데이터를 만들어 낼 수 있다.
( ? 이럴거면 왜 training시에 인코더 네트워크를 다시 만든거임? 이라는 생각이 든다. 그치만 다양한 z 분포에 대해 합리적으로 x를 재 생성하게 했으니 다양한 분포를 견딜 수 있는 디코더를 만들게 된 것이 의미라면 의미겠지….?)
여기서 약간 의문인 점이 다른 곳의 포스팅들을 봤을 때는 안 그런데 cs231n의 디코더 슬라이드에서만 마치 동일한 z에 대해서 다른 x를 생성하는 것 처럼 설명 해 놓았다.
왜 z로부터 다시 x를 샘플링하는거지? 그냥 디코딩 하는게 아니라?
그래서 인터넷에서 찾은 VAE 코드 링크를 첨부한다.
아무리 봐도 디코더에서 다시 샘플링 하는건 아닌 것 같다.
https://github.com/lyeoni/pytorch-mnist-VAE/blob/master/pytorch-mnist-VAE.ipynb
그리고 예쁜 설명 동영상이 있다.
참고하면 좋을 것 같다.
(근데 여기서 마지막으로 설명하는 disentangled variational autoencoders 에 대한 설명 자료를 찾을 수가 없다.. 이런..)
(Wasserstein Auto-Encoder도 나중에 공부해보면 좋을 것 같다)
혹시 읽다가 잘못된 부분을 발견하셨으면 제보좀 부탁드립니다……..
뭔가 공부 다 했는데 찝찝하다….
키워드에 대한 정보 variational autoencoder 설명
다음은 Bing에서 variational autoencoder 설명 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 딥러닝 Ch3.3 VAE
- 동영상
- 공유
- 카메라폰
- 동영상폰
- 무료
- 올리기
딥러닝 #Ch3.3 #VAE
YouTube에서 variational autoencoder 설명 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 딥러닝 Ch3.3 VAE | variational autoencoder 설명, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.