생성 모델의 한 축을 담당하는 Variational Autoencoder를 이해하기 위해서는, Autoencoder를 그냥 지나칠 수 없습니다. 이번 글에서는 Autoencoder에 대해 이해해 보는 시간을 가져보겠습니다.
Autoencoder
Autoencoder는 위의 그림과 같은 구조를 가지고 있으며 Encoder, Latent Vector, Decoder 이 3가지의 구성으로 이루어져 있습니다. 해당 모델의 가장 큰 목표는 데이터를 잘 압축하고자 하는 것입니다. 이 3가지의 구성 요소들이 어떻게 데이터를 잘 압축할 수 있도록 해주는지 하나하나씩 살펴보도록 하겠습니다.
Autoencoder의 목표는 데이터를 잘 압축하는데에 있다.
Encoder
Autoencoder에서 Encoder의 역할은 입력된 고차원 데이터를 저차원 벡터로 압축하는 것입니다. 이를 위해 여러 Neural Network를 비선형으로 연결해 가며 차원을 줄이게 되죠. 이렇게 해서 나오는 출력물이 바로 Latent Vector가 되는 것이고요, 이 Latent Vector가 Decoder로 전달되어 다시 원본으로 복원하는 것, 이것이 Autoencoder의 전체 흐름입니다. 이때 Encoder가 원본 데이터를 압축한다고 해서, 마냥 크기만 줄이는 압축을 하는 것이 아닙니다. Decoder가 충분히 잘 복원을 해낼 수 있도록 원본데이터의 핵심 feature들을 포함한 Latent Vector로 압축을 하는 것입니다. 이를 수행하기 위해 Encoder는 고차원 데이터 공간에서 Manifold라는 것을 학습하게 됩니다. Autoencoder의 핵심 기능이기도 하죠.
Manifold Learning
Autoencoder의 가장 핵심적인 기능은 Manifold를 학습한다는 것이라 했습니다. Manifold란 쉽게말해, 기존의 고차원 상태에 존재하는 데이터들을 보다 저차원의 공간으로 나타낼 수 있는 공간을 의미합니다. 쉽게 이해하기 위해 아래의 예시를 살펴보겠습니다.
위와 같이 3차원 공간에 사람의 얼굴 이미지들을 표현하였을 때, 이들은 해당 차원 내에서 중구난방 흐트러져 있는게 아니라, 사람의 얼굴 특징을 가지는 어떤 특정한 영역으로 밀도가 높게 모여있을 것입니다. 그리고 이러한 영역을 잘 아우르는 서브 스페이스를 우리는 Manifold라 부릅니다. 위의 사진에서 우측의 그림처럼 말이죠. 해당 예시는 고작 3차원의 공간에서 Manifold를 찾은 것이지만, 현실 데이터는 훨씬 더 고차원의 공간상에 데이터가 놓여있을 수 있습니다. 가령, 200*200의 RGB 이미지가 있다고 했을 때, 해당 데이터는 120,000차원으로 나타낼 수 있겠죠. Autoencoder는 이러한 고차원 공간 속의 데이터들을 보다 저차원으로 표현할 수 있는 Manifold를 학습해 나갑니다. 이러한 Manifold가 주는 이점이 무엇일까요?
1) 차원축소를 통해 차원의 저주를 벗어날 수 있다.
A예시처럼, 10개의 데이터를 놓을 수 있는 일차원 직선이 있고, 해당 직선위에 8개의 데이터가 놓여있다고 생각해 봅시다. 우리가 다루는 차원 속에서 약 80%가 데이터로 모여있기 때문에 이를 추론하기 위한 모델링을 수월하게 할 수 있습니다. 이제 B처럼, 2차원 공간에 똑같이 8개의 데이터가 놓여있다고 생각해 봅시다. 해당 차원 내에서 약 8%만이 데이터로 모여있기에, 이를 추론하기 위한 모델링을 진행하기는 어려울 것입니다. 92%가 빈 공간이기에, 턱없이 부족한 데이터라는 거죠. 더 나아가 C처럼, 3차원으로 확장해 보겠습니다. 3차원 공간에 8개의 데이터가 놓여있다면, 약 0.8%의 데이터만이 확보된 것입니다. 이를 추론하기 위한 모델링은 불가능할 것입니다. 즉, 차원이 늘어날수록 해당 데이터의 분포를 모델링하기 위해서는 기하급수적인 데이터를 더 필요로 하게 되는 것입니다. 이를 차원의 저주라고 하죠. 이러한 관점에서 저차원의 Manifold로 데이터의 영역을 찾아낼 수 있다면, 고차원에서 분석하기보다 훨씬 더 수월할 수 있겠습니다.
2) 데이터의 특징을 추출할 수 있다.
우리가 무인도에 딱 2개만 가지고 갈 수 있다고 한다면, 우리 인생에서 가장 중요한것은 무엇인지 깊게 고민해 볼 것입니다. 여러 우선순위를 따져 가며 뺄 건 빼고 가장 중요한 2개를 선택해 가져갈 테죠. 하지만, 100개를 가져갈 수 있게 한다면, 우리는 중요한 것이 뭘까라는 깊은 고민을 제친 채 영양가 없는 것들만 이것저것 챙기게 될 수 있습니다. Autoencoder가 매니폴드를 하려는 관점도 비슷합니다. 이미지를 입력받았을 때, 해당 이미지에서 가장 중요한 feature들이 무엇인지 학습할 것이며, 그러한 것들만 압축하여 정보를 추출해 내는 역할을 하는 것이죠.
Encoder의 가장 큰 목표는 고차원 상에 있는 데이터를 저차원의 Manifold로 나타내려는 데에 있다.
Latent Vector
Latent Vector는 잠재벡터라는 뜻으로, 원본이미지로 부터 중요 feature들을 모아놓은 vector라 볼 수 있습니다. 그래서 이를 그냥 feature라 부르기도 하며, representation vector(표현벡터), code 등등 여러 이름으로 불리기도 합니다. 이러한 vector는 앞선 Encoder로부터 얻게 됩니다. Latent Vector의 차원은 hyper parameter로 모델 설계 시 정해줄 수 있는 요소입니다. 하지만, 각 차원의 축들이 무엇을 나타내는지는 모델이 학습되는 과정에서 자동으로 구성되게 됩니다. 이러한 요소를 학습 시 자동으로 얻어낼 수 있다 하여 Autoencoder라 불립니다. 아래의 예시를 통해 latent vector를 더 직관적으로 살펴보겠습니다.
위의 예시는 0~9 사이의 손글씨 데이터셋인 MNIST를 Encoder에 입력하여, 2차원의 latent vector로 나타낸 예시입니다. 기존 MNIST데이터는 28*28의 흑백 이미지로써 784차원으로 표현할 수 있는 데이터였습니다. 이를 2차원 공간으로 압축하여 나타낸 것이죠. 이렇게 압축하는 과정에서, 위에서 언급한 Manifold를 학습했을 것이고요. 해당 2차원 상에는 2개의 축이 있는데, 이러한 축들이 각각 무엇을 의미하는지는 모릅니다. 다만 확실한 건, 해당 데이터들을 가장 잘 표현해 낼 수 있는 중요 feature 들이라는 건 분명합니다. Latent Vector를 잘 살펴보면, 손글씨 0과 1은 전혀 다른 영역에 존재함을 볼 수 있습니다. Encoder가 학습한 Manifold상에서는 이 둘의 feature들이 전혀 다른 속성을 가지고 있다는 것이죠. 반면 9와 8은 서로의 영역이 다소 겹쳐있음을 볼 수 있습니다. 이처럼 Latent Vector는 고차원의 데이터를 저차원으로 나타낸 벡터이며, 해당 데이터의 주요 feature들을 가지고 있음을 알 수 있습니다.
Latent Vector는 고차원의 원본데이터를 저차원으로 압축한 Vector이며, 주요 feature들로 이루어져 있다.
Decoder
사실 Autoencoer의 주목적은 데이터를 잘 압축하는 것입니다. 앞서 Encoder와 Latent Vector가 이들을 잘 수행해주고 있죠. 그러면 Decoder는 무엇을 하느냐? Decoder는 Autoencoder 모델이 학습가능한 요소가 될 수 있도록 해줍니다. Autoencoder는 데이터와 라벨링의 쌍으로 지도학습(Supervised Learning)하는 게 불가능합니다. 고차원 공간 속에서 데이터를 잘 아우르는 Manifold를 우리가 라벨링으로 사전에 나타낼 수 없기 때문이죠. 다른 말로는, 해당 원본이미지에 대응하는 Latent Vector를 라벨링으로써 준비할 수 없다는 것입니다. Decoder는 압축된 정보인 Latent Vector를 입력받아, 다시 원본 데이터로 복원을 하는 역학을 하며, 아래와 같이 손실함수를 얻을 수 있도록 합니다.
일단 압축을 해보고, 이 압축정보를 토대로 다시 원본 데이터로 잘 복원해 낼 수 있다면, 이 압축은 성공적이다. 압축된 정보를 토대로 다시 복원해 봤는데 전혀 엉뚱한 데이터라면 이는 잘못 압축된 것이다. 이러한 기준을 토대로 학습을 진행하는 것이죠. 그래서 모델의 손실함수는 원본 이미지와 복원된 이미지와의 차이로 결정되며, reconstruction error라 합니다. 이는 마치 Unsupervised를 Supervised방식으로 해결한 것으로 볼 수 있으며, 입출력이 모두 자기 자신인 것으로 SelfSupervised Learning이라고도 부릅니다.
Decoder는 Encoder가 Manifold를 잘 학습할 수 있도록, 거들어주는 역할을 한다.
어디에 활용할 수 있는가?
Autoencoder가 고차원의 데이터에서 주요 feature들만을 잘 압축하고, 이를 잘 복원한다는 특성을 고려하면 아래와 같이 다양한 활용범위가 있을 수 있습니다.
- 노이즈가 섞인 이미지로부터 노이즈를 제거하여 좋은 화질로 복원할 수 있다.
- 이미지뿐 아니라, 노이즈가 썩인 음성 데이터의 잡음을 제거하여 좋은 음질로 복원할 수 있다.
- 데이터의 라벨링이 부족한 경우, 해당 데이터로 Autoencoder를 학습시켜 주요 feature들을 추출해 내는 encoder단을 가져와 Classification모델로써 활용할 수 있다.
- 정상인 데이터만을 잘 복원하는 Autoencoder를 구현하여, 이상치를 탐지하는 모델로 활용할 수 있다.
활용분야는 이뿐 아니라, 훨씬 더 많은 분야에 사용될 수 있습니다. 저는 Autoencoder를 활용하여 자동차 부품 불량을 검출하는 이상치탐지를 수행한 적이 있는데, 꽤나 결과가 좋았었습니다. AE가 아닌 VAE를 사용한 점이 다르긴 하지만, 이상치를 검출하는 과정은 비슷하여 AE의 활용 사례로 해당 프로젝트를 함께 공유하고자 합니다.
마치며
Autoencoder에는 데이터를 생성하는 Decoder부분이 있지만, 생성모델이라고는 부르지 않는 것 같습니다. 생성모델이라 함은 전혀 새로운, 하지만 있을법한 그러한 데이터를 생성해 내는데 목표가 있습니다. 하지만, Autoencoder는 생성된 데이터가 새롭다기보다는 Train 데이터에 있는 데이터만을 잘 생성한다는 것입니다. 이는 Autoencoder의 성능이 낮아서가 아닙니다. 애초에 Autoencoder의 목표는 데이터의 압축이었기 때문에 새로운 데이터를 생성하는 데에는 초점이 맞춰져있지 않았기 때문이죠. Autoencoder와 구조는 매우 유사하지만, 데이터의 생성에 초점이 맞춰져 있는 Variational Autoencoder라는 모델이 있습니다. 이름도 유사하고, 코드도 유사하고, 모델의 구조도 비슷하지만 전혀 다른 목적으로 탄생한 모델입니다. 다음 포스팅에서는 이러한 Variational Autoencoder에 대해서 알아보고자 합니다.
긴 글 읽어주셔서 감사합니다.
Reference
- 공돌이의 수학정리노트 - Autoencoder
https://angeloyeo.github.io/2020/10/10/autoencoder.html - 오토인코더의 모든것
https://youtu.be/o_peo6U7IRM - 오토인코더란 무엇인가?
https://pebpung.github.io/autoencoder/2021/09/11/Auto-Encoder-1.html - 딥러닝과 설계 - Autoencoder & AnomalyDetection
https://youtu.be/9mf4maQU7UY
'Tech > Generative AI' 카테고리의 다른 글
Rag : 나만의 LLM을 만들자 (0) | 2024.03.03 |
---|---|
GPTs, 나의 과거 프로젝트를 구현하다. (0) | 2024.01.21 |
[StableDiffusion] Virtual Try On : AI로 원하는 옷 입히기 (1) | 2024.01.07 |
[Stable Diffusion] ControlNet이란? ControlNet의 종류 (1) | 2023.09.16 |
확률 관점으로 바라보는 머신러닝 (1) | 2023.03.15 |