검색
← 모듈 로드맵

단어를 벡터로 효율적으로 표현하기 (word2vec)

논문 · 입문자 · Tomas Mikolov 외 3명 · 2013 · arXiv

원제 · Efficient Estimation of Word Representations in Vector Space

은닉층 없는 CBOW · 스킵그램으로 대규모 단어 벡터를 싸고 빠르게 학습한 논문

먼저 알아야 할 것

원-핫 인코딩소프트맥스신경망 언어 모델코사인 유사도확률적 경사 하강법

다루는 내용

word2vec 논문은 신경망 언어 모델에서 비선형 은닉층을 빼고, 주변 단어로 가운데 단어를 맞히는 CBOW와 가운데 단어로 주변 단어를 맞히는 스킵그램을 제안합니다. 허프만 트리 계층적 소프트맥스로 출력 비용을 줄여 수십억 단어에서 하루 안팎에 벡터를 학습합니다. 벡터 산수(biggest − big + small ≈ smallest)로 의미 · 문법 관계를 평가하는 테스트 세트를 만들었고, 기존 NNLM · RNNLM보다 적은 비용으로 높은 정확도를 냈습니다.

초록

저자가 쓴 초록을 옮긴 것입니다.

아주 큰 데이터에서 단어의 연속 벡터 표현을 계산하는 새로운 모델 구조 두 가지를 제안합니다. 표현의 품질은 단어 유사도 과제로 측정하고, 여러 종류의 신경망에 기반한 기존 최고 기법들과 결과를 비교합니다. 그 결과 훨씬 적은 계산 비용으로 정확도가 크게 좋아졌습니다. 예를 들어 16억 단어 데이터에서 질 좋은 단어 벡터를 배우는 데 하루가 채 걸리지 않습니다. 또한 이 벡터들이 문법적 · 의미적 단어 유사도를 재는 저자들의 테스트 세트에서 최고 수준의 성능을 낸다는 것을 보입니다.

해설

단어를 벡터로 효율적으로 표현하기 (word2vec)

은닉층을 뺀 아주 단순한 두 모델(CBOW · 스킵그램)로, 수십억 단어에서 하루 안팎에 질 좋은 단어 벡터를 뽑아낸 논문입니다. "biggest − big + small ≈ smallest" 같은 벡터 연산이 널리 알려진 계기이고, 오늘날 임베딩의 출발점입니다.

항목내용
원제Efficient Estimation of Word Representations in Vector Space
저자Tomas Mikolov 외 3명 (Google)
발표2013 · arXiv 1301.3781
트랙 · 수준NLP·트랜스포머 · 기초
먼저 알면 좋은 것원-핫 인코딩, 소프트맥스, 신경망 언어 모델, 코사인 유사도, 확률적 경사 하강법

들어가기 전에

이 해설은 아래 내용을 안다고 보고 씁니다. 처음이라면 먼저 읽고 오면 수식과 손계산을 훨씬 쉽게 따라올 수 있습니다.

한눈에 보기

  • 단어를 "번호"가 아니라 "수백 차원의 좌표"로 나타내면 비슷한 단어끼리 가까이 모인다는 것을 알게 됩니다.
  • 기존 신경망 언어 모델이 왜 느렸는지(은닉층 · 출력층), word2vec이 무엇을 빼서 빨라졌는지 알게 됩니다.
  • CBOW(주변 → 가운데)와 스킵그램(가운데 → 주변)의 차이와 각자 잘하는 문제를 알게 됩니다.
  • 벡터 덧셈 · 뺄셈으로 "비교급 관계", "수도-나라 관계"를 푸는 평가 방법을 알게 됩니다.

초록 (번역)

아주 큰 데이터에서 단어의 연속 벡터 표현을 계산하는 새로운 모델 구조 두 가지를 제안합니다. 표현의 품질은 단어 유사도 과제로 측정하고, 여러 종류의 신경망에 기반한 기존 최고 기법들과 결과를 비교합니다. 그 결과 훨씬 적은 계산 비용으로 정확도가 크게 좋아졌습니다. 예를 들어 16억 단어 데이터에서 질 좋은 단어 벡터를 배우는 데 하루가 채 걸리지 않습니다. 또한 이 벡터들이 문법적 · 의미적 단어 유사도를 재는 저자들의 테스트 세트에서 최고 수준의 성능을 낸다는 것을 보입니다.

