# 차원 축소

이전 장에서는 높은 차원에서 데이터를 표현하는 과정에서 희소성 문제가 많이 나타남을 확인했습니다. 따라서 같은 정보를 표현할 때는 더 낮은 차원을 사용하는 것이 중요합니다.

![3개의 요소를 갖는 원핫 벡터의 경우에는 그림과 같이 차원 축소가 가능할 것입니다.](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-LX4NCwvtTXyg_vzXhF0%2F-LX4NGyivUptZvZt23SM%2F06-02-01.png?generation=1548425975683905\&alt=media)

이번 장에서는 더 작은 차원으로 효율적으로 정보를 표현하는 차원 축소의 이유와 방법에 관해 다루어보겠습니다.

## 주성분 분석

대표적인 차원 축소 방법으로는 주성분 분석principal component analysis(PCA)이 있습니다.

![3차원에서 2차원, 다시 1차원으로 PCA를 수행하는 예](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-Le1hTOPsJ2u5XGwomq6%2F-LX4NGykMgD3FROp7sT7%2F06-02-02.png?generation=1556971129099767\&alt=media)

이와 같이 고차원high-dimension의 데이터를 더 낮은 차원으로 표현할 수 있습니다. 주로 특잇값 분해singular value decomposition(SVD)를 통해 주성분을 분석할 수 있습니다. 이때 축소를 위한 주성분은 다음과 같은 조건을 만족합니다.

![주성분의 조건](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-Le1hTOPsJ2u5XGwomq6%2F-LX4NGymX0pjKL3VxPJa%2F06-02-03.png?generation=1556971128623880\&alt=media)

고차원에서 주어진 데이터들을 임의의 주성분 고차원 평면(초평면)hyperplane에 투사했을 때 투사점들 사이가 서로 최대한 멀어져야 합니다. 즉, 투사점들의 분산이 최대가 되도록 합니다. 또한, 고차원 평면으로 투사할 때 원래 벡터와 고차원 평면상의 투사된 거리가 최소가 되어야 합니다.

주성분 분석을 통해 고차원의 데이터를 더 낮은 차원으로 효과적으로 압축할 수 있습니다. 하지만 앞에서 언급했듯이 실제 데이터(점)의 위치와 고차원 평면에 투사된 점의 거리가 생길 수 밖에 없습니다. 이는 곧 정보의 손실을 의미합니다. 특히 주성분은 직선 또는 평면이므로, 이러한 손실은 불가피하게 나타납니다. 이 과정에서 너무 많은 정보가 손실된다면 효율적으로 정보를 학습하거나 복구할 수 없습니다. 따라서 높은 차원에 표현된 정보를 지나치게 낮은 차원으로 축소하여 표현하기는 어렵습니다. 특히 데이터가 비선형적으로 구성될수록 더욱 어려워집니다.

## 매니폴드 가설

이때 하나의 가설을 통해 차원 축소에 더 효율적으로 접근해볼 수 있습니다. 높은 차원에 존재하는 데이터들의 경우, 실제로는 해당 데이터들을 아우르는 낮은 차원의 다양체manifold 역시 존재한다는 매니폴드 가설manifold hypothesis입니다.

![3차원 공간에 기묘한 모양으로 분포한 샘플들이 2차원 매니폴드에 속하는 모습](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-LX4NCwvtTXyg_vzXhF0%2F-LX4NGyoT9uQKMpES3e7%2F06-02-04.png?generation=1548425975068255\&alt=media)

이와 같이 3차원 공간에 분포한 데이터를 아우르는 소용돌이 모양의 구부려진 2차원 매니폴드가 존재할 수도 있습니다. 이런 매니폴드를 찾아 2차원 평면에 데이터 포인트들을 맵핑할 수 있겠지요. 그러한 매니폴드를 찾을 수 있다면 앞서 살펴본 주성분 분석처럼 데이터를 고차원 평면에 선형적으로 투사하며 생긴 손실을 최소화할 수 있을 것입니다.

![3차원 공간상의 2차원 매니폴드를 2차원 공간에서 표현했을 때 각 점 사이의 최단 경로. 공간에 따라 최단 경로가 바뀌는 것을 볼 수 있습니다.](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-LX4NCwvtTXyg_vzXhF0%2F-LX4NGyqIODsdqDXE9kz%2F06-02-05.png?generation=1548425973339153\&alt=media)

매니폴드 가설에 따르면 또 하나의 흥미로운 특징이 있습니다. 앞서 그림에서 볼 수 있듯이, 고차원상에서 가까운 거리에 있던 데이터 포인트들일지라도, 매니폴드를 보다 저차원 공간으로 맵핑하면 오히려 거리가 멀어질 수 있다는 것입니다. 그리고 저차원의 공간상에서 가까운 점끼리는 실제로도 비슷한 특징feature을 갖는다는 것입니다. 즉, 저차원의 각 공간의 차원축은 고차원에서 비선형적으로 표현될 것이며, 데이터의 특징을 각각 표현하게 될 것입니다.

