← 아카이브
AI Fundamentals

컴퓨터는 어떻게 단어의 의미를 이해하게 되었을까?


지금의 ChatGPT, Claude, Gemini, Grok까지 수많은 인공지능들이 어떻게 사람의 "언어"를 이해하고 우리의 질문에 답을 할 수 있게 됐을까?

이 질문의 답에 중요한 전환점을 만든 연구가 있었다. 단어의 의미를 효율적으로 벡터에 담아낸 word2vec이다.

왜 기존 NLP는 단어를 이해하지 못했을까

기존 NLP 시스템은 단어를 단순히 어휘 사전의 인덱스(atomic units)로 취급했다.

예를 들어 사과 = 137 바나나 = 921 였다.

컴퓨터는 137과 921이 얼마나 비슷한지 알 수 없다. "사과"와 "바나나"의 관계나 "사과"와 "자동차"의 관계나 컴퓨터 입장에서는 차이가 없다.

Traditional NLP Limitation
Generated by Gen AI

word2vec의 핵심 아이디어

분산 표현이라는 아이디어는 이전에도 존재했다. word2vec이 바꾼 것은 이를 대규모 데이터에서도 빠르고 실용적으로 학습할 수 있게 만든 점이었다.

Vector Space
Generated by Gen AI

동시에 기존 신경망 모델에서 가장 많은 계산량을 차지하던 non-linear hidden layer를 제거했다. 더 정교한 모델을 만드는 대신, 더 큰 데이터셋에서 더 효율적으로 학습할 수 있는 쪽을 선택한 것이다.

이 두 가지 아이디어, 즉 단어를 좌표로 표현하는 것과 계산을 가볍게 만드는 것을 구현한 것이 CBOW와 Skip-gram이라는 두 모델이다.

벡터는 어떻게 만들어질까

기존에는 사과 = 137 바나나 = 921 였다. 컴퓨터는 137과 921이 얼마나 비슷한지 알 수 없다.

word2vec은 사과 = (0.2, ...) 바나나 = (0.19, ...) 처럼 좌표를 만들었다. 그래서 거리를 계산할 수 있게 되었다.

이 좌표는 세 단계를 거쳐 만들어진다.

먼저 **1-of-V 인코딩(One-hot Encoding)**이다. 어휘 사전의 크기가 VV라고 할 때, 각 단어는 해당 번호 위치만 1이고 나머지는 모두 0인 벡터로 표현된다. 이 단계에서는 단어 간의 유사성을 전혀 알 수 없다. 137, 921과 다를 게 없는 상태다.

이 인코딩된 단어는 Projection Layer를 통과하는데, 쉽게 말하면 Projection Layer는 거대한 좌표 사전이다. One-hot 벡터는 이 사전에서 몇 번째 페이지를 펼칠지 알려주는 색인일 뿐이고, 그 페이지에 적힌 값이 바로 그 단어의 진짜 벡터다.

Projection Layer
Generated by Gen AI

조금 더 정확히 말하면, 모든 단어는 Shared Projection Matrix를 거치는데 이 행렬의 각 행이 단어의 벡터값이다. 예를 들어 100만 개의 단어를 300차원 벡터로 만든다면, 이 행렬은 1,000,000×3001,000,000 \times 300의 크기를 가진다. 특정 단어의 인덱스가 이 행렬과 곱해지면 그 단어에 해당하는 Dense Vector, 즉 그 페이지에 적힌 좌표값이 추출된다.

처음에는 이 사전의 페이지들이 무작위 숫자로 채워져 있다. 하지만 CBOW와 Skip-gram 작업을 수행하면서 값이 정교해진다. 모델은 "이 문맥에서 이 단어가 나올 확률이 높은가?"를 계속해서 계산하고, 예측이 틀리면 Projection Matrix 내 해당 단어 벡터값을 조금씩 수정한다. 이를 Backpropagation이라고 한다. 수억 번의 반복 학습을 거치면, 비슷한 문맥에서 자주 등장하는 단어들이 벡터 공간상에서 서로 가까운 위치에 모이게 된다.

쉽게 이야기해서 단어를 벡터로 바꾸는 것은, 처음엔 임의의 좌표에 단어들을 뿌려놓았다가 수십억 개의 문장을 읽히며 의미가 비슷한 단어들끼리 가까이 모이도록 좌표를 계속 수정해 나가는 과정이다.

왜 King - Man + Woman = Queen이 가능할까

학습이 완료되면 각 단어는 고유한 벡터값을 가지게 되고, 이 값들은 단순한 숫자가 아니라 언어적 규칙성을 담게 된다.

Word Offset
Generated by Gen AI

