귀퉁이 서재

컴퓨터 비전 - 7. 오토인코더(AutoEncoder)와 매니폴드 학습(Manifold Learning) 본문

컴퓨터 비전

컴퓨터 비전 - 7. 오토인코더(AutoEncoder)와 매니폴드 학습(Manifold Learning)

Baek Kyun Shin 2023. 3. 12. 10:43

오토인코더(AutoEncoder)의 개념을 되도록 쉽게 알아보겠습니다. 각설하고 바로 시작해보죠.


1. 오토인코더의 개념

오토인코더는 입력(input)과 출력(output)이 동일한 값을 갖도록 만든 신경망 구조입니다. 오토인코더의 구조는 다음과 같습니다.

출처 : https://lilianweng.github.io/posts/2018-08-12-vae/

입력 x를 넣으면 출력 x'이 나옵니다. x와 x'은 (거의) 같은 값이 되게끔 하는 신경망 구조죠. 그런데 모양이 조금 특이합니다. 레이어가 점점 줄어들다가 다시 커지는 형태네요. 그래서 오토인코더를 Diabolo Network라고도 합니다. 아래와 같은 놀이기구(?)가 디아볼로라고 하네요. 작아졌다가 커지는 모양이 디아볼로와 같아서 이렇게도 부릅니다.

디아볼로

오토인코더의 가장 중요한 목적은 차원축소(Dimension Reduction)입니다. 어떻게 차원축소를 하는지 알아보려면 먼저 오토인코더의 구조를 살펴봐야 합니다. 오토인코더의 앞단을 인코더(Encoder), 뒷단을 디코더(Decoder)라고 부릅니다. 인코더의 역할은 입력 데이터(x)를 압축해 z를 만드는 일입니다. 압축된 z를 Latent Vector라고 부릅니다. Latent Vector에는 입력 데이터의 '중요한' 정보가 압축되어있죠. 사실 오토인코더의 목적은 여기서 끝입니다. 입력 데이터를 압축해 차원축소했기 때문이죠. 그런데 차원축소가 잘 됐는지 검증을 해야겠죠? 그래서 뒷단이 붙었습니다. 중요한 정보가 담긴 Latent Vector가 잘 압축된 건지 검증하려면, Latent Vector를 원복해봐야 합니다. 원복했을 때 입력 데이터와 같다면 잘 압축이 됐다고 판단할 수 있겠습니다. 그렇기 때문에 Latent Vector를 다시 디코딩하는 디코더가 붙은 겁니다. 인코더로 들어가는 입력 데이터 x와 디코더가 출력한 데이터 x'이 같아지도록 오토인코더 네트워크를 훈련(training)해야 합니다. 

다른 말로 하면 오토인코더는 표현학습(representation learning), 특징학습(feature learning)을 비지도 학습(unsupervised learning) 형태로 훈련하는 신경망입니다. 가운데 압축된 Latent Vector를 Hidden Representation 또는 Feature라고도 부르기 때문입니다. 오토인코더를 훈련하면 데이터에서 중요한 점, 특징점을 자동으로 찾아줍니다.  

여기서 잠깐!
데이터를 압축하는 앞단은 타깃값이 없기 때문에 비지도 학습(Unsupervised Learning)이지만, 전체 구조를 보면 사실 입력 데이터가 타깃값이므로 자가 지도 학습(Self-Supervised Learning)으로 볼 수 있습니다. 

다시 말하면 오토인코더에서 인코더는 차원축소하는 역할, 디코더는 생성 모델 역할을 합니다.

2. Manifold Learning

Manifold Learning이란?

지금까지 오토인코더의 개념을 알아봤습니다. 오토인코더의 목적도 차원축소라는 점도 배웠고요. 그런데 왜 차원축소를 해야 할까요? Manifold Learning을 이해하면 그 이유를 알 수 있습니다. 사실 차원축소는 Manifold Learning과 같은 의미입니다. 따라서 오토인코더의 궁극적인 목적은 Manifold Learning이라고도 할 수 있습니다.

그럼 Manifold Learning이란 무엇일까요? 말 그대로 Manifold를 학습하는 것입니다. 그럼 다시.. ㅎㅎ Manifold란 무엇일까요? 쉽게 말해 Manifold는 데이터가 있는 공간을 뜻합니다. Manifold를 학습한다는 말은 데이터가 위치한 공간을 찾아낸다는 이야기입니다. 다음 그림을 보시죠.

출처 : https://www.cs.cmu.edu/~efros/courses/AP06/presentations/ThompsonDimensionalityReduction.pdf

