Skip to main content

차원 축소와 임베딩

Views 60약 11분생성형 AI 활용

데이터를 다루다 보면 이상한 순간이 찾아옵니다. 열은 수십 개, 수백 개, 많게는 수천 개인데, 정작 데이터는 잘 안 보입니다. 분명 정보는 많은데 패턴은 흐릿하고, 모델은 복잡해지고, 시각화는 거의 불가능해집니다. 이때 필요한 것이 차원 축소입니다. 이름만 들으면 어려워 보이지만, 사실 하는 일은 꽤 단순합니다. 복잡하게 흩어진 정보를 더 다루기 쉬운 좌표계로 다시 표현하는 것입니다.

그리고 이 이야기는 오늘날의 검색, 추천, LLM까지 자연스럽게 이어집니다. 단어, 문장, 상품, 사용자 같은 대상을 숫자 벡터로 바꾸는 임베딩도 결국은 "복잡한 대상을 계산 가능한 좌표로 바꾼다"는 점에서 같은 흐름 위에 서 있습니다. 보이지 않던 구조를 보이게 만들면, 탐색도 쉬워지고, 시각화도 쉬워지고, 비슷한 것을 찾는 일도 훨씬 쉬워집니다.

차원 축소와 임베딩

차원이 높아질수록 왜 감각이 무너질까

먼저 차원이 무엇인지부터 다시 잡고 가봅시다. 데이터의 한 열, 즉 하나의 특성을 하나의 축이라고 생각하면 됩니다. 키, 몸무게, 나이, 구매 횟수, 최근 방문일, 클릭 수, 관심 카테고리 점수 같은 것이 각각 하나의 차원입니다. 특성이 2개면 2차원 평면에 점으로 찍을 수 있고, 3개면 3차원 공간에 놓아볼 수 있습니다. 그런데 특성이 100개라면 어떨까요. 이제 머릿속에 그릴 수도 없고, 거리의 의미도 점점 낯설어집니다.

이 현상을 흔히 차원의 저주라고 부릅니다. 이름은 거창하지만 핵심은 이렇습니다. 차원이 높아질수록 데이터가 공간 속에서 너무 희박하게 퍼져, 우리가 저차원에서 믿고 있던 직관이 잘 통하지 않게 됩니다.

예를 들어 1차원 선분에서 점 몇 개를 찍으면 서로 꽤 가까워 보입니다. 2차원 평면에서도 군집이 제법 눈에 띕니다. 하지만 차원이 계속 늘어나면 모든 점이 멀어지고, 심지어 가장 가까운 점과 가장 먼 점의 차이도 생각보다 작아집니다. 다시 말해 "가깝다"는 말 자체가 애매해집니다. 최근접 이웃을 찾는 모델이나 거리 기반 알고리즘이 어려워지는 이유가 여기에 있습니다.

밀도에 대한 감각도 함께 무너집니다. 저차원에서는 어느 구역에 데이터가 빽빽하게 모여 있는지 금방 알 수 있지만, 고차원에서는 그 빽빽함을 확인하려면 훨씬 많은 데이터가 필요합니다. 상자를 채우는 문제로 생각하면 쉽습니다. 1차원 선분을 촘촘히 덮는 것은 어렵지 않지만, 10차원, 100차원 공간을 촘촘히 덮으려면 필요한 점의 수가 폭발적으로 늘어납니다. 그래서 고차원 데이터에서는 데이터가 충분한 것처럼 보여도, 실제로는 공간 전체를 거의 비어 있는 상태로 다루고 있을 때가 많습니다.

이 문제는 실무에서 꽤 자주 나타납니다. 텍스트를 단어 수천 개로 표현하면 차원이 매우 커지고, 사용자 행동 로그도 이벤트별 특성으로 펼치면 금방 고차원이 됩니다. 이미지 역시 픽셀 단위로 보면 엄청난 차원의 벡터입니다. 데이터는 많은데 구조를 읽기 어려운 이유가 여기에 있습니다.

차원 축소는 무엇을 하는가

