본문 바로가기
TIL

[23.03.27] AutoEncoder

by rahites 2023. 3. 27.

# 꽃이 피는 봄 

 

1. AutoEncoder

월요일 첫 수업은 AutoEncoder에 대한 이야기로 시작하였다. 지난 토요일 AutoEncoder 코드를 끄적이다 문득 생각이 들었던 문제, latent vector의 값은 모델의 seed에 따라 바뀌는 걸까? 에 대한 교수님의 답변으로 강의는 진행되었다. 물론 내가 질문한 것은 아니다 ㅎ

 

AutoEncoder는 초기값을 랜덤으로 주기 때문에 학습을 할 때마다 latent vector z의 값이 다르게 나온다는 문제점을 가진다고 한다. 이러한 문제는 우리가 Generative Model을 만드는데서 발생하는데, 일반적으로 생성 모델은 Decoder를 가지고 만들어진다. 이 때 Decoder의 input에는 latent vector z가 들어가는데, 만약 latent vector z의 위치가 매번 달라진다면? 우리가 이 생성 모델을 고객에게 서비스한다고 생각했을 때 매번 다른 범위에서 input을 받아와야하는 문제가 생긴다는 것이다. 

 

따라서 latent vector에 조건을 주어 범위에 제한을 두자! 라는 아이디어가 등장한다. 이를 위해서는 latent vector z를 discriminative하게 만드는 것이 중요한데, 그러기 위해서는 2가지 방법이 존재한다. 첫번째는 latent vector의 차원을 확장하는 것이다. 가장 쉽게 생각할 수 있는 방법으로 실제로 AE 코드에서 latent vector를 2차원 -> 5차원으로 확장하였더니 discriminative한 결과가 나오는 것을 확인할 수 있었다. 

5차원 latent vector를 2차원으로 TSNE 시각화

두번째 방법은 Condition을 주는 것이다. 코딩을 할 때 우리는 if문으로 조건문을 만들지만, 딥러닝 모델에서는 그럴 수 없다. 그렇다면 우리는 어떤식으로 모델에 Condition을 줄 수 있을까? 

 

MNIST 데이터를 예시로 들어보겠다. MNIST 데이터는 1 x 28 x 28 크기를 가지고 있는 이미지로 각각의 이미지는 0 ~ 9까지의 label 값을 가진다. 이 때 우리는 label 값을 output이 가져야 하는 Condition이라고 생각할 수 있고, 따라서 if 문 대신 우리는 이 label 값을 이미지 데이터와 같이(Concat) 모델에 넣어주는 것으로 Condition을 줄 수 있다.  

 

AE 모델이 Linear layer로 구성되어 있을 때 input 값은 1x28x28 = 784 + 0~9 원핫벡터 = 10 으로 794크기의 벡터가 들어간다. 이 때 두 벡터는 concat되어 입력되는데 이를 A([x, c])라고 생각할 때 A([c, x]) 형태로 입력되거나 x 사이에 c가 삽입되어 input으로 들어가도 상관없다.

이 때 label이 0~9 값을 0~1 로 변환(딥러닝은 무조건 0~1 float!!)하여 넣지 않고 원핫벡터로 넣는 이유는 만약 이처럼 연속적인 값을 넣어줄 경우 정답이 3일 때 5로 예측한 모델과 9로 예측한 모델 중 둘다 동일하게 틀린 모델인데 3과 5와의 거리가 더 가깝기 때문에 5가 좀 더 좋은 모델로 판단하기 때문이다. (Regression 문제로 해석)

따라서 원핫벡터 형태의 Classification 문제로 학습되게 해야 두 모델이 동일한 정도로 안좋은 모델임을 학습시킬 수 있다.

 

위처럼 Condition을 준 것은 모델이 Linear layer이었기 때문이다. 결국 모든 모델에 Condition을 줄 때에는 모델의 구조를 파악해야하고 모델의 연산구조가 x값과 조건 c를 같이 볼 수 있게 만들어야 한다는 의미이다. 예를들어 위의 모델이 Convolution으로 이루어져 있었다면 모델 필터 뒤에 채널을 concat해 붙이는 형태로 Condition을 줄 수 있다.

 

이렇게 Condition을 주는 방식으로 latent vector가 학습마다 다른 위치로 출력되는 것을 막을 수 있고 이것이 VAE를 이해하기 위한 기초가 될 것이라고 하셨다. 코드를 한번 보고 수업을 들어서인지 너무 집중이 잘되었고 더 이해도 잘 할 수 있었던 것 같다.

 

오늘의 가장 기억의 남는 말과 함께 오늘의 공부를 마무리 하도록 하겠다.

 

우리가 머릿 속으로 무언가를 생각할 때, 정보는 구조화되어 저장되지 않는다.
딥러닝도 마찬가지이다.
목적을 위해서라면 정보는 언제든지 내가 원하는 구조로 바꾸어 만들 수 있다. 

 

'TIL' 카테고리의 다른 글

[23.03.28] Wandb와 ONNX  (0) 2023.03.28
[23.03.26] 잔디와 추천시스템  (0) 2023.03.27
[23.03.25] AutoEncoder  (0) 2023.03.26

댓글