Skip to main content
Summary

이름도, 문장도, 상품도 결국 숫자가 되어야 한다

앞에서 우리는 데이터를 점처럼 바라보는 연습을 했다. K-means에서는 비슷한 점끼리 모였고, PCA에서는 복잡한 데이터를 더 낮은 차원의 평면에 펼쳐 보았으며, 이상치 탐지에서는 무리에서 멀리 떨어진 점을 찾아냈다. 이 모든 이야기의 바닥에는 하나의 공통된 생각이 깔려 있었다.

데이터는 숫자로 표현될 때 공간 위에 놓을 수 있다.

그런데 현실의 데이터는 처음부터 숫자처럼 생기지 않은 경우가 많다. 이메일 제목은 문장이다. 쇼핑몰 상품명은 텍스트다. 사용자의 직업은 범주다. 영화 제목, 음식 이름, 브랜드명, 검색어, 댓글, 해시태그도 모두 숫자가 아니다. 사람은 "러닝화"와 "운동화"가 비슷하다는 느낌을 바로 이해하지만, 모델은 이 단어들을 그대로 읽고 의미를 느끼지 못한다.

머신러닝 모델은 기본적으로 계산하는 기계다. 계산을 하려면 입력이 숫자여야 한다. 그래서 우리는 현실의 대상을 모델이 다룰 수 있는 숫자 표현으로 바꿔야 한다. 이때 등장하는 중요한 개념이 바로 임베딩이다.

임베딩은 머신러닝에서 딥러닝과 LLM으로 넘어갈 때 반드시 만나게 되는 연결 고리다. 나중에 자연어 처리, 추천 시스템, 검색 엔진, 이미지 검색, 대규모 언어 모델을 이해하려면 "대상을 벡터 공간에 놓는다"는 감각이 필요하다. 이번 장에서는 그 첫걸음을 뗀다.

임베딩을 이해하기 위한 준비

모델은 단어를 이해하지 않는다

우리가 스팸 메일 분류기를 만든다고 생각해 보자. 이메일 제목에 이런 문장이 들어 있다.

"지금 가입하면 무료 쿠폰을 드립니다"

사람은 이 문장을 읽고 대략적인 의미를 파악한다. "무료", "쿠폰", "가입" 같은 단어를 보고 광고성 메일일 가능성을 떠올린다. 하지만 모델은 문장을 사람처럼 읽지 않는다. 모델 입장에서 "무료"라는 글자는 계산할 수 있는 숫자가 아니다.

모델이 할 수 있는 일은 이런 것이다.

입력값을 숫자로 받는다. 그 숫자들에 가중치를 곱한다. 여러 계산을 거쳐 예측값을 만든다. 예측값이 실제 정답과 얼마나 다른지 보고, 오차를 줄이는 방향으로 가중치를 고친다.

이 흐름은 우리가 앞에서 반복해서 본 머신러닝의 기본 구조와 같다.

데이터를 준비한다 → 특징을 만든다 → 모델이 예측한다 → 실제값과 비교한다 → 오차를 줄인다 → 새로운 데이터에 적용한다.

여기서 텍스트나 상품명 같은 비숫자 데이터를 다룰 때 가장 먼저 부딪히는 문제는 "특징을 어떻게 숫자로 만들 것인가?"이다. 단어, 사용자, 상품, 영화, 음악, 장소 같은 대상을 숫자로 표현해야 비로소 모델은 계산을 시작할 수 있다.

원-핫 인코딩: 가장 단순한 숫자 변환

범주형 데이터를 숫자로 바꾸는 가장 단순한 방법은 원-핫 인코딩이다. 원-핫 인코딩은 여러 범주 중 해당하는 하나만 1로 표시하고, 나머지는 0으로 표시하는 방식이다.

예를 들어 과일 종류가 세 가지뿐이라고 해 보자.

과일사과바나나포도
사과100
바나나010
포도001

"사과"는 [1, 0, 0], "바나나"는 [0, 1, 0], "포도"는 [0, 0, 1]이 된다. 이제 모델은 적어도 이 값을 숫자로 받을 수 있다. 글자 그대로의 "사과" 대신, 숫자로 된 벡터가 입력으로 들어가는 것이다.