차원 축소는 말 그대로 차원의 수를 줄이는 일입니다. 하지만 아무 열이나 버리는 것과는 다릅니다. 중요한 구조는 최대한 유지하면서, 표현을 더 간결하게 만드는 것이 핵심입니다.

이를 위해 보통 두 가지 질문을 던집니다.

  • 이 많은 특성 중 정말 중요한 방향은 무엇인가?

  • 데이터를 더 적은 축으로 다시 표현해도 핵심 패턴이 남는가?

  • 우리가 잃는 정보와 얻는 단순함의 균형은 어디인가?

예를 들어 학생 데이터를 생각해봅시다. 수학 점수, 과학 점수, 독해 점수, 문제 해결력, 과제 수행도 같은 열이 있다고 하겠습니다. 이 특성들은 제각각 따로 노는 것 같지만, 실제로는 어느 정도 함께 움직일 수 있습니다. 전반적인 학업 성취도라는 숨은 축이 있을 수도 있고, 이과형 역량과 언어형 역량처럼 몇 개의 큰 방향으로 정리될 수도 있습니다. 차원 축소는 이런 숨어 있는 큰 축을 찾아내어 데이터를 더 압축된 형태로 보여줍니다.

중요한 점은 차원 축소가 단지 "열 수를 줄인다"는 기술이 아니라는 것입니다. 더 정확히 말하면, 원래의 표현을 더 의미 있는 좌표계로 바꿔 보는 작업에 가깝습니다.

PCA는 정보를 가장 잘 담는 방향을 찾는다

차원 축소를 대표하는 가장 기본적인 방법이 PCA입니다. Principal Component Analysis, 우리말로 주성분 분석이라고 합니다. 처음 들으면 수식이 떠오르지만, 직관은 의외로 간단합니다. 데이터가 가장 넓게 퍼져 있는 방향을 먼저 찾고, 그다음 그와 직교하면서 또 많이 퍼진 방향을 찾는 방식입니다.

왜 퍼진 방향이 중요할까요. 데이터가 거의 변하지 않는 축은 정보를 많이 담고 있지 않을 가능성이 큽니다. 반대로 값이 크게 달라지는 방향은 관측값을 구분하는 데 더 유용한 경우가 많습니다. PCA는 바로 그 "변화가 큰 축"을 새 기준축으로 삼습니다.

예를 들어 집값 데이터에 평수와 방 수가 있다고 해봅시다. 이 둘은 완전히 독립적이지 않습니다. 보통 평수가 커지면 방 수도 늘어나는 경향이 있습니다. 원래 좌표계에서는 두 축으로 따로 보이지만, 실제 데이터의 퍼짐은 대각선 방향일 가능성이 큽니다. PCA는 이 대각선을 첫 번째 주성분으로 잡습니다. 그러면 "전반적으로 큰 집인가"라는 방향 하나만으로도 꽤 많은 정보를 설명할 수 있습니다. 두 번째 주성분은 첫 번째와 직각인 방향인데, 이는 "평수에 비해 방이 유난히 많은가 적은가" 같은 차이를 나타낼 수 있습니다.

이렇게 보면 PCA는 데이터가 퍼진 방향에 맞춰 좌표계를 살짝 돌리는 일처럼 보입니다. 그리고 필요하다면 가장 중요한 몇 축만 남기고 나머지를 버립니다. 100차원 데이터를 10차원으로 줄이더라도, 그 10개의 새 축이 전체 변동의 대부분을 설명한다면 꽤 효율적인 압축이 됩니다.

PCA에서 꼭 알아야 할 세 가지

PCA를 사용할 때는 세 가지를 기억하면 좋습니다.

첫째, PCA는 분산이 큰 방향을 찾습니다. 그런데 분산은 특성의 단위에 크게 영향을 받습니다. 예를 들어 연봉은 수천만 원 단위이고, 나이는 수십 단위라면 연봉 축이 훨씬 크게 흔들려 보일 수 있습니다. 그래서 PCA 전에는 보통 스케일을 맞추는 작업, 즉 표준화나 정규화를 먼저 합니다. 그렇지 않으면 중요한 구조가 아니라 단위가 큰 열이 분석을 지배할 수 있습니다.