무엇을 풀었나

당시 많은 자연어 처리 시스템은 단어를 사전의 번호로만 다뤘습니다. "고양이"가 17번, "강아지"가 4,203번이면, 두 단어가 비슷하다는 정보는 어디에도 없습니다. 단순하고 튼튼해서 N-그램 같은 방법이 오래 쓰였지만, 데이터를 늘리는 것만으로는 더 나아지기 어려운 과제가 많았습니다.

단어를 연속 벡터로 표현하는 신경망 언어 모델(NNLM, Neural Network Language Model)은 이미 N-그램보다 낫다고 알려져 있었습니다. 문제는 속도였습니다. 저자들에 따르면 기존 구조 가운데 수억 단어를 넘는 데이터로, 50~100차원보다 큰 벡터를 학습한 사례가 없었습니다.

계산을 무겁게 만드는 곳은 두 군데였습니다.

  1. 비선형 은닉층: 입력 단어들을 벡터로 바꾼 뒤 수백~천 개 단위의 은닉층을 거칩니다.
  2. 출력층: 다음 단어의 확률을 사전 전체(VV개, 수십만~백만)에 대해 계산해야 합니다.

이 논문의 질문은 "표현력을 조금 잃더라도 모델을 훨씬 단순하게 만들어, 훨씬 많은 데이터를 먹이면 어떨까?"였습니다.

전체 흐름

mermaid
flowchart LR
  A[대규모 말뭉치<br/>예: 구글 뉴스 60억 토큰] --> B[창 단위로 자르기<br/>가운데 단어 + 주변 단어]
  B --> C{모델 선택}
  C -->|CBOW| D[주변 단어 벡터 평균<br/>→ 가운데 단어 맞히기]
  C -->|스킵그램| E[가운데 단어 벡터<br/>→ 주변 단어 각각 맞히기]
  D --> F[허프만 트리<br/>계층적 소프트맥스]
  E --> F
  F --> G[오차 역전파로<br/>단어 벡터 갱신]
  G --> H[단어 벡터 표<br/>벡터 산수로 평가]

핵심 아이디어

1. 비용을 "학습 중 건드리는 파라미터 수"로 잰다

한 문장 직관: 공장 생산 비용을 "하루 몇 개 × 개당 몇 분"으로 따지듯, 모델 비용을 "단어 수 × 단어 하나 학습 비용"으로 따집니다.

단계별 설명

  1. 학습은 데이터의 단어를 하나씩 보며 진행합니다.
  2. 단어 하나를 학습할 때 손대야 하는 파라미터 수를 QQ라 합니다.
  3. 데이터 전체를 몇 번 반복하는지(에폭)와 단어 수를 곱하면 전체 비용이 나옵니다.
O=E×T×QO = E \times T \times Q
기호뜻
OO전체 학습 비용
EE에폭 수(데이터를 몇 바퀴 도는지, 논문: 보통 3~50)
TT학습 데이터의 단어 수(논문: 최대 10억 정도가 흔함)
QQ단어 하나당 비용 — 모델마다 다름

기존 두 모델의 QQ는 다음과 같습니다.

QNNLM=N×D+N×D×H+H×V,QRNNLM=H×H+H×VQ_{\text{NNLM}} = N \times D + N \times D \times H + H \times V, \qquad Q_{\text{RNNLM}} = H \times H + H \times V
기호뜻
NN입력으로 쓰는 앞 단어 개수
DD단어 벡터의 차원
HH은닉층 크기
VV사전 크기
N×DN \times D단어들을 벡터로 바꾸는 투영 비용
N×D×HN \times D \times H투영층 → 은닉층 비용
H×VH \times V은닉층 → 사전 전체 출력 비용

출력 비용 H×VH \times V는 뒤에 나올 계층적 소프트맥스로 H×log⁡2VH \times \log_2 V 수준까지 줄일 수 있습니다. 그러면 남는 가장 큰 항은 N×D×HN \times D \times H, 곧 은닉층입니다. 그래서 저자들은 은닉층을 빼기로 합니다.