원-핫 인코딩은 단순하고 직관적이다. 또한 "사과=1, 바나나=2, 포도=3"처럼 숫자를 붙였을 때 생길 수 있는 오해를 피할 수 있다. 만약 바나나를 2, 포도를 3이라고 적으면 모델은 포도가 바나나보다 더 크거나, 사과와 포도 사이에 어떤 순서가 있다고 착각할 수 있다. 원-핫 인코딩은 그런 가짜 순서를 만들지 않는다.

하지만 원-핫 인코딩에는 곧 한계가 드러난다. 범주가 많아질수록 벡터가 너무 길어진다. 쇼핑몰에 상품이 100만 개 있다면 상품 하나를 표현하기 위해 길이 100만짜리 벡터가 필요하다. 그중 실제로 1인 값은 하나뿐이고 나머지는 전부 0이다. 마치 거대한 운동장에 사람 한 명만 서 있는 것처럼 비어 있는 공간이 너무 많다.

더 큰 문제는 비슷함을 표현하기 어렵다는 점이다.

원-핫 벡터는 서로를 너무 모른다

다음 세 단어를 생각해 보자.

단어원-핫 벡터 예시
고양이[1, 0, 0]
강아지[0, 1, 0]
자동차[0, 0, 1]

사람에게 "고양이와 강아지 중 무엇이 더 비슷한가요?"라고 물으면 대부분 고양이와 강아지를 묶을 것이다. 둘 다 동물이고, 반려동물로 함께 떠올리기도 쉽다. 자동차는 성격이 다르다.

그런데 원-핫 인코딩으로 표현하면 상황이 이상해진다. 고양이 [1, 0, 0]와 강아지 [0, 1, 0]는 서로 완전히 다른 위치에 있다. 고양이 [1, 0, 0]와 자동차 [0, 0, 1]도 마찬가지로 완전히 다르다. 원-핫 벡터는 "고양이와 강아지가 자동차보다 가깝다"는 감각을 담지 못한다.

이것은 추천 시스템에서도 문제가 된다. 사용자가 "러닝화"를 자주 봤다면 "운동화", "러닝 양말", "조깅복"을 추천하는 것이 자연스럽다. 하지만 원-핫 인코딩만으로는 러닝화와 운동화가 가까운지, 러닝화와 냉장고가 먼지 알기 어렵다. 각각은 그저 서로 다른 번호표를 단 대상일 뿐이다.

우리가 원하는 표현은 조금 다르다. 단지 대상을 구분하는 데서 끝나는 것이 아니라, 비슷한 대상은 가까이 놓고 다른 대상은 멀리 놓는 표현이다. 바로 여기서 임베딩이 등장한다.

임베딩: 의미를 품은 숫자 벡터

임베딩은 단어, 사용자, 상품 같은 대상을 숫자 벡터로 표현하는 방법이다. 원-핫 인코딩처럼 길고 듬성듬성한 벡터가 아니라, 보통은 더 짧고 조밀한 벡터를 사용한다.

예를 들어 세 단어를 다음처럼 표현한다고 해 보자.

단어임베딩 벡터 예시
고양이[0.82, 0.15, 0.71]
강아지[0.79, 0.18, 0.68]
자동차[0.12, 0.91, 0.20]

이 숫자들은 단순한 예시지만, 중요한 느낌을 보여 준다. 고양이와 강아지의 벡터는 서로 비슷하게 생겼다. 반면 자동차의 벡터는 두 동물과 꽤 다르게 생겼다. 이렇게 표현하면 모델은 숫자 계산을 통해 "고양이와 강아지는 가깝고, 자동차는 상대적으로 멀다"는 관계를 다룰 수 있다.

임베딩의 핵심은 이것이다.

비슷한 대상이 가까운 벡터가 되도록 표현을 학습한다.

여기서 "가깝다"는 말은 실제 지도 위의 거리를 뜻하지 않는다. 벡터 공간에서의 거리를 뜻한다. 두 벡터의 숫자 패턴이 비슷하면 가깝다고 보고, 많이 다르면 멀다고 본다. 앞에서 군집화와 PCA를 공부할 때 데이터가 공간 위의 점처럼 놓인다고 했던 것을 떠올려 보자. 임베딩도 같은 감각으로 이해할 수 있다. 단지 이번에는 숫자로 태어난 데이터가 아니라, 원래는 단어였거나 상품이었거나 사용자였던 대상을 숫자 공간 위에 올려놓는다는 점이 다르다.