둘째, PCA는 선형적인 방법입니다. 데이터가 직선이나 평면처럼 비교적 단순한 방향성으로 퍼져 있을 때는 잘 작동하지만, 구불구불한 곡선 구조나 복잡한 매니폴드 위에 놓인 데이터는 잘 펼쳐내지 못할 수 있습니다. 다시 말해, PCA는 기본기 좋고 해석하기 쉬운 도구이지만 만능 망치는 아닙니다.

셋째, 주성분은 원래 특성의 조합입니다. 따라서 해석이 완전히 직관적이진 않을 수 있습니다. "첫 번째 주성분이 무엇을 의미하나?"라는 질문에 바로 답하기 어려운 경우도 있습니다. 그래도 각 주성분이 어떤 열들의 조합으로 만들어졌는지 보면, 대략 어떤 성격의 축인지 짐작할 수 있습니다.

몇 차원까지 줄여야 할까

차원 축소를 시작하면 금방 이런 질문이 생깁니다. "그래서 몇 개만 남기면 되죠?" 정답은 목적에 따라 달라집니다.

모델을 가볍게 만들고 싶다면, 성능이 크게 떨어지지 않는 선에서 가능한 한 적은 차원을 택할 수 있습니다. 반대로 데이터를 충분히 보존하고 싶다면 설명 분산 비율을 확인하며 더 많은 주성분을 남길 수 있습니다. 설명 분산 비율은 쉽게 말해 "이 축들이 원래 데이터의 변동을 얼마나 많이 담고 있나"를 보여주는 값입니다.

가령 첫 5개의 주성분이 전체 정보의 85%를 설명하고, 10개를 쓰면 93%를 설명한다고 해봅시다. 이때 5개로도 충분할지, 10개가 필요한지는 실제 과제에 따라 다릅니다. 분류 성능이 중요하다면 둘 다 돌려 보고 비교해야 하고, 시각화가 목적이라면 결국 2차원이나 3차원으로 내려와야 합니다.

중요한 것은 "더 적게 줄였으니 더 좋다"가 아니라는 점입니다. 너무 과감하게 줄이면 보기엔 깔끔해도 중요한 신호를 잃어버릴 수 있습니다.

시각화를 위한 차원 축소와 입력 압축은 다르다

차원 축소를 배울 때 가장 자주 생기는 오해 중 하나는, 예쁘게 시각화된 결과가 곧 좋은 입력 표현이라는 생각입니다. 하지만 이 둘은 목적이 다릅니다.

시각화를 위한 차원 축소는 사람이 보기 쉽게 만드는 것이 우선입니다. 사람이 한눈에 볼 수 있는 공간은 사실상 2차원이나 3차원뿐입니다. 그래서 복잡한 데이터를 억지로라도 눈앞에 펼쳐 보이게 만드는 데 초점을 둡니다. 이때는 군집이 분리되어 보이는지, 이상한 점이 튀어 보이는지, 전체 구조가 어떤지 파악하는 데 도움이 됩니다.

반면 모델 입력 압축을 위한 차원 축소는 예측 성능, 계산 비용, 노이즈 제거가 더 중요합니다. 사람이 보기 좋은 그림을 만드는 것보다, 모델이 더 안정적으로 학습할 수 있는 표현을 만드는 일이 목적입니다. 따라서 2차원까지 무리하게 줄일 필요가 없습니다. 100차원을 20차원으로 줄이는 것만으로도 충분히 유용할 수 있습니다.

같은 차원 축소라도 질문이 다르면 판단 기준도 달라집니다. 시각화에서는 "구조가 잘 보이는가"가 중요하고, 입력 압축에서는 "성능과 효율이 좋아지는가"가 중요합니다. 예쁜 그림이 반드시 좋은 특징 표현은 아닙니다. 반대로 눈에 띄는 그림이 없어도, 모델 성능은 더 좋아질 수 있습니다.