이 벡터값들은 **선형적인 규칙성(Linear Regularity)**을 보존하기 때문에, vector(King)vector(Man)+vector(Woman)vector(\text{King}) - vector(\text{Man}) + vector(\text{Woman})을 계산하면 vector(Queen)vector(\text{Queen})과 가장 가까운 벡터가 나타나는 현상이 관찰되었다. 프랑스:파리 = 독일:베를린 같은 관계도 마찬가지다. 단어 벡터 간의 단순한 대수적 연산(Word Offset)을 통해 단어 사이의 복잡한 관계를 파악할 수 있게 된 것이다.

CBOW와 Skip-gram은 어떻게 다를까

word2vec에는 두 가지 새로운 모델이 도입되었다.

CBOW vs. Skip-gram
Generated by Gen AI

Continuous Bag-of-Words

첫번째로 CBOW이다. CBOW 모델은 주변에 나타나는 문맥 단어들을 통해 현재 위치의 단어를 예측하는 방식이다.

Input layer에서 현재 단어를 둘러싼 앞뒤 단어들(문맥)을 input으로 받는다. 예를 들어, 앞의 단어 4개와 뒤의 단어 4개를 input으로 받는 것이다.

Input으로 받은 단어들을 동일한 투사 행렬을 공유하고 이 단어 벡터들의 평균을 내어 하나의 위치로 투사한다. 이는 projection layer에서 수행된다.

이 과정에서 단어들의 순서가 projection에 영향을 주지 않기 때문에 'Bag-of-words'라고 불린다. 기존의 Feed-forward 신경망(NNLM)과 유사하지만 non-linear hidden layer가 없어서 계산이 매우 빠르다.

CBOW 모델의 강점은 구문적(Syntactic) 작업에서 뛰어난 성능을 보인다. 또한 주변 단어들을 평균 내어 학습하므로 Skip-gram보다 학습 속도가 더 빠를 수 있다.

쉽게 이야기해서 수능 영어 영역에서의 빈칸 추론 문제와 같다. 문장 중간에 구멍이 뚫려 있고, 이를 그 앞뒤에 있는 단어들을 힌트 삼아 맞추는 방식이다. 그래서 단어의 문법적인 규칙을 파악하는데 강점이 있다.

Continuous Skip-gram

두번째로 Continuous Skip-gram 모델이다.

이 모델은 CBOW 모델과 반대로 현재 단어를 기반으로 같은 문장 내 주변 단어들을 예측하는 방식이다.

현재 단어를 input으로 해서 로그 선형 분류기에 넣고 현재 단어 전후의 일정 범위(C) 내에 있는 단어들을 예측한다.

이 일정 범위(C)를 넓힐수록 단어 벡터의 품질은 향상되지만 계산 복잡도는 증가한다. 또한 가중치 조절을 하는데, 현재 단어에서 멀리 떨어진 단어일수록 관련성이 적을 가능성이 높아 먼 거리의 단어는 샘플링 비중을 줄여 가중치를 낮게 준다.

예를 들어 C=10C=10인 경우, 매번 1에서 10 사이의 임의의 숫자 RR을 선택해 앞뒤로 RR개씩 총 R×2R \times 2개의 단어를 분류 작업의 레이블로 사용한다.

이 모델은 의미론적(Semantic) 작업에서 CBOW나 다른 신경망 모델보다 압도적으로 우수한 성능을 보여준다. 특히 프랑스:파리 = 독일:베를린, 왕 - 남자 + 여자 = 여왕 같은 정교한 관계를 파악하는 능력이 탁월하다.

둘은 언제 쓰나

두 모델을 매번 동시에 쓰기에는 계산량이 많아진다. 그래서 사용자의 목적에 따라 하나를 선택해서 사용한다. 초기 실험에서는 CBOW가 문법적 유사성, 구문적 관계,에서 Skip-gram이 의미적 관계에서 상대적으로 강한 경향을 보였다. 다만 실제 성능은 데이터와 학습 조건에 따라 달라진다.

초기 논문에서 두 모델은 output 계산량을 줄이기 위해 Hierarchical Softmax를 사용했다. 이후 후속 연구에서는 더 단순한 Negative Sampling도 도입되었다. 단어 빈도에 기반한 Huffman tree 구조를 통해 대규모 어휘 사전을 효율적으로 처리한다.

왜 둘 다 중요했나

성능 보완을 위해서 다른 모델과 함께 쓰이기도 한다. 예를 들면 Continuous Skip-gram 모델과 RNN 기반 언어 모델을 결합하여 문장 완성 테스트(Microsoft Sentence Completion Challenge)를 수행했을 때, 단일 모델을 썼을 때보다 더 높은 정확도를 기록해서 당시 SOTA를 경신했다.

또한 상호 보완적 특징으로 더 정교한 결과를 얻기 위해 두 모델들의 결과를 가중치 조합(Weighted combination) 방식으로 섞어서 활용하기도 한다. 하나의 정답만 있는 게 아니라, 목적에 따라 선택하거나 조합할 수 있다는 유연함이 word2vec을 실무에서 오래 살아남게 만든 이유 중 하나다.