임베딩의 각 숫자는 무엇을 의미할까

처음 임베딩을 보면 이런 질문이 떠오를 수 있다.

"고양이의 임베딩이 [0.82, 0.15, 0.71]이라면, 0.82는 정확히 무엇을 뜻하나요?"

좋은 질문이다. 하지만 대부분의 임베딩에서 각 숫자의 의미를 사람이 명확히 이름 붙이기는 어렵다. 첫 번째 숫자가 "귀여움", 두 번째 숫자가 "동물성", 세 번째 숫자가 "속도"처럼 깔끔하게 대응되는 경우는 드물다. 임베딩의 차원들은 모델이 학습 과정에서 만들어 낸 내부 좌표에 가깝다.

우리가 지하철 노선도를 처음 볼 때를 떠올려 보자. 어떤 역의 좌표가 (3.2, 7.8)이라고 해서 3.2가 "맛집 정도"를 뜻하고 7.8이 "출퇴근 혼잡도"를 뜻하는 것은 아니다. 중요한 것은 그 좌표를 통해 역과 역 사이의 상대적 위치를 알 수 있다는 점이다. A역과 B역이 가까운지, C역은 어느 방향으로 떨어져 있는지 볼 수 있다.

임베딩도 비슷하다. 각 숫자의 개별 의미보다 더 중요한 것은 벡터들 사이의 관계다. 어떤 단어들이 가까이 모이는가, 어떤 상품들이 비슷한 방향에 놓이는가, 어떤 사용자들이 비슷한 취향의 공간에 있는가가 핵심이다.

임베딩은 어떻게 비슷함을 배울까

임베딩은 사람이 손으로 하나하나 정하는 표가 아니다. 보통은 데이터에서 학습된다. 그렇다면 모델은 무엇을 보고 "비슷하다"고 배울까?

상황에 따라 기준은 달라진다. 자연어 처리에서는 함께 자주 등장하는 단어들이 비슷한 위치를 갖도록 학습할 수 있다. 예를 들어 "커피"라는 단어 주변에 "카페", "원두", "라떼", "아메리카노"가 자주 등장한다면, 모델은 이런 단어들이 서로 관련 있다는 단서를 얻는다.

추천 시스템에서는 사용자의 행동이 단서가 된다. 같은 사용자가 자주 함께 본 상품, 함께 구매한 상품, 비슷한 사용자들이 좋아한 상품은 가까운 벡터가 되도록 학습할 수 있다. 누군가가 러닝화를 본 뒤 러닝 양말과 스포츠 물병을 자주 함께 본다면, 모델은 이 상품들이 같은 취향의 공간에 놓일 가능성이 높다고 판단한다.

사용자도 임베딩할 수 있다. 어떤 사용자는 캠핑용품, 등산화, 휴대용 조명을 자주 본다. 다른 사용자는 키보드, 모니터, 노트북 거치대를 자주 본다. 모델은 행동 패턴을 바탕으로 사용자를 벡터 공간에 배치할 수 있다. 그러면 비슷한 취향을 가진 사용자들이 서로 가까워지고, 각 사용자에게 어울릴 만한 상품을 찾기 쉬워진다.

정리하면 임베딩은 대상을 숫자로 바꾸되, 아무 숫자나 붙이는 것이 아니다. 데이터 속 관계를 반영하도록 숫자 표현을 조정한다. 그래서 임베딩은 단순한 변환표가 아니라 학습된 표현이다.

추천 시스템에서 임베딩이 강력한 이유

추천 시스템은 임베딩을 이해하기 좋은 예시다. 쇼핑몰에 사용자와 상품이 있다고 해 보자. 사용자는 상품을 클릭하고, 장바구니에 담고, 구매하고, 별점을 남긴다. 이 모든 행동은 "이 사용자와 이 상품 사이에 어떤 관계가 있었다"는 흔적이다.