차원 축소는 언제 도움이 될까

차원 축소는 특히 다음과 같은 상황에서 힘을 발휘합니다.

  • 특성이 너무 많아 학습이 느리거나 과적합이 심할 때

  • 서로 비슷한 특성이 많아 정보가 중복될 때

  • 데이터를 탐색하거나 시각화해 구조를 먼저 이해하고 싶을 때

  • 거리 기반 방법이나 군집화에서 노이즈를 줄이고 싶을 때

예를 들어 텍스트 데이터를 단어 빈도로 표현하면 수천, 수만 차원이 되기 쉽습니다. 이때 차원 축소를 통해 노이즈를 줄이면 군집화나 시각화가 조금 더 안정적으로 보일 수 있습니다. 이미지도 픽셀 그대로 쓰기보다 압축된 표현을 사용하면 모델이 더 다루기 쉬워질 수 있습니다.

물론 항상 도움이 되는 것은 아닙니다. 트리 기반 모델은 원본 특성을 직접 잘 활용하는 경우가 많아서, 무조건 PCA를 적용한다고 성능이 좋아지는 것은 아닙니다. 그리고 중요한 해석 가능성이 사라질 수도 있습니다. "이 변수 때문에 이런 예측이 나왔다"를 설명해야 하는 문제라면, 차원 축소된 축이 오히려 설명을 어렵게 만들 수 있습니다.

임베딩은 대상을 벡터로 번역하는 기술이다

이제 임베딩으로 넘어가 봅시다. 차원 축소가 기존 데이터를 더 적은 축으로 바꾸는 기술이라면, 임베딩은 단어, 문장, 상품, 사용자처럼 원래 숫자가 아니었던 대상을 벡터로 표현하는 기술입니다.

핵심 아이디어는 아주 매력적입니다. 비슷한 의미를 가진 대상은 벡터 공간에서도 가깝게 놓이게 하자는 것입니다.

예를 들어 "사과"와 "배"는 과일이라는 점에서 가깝고, "사과"와 "노트북"은 멀어야 자연스럽습니다. 문장이라면 "환불하고 싶어요"와 "반품 요청합니다"가 가까워야 하고, 추천 시스템에서는 비슷한 취향의 사용자나 함께 소비되는 상품이 가까이 있어야 합니다.

이렇게 대상을 숫자 벡터로 바꾸면 좋은 점이 많습니다. 먼저 유사도를 계산할 수 있습니다. 두 단어가 얼마나 비슷한지, 두 문장이 같은 뜻인지, 어떤 사용자에게 어떤 상품이 가까운지 수학적으로 비교할 수 있습니다. 또 검색이 쉬워집니다. 검색어를 벡터로 바꾸고, 문서 벡터들과 가까운 것을 찾으면 의미 기반 검색이 가능합니다. 단순히 같은 단어가 들어 있는지를 보는 검색보다 더 똑똑한 결과를 만들 수 있습니다.

임베딩은 어떻게 만들어질까

임베딩은 보통 "함께 나타나는 패턴"이나 "행동의 맥락"을 이용해 학습됩니다. 단어 임베딩이라면 비슷한 문맥에서 자주 등장하는 단어들이 가까워지고, 사용자-상품 임베딩이라면 비슷한 상품을 소비하는 사용자들이 가까워집니다.

쉽게 말해 모델은 이런 질문을 받습니다. "이 주변에서 자주 함께 등장하는 대상은 무엇인가?" "이 사용자가 고른 것과 비슷한 맥락의 상품은 무엇인가?" "이 문장과 뜻이 비슷한 문장을 가깝게 두려면 어떤 숫자 표현이 좋을까?" 이 과정을 반복하면서 벡터가 조정됩니다.

중요한 것은 임베딩이 사람이 미리 의미를 적어 넣는 표가 아니라는 점입니다. 학습을 통해 자동으로 만들어진 좌표입니다. 그래서 벡터의 각 축 하나하나에 사람의 언어로 이름을 붙이기는 어렵지만, 전체 위치 관계는 매우 유용합니다. 의미가 공간 구조로 녹아 있다고 생각하면 됩니다.