데이터가 3차원에 흩뿌려져 있습니다. 그런데 자세히 봅시다. 데이터를 아우르는 나선형의 평면이 있습니다. 이 나선형의 평면을 펼치면 2차원이 평면이 되겠죠? 즉, 우리는 3차원에 있는 데이터에서 Manifold를 찾아 2차원으로 만들 수 있습니다. 그럼 3차원의 데이터가 2차원의 데이터로 바뀌죠. 차원을 축소한 겁니다. 이런 평면을 찾는 방법이 Manifold Learning입니다.

매니폴드 학습 절차는 직관적으로는 간단합니다. ① 데이터를 고차원 공간에 뿌립니다. ② 해당 데이터를 오류 없이 잘 아우르는 sub-space(=manifold)를 구합니다. ③ 데이터를 Manifold에 투영(projection)하면 데이터 차원이 축소됩니다. 

Manifold Learning의 목적

차원축소의 목적, 다시 말해 Manifold Learning의 목적은 크게 4가지입니다.

첫 번째 목적은 데이터 압축입니다. 데이터를 압축한 뒤, 압축한 Latent Vector를 다시 디코딩할 때, 원본 데이터로 복원이 제대로 된다면 압축이 잘 된 것입니다.

두 번째 목적은 데이터 시각화입니다. 시각화를 하는 이유는 데이터에서 직관을 얻거나 해석을 쉽게 하기 위해서입니다. t-SNE를 활용하면 시각화가 쉽죠? t-SNE를 이용해 시각화하는 점과 목적이 비슷합니다.

세 번째 목적은 차원의 저주(Curse of Dimension) 피하기입니다. 데이터 차원이 늘어날수록 공간의 부피가 기하급수적으로 증가합니다. 같은 개수의 데이터 밀도는 급격히 희박해지죠. 차원이 늘수록 데이터의 분포분석 또는 모델추정에 필요한 데이터 개수가 기하급수적으로 늘어납니다. 다음 그림을 보시죠. 1차원에서 3차원으로 늘어날수록 전체 공간을 차지하는 데이터 밀도를 같게 유지하려면 데이터 개수는 굉장히 많아집니다. 데이터가 같다면 차원이 늘수록 데이터 밀도가 급격히 줄어든다는 말이죠. 그만큼 데이터 활용력은 떨어집니다. 그렇기 때문에 가능한 한 차원은 줄일수록 좋습니다.

출처 : http://videolectures.net/kdd2014_bengio_deep_learning/

Manifold Learning의 마지막 목적은 유용한 특징 추출입니다. Manifold를 찾았다는 점 자체가 데이터에서 유용한 특징을 찾았다는 말과 같습니다. 예를 들어, Manifold의 축을 따라가면 크기(size) 변화, 회전(rotation) 변화 등의 특징을 발견할 수 있기 때문입니다. Manifold를 구했을 뿐인데 중요한 피처가 추출된 겁니다. 

출처 : https://dmm613.wordpress.com/tag/machine-learning/

Manifold Learning의 실질적인 의미

지금까지는 이론적으로 알아봤습니다. 이제는 Manifold Learning이 실질적으로 무슨 의미인지 알아보죠. 다음 그림을 보시죠.

출처 : https://www.slideshare.net/NaverEngineering/ss-96581209

왼쪽은 고차원 공간에서 세 가지 데이터를 표시했습니다. A1, B, A2로요. 고차원 공간에서는 유클리드 거리상 B가 A2보다 A1에 가깝습니다. 그런데 Manifold에서는 다릅니다. 오른쪽 Manifold에서는 B가 A1보다 A2에 가깝습니다. 고차원에서는 차원의 저주 때문에 유의미한 거리 측정 방식을 찾기가 어렵습니다. 

또 다른 예를 보죠.

출처 : https://www.slideshare.net/NaverEngineering/ss-96581209

골프하는 사진입니다. 왼쪽과 오른쪽 사진의 중간값은 무엇일까요? 그냥 사진을 합쳐버리면 가운데 사진처럼 겹친 사진이 됩니다. 고차원상 두 데이터의 가운데 점을 구하니 그런 거죠. 이처럼 고차원상 두 데이터 간 중앙값은 의미 없습니다. 중앙값이 Manifold를 벗어나서 의미 없는 값이 된 겁니다. 정상적인 중앙값을 구하려면 Manifold 안에서 구해야 합니다. 그래야 다음과 같이 정상적인 중앙값 사진이 나옵니다.

출처 : https://www.slideshare.net/NaverEngineering/ss-96581209

