임베딩이란? AI가 단어의 의미를 숫자 벡터로 표현하는 방법
지난 글에서는 AI가 문장을 토큰(Token)이라는 작은 조각으로 나누고, 각 토큰을 고유한 숫자 ID로 바꾼다는 것을 알아봤습니다. 하지만 “고양이”가 314번이고 “강아지”가 927번이라고 해서 AI가 두 단어의 관계를 이해할 수 있는 것은 아닙니다. 숫자 ID는 사전에서 토큰을 찾기 위한 주소일 뿐, 숫자의 크기나 간격에는 의미가 없기 때문입니다.
언어 모델이 단어 사이의 관계를 계산하려면 ID를 더 풍부한 숫자 표현으로 바꿔야 합니다. 이때 사용하는 것이 임베딩(Embedding)입니다. 이번 글에서는 임베딩이 무엇이며 어떻게 학습되고, Transformer와 LLM에서 어떤 역할을 하는지 차근차근 살펴보겠습니다.
임베딩이란?
임베딩은 단어·토큰·문장 같은 대상을 여러 개의 실수로 이루어진 벡터(Vector)로 표현하는 방법입니다. 예를 들어 “고양이”라는 토큰이 [0.2, -0.7, 0.4, …]처럼 수백 개 이상의 숫자로 표현될 수 있습니다. 여기에 나온 숫자는 이해를 돕기 위한 예시이며, 실제 값과 벡터 길이는 모델마다 다릅니다.
Google의 머신러닝 임베딩 학습 자료는 임베딩을 희소한 데이터를 더 낮은 차원의 조밀한 벡터로 표현하여 항목 사이의 의미 관계를 담는 방법으로 설명합니다. 핵심은 하나의 번호 대신 여러 숫자의 조합으로 대상을 표현한다는 점입니다.
토큰 ID만으로는 왜 부족할까?
토큰 ID는 단지 어휘 사전의 항목을 구분하는 번호입니다. “고양이”의 ID가 314이고 “강아지”의 ID가 927이라고 가정해도, 927에서 314를 뺀 값은 두 동물의 의미 차이를 나타내지 않습니다. “자동차”의 ID가 315라고 해서 고양이와 자동차가 고양이와 강아지보다 비슷한 것도 아닙니다.
원-핫 인코딩처럼 한 위치만 1이고 나머지는 모두 0인 벡터를 사용할 수도 있지만, 어휘가 커질수록 벡터가 매우 길고 대부분이 0인 희소한 표현이 됩니다. 서로 다른 토큰의 원-핫 벡터만 보아서는 어떤 단어가 비슷하게 쓰이는지도 알기 어렵습니다. 임베딩은 이 문제를 해결하기 위해 비교적 짧고 값이 촘촘한 벡터를 학습합니다.
토큰이 임베딩 벡터로 바뀌는 과정
에는 흔히 임베딩 테이블이라고 부르는 거대한 숫자표가 있습니다. 각 행은 어휘 사전의 토큰 하나에 대응하고, 각 열은 벡터의 한 차원에 대응합니다. 토큰 ID가 입력되면 모델은 그 번호에 해당하는 행을 찾아 임베딩 벡터를 가져옵니다. 이를 임베딩 조회(Lookup)라고 생각하면 쉽습니다.
- 토크나이저가 “고양이”를 토큰으로 나누고 토큰 ID를 찾습니다.
- 모델이 임베딩 테이블에서 해당 ID의 행을 조회합니다.
- 그 행에 저장된 여러 실수가 토큰의 초기 임베딩 벡터가 됩니다.
- 벡터에 위치 정보 등이 더해진 뒤 Transformer 층으로 전달됩니다.
그림의 314라는 ID와 벡터 값은 모두 설명용 예시입니다. 같은 텍스트라도 모델의 토크나이저와 어휘 사전이 다르면 ID가 달라지고, 별도로 학습된 모델의 임베딩 값도 서로 다릅니다.
벡터의 각 숫자는 무엇을 뜻할까?
임베딩 벡터의 한 숫자를 보고 “첫 번째 값은 동물성, 두 번째 값은 크기”라고 단정할 수는 없습니다. 모델은 사람이 정한 의미 표를 외우는 것이 아니라, 학습 목표의 오차를 줄이는 방향으로 수많은 값을 함께 조정합니다. 의미와 문법적 특징은 대개 여러 차원에 분산되어 나타납니다.
TensorFlow의 단어 임베딩 안내도 임베딩을 학습 가능한 실수 벡터이자 조회표로 설명합니다. 즉, 사람이 모든 값을 직접 입력하는 것이 아니라 신경망의 다른 가중치처럼 데이터에서 학습됩니다.
차원이 많으면 무조건 좋을까?
벡터의 숫자 개수를 임베딩 차원이라고 합니다. 차원이 늘어나면 더 다양한 관계를 표현할 여지가 생기지만, 임베딩 테이블의 매개변수 수와 메모리 사용량도 커집니다. 예를 들어 어휘가 5만 개이고 임베딩이 1,000차원이라면 이 표에만 5천만 개의 값이 필요합니다.
반대로 차원이 너무 작으면 여러 의미와 문법 특징을 충분히 구분하지 못할 수 있습니다. 적절한 크기는 데이터 양, 모델 규모, 계산 자원과 수행할 작업에 따라 달라집니다. 따라서 “차원이 클수록 정확하다”는 단순한 공식보다는 전체 모델 설계와 학습 품질을 함께 봐야 합니다.
임베딩 공간과 의미적 거리
각 임베딩 벡터를 하나의 점이라고 생각하면 수많은 토큰이 놓인 임베딩 공간을 상상할 수 있습니다. 학습 데이터에서 비슷한 맥락에 자주 등장하고 비슷한 역할을 하는 표현은 벡터도 비슷해지는 경향이 있습니다. 그래서 “고양이”, “강아지”, “토끼”가 서로 가깝고 “자동차”, “버스”, “기차”가 다른 군집을 만들 수 있습니다.
다만 위 그림은 이해를 위한 2차원 투영입니다. 실제 임베딩은 훨씬 많은 차원을 가지며, 고차원 데이터를 평면에 줄여 그리면 원래의 거리 관계가 일부 왜곡될 수 있습니다. 그림의 좌표가 모든 모델에서 그대로 존재하는 고정된 의미 지도라는 뜻은 아닙니다.
AI는 비슷함을 어떻게 계산할까?
벡터가 비슷한 방향을 가리키는지 비교할 때 흔히 코사인 유사도(Cosine Similarity)를 사용합니다. 두 벡터의 방향이 비슷할수록 값이 높게 나오므로, 의미 검색에서 질문과 문서가 얼마나 가까운 맥락을 가졌는지 비교하는 데 활용할 수 있습니다. 유클리드 거리나 내적 같은 다른 계산도 목적과 모델에 따라 사용됩니다.
그러나 벡터 유사도는 “두 표현이 객관적으로 같은 뜻이다”라는 판정이 아닙니다. 학습 데이터에서 관찰된 사용 패턴을 수치로 비교한 결과입니다. 반의어가 비슷한 문장 구조에 자주 등장하면 가까워질 수 있고, 데이터의 편견이나 부족한 맥락도 벡터에 반영될 수 있습니다.
임베딩은 어떻게 학습될까?
처음 임베딩 테이블의 값은 의미 있는 사전처럼 완성되어 있지 않습니다. 모델이 문맥에서 단어를 예측하거나 주어진 작업을 수행하고, 예측과 정답의 차이를 손실 함수로 계산한 뒤 역전파와 경사하강법으로 가중치를 수정합니다. 이 과정에서 임베딩 값도 함께 조정됩니다.
예를 들어 비슷한 문맥에 등장하는 표현이 비슷한 예측에 도움이 된다면, 학습을 거치며 그 표현들의 벡터가 관련된 구조를 형성할 수 있습니다. 임베딩은 사람이 붙인 간단한 분류표가 아니라 방대한 예시에서 모델의 목적에 맞게 만들어진 수치적 표현입니다.
정적 임베딩과 문맥 임베딩
정적 임베딩
전통적인 정적 단어 임베딩에서는 하나의 단어가 대체로 하나의 고정된 벡터를 가집니다. 구현이 단순하고 단어 관계를 비교하기 좋지만, “눈이 내린다”의 눈과 “눈을 감는다”의 눈처럼 같은 표기가 다른 뜻을 가질 때 하나의 벡터만으로 구분하기 어렵습니다.
문맥 임베딩
Transformer 기반 언어 모델은 토큰의 초기 임베딩을 입력으로 받은 뒤 Attention과 여러 층의 계산을 거치며 주변 문맥을 반영한 표현을 만듭니다. 따라서 같은 “눈” 토큰도 앞뒤 문장에 따라 이후 층의 벡터 표현이 달라질 수 있습니다.
엄밀히 말하면 임베딩 테이블에서 처음 꺼낸 값은 토큰의 초기 임베딩이고, Transformer 내부 층에서 문맥이 반영된 값은 흔히 문맥적 표현 또는 숨은 상태라고 부릅니다. 둘을 모두 넓은 의미의 문맥 임베딩으로 설명하기도 하지만, 이 차이를 알아두면 LLM의 동작을 더 정확히 이해할 수 있습니다.
토큰 임베딩만 있는 것은 아니다
- 문장 임베딩: 문장 전체의 의미를 하나의 벡터로 표현합니다.
- 문서 임베딩: 긴 글이나 문서 조각을 비교하고 검색하는 데 사용합니다.
- 이미지 임베딩: 이미지의 시각적 특징을 벡터로 표현합니다.
- 사용자·상품 임베딩: 추천 시스템에서 취향과 상품 특성을 표현할 수 있습니다.
서로 다른 종류의 데이터를 같은 공간에 맞춰 학습하면 텍스트로 이미지를 찾는 것처럼 형태가 다른 정보도 비교할 수 있습니다. 단, 임베딩의 차원과 의미 공간은 모델마다 다르므로 서로 다른 모델이 만든 벡터를 그대로 섞어 비교해서는 안 됩니다.
임베딩은 어디에 쓰일까?
- 의미 검색: 정확히 같은 단어가 없어도 질문과 뜻이 가까운 문서를 찾습니다.
- RAG: 질문 임베딩과 가까운 자료를 검색해 생성 모델의 답변에 참고시킵니다.
- 추천: 사용자와 상품의 벡터 관계를 바탕으로 관심 대상을 추천합니다.
- 군집화와 분류: 비슷한 문서나 고객 의견을 묶고 범주를 예측합니다.
- 중복 탐지: 표현은 달라도 내용이 유사한 문장이나 문서를 찾습니다.
임베딩을 볼 때 주의할 점
- 유사도는 사실 판정이 아닙니다. 가까운 벡터라는 이유만으로 문장이 정확하거나 참이라는 뜻은 아닙니다.
- 학습 데이터의 영향을 받습니다. 편견, 오래된 정보, 특정 분야의 부족한 표현이 공간에 반영될 수 있습니다.
- 모델마다 공간이 다릅니다. 차원이 같아도 서로 다른 모델의 좌표축과 값은 직접 비교할 수 없습니다.
- 문장을 자르는 방식이 중요합니다. 긴 문서를 어떤 단위로 나누느냐에 따라 검색 결과가 달라질 수 있습니다.
- 2차원 시각화는 근사입니다. 보기 쉬운 그림으로 줄이는 과정에서 고차원의 관계가 일부 사라질 수 있습니다.
한눈에 정리하기
- 토큰 ID는 사전의 주소이고, 임베딩은 계산 가능한 조밀한 실수 벡터입니다.
- 임베딩 테이블에서 토큰 ID에 해당하는 행을 조회해 초기 벡터를 얻습니다.
- 비슷한 맥락에서 쓰인 표현은 임베딩 공간에서 가까워지는 경향이 있습니다.
- 임베딩 값은 손실을 줄이는 학습 과정에서 다른 가중치와 함께 조정됩니다.
- Transformer는 초기 임베딩에 문맥을 반영해 층마다 더 풍부한 표현을 만듭니다.
- 임베딩은 의미 검색, RAG, 추천, 분류와 중복 탐지 등 다양한 분야에 활용됩니다.
임베딩은 글을 단순한 번호에서 의미 관계를 계산할 수 있는 벡터로 바꾸는 연결 고리입니다. 다음 글에서는 토큰과 임베딩을 입력받은 ChatGPT가 어떻게 다음 내용을 예측하고 답변을 완성하는지 전체 흐름을 이어서 알아보겠습니다.
댓글
댓글 쓰기