단어를 벡터로 효율적으로 표현하기 (word2vec)
은닉층 없는 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·트랜스포머 · 기초 |
| 먼저 알면 좋은 것 | 원-핫 인코딩, 소프트맥스, 신경망 언어 모델, 코사인 유사도, 확률적 경사 하강법 |
들어가기 전에
이 해설은 아래 내용을 안다고 보고 씁니다. 처음이라면 먼저 읽고 오면 수식과 손계산을 훨씬 쉽게 따라올 수 있습니다.
- 임베딩과 벡터 유사도: 원-핫에서 의미 공간까지 — 원-핫의 한계, 임베딩 조회, 내적 · 코사인 유사도를 손계산으로 익히는 기초 수업
- 딥러닝 문서로 배우기 (D2L) — 소프트맥스 · 교차 엔트로피 · ReLU MLP · 자동 미분 · PyTorch 학습 루프를 한 번에 익히는 수업
한눈에 보기
- 단어를 "번호"가 아니라 "수백 차원의 좌표"로 나타내면 비슷한 단어끼리 가까이 모인다는 것을 알게 됩니다.
- 기존 신경망 언어 모델이 왜 느렸는지(은닉층 · 출력층), word2vec이 무엇을 빼서 빨라졌는지 알게 됩니다.
- CBOW(주변 → 가운데)와 스킵그램(가운데 → 주변)의 차이와 각자 잘하는 문제를 알게 됩니다.
- 벡터 덧셈 · 뺄셈으로 "비교급 관계", "수도-나라 관계"를 푸는 평가 방법을 알게 됩니다.
초록 (번역)
아주 큰 데이터에서 단어의 연속 벡터 표현을 계산하는 새로운 모델 구조 두 가지를 제안합니다. 표현의 품질은 단어 유사도 과제로 측정하고, 여러 종류의 신경망에 기반한 기존 최고 기법들과 결과를 비교합니다. 그 결과 훨씬 적은 계산 비용으로 정확도가 크게 좋아졌습니다. 예를 들어 16억 단어 데이터에서 질 좋은 단어 벡터를 배우는 데 하루가 채 걸리지 않습니다. 또한 이 벡터들이 문법적 · 의미적 단어 유사도를 재는 저자들의 테스트 세트에서 최고 수준의 성능을 낸다는 것을 보입니다.
무엇을 풀었나
당시 많은 자연어 처리 시스템은 단어를 사전의 번호로만 다뤘습니다. "고양이"가 17번, "강아지"가 4,203번이면, 두 단어가 비슷하다는 정보는 어디에도 없습니다. 단순하고 튼튼해서 N-그램 같은 방법이 오래 쓰였지만, 데이터를 늘리는 것만으로는 더 나아지기 어려운 과제가 많았습니다.
단어를 연속 벡터로 표현하는 신경망 언어 모델(NNLM, Neural Network Language Model)은 이미 N-그램보다 낫다고 알려져 있었습니다. 문제는 속도였습니다. 저자들에 따르면 기존 구조 가운데 수억 단어를 넘는 데이터로, 50~100차원보다 큰 벡터를 학습한 사례가 없었습니다.
계산을 무겁게 만드는 곳은 두 군데였습니다.
- 비선형 은닉층: 입력 단어들을 벡터로 바꾼 뒤 수백~천 개 단위의 은닉층을 거칩니다.
- 출력층: 다음 단어의 확률을 사전 전체(개, 수십만~백만)에 대해 계산해야 합니다.
이 논문의 질문은 "표현력을 조금 잃더라도 모델을 훨씬 단순하게 만들어, 훨씬 많은 데이터를 먹이면 어떨까?"였습니다.
전체 흐름
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. 비용을 "학습 중 건드리는 파라미터 수"로 잰다
한 문장 직관: 공장 생산 비용을 "하루 몇 개 × 개당 몇 분"으로 따지듯, 모델 비용을 "단어 수 × 단어 하나 학습 비용"으로 따집니다.
단계별 설명
- 학습은 데이터의 단어를 하나씩 보며 진행합니다.
- 단어 하나를 학습할 때 손대야 하는 파라미터 수를 라 합니다.
- 데이터 전체를 몇 번 반복하는지(에폭)와 단어 수를 곱하면 전체 비용이 나옵니다.
| 기호 | 뜻 |
|---|---|
| 전체 학습 비용 | |
| 에폭 수(데이터를 몇 바퀴 도는지, 논문: 보통 3~50) | |
| 학습 데이터의 단어 수(논문: 최대 10억 정도가 흔함) | |
| 단어 하나당 비용 — 모델마다 다름 |
기존 두 모델의 는 다음과 같습니다.
| 기호 | 뜻 |
|---|---|
| 입력으로 쓰는 앞 단어 개수 | |
| 단어 벡터의 차원 | |
| 은닉층 크기 | |
| 사전 크기 | |
| 단어들을 벡터로 바꾸는 투영 비용 | |
| 투영층 → 은닉층 비용 | |
| 은닉층 → 사전 전체 출력 비용 |
출력 비용 는 뒤에 나올 계층적 소프트맥스로 수준까지 줄일 수 있습니다. 그러면 남는 가장 큰 항은 , 곧 은닉층입니다. 그래서 저자들은 은닉층을 빼기로 합니다.
숫자로 해 보기 (해설용 계산, 논문 수치 아님)
논문이 "흔한 선택"으로 든 범위 안에서 , , , 으로 잡아 봅니다().
- 투영:
- 은닉층:
- 출력(계층적 소프트맥스 사용 시):
은닉층 하나가 나머지를 합친 것의 160배가 넘습니다. 병목이 어디인지 숫자로 바로 보입니다.
2. 허프만 트리 계층적 소프트맥스
한 문장 직관: 백만 명 중 한 사람을 찾을 때 한 명씩 다 확인하지 않고 "서울? 아니면 지방?" 같은 예/아니요 질문 스무 번으로 좁히는 방식입니다.
단계별 설명
- 사전의 모든 단어를 이진 트리의 잎(leaf)에 둡니다.
- 뿌리에서 정답 단어까지 가는 길의 갈림길마다 "왼쪽일 확률"을 계산합니다.
- 그 확률들을 곱하면 정답 단어의 확률이 됩니다. 사전 전체를 계산할 필요가 없습니다.
- 저자들은 허프만 트리(Huffman tree)를 씁니다. 자주 나오는 단어에 짧은 길을 주는 트리입니다.
균형 트리라면 약 번 판단하면 되고, 허프만 트리는 평균적으로 그보다 적습니다(논문 표기로는 약 ). 논문은 사전이 100만 단어일 때 평가가 약 두 배 빨라진다고 적습니다.
왜 허프만 트리인가: 은닉층이 없는 새 모델에서는 출력 계산이 거의 전부입니다. 그래서 출력 쪽을 한 번 더 줄이는 효과가 커집니다. 저자들은 단어 빈도로 묶는 방식이 신경망 언어 모델에서 잘 통한다는 이전 관찰을 근거로 듭니다.
숫자로 해 보기 (해설용 예)
단어 4개의 출현 비율이 the 50% · cat 25% · sat 15% · mat 10%라고 합시다.
| 단어 | 허프만 경로 | 판단 횟수 |
|---|---|---|
| the | 0 | 1 |
| cat | 10 | 2 |
| sat | 110 | 3 |
| mat | 111 | 3 |
평균 판단 횟수는 번입니다. 균형 트리는 모든 단어가 2번이므로, 자주 나오는 단어 덕분에 평균이 줄었습니다.
3. CBOW — 주변 단어로 가운데 단어 맞히기
한 문장 직관: "나는 아침에 ___ 를 마신다"에서 빈칸을 맞히는 문제를 수십억 번 풀게 하면, 빈칸에 들어갈 만한 단어들(커피 · 우유 · 차)이 비슷한 벡터를 갖게 됩니다.
단계별 설명
- 가운데 단어 앞뒤로 몇 개씩 단어를 고릅니다. 논문에서는 앞 4개 · 뒤 4개일 때 가장 좋았습니다.
- 각 주변 단어의 벡터를 꺼내 평균을 냅니다. 순서는 무시합니다(그래서 "단어 주머니, bag-of-words").
- 그 평균 벡터로 가운데 단어가 무엇인지 분류합니다(로그 선형 분류기).
- 틀린 만큼 단어 벡터를 고칩니다.
| 기호 | 뜻 |
|---|---|
| 주변 단어 개의 벡터를 꺼내 평균 내는 비용 | |
| 평균 벡터로 계층적 소프트맥스 출력을 계산하는 비용 |
NNLM과 비교하면 은닉층 항 가 통째로 사라졌습니다. 이름의 "연속(Continuous)"은 보통의 단어 주머니 모델과 달리 단어를 연속 벡터로 표현한다는 뜻입니다.
왜 평균인가: 앞 단어들을 이어 붙이면(concatenate) 위치 정보가 남지만 그 뒤에 큰 층이 필요해집니다. 평균은 정보를 조금 잃는 대신 가장 싸고, 앞뒤 단어를 모두 쓸 수 있습니다.
숫자로 해 보기 (해설용, 2차원 벡터)
주변 단어 "the" = (0.2, 0.4), "sat" = (0.6, 0.0)이면 평균은 (0.4, 0.2)입니다. 후보 단어의 출력 벡터가 "cat" = (1, 1), "car" = (1, −1)이라면 점수(내적)는
- cat:
- car:
소프트맥스로 바꾸면 , 이므로 cat 약 0.60, car 약 0.40입니다. 정답이 cat이면 cat 쪽 확률을 더 높이도록 벡터들이 조금씩 움직입니다.
4. 스킵그램 — 가운데 단어로 주변 단어 맞히기
한 문장 직관: "커피"라는 단어 하나만 보고 "주변에 '마신다', '아침', '카페'가 나오겠구나"를 맞히는 연습입니다.
단계별 설명
- 현재 단어 하나를 입력으로 넣습니다.
- 최대 거리 를 정하고, 매번 사이에서 숫자 을 무작위로 뽑습니다.
- 앞 개 · 뒤 개, 모두 개 단어를 각각 정답으로 삼아 맞힙니다.
- 이렇게 하면 가까운 단어는 자주, 먼 단어는 드물게 학습에 쓰입니다.
| 기호 | 뜻 |
|---|---|
| 주변 단어의 최대 거리(실험에서는 ) | |
| 입력 단어 벡터를 꺼내는 비용 | |
| 주변 단어 하나를 예측하는 출력 비용 |
왜 거리마다 다르게 뽑나: 범위를 넓히면 벡터 품질은 좋아지지만 계산이 늘어납니다. 먼 단어는 보통 덜 관련 있으니, 아예 빼지 않고 덜 자주 쓰는 방식으로 균형을 잡았습니다.
숫자로 해 보기 (해설용 계산)
이면 은 1~5 중 하나입니다. 거리 1인 단어는 이 무엇이든 포함되니 확률 , 거리 3인 단어는 일 때만이니 , 거리 5인 단어는 일 때만이니 입니다. 가까운 단어일수록 더 많이 학습에 참여합니다.
5. 벡터 산수로 품질 재기
한 문장 직관: "big에서 biggest로 가는 화살표"를 small에 그대로 붙이면 smallest에 닿아야 좋은 벡터입니다.
단계별 설명
- 같은 관계의 단어 쌍 두 개로 질문을 만듭니다. 예: big : biggest = small : ?
- 아래처럼 벡터를 계산합니다.
- 사전에서 와 코사인 거리가 가장 가까운 단어를 고릅니다(질문에 쓴 단어는 뺍니다).
- 정확히 "smallest"일 때만 정답입니다. 동의어도 오답으로 칩니다.
| 기호 | 뜻 |
|---|---|
| 단어 의 벡터 | |
| "최상급으로 만드는" 방향 | |
| small에 그 방향을 더한 지점 |
이를 위해 저자들은 의미 질문 5종 8,869개, 문법 질문 9종 10,675개로 된 테스트 세트를 새로 만들었습니다. 수도-나라, 통화, 도시-주, 남성-여성, 비교급, 최상급, 과거형, 복수형 같은 관계입니다. 여러 단어로 된 이름(New York 등)은 넣지 않았습니다.
숫자로 해 보기 (해설용, 2차원 벡터)
big = (1, 0), biggest = (1, 2), small = (−1, 0)이면 입니다.
- smallest = (−1, 1.9): 내적 , 길이 곱 → 코사인 약 1.00
- smaller = (−1, 1): 내적 , 길이 곱 → 코사인 약 0.95
smallest가 더 가까우니 정답입니다.
결과
같은 데이터 · 640차원 벡터로 구조 비교 (LDC 말뭉치 3억 2천만 단어, 사전 8만 2천 단어, 정확도 %)
| 모델 | 의미 | 문법 |
|---|---|---|
| RNNLM | 9 | 36 |
| NNLM | 23 | 53 |
| CBOW | 24 | 64 |
| 스킵그램 | 55 | 59 |
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 코어) |
|---|---|---|---|---|---|
| NNLM | 100 | 34.2 | 64.5 | 50.8 | 14 × 180 |
| CBOW | 1000 | 57.3 | 68.9 | 63.7 | 2 × 140 |
| 스킵그램 | 1000 | 66.1 | 65.1 | 65.6 | 2.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) | 학습 데이터를 한 바퀴 다 보는 것 |
스스로 점검
- NNLM에서 비용이 가장 큰 부분은 어디였고, word2vec은 그것을 어떻게 했나요?
계층적 소프트맥스로 출력 비용을 줄인 뒤에는 투영층 → 은닉층()이 가장 컸습니다. word2vec은 비선형 은닉층을 아예 뺐습니다.
- CBOW와 스킵그램은 무엇을 입력하고 무엇을 맞히나요? 어느 쪽이 의미 문제에 강했나요?
CBOW는 주변 단어 평균으로 가운데 단어를, 스킵그램은 가운데 단어로 주변 단어를 맞힙니다. 논문 비교에서 의미 문제는 스킵그램이 크게 앞섰습니다.
- "big : biggest = small : ?"를 벡터로 어떻게 푸나요?
biggest − big + small을 계산하고, 그 결과와 코사인 거리가 가장 가까운 단어(질문 단어 제외)를 고릅니다. 정확히 smallest여야 정답입니다.
다음에 볼 것
이 글을 이해했다면 이어서 보면 좋은 항목입니다.
- 언어 모델의 기본: 다음 토큰 예측 · 퍼플렉서티 · 샘플링 — 다음 토큰 예측 · n-gram · 소프트맥스 · 퍼플렉서티 · 디코딩을 손계산으로 익히는 수업
- 문장 임베딩: 샴 BERT 네트워크 (Sentence-BERT) — BERT를 샴 구조로 미세조정해 코사인으로 비교 가능한 문장 벡터를 만든 논문
출처
- 원문: arxiv.org/abs/1301.3781 (2013 · Tomas Mikolov 외)
AI 원리부터 이해하기 · NLP·트랜스포머 모듈
NLP·트랜스포머 모듈 학습
이 글은 NLP·트랜스포머 모듈의 학습 자료입니다. 전체 23개 자료 중 3번째입니다.
출처·원문
원문 보기요약만