Word2Vec 밑바닥부터 구현하기: "king - man + woman = queen"이 실제로 작동하는 원리
요약
Word2Vec의 핵심 원리인 분포 가설과 Skip-gram 모델을 밑바닥부터 설명합니다. 원-핫 벡터의 한계를 극복하고 단어 간의 의미적 관계를 밀집 벡터로 학습하는 과정을 다룹니다.
핵심 포인트
- 분포 가설: 유사한 문맥에서 나타나는 단어는 유사한 의미를 가짐
- Skip-gram: 중심 단어를 통해 주변 문맥 단어를 예측하는 방식
- Negative Sampling: 전체 Softmax 연산의 비용을 줄이기 위한 효율적인 학습 기법
- 단어 벡터 연산: 학습된 임베딩을 통해 단어 간 의미적 산술 연산 가능
컴퓨터는 "king"이 무엇을 의미하는지 전혀 알지 못합니다. 컴퓨터에 단어를 전달할 때, 가장 먼저 결정해야 할 것은 단어를 어떻게 숫자로 변환할 것인가입니다. 가장 단순한 방법은 원-핫 벡터 (one-hot vector)입니다. 어휘 사전(vocabulary)의 단어 하나당 하나의 슬롯을 할당하고, 단 하나의 1을 제외한 나머지는 모두 0으로 채우는 방식입니다. 문제는 모든 원-핫 벡터가 서로 정확히 같은 거리에 위치한다는 점입니다. 이 방식에서는 "king"이 "queen"과 "banana" 사이에서 특별히 더 가깝지 않습니다. 의미가 아닌 정체성(identity)만을 인코딩한 것입니다.
Word2Vec은 모든 단어에 대해 밀집 벡터 (dense vector)를 학습함으로써 이 문제를 해결하며, 이 벡터들은 의미를 이용한 산술 연산이 가능할 정도로 매우 훌륭하게 생성됩니다. 즉, king − man + woman을 하면 queen 바로 옆에 위치하게 됩니다. 저는 브라우저에서 학습되는 아주 작은 버전을 구축했으며, 이는 정확히 그 결과를 재현합니다. 작동 원리는 다음과 같습니다.
분포 가설 (The distributional hypothesis)
이 모든 것은 언어학의 오래된 아이디어인 "단어는 그와 함께 어울리는 동료들을 통해 알 수 있다"라는 개념에 기반합니다. 유사한 문맥 (context)에서 나타나는 단어들은 유사한 의미를 갖는 경향이 있습니다. "King"과 "queen"은 모두 "rules", "crown", "kingdom" 근처에 등장합니다. 따라서 유사한 이웃을 가진 단어들이 유사한 벡터를 갖도록 학습한다면, 사전이나 라벨 없이 오직 가공되지 않은 텍스트 (raw text)만으로도 그 벡터들이 의미를 포착할 수 있게 됩니다.
스킵-그램 (Skip-gram): 이웃 예측하기
Word2Vec은 이 아이디어를 스킵-그램 (skip-gram)이라 불리는 예측 게임으로 전환합니다. 텍스트 위로 윈도우 (window)를 슬라이딩합니다. 중심 단어를 잡고 주변의 각 문맥 단어를 예측하려고 시도합니다. 윈도우 크기가 2일 때, "the king rules the kingdom"이라는 문장에서 중심 단어인 "king"은 "the", "rules", "the", "kingdom"을 예측해야 합니다. 모든 문장은 당신에게 무료로 학습 쌍 (training pairs)을 제공하며, 이는 자기 지도 학습 (self-supervised) 방식입니다. 문맥을 잘 예측하기 위해서 단어의 벡터는 그 단어가 어떤 동료들과 어울리는지를 포착해야 하며, 이것이 바로 우리가 추구하는 의미 그 자체입니다.
각 단어는 실제로 두 개의 벡터를 갖게 됩니다. 단어가 중심 단어 (center word)일 때를 위한 입력 벡터 (input vector)와, 문맥 단어 (context word)일 때를 위한 출력 벡터 (output vector)입니다. 예측은 중심 벡터와 후보 문맥 벡터 사이의 내적 (dot product)을 구한 뒤, 이를 시그모이드 (sigmoid) 함수로 압축하는 과정입니다. 학습이 끝난 후에는 입력 벡터들을 임베딩 (embeddings)으로 사용합니다.
Negative sampling: 거대한 softmax 건너뛰기
한 가지 문제가 있습니다. 문맥 단어들에 대해 적절한 확률을 계산하려면 전체 어휘 (vocabulary)에 대한 softmax 연산이 필요합니다. 즉, 학습 쌍 하나당 단어 하나마다 내적을 수행해야 합니다. 어휘가 100,000개라면 이는 매우 가혹한 작업입니다. Negative sampling (네거티브 샘플링)은 이를 훨씬 저렴한 방식으로 대체합니다. 실제 (중심, 문맥) 쌍 하나를 양성 예시 (positive example)라고 부릅시다. 그런 다음 몇 개의 무작위 단어(예를 들어 5개)를 뽑아 이를 음성 예시 (negatives)라고 부릅니다. 이제 과제는 아주 작은 이진 질문이 됩니다. '이 쌍이 진짜인가, 가짜인가?' 이는 $O(100,000)$의 작업 대신 $O(6)$의 작업으로 해결됩니다. 음성 예시들은 unigram 빈도의 0.75승 분포 (unigram-frequency-to-the-0.75 distribution)에서 추출되는데, 이는 흔한 단어들이 너무 지배적이지 않게 하면서도 조금 더 자주 샘플링되도록 합니다.
업데이트는 줄다리기와 같다
이진 교차 엔트로피 손실 (binary cross-entropy loss)의 그래디언트 (gradient)는 아름다울 정도로 단순합니다: (예측값 - 레이블). 양성 쌍의 경우, 업데이트는 중심 벡터와 문맥 벡터를 서로 가까워지도록 유도하여 내적 값을 높입니다. 반대로 각 음성 쌍의 경우, 두 벡터를 서로 멀어지게 밀어냅니다. 그게 전부입니다. 이 과정을 수백만 개의 쌍과 공기 (co-occurring) 단어들에 대해 실행하면, 함께 나타나는 단어들은 공간상에서 서로 끌어당겨지고 관련 없는 단어들은 멀리 떠내려갑니다. 의미의 기하학 (geometry of meaning)은 전적으로 이러한 '끌어당기고 밀어내는 춤'에 의해 조각됩니다.
완성된 벡터들을 비교하기 위해 우리는 코사인 유사도 (cosine similarity)를 사용합니다. 이는 벡터 사이의 각도를 측정하는 정규화된 내적 (normalised dot product)입니다. 의미는 크기 (magnitude)가 아니라 방향 (direction)에 담겨 있습니다. 쿼리 벡터 (query vector)에 대한 코사인 유사도를 기준으로 전체 어휘의 순위를 매기면 가장 가까운 이웃 (nearest neighbours)을 찾을 수 있습니다.
왜 유추가 성립하는가
놀라운 점은 바로 이것입니다. 관계가 일관된 방향성 (directions)으로 변환된다는 것입니다. "king"과 "queen"이 "man"과 "woman"과 마찬가지로 주로 성별 (gender)에 의해 차이가 나기 때문에, "man"에서 "woman"으로 향하는 벡터는 "king"에서 "queen"으로 향하는 벡터와 대략적으로 동일합니다. 따라서 "king"에서 "man"을 빼면 남성적인 부분이 제거되고, 여기에 "woman"을 더하면 여성적인 부분이 공급되어 "queen" 근처에 도달하게 됩니다. 누구도 이를 설계하지 않았습니다. 이는 공기 (co-occurrence) 목적 함수가 구축하는 선형 구조 (linear structure)로부터 자연스럽게 나타나는 현상입니다. 왕실, 동물, 음식에 관한 약 40개의 짧은 문장들로 학습시킨 저의 토이 데모 (toy demo)는 대부분의 경우 "king - man + woman"에 대해 "queen"을 최상위 결과로 도출하며, 항상 무작위 단어들보다 높은 순위에 배치합니다. (코퍼스 (corpus)는 유추 (analogy)가 안정적으로 유지되도록 의도적으로 작고 밀집되어 있습니다.)
알아두어야 할 한계점
Word2Vec은 각 단어에 하나의 정적 벡터 (static vector)를 부여합니다. 따라서 강가의 "bank"와 금융 기관인 "bank"는 문장과 상관없이 하나의 모호한 벡터로 뭉쳐버립니다. 이러한 한계는 바로 이 분야를 문맥 임베딩 (contextual embeddings) — ELMo를 거쳐 BERT와 Transformer 제품군 — 으로 이끄는 동력이 되었습니다. 문맥 임베딩에서는 단어의 벡터가 실제 문장으로부터 계산됩니다. 하지만 문맥으로부터 학습된 기하학 (geometry)으로서의 의미라는 핵심 아이디어는 이들이 모두 기반을 두고 있는 토대입니다.
라이브 버전을 직접 실행해 보세요 — 모델을 학습시키고, 단어를 클릭하여 이웃 (neighbours)을 확인하며, 자신만의 유추를 풀어보세요: https://dev48v.infy.uk/dl/day23-word2vec.html
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기