모델은 이 흔적을 바탕으로 사용자와 상품을 같은 벡터 공간에 배치할 수 있다. 어떤 사용자의 벡터와 어떤 상품의 벡터가 가까우면, 그 사용자가 그 상품을 좋아할 가능성이 높다고 볼 수 있다. 반대로 멀면 관심이 낮을 수 있다.

예를 들어 한 사용자의 임베딩이 야외 활동 상품들과 가까운 위치에 놓여 있다고 하자. 그러면 아직 보지 않은 등산 스틱이나 캠핑 의자도 추천 후보가 될 수 있다. 이때 추천은 단순히 "이전에 본 상품과 이름이 비슷한 상품"을 보여 주는 것이 아니다. 사용자의 행동 패턴과 상품 사이의 관계를 벡터 공간에서 찾아내는 일에 가깝다.

이 관점은 나중에 추천 시스템을 맛볼 때 다시 중요해진다. 추천은 결국 "무엇과 무엇이 가까운가?"라는 질문으로 바꿔 생각할 수 있다. 사용자와 상품이 가까운가, 상품과 상품이 가까운가, 사용자와 사용자가 가까운가를 보는 것이다. 임베딩은 이 질문을 숫자 계산으로 바꿔 주는 도구다.

자연어 처리에서 임베딩이 중요한 이유

자연어 처리에서도 임베딩은 핵심이다. 문장을 모델에 넣으려면 먼저 단어 또는 토큰을 숫자로 바꿔야 한다. 여기서 토큰은 문장을 잘게 나눈 조각이라고 생각하면 된다. 어떤 경우에는 단어가 토큰이 되고, 어떤 경우에는 단어보다 작은 조각이 토큰이 된다.

예를 들어 "나는 커피를 마신다"라는 문장이 있다고 해 보자. 모델은 이 문장을 그대로 이해하지 않는다. 먼저 "나는", "커피를", "마신다" 같은 조각으로 나누고, 각 조각을 숫자 벡터로 바꾼다. 그다음 이 벡터들을 계산하면서 문장의 의미나 다음에 올 단어, 문장의 감정, 질문에 대한 답 등을 예측한다.

원-핫 인코딩만으로도 단어를 구분할 수는 있다. 하지만 단어가 수십만 개라면 벡터가 너무 커진다. 더구나 "왕"과 "여왕", "서울"과 "부산", "맛있다"와 "훌륭하다"처럼 의미상 가까운 관계를 표현하기 어렵다. 임베딩은 이런 단어들을 더 작은 차원의 벡터로 표현하면서, 사용 맥락이 비슷한 단어들이 가까이 놓이도록 만든다.

LLM도 이 감각에서 출발한다. 물론 실제 LLM은 훨씬 복잡한 구조와 거대한 학습 과정을 갖고 있지만, 첫 관문은 같다. 텍스트를 숫자 벡터로 바꿔야 한다. 단어 조각들이 임베딩이 되고, 모델은 그 벡터들을 바탕으로 다음 계산을 이어 간다. 그래서 임베딩은 전통적인 머신러닝과 딥러닝, 그리고 LLM을 잇는 다리라고 할 수 있다.

임베딩은 특징 엔지니어링의 확장이다

앞에서 우리는 특징이라는 말을 여러 번 사용했다. 집값 예측에서는 면적, 방 개수, 위치가 특징이 될 수 있었다. 타이타닉 생존 예측에서는 성별, 나이, 객실 등급이 특징이 될 수 있었다. 특징은 모델이 예측에 사용할 단서다.

임베딩도 넓게 보면 특징을 만드는 방법이다. 다만 사람이 직접 "이 상품은 스포츠 카테고리, 가격대는 중간, 브랜드는 A"처럼 특징을 설계하는 대신, 모델이 데이터 속 관계를 보고 유용한 숫자 표현을 학습한다는 점이 다르다.

예를 들어 상품명만 보고 추천하기는 어렵다. 하지만 상품 임베딩을 잘 학습하면 상품명, 카테고리, 클릭 기록, 구매 기록, 함께 본 상품 같은 다양한 신호가 벡터 안에 압축될 수 있다. 사용자 임베딩도 마찬가지다. 나이와 성별 같은 명시적인 정보뿐 아니라 실제 행동 패턴이 반영될 수 있다.

