"사과"와 "바나나"는 비슷한 단어일까? 사람이라면 둘 다 과일이라는 것을 금방 떠올린다. 하지만 컴퓨터에게 "사과"는 EC82ACEA B3BC라는 바이트 나열이고, "바나나"는 EB B094EB8298EB8298라는 전혀 다른 바이트 나열일 뿐이다. 컴퓨터는 텍스트 자체로부터 의미를 읽어낼 수 없다.
그렇다면 텍스트의 의미를 컴퓨터가 다룰 수 있는 형태로 바꿀 방법은 없을까? 이 질문에 대한 답이 바로 임베딩(Embedding) 이다.
임베딩이란?
임베딩은 텍스트 데이터(단어, 문장, 문서)를 컴퓨터가 이해하고 처리할 수 있는 숫자 벡터로 변환하는 기술이다. 단순히 숫자를 매기는 것이 아니라, 의미적 유사성을 벡터 공간의 거리로 표현한다는 점이 핵심이다.
비유하자면, 거대한 도서관을 생각해보자. 요리 책은 요리 책끼리, 프로그래밍 책은 프로그래밍 책끼리 가까운 선반에 꽂혀 있다. 임베딩은 이와 비슷하게 의미가 가까운 텍스트를 벡터 공간에서 가까운 위치에 배치하는 것이다. "고양이"와 "강아지"의 벡터는 가깝고, "고양이"와 "자동차"의 벡터는 멀다.
왜 임베딩이 필요한가?
임베딩이 해결하는 문제는 크게 세 가지다.
1. 의미의 수치화 (Semantic Representation)
컴퓨터는 텍스트를 직접 이해하지 못한다. 딥러닝 모델에 텍스트를 입력하려면 숫자로 변환해야 한다. 가장 단순한 방법은 원-핫 인코딩(One-Hot Encoding) 이다. 예를 들어 어휘 사전에 10,000개의 단어가 있다면, "사과"를 [0, 0, ..., 1, ..., 0]처럼 10,000차원 벡터로 표현한다. 해당 단어의 인덱스만 1이고 나머지는 전부 0이다.
문제는 이 방식으로는 단어 간 관계를 전혀 표현할 수 없다는 것이다. 원-핫 벡터에서 "사과"와 "바나나"의 거리나, "사과"와 "자동차"의 거리나 완전히 동일하다. 모든 단어 쌍이 직교하기 때문이다. 임베딩은 이 한계를 극복하여 텍스트의 의미를 숫자에 담아낸다.
2. 유사도 측정 (Similarity Measurement)
임베딩 덕분에 "이 두 문장이 얼마나 비슷한가?"라는 질문에 수학적으로 답할 수 있다. 의미적으로 유사한 단어나 문서는 벡터 공간에서 가까운 곳에 위치하므로, 코사인 유사도(Cosine Similarity)나 유클리드 거리 같은 수학적 도구로 유사성을 정량화할 수 있다.
임베딩의 핵심 아이디어: 의미가 비슷하면 벡터도 가깝다.
3. 차원 축소 (Dimensionality Reduction)
앞서 본 원-핫 인코딩은 어휘 크기만큼의 차원을 필요로 한다. 어휘가 100,000개라면 100,000차원 벡터가 되는데, 대부분의 값이 0인 희소 벡터(Sparse Vector) 라서 계산 비용이 크고 비효율적이다.
임베딩은 이를 256차원, 768차원 등의 저차원 밀집 벡터(Dense Vector) 로 압축한다. 차원은 훨씬 작아지지만, 그 안에 의미 정보가 촘촘하게 담긴다. 마치 긴 글을 핵심만 추려 요약하는 것과 비슷하다.
정적 임베딩 (Static Embedding)
정적 임베딩은 하나의 단어에 하나의 고정된 벡터를 부여한다. 문맥이 달라져도 벡터 값은 변하지 않는다. 초기 임베딩 기술의 주류를 차지했다.
Word2Vec
Word2Vec은 2013년 Google에서 발표한 모델로, 임베딩의 대중화를 이끈 대표적인 기술이다. 핵심 아이디어는 "한 단어의 의미는 그 주변 단어로부터 알 수 있다"는 분포 가설(Distributional Hypothesis)이다.
"나는 ___을(를) 먹었다"라는 문장에서 빈칸에 들어갈 수 있는 단어들("사과", "빵", "라면")은 서로 의미가 비슷할 가능성이 높다. Word2Vec은 이처럼 주변 단어를 예측하는 과정에서 단어 벡터를 학습한다.
Word2Vec이 학습한 벡터에서는 유명한 벡터 연산이 가능하다.
king - man + woman = queen
"왕"에서 "남성"의 의미를 빼고 "여성"의 의미를 더하면 "여왕"이 나온다. 단어의 의미가 벡터 공간에서 방향과 거리로 표현된다는 증거이다.
GloVe (Global Vectors)
GloVe는 2014년 Stanford에서 발표한 모델로, Word2Vec과는 접근 방식이 다르다. Word2Vec이 로컬한 문맥 창(context window)을 학습하는 것과 달리, GloVe는 전체 말뭉치(corpus)에서의 단어 동시 출현 통계(co-occurrence statistics) 를 기반으로 학습한다.
쉽게 말해, "얼음"과 "차가운"이 함께 등장하는 빈도, "얼음"과 "뜨거운"이 함께 등장하는 빈도 등 글로벌한 통계 정보를 활용한다. 이 때문에 이름도 Global Vectors이다.
FastText
FastText는 2016년 Facebook(현 Meta)에서 발표한 모델이다. Word2Vec과 GloVe가 단어를 더 이상 쪼갤 수 없는 최소 단위로 취급하는 것과 달리, FastText는 단어를 문자 단위의 n-gram으로 분해하여 학습한다.
예를 들어 "apple"이라는 단어를 <ap, app, ppl, ple, le> 같은 부분 문자열로 쪼개고, 각 조각의 벡터를 합산하여 전체 단어의 벡터를 만든다.
이 방식의 가장 큰 장점은 미등록 단어(OOV, Out-of-Vocabulary) 처리다. Word2Vec은 학습 데이터에 없는 단어를 만나면 벡터를 생성할 수 없다. 반면 FastText는 처음 보는 단어라도 n-gram 조각들의 벡터를 조합하여 합리적인 벡터를 만들어낼 수 있다. 신조어나 오탈자가 빈번한 실제 환경에서 큰 강점이 된다.
문맥 임베딩 (Contextual Embedding)
정적 임베딩에는 근본적인 한계가 있다. 동음이의어를 처리하지 못한다는 것이다.
"배가 고프다"의 "배"와 "배를 타고 간다"의 "배"는 완전히 다른 의미이지만, 정적 임베딩에서는 동일한 벡터를 갖는다. 이 문제를 해결한 것이 문맥 임베딩(Contextual Embedding) 이다. 문맥 임베딩은 같은 단어라도 주변 문맥에 따라 다른 벡터 값을 부여한다. 현대 대규모 언어 모델(LLM)의 핵심 기술이기도 하다.
ELMo (Embeddings from Language Models)
ELMo(2018, Allen AI)는 문맥 임베딩의 시초라 할 수 있다. 양방향 LSTM(Bidirectional LSTM) 을 사용하여 문장의 왼쪽과 오른쪽 문맥을 모두 고려한 단어 표현을 생성한다.
"배가 고프다"라는 문장에서 ELMo는 "고프다"라는 주변 문맥을 보고, "배"의 벡터를 신체 부위 쪽으로 조정한다. "배를 타고"에서는 교통수단 쪽으로 조정한다.
BERT (Bidirectional Encoder Representations from Transformers)
BERT(2018, Google)는 Transformer의 Encoder 구조를 사용하여 양방향 문맥을 동시에 처리한다. ELMo가 왼쪽-오른쪽을 따로 읽고 합쳤다면, BERT는 문장 전체를 한 번에 양방향으로 읽는다.
BERT의 학습 방식이 독특한데, 문장에서 일부 단어를 [MASK]로 가리고 해당 단어를 맞추는 Masked Language Model(MLM) 방식으로 학습한다. "나는 [MASK]를 먹었다"에서 빈칸에 올 단어를 예측하는 것이다. 이 과정에서 문맥에 대한 깊은 이해를 얻게 된다.
BERT는 문장 임베딩, 질의응답, 감성 분석 등 다양한 NLP 태스크에서 당시 최고 성능을 기록하며, 사전학습(Pre-training) + 미세조정(Fine-tuning) 패러다임을 확립했다.
GPT (Generative Pre-trained Transformer)
GPT(OpenAI)는 Transformer의 Decoder 구조를 사용하며, BERT와 달리 단방향(왼쪽에서 오른쪽) 문맥만 참조한다. 다음 단어를 예측하는 방식으로 학습하기 때문에, 텍스트 생성에 특화되어 있다.
BERT가 "빈칸 채우기"에 강하다면, GPT는 "이어서 쓰기"에 강하다고 볼 수 있다. ChatGPT로 대표되는 현재의 대화형 AI가 바로 이 GPT 계열 모델 위에 구축되어 있다.
정적 임베딩은 사전에서 단어의 뜻을 찾는 것이고, 문맥 임베딩은 문장 속에서 단어의 뜻을 파악하는 것이다.
임베딩의 활용
임베딩은 단순히 단어를 벡터로 바꾸는 것에 그치지 않는다. 다양한 실전 응용에서 핵심 역할을 한다.
유사도 검색 (Similarity Search)
벡터 데이터베이스(Vector Database) 에 문서를 임베딩하여 저장한 뒤, 쿼리와 가장 유사한 문서를 검색하는 방식이다. 최근 주목받는 RAG(Retrieval-Augmented Generation) 의 검색 단계가 바로 이 유사도 검색에 해당한다. 사용자의 질문을 임베딩하고, 가장 관련 있는 문서를 찾아 LLM에 전달하는 구조이다.
텍스트 분류 (Text Classification)
스팸 메일 분류, 감성 분석(긍정/부정 판별) 등 텍스트를 카테고리로 나누는 태스크에서, 임베딩은 텍스트를 분류 모델에 입력하기 위한 수치 표현으로 사용된다.
클러스터링 (Clustering)
유사한 문서끼리 그룹을 만드는 작업이다. 뉴스 기사를 정치, 경제, 스포츠 등으로 자동 분류하거나, 고객 문의를 유형별로 묶는 데 활용된다. 임베딩 벡터에 K-means 같은 클러스터링 알고리즘을 적용하면 된다.
추천 시스템 (Recommendation Systems)
사용자의 선호도와 아이템의 특성을 각각 벡터로 표현하고, 두 벡터 사이의 유사도를 계산하여 추천하는 방식이다. 넷플릭스의 영화 추천, 쇼핑몰의 상품 추천 등이 이 원리를 활용한다. 사용자 벡터와 가까운 아이템 벡터를 찾으면, 그것이 곧 추천 결과가 된다.
정리
임베딩은 텍스트를 숫자 벡터로 변환하여 컴퓨터가 의미를 다룰 수 있게 하는 기술이다. 정적 임베딩(Word2Vec, GloVe, FastText)은 단어마다 하나의 고정 벡터를 부여하고, 문맥 임베딩(ELMo, BERT, GPT)은 문맥에 따라 동적으로 벡터를 생성한다. 오늘날 대부분의 NLP 시스템은 문맥 임베딩 위에 구축되어 있으며, RAG, 텍스트 분류, 추천 시스템 등 다양한 응용에서 핵심 역할을 한다.
다음 글에서는 임베딩된 벡터를 저장하고 검색하는 벡터 데이터베이스(Vector Database) 에 대해 다룰 예정이다.