숫자로 해 보기 (해설용 계산, 논문 수치 아님)

논문이 "흔한 선택"으로 든 범위 안에서 N=10N = 10, D=500D = 500, H=500H = 500, V=1,000,000V = 1{,}000{,}000으로 잡아 봅니다(log⁡2V≈20\log_2 V \approx 20).

  • 투영: 10×500=5,00010 \times 500 = 5{,}000
  • 은닉층: 10×500×500=2,500,00010 \times 500 \times 500 = 2{,}500{,}000
  • 출력(계층적 소프트맥스 사용 시): 500×20=10,000500 \times 20 = 10{,}000

은닉층 하나가 나머지를 합친 것의 160배가 넘습니다. 병목이 어디인지 숫자로 바로 보입니다.

2. 허프만 트리 계층적 소프트맥스

한 문장 직관: 백만 명 중 한 사람을 찾을 때 한 명씩 다 확인하지 않고 "서울? 아니면 지방?" 같은 예/아니요 질문 스무 번으로 좁히는 방식입니다.

단계별 설명

  1. 사전의 모든 단어를 이진 트리의 잎(leaf)에 둡니다.
  2. 뿌리에서 정답 단어까지 가는 길의 갈림길마다 "왼쪽일 확률"을 계산합니다.
  3. 그 확률들을 곱하면 정답 단어의 확률이 됩니다. 사전 전체를 계산할 필요가 없습니다.
  4. 저자들은 허프만 트리(Huffman tree)를 씁니다. 자주 나오는 단어에 짧은 길을 주는 트리입니다.

균형 트리라면 약 log⁡2V\log_2 V번 판단하면 되고, 허프만 트리는 평균적으로 그보다 적습니다(논문 표기로는 약 log⁡2(유니그램 퍼플렉서티)\log_2(\text{유니그램 퍼플렉서티})). 논문은 사전이 100만 단어일 때 평가가 약 두 배 빨라진다고 적습니다.

왜 허프만 트리인가: 은닉층이 없는 새 모델에서는 출력 계산이 거의 전부입니다. 그래서 출력 쪽을 한 번 더 줄이는 효과가 커집니다. 저자들은 단어 빈도로 묶는 방식이 신경망 언어 모델에서 잘 통한다는 이전 관찰을 근거로 듭니다.

숫자로 해 보기 (해설용 예)

단어 4개의 출현 비율이 the 50% · cat 25% · sat 15% · mat 10%라고 합시다.

단어허프만 경로판단 횟수
the01
cat102
sat1103
mat1113

평균 판단 횟수는 0.5×1+0.25×2+0.15×3+0.1×3=1.750.5 \times 1 + 0.25 \times 2 + 0.15 \times 3 + 0.1 \times 3 = 1.75번입니다. 균형 트리는 모든 단어가 2번이므로, 자주 나오는 단어 덕분에 평균이 줄었습니다.

3. CBOW — 주변 단어로 가운데 단어 맞히기

한 문장 직관: "나는 아침에 ___ 를 마신다"에서 빈칸을 맞히는 문제를 수십억 번 풀게 하면, 빈칸에 들어갈 만한 단어들(커피 · 우유 · 차)이 비슷한 벡터를 갖게 됩니다.

단계별 설명

  1. 가운데 단어 앞뒤로 몇 개씩 단어를 고릅니다. 논문에서는 앞 4개 · 뒤 4개일 때 가장 좋았습니다.
  2. 각 주변 단어의 벡터를 꺼내 평균을 냅니다. 순서는 무시합니다(그래서 "단어 주머니, bag-of-words").
  3. 그 평균 벡터로 가운데 단어가 무엇인지 분류합니다(로그 선형 분류기).
  4. 틀린 만큼 단어 벡터를 고칩니다.
QCBOW=N×D+D×log⁡2VQ_{\text{CBOW}} = N \times D + D \times \log_2 V
기호뜻
N×DN \times D주변 단어 NN개의 벡터를 꺼내 평균 내는 비용
D×log⁡2VD \times \log_2 V평균 벡터로 계층적 소프트맥스 출력을 계산하는 비용