물론 임베딩이 마법은 아니다. 데이터가 부실하면 임베딩도 부실해진다. 많은 사용자가 거의 보지 않은 상품은 좋은 벡터를 배우기 어렵다. 잘못된 행동 데이터가 쌓이면 이상한 추천이 만들어질 수도 있다. 임베딩은 데이터의 패턴을 반영하는 도구이지, 데이터에 없는 지혜를 저절로 만들어 내는 존재는 아니다.

가까운 벡터가 항상 좋은 의미는 아니다

임베딩을 배울 때 주의할 점도 있다. 벡터 공간에서 가까운 대상이 항상 사람이 기대하는 의미로 비슷하다고 단정할 수는 없다. 모델은 우리가 원하는 기준이 아니라, 학습 데이터가 보여 준 기준에 따라 가까움을 배운다.

예를 들어 쇼핑몰에서 두 상품이 자주 함께 클릭되었다고 해서 반드시 같은 종류의 상품은 아닐 수 있다. 스마트폰과 스마트폰 케이스는 함께 등장하지만 같은 물건은 아니다. 노트북과 노트북 파우치도 자주 함께 구매되지만 기능은 다르다. 이런 경우 임베딩 공간에서 가까운 것은 "같은 종류"라기보다 "함께 관심을 받는 관계"일 수 있다.

자연어에서도 마찬가지다. 어떤 단어들은 의미가 비슷해서 가까워질 수 있고, 어떤 단어들은 같은 문맥에 자주 등장해서 가까워질 수 있다. "의사"와 "병원"은 같은 뜻은 아니지만 자주 함께 나타난다. 따라서 임베딩을 해석할 때는 "무엇을 기준으로 학습했는가?"를 함께 봐야 한다.

이 점은 앞으로 좋은 모델을 만드는 법을 배울 때 다시 중요해진다. 모델은 데이터에서 패턴을 배운다. 그런데 데이터의 패턴이 항상 우리가 원하는 진실과 일치하지는 않는다. 좋은 머신러닝은 단순히 모델을 학습시키는 것에서 끝나지 않고, 모델이 무엇을 배웠는지 의심하고 확인하는 과정까지 포함한다.

이제 우리는 더 깊은 곳으로 갈 준비가 되었다

이번 장에서 우리는 임베딩의 문 앞까지 왔다. 핵심은 어렵지 않다. 모델은 텍스트나 상품명을 직접 이해하지 않는다. 그래서 우리는 대상을 숫자 벡터로 바꿔야 한다. 원-핫 인코딩은 가장 단순한 방법이지만, 비슷함을 표현하기 어렵다. 임베딩은 비슷한 대상이 가까운 벡터가 되도록 학습된 표현이다.

이 감각 하나만 붙잡아도 앞으로 만날 많은 기술이 덜 낯설어진다. 추천 시스템은 사용자와 상품을 벡터 공간에 놓고 가까운 것을 찾는 문제로 볼 수 있다. 자연어 처리는 단어와 문장을 벡터로 바꾼 뒤 의미 관계를 계산하는 문제로 볼 수 있다. LLM 역시 텍스트를 임베딩으로 바꾸고, 그 벡터들을 깊은 신경망 안에서 계속 변형해 가며 답을 만든다.

우리는 지금 비지도학습의 마지막 구간을 지나고 있다. 군집화는 비슷한 점을 모았고, PCA는 복잡한 점들을 보기 쉽게 펼쳤고, 이상치 탐지는 무리에서 벗어난 점을 찾았다. 임베딩은 여기에 한 걸음 더해, 애초에 숫자가 아니던 대상을 의미 있는 점으로 바꾸는 방법을 알려 준다.

다음부터는 좋은 모델을 만드는 법으로 넘어간다. 지금까지 우리는 모델이 데이터를 보고 패턴을 배운다는 감각을 쌓았다. 이제 중요한 질문이 남아 있다.

모델이 학습 데이터에서는 잘 맞히는데, 처음 보는 데이터에서는 엉망이라면 어떻게 해야 할까?

이 질문이 바로 과적합과 일반화의 세계로 우리를 데려간다.

책 목록

처음 만나는 머신러닝: 데이터가 스스로 규칙을 배우는 법

전체 목차 보기

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

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

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

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

참여하기