Search

VAE

대분류
인공지능/데이터
소분류
ML/DL 정리 노트
유형
딥 러닝
부유형
Vision PyTorch
Generative Model
최종 편집 일시
2024/10/27 15:19
생성 일시
2024/10/17 00:19
14 more properties

Variational Auto-Encoder

VAE는 Input image X를 잘 설명하는 feature를 추출하여 Latent vector z에 담고, 이 Latent vector z를 통해 X와 유사하지만 완전히 새로운 데이터를 생성하는 것을 목표로 한다.
이때 각 feature가 가우시안 분포를 따른다고 가정하고 latent z는각 feature의 평균과 분산값을 나타낸다.
예를 들어 한국인의 얼굴을 그리기 위해 눈, 코, 입 등의 feature를 Latent vector z에 담고, 그 z를 이용해 그럴듯한 한국인의 얼굴을 그려내는 것이다.
latent vector z는 한국인 눈 모양의 평균 및 분산, 한국인 코 길이의 평균 및 분산, 한국인 머리카락 길이의 평균 및 분산 등등의 정보를 담고 있다고 생각할 수 있다.

VAE 모델 구조

Input image X를 Encoder에 통과시켜 Latent vector z를 구하고, Latent vector z를 다시 Decoder에 통과시켜 기존 input image X와 비슷하지만 새로운 이미지 X를 찾아내는 구조
VAE는 input image가 들어오면 그 이미지에서의 다양한 특징들이 각각의 확률 변수가 되는 어떤 확률 분포를 만들게 된다.
이런 확률 분포를 잘 찾아내고, 확률값이 높은 부분을 이용하면 실제에 있을법한 이미지를 새롭게 만들 수 있을 것이다.

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를 통해서 데이터의 특징을 파악하는게 더 유리하다.
입력 (Input):
입력 데이터로는 이미지(예: 고양이 이미지)와 해당 이미지의 라벨(label)이 함께 들어간다.
이 라벨은 조건으로 작용하며, 모델이 데이터를 생성할 때 특정한 속성을 반영하도록 돕는다.
Encoder Neural Network (인코더 신경망):
인코더는 입력 데이터(이미지와 라벨)를 받아 이를 잠재 공간(latent space)으로 변환한다.
이때, 인코더는 잠재 변수 z에 대한 두 가지 중요한 값을 출력한다:
μ (뮤): 잠재 공간에서 각 차원의 평균 값을 나타낸다.
σ (시그마): 잠재 공간에서 각 차원의 표준편차 값을 나타낸다.
Reparameterization Trick:
인코더에서 출력된 μ와 σ는 잠재 변수 z를 만들기 위해 사용된다.
이 과정에서 가우시안 분포 N(0,1)N(0,1)에서 샘플링된 ε (엡실론)이 σ와 곱해지고, μ와 더해진다.
이 과정을 통해 잠재 변수 z를 샘플링하게 된다.
수식적으로는 다음과 같다:
Z1=μ1+ε1×σ1Z_1 = μ_1 + ε_1 × σ_1
Z2=μ2+ε2×σ2Z_2 = μ_2 + ε_2 × σ_2
Z3=μ3+ε3×σ3Z_3 = μ_3 + ε_3 × σ_3
이 과정은 샘플링 과정에서의 불확실성을 반영하면서도 미분 가능한 방식으로 설계된 것으로, VAE에서 중요한 재매개변수화 트릭(Reparameterization Trick)이다.
잠재 변수 Z:
위 과정에서 생성된 잠재 변수 Z는 이후에 Decoder로 전달된다.
이 잠재 변수는 이미지의 주요 특징을 압축하여 나타낸 정보이다.
이 잠재 변수는 조건 라벨과 결합되어, 디코더가 이를 기반으로 특정 조건을 가진 이미지를 생성할 수 있게 한다.
Decoder Neural Network (디코더 신경망):
디코더는 인코더의 반대 역할을 하며, 잠재 변수 z와 조건 정보를 입력받아 원래의 이미지를 복원하려고 시도한다.
이를 통해 VAE는 입력과 유사한 데이터를 생성하게 된다.
출력 (Output):
최종적으로 디코더를 통해 생성된 이미지가 출력된다.
이 출력 이미지는 주어진 조건(라벨)에 맞는 특징을 갖추고 있으며, 인코더의 입력 이미지와 비슷한 형태를 띠게 된다.

Model

Encoder
class Encoder(nn.Module): def __init__(self, x_dim, h_dim1, h_dim2, z_dim, c_dim): super().__init__() # encoder part self.fc1 = nn.Linear(x_dim + c_dim, h_dim1) self.fc2 = nn.Linear(h_dim1, h_dim2) self.fc31 = nn.Linear(h_dim2, z_dim) self.fc32 = nn.Linear(h_dim2, z_dim) def forward(self, x, c): concat_input = torch.cat([x, c], 1) h = F.relu(self.fc1(concat_input)) h = F.relu(self.fc2(h)) return self.fc31(h), self.fc32(h)
Python
복사
Decoder
CVAE