단어 임베딩에서 문장 임베딩까지

처음에는 주로 단어를 벡터로 표현하는 일이 널리 알려졌습니다. 하지만 실무에서는 문장, 문서, 이미지, 사용자, 상품, 심지어 코드 조각까지도 임베딩합니다. 결국 "비슷한 것은 가깝게, 다른 것은 멀게" 만들 수 있다면 무엇이든 벡터화할 수 있습니다.

예를 들어 고객 문의 시스템을 떠올려 봅시다. "배송이 늦어요", "아직 상품이 안 왔어요", "언제 도착하나요?"는 표현은 달라도 비슷한 의도를 담고 있습니다. 키워드 기반 방식만 쓰면 단어가 조금만 달라도 놓칠 수 있지만, 문장 임베딩을 사용하면 이런 문의들을 가까운 위치에 둘 수 있습니다. 그 결과 문의 분류, 유사 사례 검색, 자동 응답 추천이 훨씬 자연스러워집니다.

추천 시스템도 마찬가지입니다. 사용자 임베딩과 상품 임베딩을 같은 공간에 두면, 어떤 사용자가 어떤 상품과 가까운지를 계산할 수 있습니다. 이것이 곧 개인화 추천의 중요한 기반이 됩니다.

차원 축소와 임베딩은 어떻게 다를까

둘 다 벡터 공간을 다루기 때문에 헷갈리기 쉽습니다. 하지만 출발점이 다릅니다.

차원 축소는 이미 있는 수치 데이터를 더 적은 차원의 표현으로 바꾸는 데 초점이 있습니다. 원본 특성이 먼저 있고, 이를 압축하거나 재표현하는 것입니다. 반면 임베딩은 원래부터 숫자 벡터가 아니었던 대상을 학습 가능한 벡터로 바꾸는 데 초점이 있습니다.

물론 경계가 완전히 딱 나뉘는 것은 아닙니다. 임베딩 벡터 자체도 너무 크면 다시 차원 축소해서 시각화할 수 있습니다. 예를 들어 수백 차원의 단어 임베딩을 2차원으로 줄여 단어들의 의미 관계를 그림으로 보여줄 수 있습니다. 이때는 임베딩이 원재료이고, 차원 축소는 그것을 사람이 볼 수 있게 정리하는 도구가 됩니다.

유사도는 왜 중요한가

임베딩이 강력한 이유는 결국 유사도를 계산할 수 있게 해주기 때문입니다. 머신러닝에서 유사도는 생각보다 많은 문제의 중심에 있습니다. 검색은 "질문과 비슷한 문서를 찾는 일"이고, 추천은 "취향이 비슷한 사용자나 아이템을 찾는 일"이며, 분류조차도 어느 의미 공간에서 비슷한 패턴끼리 모이게 만드는 문제로 볼 수 있습니다.

임베딩 공간에서 유사도는 보통 거리나 각도로 계산합니다. 이때 자주 쓰이는 것이 코사인 유사도입니다. 두 벡터가 얼마나 같은 방향을 보는지 측정하는 방식이라고 이해하면 충분합니다. 길이보다 방향에 집중하기 때문에 텍스트나 의미 표현에서 자주 사용됩니다.

쉽게 말해, 임베딩은 세상을 "비슷함을 계산할 수 있는 지도"로 바꿔 줍니다. 그리고 지도만 생기면 할 수 있는 일이 갑자기 많아집니다.

실무에서 임베딩이 쓰이는 장면

임베딩은 현대 머신러닝과 AI 제품의 숨은 공통 언어에 가깝습니다.

  • 검색: 질문과 문서를 벡터로 바꾸고 가까운 문서를 찾습니다.

  • 추천: 사용자와 상품의 벡터를 비교해 선호할 가능성이 높은 대상을 고릅니다.

  • 분류와 군집화: 비슷한 의미의 데이터가 자연스럽게 가까워지도록 표현합니다.

  • 중복 탐지: 거의 같은 문장, 비슷한 이미지, 유사한 상품을 찾아냅니다.

  • RAG 같은 LLM 응용: 문서를 임베딩해 두고, 질문과 가까운 문서를 검색해 답변에 활용합니다.