수식으로 보면

CBOW는

Q=N×D+D×log2VQ = N \times D + D \times \log_{2}{V}

Skip-gram은

Q=C×(D+D×log2V)Q = C \times (D + D \times \log_2{V})

NN은 문맥 단어 수, DD는 벡터 차원, VV는 어휘 사전 크기, CC는 최대 거리다.

word2vec은 어떻게 세상에 퍼졌을까

논문만 발표된 것이 아니었다. Google은 학습된 벡터와 구현까지 함께 공개했다.

Google은 약 1,000억 단어 규모의 뉴스 데이터로 학습한 300차원의 단어, 구문 벡터 약 300만 개와 구현을 공개해서 이를 가져다 쓸 수 있게 했다. 또한 CBOW와 Skip-gram 아키텍처를 누구나 자신의 데이터로 학습시킬 수도 있게 했다.

덕분에 연구실 안에서 끝나지 않고 실제 NLP 산업 전반으로 빠르게 퍼질 수 있었다. 하지만 중요했던 건 라이브러리 자체가 아니다. 단어를 의미 있는 벡터 공간으로 표현하는 방식을 실용적인 수준으로 만든 것이 중요했다.

논문에서도 단어 벡터를 먼저 학습한 뒤, 그 위에 다른 모델을 쌓아 올리는 2단계 학습 방식이 매우 효율적이라고 강조했다.

word2vec은 왜 이름이 word2vec일까

지금까지 본 것들을 한 번 되짚어보자. 분산 표현, Projection Layer, CBOW, Skip-gram, Hierarchical Softmax. 이름은 복잡하지만 이 모든 것이 하고 있던 일은 사실 하나였다.

단어(word)를 벡터(vector)로 바꾸는 것.

이름 그대로다. "word to vector." 논문에서 등장한 모든 장치들, 즉 계산량을 줄이기 위한 구조든 정확도를 높이기 위한 구조든, 결국 이 하나의 목표에 대한 답이었다. 좋은 좌표를 어떻게 더 효율적으로, 더 정확하게 만들어낼 것인가.

word2vec의 한계

여기까지만 보면 word2vec은 완벽해 보인다. 하지만 이 벡터에는 결정적인 한계가 하나 있다.

단어 하나당 벡터는 딱 하나다.

"bank"라는 단어를 생각해보자. 강둑이라는 뜻도 있고 은행이라는 뜻도 있다. 그런데 word2vec은 이 두 가지 의미를 구분하지 못한다. 문장이 뭐든 "bank"는 항상 같은 좌표를 가진다.

Static Embedding, 즉 정적 벡터이기 때문이다. 학습이 끝나는 순간 벡터는 고정된다. 문맥에 따라 의미가 달라지는 단어를 다룰 방법이 없다.

왜 지금 LLM까지 이어졌을까

word2vec이 만든 건 벡터 그 자체보다 하나의 흐름이었다. 단어 벡터를 먼저 학습시켜두고, 그 위에 다른 작업을 쌓아 올리는 방식. Pre-train된 단어 벡터를 여러 NLP 작업에 재사용하는 흐름을 실용화하고 널리 확산시켰다.

동시에 word2vec이 남긴 숙제도 있다. 벡터가 고정되어 있다는 것.

이 숙제를 푼 게 이전에 다뤘던 ELMo였다. ELMo는 같은 단어라도 문맥에 따라 벡터가 달라지게 만들었다. "bank"가 강둑으로 쓰였는지 은행으로 쓰였는지에 따라 다른 벡터를 갖게 된 것이다. 그리고 이 흐름은 BERT로 이어졌다. BERT는 양방향으로 문맥을 읽어서, ELMo보다 더 정교하게 단어의 의미를 문맥 속에서 파악했다.

마무리

사람도 처음 말을 배울 때 단어부터 배운다. 컴퓨터가 언어를 배울 때도 마찬가지였다. 사람의 단어를 컴퓨터의 단어인 숫자로, 정확히는 좌표로 바꾸는 것에서부터 시작된 것이다.

word2vec은 컴퓨터에게 단어의 의미를 처음 가르친 모델은 아니다.
대신 단어 사이의 관계를 벡터 공간에 담는 방법을 빠르고 실용적인 규모로 확장했다.

오늘날의 LLM은 word2vec과 다른 구조로 문맥 속 토큰 표현을 학습한다. 하지만 언어의 관계를 숫자와 공간으로 표현할 수 있다는 관점은 여전히 이어지고 있다.

word2vec이 남긴 가장 중요한 것은 하나의 라이브러리나 유명한 벡터 연산이 아니다.

언어의 관계도 계산 가능한 구조로 바꿀 수 있다는 사실을 널리 보여준 것이다.