차원을 줄여도 문제없는가?

지금까지 Manifold Learning의 개념과 목적을 알아봤습니다. 그런데 데이터 차원을 줄여도 문제가 없을까요? 네, 문제없습니다. Manifold Hypothesis(매니폴드 가정) 때문입니다. Manifold Hypothesis란 고차원상 데이터에서 이 데이터 집합을 포함하는 저차원의 Manifold(sub-space)가 있을 것이라는 가정입니다. 데이터는 고차원 공간에 골고루 분포되어 있지 않고, 특정한 곳에 몰려있을 것이라는 말입니다. 그리고 그 몰려있는 데이터를 아우르는 Manifold를 찾을 수 있다는 가정입니다. 이 Manifold를 벗어나는 순간 데이터 밀도가 급격히 낮아집니다. 

Manifold Hypothesis : Natural data in high dimensional spaces concentrates close to lower dimensional manifolds. Probability density decreases very rapidly when moving away from the supporting manifold.

3. PCA와 오토인코더의 차이점

우리는 PCA도 차원축소 방법이라는 점을 알고 있습니다(오토인코더를 공부할 정도라면 PCA도 알 거라고 가정합니다). 그러면 PCA와 오토인코더는 무엇이 다를까요? PCA는 선형 차원 축소 기법이고, 오토인코더는 비선형 차원 축소 기법입니다.

출처 : https://www.jeremyjordan.me/autoencoders/

아무래도 선형 차원 축소보다 비선형 차원 축소가 더 효과적이겠죠? 데이터를 더 효과적으로 아우르는 sub-space를 찾을 수 있기 때문이죠.

출처 : http://videolectures.net/deeplearning2015_vincent_autoencoders/

4. 손실 함수

오토 인코더의 손실 함수는 간단합니다. 아래 그림을 봅시다.

출처 : file:///Users/bisney/Downloads/deeplearning2015_vincent_autoencoders_01.pdf

reconstruction error라고도 하는데, L(x, r)입니다. x는 입력 데이터이고, r은 출력 데이터입니다. r = g(h(x))입니다. 곧, 입력 데이터를 인코딩한 뒤, 디코딩한 값이죠. 손실 함수 L(x, r)을 최소화하는 게 훈련 목표죠. 종합하면 입력 데이터와 출력 데이터 차이를 작게 만드는 게 목표입니다. 입력 데이터를 최대한 '잘' 압축하고, 압축된 데이터를 다시 제대로 복원해야 하죠.

5. Denoising 오토인코더

이번엔 조금 다른 오토인코더를 간단히 살펴보겠습니다. Denoising 오토인코더입니다. 

출처 : https://lilianweng.github.io/posts/2018-08-12-vae/

이름에서 추측하겠지만, 입력 데이터를 넣을 때 랜덤 노이즈(random noisze)를 함께 넣어서 학습하는 오토인코더입니다. 노이즈를 넣은 서로 다른 1,000개 입력이 있을 때, 인코딩된 Latent Vector는 1,000개가 모두 같아야 한다. 그렇게 훈련하면 노이즈가 없는 상태로 훈련된 오토인코더보다 성능이 좋습니다. 

이외에도 여러 오토인코더가 있습니다. 대표적으로 Variational 오토인코더(줄여서 VAE)가 있습니다. VAE는 오토인코더와 구조는 비슷하지만 목적이 다릅니다. 오토인코더의 목적은 Manifold Learning이라고 배웠죠? 오토인코더의 앞단이 중요합니다. 다만, 지도 학습을 하기 위해(압축이 잘 됐는지 검증하기 위해) 뒷단이 붙은 거죠. VAE는 오토인코더와 정반대입니다. 데이터를 만들어내는 게 목적입니다. 생성모델이라는 말입니다. 고로 뒷단이 중요하죠. 뒷단을 학습시키려다보니 앞단이 붙었는데 공교롭게 구조가 오토인코더와 같아진 겁니다. 오토인코더와 VAE는 출발점이 다르다는 점 유의하세요!

지금까지 오토인코더의 전반적인 사항은 간략히 알아봤습니다. 다음 게시글에서는 오토인코더를 코드로 구현해보겠습니다. 인코더로 압축한 이미지도 출력해 어떻게 생겼는지 살펴볼 겁니다.


참고 자료

Lilian Weng - "From Autoencoder to Beta-VAE"

Jeremy Jordan - "Introduction to autoencoders"

이활석 - "오토인코더의 모든 것"

Pascal Vincent - "On manifolds and autoencoders"

Comments