여기서 눈여겨볼 점이 있습니다. 임베딩은 최근 기술처럼 보이지만, 본질은 지금까지 배운 머신러닝 감각과 연결되어 있습니다. 좋은 표현을 만들고, 비슷한 것을 가까이 두고, 목적에 맞는 평가 기준을 세우는 일은 전통적인 머신러닝에서도 늘 중요했습니다. 달라진 것은 데이터의 종류와 규모, 그리고 응용 범위입니다.

차원 축소와 임베딩을 사용할 때의 함정

이 장의 개념들은 멋져 보이지만, 몇 가지 함정을 알고 써야 합니다.

첫째, 2차원 그림을 너무 믿으면 안 됩니다. 고차원 구조를 2차원으로 접어 넣는 과정에서 왜곡이 생길 수 있습니다. 그림에서 멀어 보인다고 실제 작업에서도 반드시 멀다는 뜻은 아닙니다. 반대로 겹쳐 보인다고 완전히 같은 것도 아닙니다. 시각화는 힌트를 주지만, 진실 전체를 보장하지는 않습니다.

둘째, 압축은 손실을 동반합니다. 차원을 줄인다는 것은 일부 정보를 버린다는 뜻입니다. 그 정보가 노이즈일 수도 있지만, 문제 해결에 꼭 필요한 신호일 수도 있습니다. 그래서 차원 축소는 항상 성능 검증과 함께 써야 합니다.

셋째, 임베딩은 학습 데이터의 편향을 그대로 품을 수 있습니다. 특정 집단이나 표현이 덜 등장하면 공간 구조도 그 현실을 반영합니다. 그래서 검색, 추천, 자동 분류에 임베딩을 사용할 때는 공정성, 대표성, 드리프트를 함께 점검해야 합니다.

넷째, 해석 가능성이 떨어질 수 있습니다. 원래의 명시적 특성보다, 학습된 벡터는 사람에게 설명하기 어렵습니다. 성능만 볼 것이 아니라, 운영과 설명의 필요도 같이 생각해야 합니다.

이 장에서 꼭 남겨야 할 감각

지금까지의 내용을 한 문장으로 묶으면 이렇습니다. 고차원 데이터는 있는 그대로 두면 너무 넓고 희박해서 다루기 어렵다. 그래서 우리는 중요한 구조를 남기면서 더 다루기 쉬운 공간으로 옮겨야 한다.

PCA는 그중 가장 기본적인 방법입니다. 데이터가 많이 퍼진 방향을 찾아, 정보를 가능한 한 많이 보존한 채 압축합니다. 시각화를 위해서든 모델 입력을 단순화하기 위해서든 유용한 출발점이 됩니다.

임베딩은 한 걸음 더 나아갑니다. 단어, 문장, 사용자, 상품처럼 복잡한 대상을 벡터로 바꾸어, 유사도를 계산할 수 있게 만듭니다. 이 덕분에 검색, 추천, 분류, LLM 응용이 훨씬 강력해집니다.

결국 차원 축소와 임베딩은 둘 다 "좋은 표현을 만드는 기술"입니다. 데이터가 스스로 말하게 만들기 위해, 우리는 보기 좋은 표를 넘어서 계산 가능한 공간을 설계합니다. 보이지 않던 구조가 보이기 시작하는 순간, 모델링은 한층 쉬워집니다.

다음 장에서는 이런 표현 위에서 한 발 더 나아가, 정상과 비정상을 가려내는 문제를 다룹니다. 패턴이 보이기 시작했다면, 이제 그 패턴에서 벗어난 신호를 찾아낼 차례입니다.

책 목록

머신러닝 설계 수업: 데이터를 모델로, 모델을 제품으로 바꾸는 실전 감각

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기