NNLM과 비교하면 은닉층 항 N×D×HN \times D \times H가 통째로 사라졌습니다. 이름의 "연속(Continuous)"은 보통의 단어 주머니 모델과 달리 단어를 연속 벡터로 표현한다는 뜻입니다.

왜 평균인가: 앞 단어들을 이어 붙이면(concatenate) 위치 정보가 남지만 그 뒤에 큰 층이 필요해집니다. 평균은 정보를 조금 잃는 대신 가장 싸고, 앞뒤 단어를 모두 쓸 수 있습니다.

숫자로 해 보기 (해설용, 2차원 벡터)

주변 단어 "the" = (0.2, 0.4), "sat" = (0.6, 0.0)이면 평균은 (0.4, 0.2)입니다. 후보 단어의 출력 벡터가 "cat" = (1, 1), "car" = (1, −1)이라면 점수(내적)는

  • cat: 0.4+0.2=0.60.4 + 0.2 = 0.6
  • car: 0.4−0.2=0.20.4 - 0.2 = 0.2

소프트맥스로 바꾸면 e0.6≈1.82e^{0.6} \approx 1.82, e0.2≈1.22e^{0.2} \approx 1.22이므로 cat 약 0.60, car 약 0.40입니다. 정답이 cat이면 cat 쪽 확률을 더 높이도록 벡터들이 조금씩 움직입니다.

4. 스킵그램 — 가운데 단어로 주변 단어 맞히기

한 문장 직관: "커피"라는 단어 하나만 보고 "주변에 '마신다', '아침', '카페'가 나오겠구나"를 맞히는 연습입니다.

단계별 설명

  1. 현재 단어 하나를 입력으로 넣습니다.
  2. 최대 거리 CC를 정하고, 매번 1∼C1 \sim C 사이에서 숫자 RR을 무작위로 뽑습니다.
  3. 앞 RR개 · 뒤 RR개, 모두 2R2R개 단어를 각각 정답으로 삼아 맞힙니다.
  4. 이렇게 하면 가까운 단어는 자주, 먼 단어는 드물게 학습에 쓰입니다.
Qskip=C×(D+D×log⁡2V)Q_{\text{skip}} = C \times \left(D + D \times \log_2 V\right)
기호뜻
CC주변 단어의 최대 거리(실험에서는 C=10C = 10)
DD입력 단어 벡터를 꺼내는 비용
D×log⁡2VD \times \log_2 V주변 단어 하나를 예측하는 출력 비용

왜 거리마다 다르게 뽑나: 범위를 넓히면 벡터 품질은 좋아지지만 계산이 늘어납니다. 먼 단어는 보통 덜 관련 있으니, 아예 빼지 않고 덜 자주 쓰는 방식으로 균형을 잡았습니다.

숫자로 해 보기 (해설용 계산)

C=5C = 5이면 RR은 1~5 중 하나입니다. 거리 1인 단어는 RR이 무엇이든 포함되니 확률 5/5=15/5 = 1, 거리 3인 단어는 R≥3R \ge 3일 때만이니 3/53/5, 거리 5인 단어는 R=5R = 5일 때만이니 1/51/5입니다. 가까운 단어일수록 더 많이 학습에 참여합니다.

5. 벡터 산수로 품질 재기

한 문장 직관: "big에서 biggest로 가는 화살표"를 small에 그대로 붙이면 smallest에 닿아야 좋은 벡터입니다.

단계별 설명

  1. 같은 관계의 단어 쌍 두 개로 질문을 만듭니다. 예: big : biggest = small : ?
  2. 아래처럼 벡터를 계산합니다.
  3. 사전에서 XX와 코사인 거리가 가장 가까운 단어를 고릅니다(질문에 쓴 단어는 뺍니다).
  4. 정확히 "smallest"일 때만 정답입니다. 동의어도 오답으로 칩니다.
X=vec(biggest)−vec(big)+vec(small)X = \mathrm{vec}(\text{biggest}) - \mathrm{vec}(\text{big}) + \mathrm{vec}(\text{small})
기호뜻
vec(w)\mathrm{vec}(w)단어 ww의 벡터
vec(biggest)−vec(big)\mathrm{vec}(\text{biggest}) - \mathrm{vec}(\text{big})"최상급으로 만드는" 방향
XXsmall에 그 방향을 더한 지점