예를 들어 다음 그림과 같이 MNIST 데이터를 2차원의 숨겨진 저차원low-dimensional latent space에 표현한다고 가정합니다. 빨간색으로 표시된 각 샘플은 2차원 공간에서는 사람이 인지하는 특징과 비슷한 특징을 갖는 위치와 관계에 있겠지만, 원래의 데이터 차원인 784차원의 고차원 공간에서는 전혀 다른 거리와 관계를 지닐 것입니다.

![MNIST 데이터를 2차원 공간에 표현했을 때 두 샘플의 위치](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-LX4NCwvtTXyg_vzXhF0%2F-LX4NGysl1SrE9-9mkXo%2F06-02-06.png?generation=1548425977192105\&alt=media)

## 딥러닝이 잘 동작한 이유

아마도 딥러닝이 훌륭한 성능을 내는 이유를 여기서 찾을 수 있을 것입니다. 대부분의 경우 딥러닝이 문제를 풀기 위해 차원 축소를 수행하는 과정은, 데이터가 존재하는 고차원상에서 매니폴드를 찾는 과정입니다. 주성분 분석(PCA)과 같이 다른 선형적인 방식에 비해 딥러닝은 비선형적인 방식으로 차원 축소를 수행하며, 그 과정에서 해당 문제를 가장 잘 해결하기 위한 매니폴드를 자연스럽게 찾아냅니다. 이것이 바로 딥러닝이 그토록 성공적으로 동작하는 이유일 것으로 예상합니다.

> 아직 증명되지 않은 가설이기 때문에 확언할 수는 없습니다. 하지만 대부분의 연구가 실제 이 가설에 기반하여 이루어지고 있으며 성과를 내고 있습니다.

![3차원 데이터를 입력으로 받아 1차원의 이진 분류를 수행할 때](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-LX4NCwvtTXyg_vzXhF0%2F-LX4NGyu_w84SAgyNO-u%2F06-02-07.png?generation=1548425972624539\&alt=media)

## 오토인코더

자연어 처리에서 단어를 표현하기 위한 차원 축소를 본격적으로 다루기에 앞서, 오토인코더autoencoder에 관해 이야기해보겠습니다. 오토인코더는 다음과 같은 구조를 가진 딥러닝 모델 입니다.

![전형적인 형태의 오토인코더](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-Le1hTOPsJ2u5XGwomq6%2F-LX4NGywCmO21biZOes9%2F06-02-08.png?generation=1556971129247392\&alt=media)

고차원의 샘플 벡터를 입력으로 받아 매니폴드를 찾고, 저차원으로 축소하는 인코더를 거쳐 병목bottle-neck 구간에서의 숨겨진hidden 벡터로 표현합니다. 그리고 디코더는 저차원의 벡터를 받아, 다시 원래 입력 샘플이 존재하던 고차원으로 데이터를 복원하는 작업을 수행합니다. 복원된 데이터는 고차원 상의 매니폴드 위에 위치하게 될 겁니다.

이때 고차원의 벡터를 저차원으로 압축한 후 다시 복원하는 과정에서, 오토인코더는 병목의 차원이 매우 낮기 때문에 복원에 필요한 정보만 남기고 필요 없는 정보는 버려야 합니다. 좁은 병목구간을 통과하기 위해서는 복원에 필요 없는 정보부터 버려질 것입니다. 따라서 이 구조의 모델을 훈련할 때는 복원된 데이터와 실제 입력 데이터 사이의 차이를 최소화하도록 손실 함수를 구성합니다.

> 이때 정보량이 낮은 정보부터 버려질 것입니다.

![고차원(3차원)에서 저차원(2차원)으로 투사할 때의 정보 손실(복원 오류)](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-LX4NCwvtTXyg_vzXhF0%2F-LX4NGz-7n1h2sTcPs-x%2F06-02-10.png?generation=1548425974399660\&alt=media)

하지만 고차원에서 저차원으로 데이터를 표현하면서 손실이 따를 수 있으므로, 훈련이 완료된 모델일지라도 복원된 데이터는 실제 입력과 차이가 있을 수 있습니다.

오토인코더를 사용하여 이전 장에서 TF-IDF 등을 활용해 계산한 희소 단어 특징 벡터를 입력으로 넣고 같은 출력값을 갖도록 훈련했을 때, 오토인코더의 병목 계층 결괏값을 덴스 단어 임베딩 벡터로 사용할 수 있을 것입니다.