이를 위해 저자들은 의미 질문 5종 8,869개, 문법 질문 9종 10,675개로 된 테스트 세트를 새로 만들었습니다. 수도-나라, 통화, 도시-주, 남성-여성, 비교급, 최상급, 과거형, 복수형 같은 관계입니다. 여러 단어로 된 이름(New York 등)은 넣지 않았습니다.

숫자로 해 보기 (해설용, 2차원 벡터)

big = (1, 0), biggest = (1, 2), small = (−1, 0)이면 X=(1,2)−(1,0)+(−1,0)=(−1,2)X = (1,2) - (1,0) + (-1,0) = (-1, 2)입니다.

  • smallest = (−1, 1.9): 내적 1+3.8=4.81 + 3.8 = 4.8, 길이 곱 ≈2.236×2.147≈4.80\approx 2.236 \times 2.147 \approx 4.80 → 코사인 약 1.00
  • smaller = (−1, 1): 내적 1+2=31 + 2 = 3, 길이 곱 ≈2.236×1.414≈3.16\approx 2.236 \times 1.414 \approx 3.16 → 코사인 약 0.95

smallest가 더 가까우니 정답입니다.

결과

같은 데이터 · 640차원 벡터로 구조 비교 (LDC 말뭉치 3억 2천만 단어, 사전 8만 2천 단어, 정확도 %)

모델의미문법
RNNLM936
NNLM2353
CBOW2464
스킵그램5559

CBOW는 문법 문제에서, 스킵그램은 의미 문제에서 특히 강했습니다. 비교 대상 RNNLM은 CPU 하나로 약 8주 학습한 모델입니다.

데이터와 차원은 함께 늘려야 합니다. 구글 뉴스 말뭉치(약 60억 토큰, 사전 상위 100만 단어)의 부분 데이터로 CBOW를 실험하니, 차원만 키우거나 데이터만 늘리면 어느 순간 개선이 줄었습니다(질문은 상위 3만 단어로 제한). 예를 들어 7억 8,300만 단어에서 600차원은 50.4%, 50차원은 23.2%였습니다. 저자들은 "데이터를 두 배로 늘리는 비용은 벡터 차원을 두 배로 늘리는 비용과 비슷하다"고 정리합니다.

한 에폭 vs 세 에폭: 같은 데이터를 세 번 도는 것보다 두 배 데이터를 한 번 도는 쪽이 비슷하거나 더 나았고, 조금 더 빨랐습니다. 학습률은 0.025에서 시작해 끝에서 0이 되도록 선형으로 줄였습니다.

분산 학습(DistBelief, 구글 뉴스 60억 단어, 모델 복제본 50~100개)

모델차원의미문법전체학습 시간(일 × CPU 코어)
NNLM10034.264.550.814 × 180
CBOW100057.368.963.72 × 140
스킵그램100066.165.165.62.5 × 125

MS 문장 완성 과제(1,040문장, 보기 5개 중 빈칸 단어 고르기): 스킵그램 단독은 48.0%로 LSA 유사도(49%)보다 낮았지만, RNNLM과 가중 결합하니 58.9%로 기존 최고(55.4%)를 넘었습니다.

그 밖에 관계 벡터를 예시 하나가 아니라 열 개의 평균으로 만들면 최고 모델 정확도가 절대값으로 약 10% 올랐다고 보고합니다. 논문 뒤에 붙은 후속 작업 절에서는, 공개한 C++ 코드가 일반적인 설정에서 시간당 수십억 단어를 처리하며, 1,000억 단어 넘게 학습한 개체명 벡터 140만 개 이상도 공개했다고 적습니다.

왜 중요한가 · 이후 영향

  • "단순한 모델 + 큰 데이터"의 힘: 표현력을 일부 포기하는 대신 훨씬 많은 데이터를 학습하는 편이 낫다는 것을 보였습니다. 이 생각은 이후 대규모 사전학습과 스케일링 연구로 이어집니다.
  • 임베딩의 대중화: 공개된 코드와 벡터 덕분에 단어 벡터가 검색 · 추천 · 분류 등 여러 NLP 시스템의 기본 부품이 됐습니다. 지금 RAG에서 쓰는 문장 임베딩도 같은 계보입니다.
  • 선형 구조의 발견: 의미 관계가 벡터 공간에서 "방향"으로 나타난다는 관찰은 이후 표현 학습 · 해석 가능성 연구에 큰 영향을 줬습니다.

한계 · 주의할 점

  • 단어마다 벡터가 하나뿐입니다. "배(과일)"와 "배(선박)"를 구별하지 못합니다. 문맥에 따라 벡터가 달라지는 방식은 이후 BERT 같은 문맥 표현이 해결합니다.
  • 사전에 없는 단어는 표현하지 못합니다. 테스트 세트도 한 토큰짜리 단어만 담았습니다. 서브워드 토큰화(BPE)가 이 문제를 다룹니다.
  • 평가 방식의 한계: 정확히 일치할 때만 정답이라 동의어를 오답으로 셉니다. 단어 형태 정보를 쓰지 않으니 저자들도 100%는 사실상 불가능하다고 밝힙니다.
  • CPU 수치는 추정치입니다. 데이터센터 기계를 다른 작업과 나눠 써서 CPU 코어 수가 정확하지 않다고 논문이 밝힙니다.
  • 이 논문의 출력층은 계층적 소프트맥스입니다. word2vec과 함께 자주 언급되는 네거티브 샘플링은 이 논문에 없고, 저자들이 예고한 NIPS 2013 후속 논문에서 다룹니다.

이어서 읽을 것

용어 정리

용어쉬운 뜻
단어 벡터 · 임베딩(embedding)단어를 수백 개 숫자의 좌표로 나타낸 것. 뜻이 비슷하면 가까이 놓입니다.
원-핫 인코딩(one-hot)사전 크기만큼 칸을 만들고 해당 단어 칸만 1로 둔 표현
신경망 언어 모델(NNLM)앞 단어들로 다음 단어 확률을 맞히는 신경망
은닉층(hidden layer)입력과 출력 사이에서 비선형 변환을 하는 층. 비용이 큽니다.
소프트맥스(softmax)점수들을 합이 1인 확률로 바꾸는 함수
계층적 소프트맥스사전 전체 대신 이진 트리의 갈림길 확률만 계산하는 방법
허프만 트리(Huffman tree)자주 나오는 항목에 짧은 경로를 주는 이진 트리
CBOW주변 단어 평균으로 가운데 단어를 맞히는 모델
스킵그램(Skip-gram)가운데 단어로 주변 단어를 맞히는 모델
코사인 유사도두 벡터 방향이 얼마나 같은지(1에 가까울수록 비슷)
에폭(epoch)학습 데이터를 한 바퀴 다 보는 것

스스로 점검

  1. NNLM에서 비용이 가장 큰 부분은 어디였고, word2vec은 그것을 어떻게 했나요?

    계층적 소프트맥스로 출력 비용을 줄인 뒤에는 투영층 → 은닉층(N×D×HN \times D \times H)이 가장 컸습니다. word2vec은 비선형 은닉층을 아예 뺐습니다.

  2. CBOW와 스킵그램은 무엇을 입력하고 무엇을 맞히나요? 어느 쪽이 의미 문제에 강했나요?

    CBOW는 주변 단어 평균으로 가운데 단어를, 스킵그램은 가운데 단어로 주변 단어를 맞힙니다. 논문 비교에서 의미 문제는 스킵그램이 크게 앞섰습니다.

  3. "big : biggest = small : ?"를 벡터로 어떻게 푸나요?

    biggest − big + small을 계산하고, 그 결과와 코사인 거리가 가장 가까운 단어(질문 단어 제외)를 고릅니다. 정확히 smallest여야 정답입니다.

다음에 볼 것

이 글을 이해했다면 이어서 보면 좋은 항목입니다.

출처

AI 원리부터 이해하기 · NLP·트랜스포머 모듈

NLP·트랜스포머 모듈 학습

이 글은 NLP·트랜스포머 모듈의 학습 자료입니다. 전체 23개 자료 중 3번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

요약만

arXiv (논문별 상이)

arXiv 1301.3781