인공지능과 딥러닝이 세상을 바꾸고 있는 지금, 가장 활발하게 연구되고 상용화된 분야 중 하나는 바로 자연어 처리(NLP, Natural Language Processing)입니다. 우리가 매일 사용하는 검색 엔진, 번역기, 그리고 챗봇(Chatbot)까지, 컴퓨터가 인간의 언어를 이해하고 구사하는 능력은 날이 갈수록 정교해지고 있습니다. 그런데 근본적인 의문이 하나 생깁니다. 컴퓨터는 기본적으로 0과 1로 이루어진 기계어만을 이해하는 계산기일 뿐인데, 도대체 어떻게 '사랑', '학교', '자동차'와 같은 추상적이고 복잡한 단어의 의미를 이해하는 것일까요?
그 비밀의 문을 여는 열쇠가 바로 '단어를 숫자로 바꾸는 기술', 즉 워드 임베딩(Word Embedding)입니다. 그리고 이 워드 임베딩의 역사에서 가장 기념비적인 혁신을 일으킨 주인공이 바로 오늘 우리가 깊이 파헤쳐 볼 Word2Vec입니다. 2013년 구글(Google) 연구팀이 발표한 이 기술은 자연어 처리의 패러다임을 완전히 뒤바꾸어 놓았습니다.
이 글에서는 Word2Vec이 등장하게 된 배경부터, 기존 방식의 한계를 극복한 원리, 그리고 구체적인 작동 알고리즘인 CBOW와 Skip-gram까지 아주 상세하게 알아보겠습니다. 컴퓨터가 인간의 언어를 배우는 마법 같은 과정을 함께 따라가 보시죠.
1. 컴퓨터가 단어를 이해하는 방식의 진화: 희소에서 밀집으로
Word2Vec의 위대함을 이해하기 위해서는, 먼저 그 이전의 방식들이 가졌던 한계점을 명확히 짚고 넘어가야 합니다. 딥러닝과 Word2Vec이 등장하기 전, 컴퓨터에게 단어를 가르치는 가장 고전적이고 기초적인 방식은 원-핫 인코딩(One-Hot Encoding)이었습니다.
원-핫 인코딩(One-Hot Encoding)의 치명적 한계
원-핫 인코딩은 아주 단순합니다. 전체 단어 집합의 크기만큼 벡터 차원을 만들고, 표현하고 싶은 단어의 인덱스에만 '1'을 부여하고 나머지는 모두 '0'으로 채우는 방식입니다. 예를 들어, 우리에게 ['강아지', '고양이', '사과', '노트북']이라는 단어장이 있다고 가정해 봅시다.
- 강아지: [1, 0, 0, 0]
- 고양이: [0, 1, 0, 0]
- 사과: [0, 0, 1, 0]
- 노트북: [0, 0, 0, 1]
이 방식은 직관적이고 구현하기 쉽다는 장점이 있지만, 자연어 처리의 성능을 높이는 데에는 두 가지 치명적인 걸림돌이 있었습니다.
단어의 의미나 관계를 전혀 담아내지 못합니다. 위의 벡터를 보면 '강아지'와 '고양이'는 둘 다 동물이라는 공통점이 있지만, 벡터 공간 상에서는 그저 서로 다른 축에 위치한 점일 뿐입니다. [1, 0, 0, 0]과 [0, 1, 0, 0] 사이에는 어떠한 수학적 연관성도 없습니다. 즉, 컴퓨터 입장에서는 '강아지'와 '고양이'의 차이가 '강아지'와 '노트북'의 차이와 똑같이 인식되는 것입니다.
희소성(Sparsity) 문제와 차원의 저주가 발생합니다. 실제 세상의 단어는 수십만 개에 달합니다. 만약 단어가 10만 개라면, 하나의 단어를 표현하기 위해 10만 차원의 벡터가 필요합니다. 그리고 그중 딱 하나의 숫자만 1이고 나머지 99,999개는 0으로 채워집니다. 이는 엄청난 메모리 낭비일 뿐만 아니라, 데이터가 너무 희소(Sparse)해서 신경망이 제대로 학습하기 어려운 환경을 만듭니다.
2. Word2Vec의 혁명: 의미를 벡터 공간에 뿌리다
이러한 원-핫 인코딩의 문제를 해결하기 위해 등장한 것이 바로 분산 표현(Distributed Representation)을 사용하는 Word2Vec입니다. Word2Vec의 핵심 아이디어는 언어학의 "분포 가설(Distributional Hypothesis)"에 기초합니다.
"비슷한 문맥에서 등장하는 단어들은 비슷한 의미를 가진다."
즉, '강아지'라는 단어 주변에는 '귀엽다', '짖다', '산책' 같은 단어가 자주 오고, '고양이' 주변에도 '귀엽다', '울다', '츄르' 같은 단어가 자주 옵니다. 주변 단어의 분포가 비슷하면, 그 중심 단어들의 의미도 비슷할 것이라는 가정입니다.
밀집 벡터(Dense Vector)로의 변환
Word2Vec은 단어를 밀집 벡터(Dense Vector)로 변환합니다. 수만 차원의 희소 벡터가 아니라, 사용자가 지정한(예: 128차원, 256차원) 비교적 낮은 차원의 실수값으로 단어를 압축하여 표현합니다. 이렇게 만들어진 벡터는 더 이상 0과 1이 아닌, [0.21, -0.54, 0.88, ...]과 같은 실수값을 가지며, 이를 통해 단어 간의 의미적 유사도를 수학적으로 계산할 수 있게 됩니다.
Word2Vec의 가장 유명한 예시가 바로 다음의 벡터 연산입니다.
King(왕) - Man(남자) + Woman(여자) = Queen(여왕)
이 수식은 단순한 우연이 아닙니다. Word2Vec이 단어를 단순한 기호가 아니라, '의미론적 속성'을 가진 벡터로 학습했다는 것을 증명합니다. 벡터 공간에서 '왕'의 위치에서 '남자'라는 속성 벡터를 빼고 '여자'라는 속성 벡터를 더했더니, 놀랍게도 '여왕'이 위치한 좌표와 가장 가까워졌다는 것입니다. 이는 컴퓨터가 단어의 의미를 '이해'하는 것처럼 보이게 만드는 결정적인 장면입니다.
3. Word2Vec의 두 가지 엔진: CBOW와 Skip-gram
Word2Vec은 크게 두 가지 학습 알고리즘을 통해 단어의 최적 벡터값을 찾아냅니다. 바로 CBOW(Continuous Bag of Words)와 Skip-gram입니다. 두 방식 모두 얕은 신경망(Shallow Neural Network)을 이용하지만, 문제를 푸는 방향이 서로 정반대입니다.
1) CBOW (Continuous Bag of Words)
CBOW는 "주변 단어들을 보고 중간에 들어갈 빈칸 단어를 맞추는" 방식입니다. 마치 우리가 영어 시험에서 빈칸 채우기 문제를 푸는 것과 같습니다.
- 예문: "The fat cat sat on the mat"
- 상황:
["The", "fat", "sat", "on"]이라는 주변 단어(Context words)가 주어졌을 때, - 목표: 가운데 있는
"cat"(Target word)을 예측하라.
CBOW 모델은 주변 단어들의 벡터를 입력받아 이를 평균 내거나 합친 후, 은닉층(Hidden Layer)을 거쳐 중심 단어가 무엇일지 확률적으로 예측합니다. 학습이 진행되면서 모델은 "'fat'과 'sat' 사이에 올 단어는 'cat'일 확률이 높다"는 것을 배우게 되고, 이 과정에서 문맥상 비슷한 위치에 오는 단어들은 벡터 공간에서도 가까운 위치에 모이게 됩니다. CBOW는 일반적으로 학습 속도가 빠르다는 장점이 있습니다.
2) Skip-gram
Skip-gram은 CBOW와 정반대의 매커니즘을 가집니다. "중심 단어 하나를 보고 그 주변에 어떤 단어들이 올지 맞추는" 방식입니다.
- 예문: "The fat cat sat on the mat"
- 상황:
"cat"(Center word)이라는 단어 하나가 주어졌을 때, - 목표: 주변에 있는
["The", "fat", "sat", "on"](Context words)을 예측하라.
Skip-gram은 중심 단어 하나로 주변의 여러 단어를 예측해야 하므로 CBOW보다 학습 난이도가 훨씬 높습니다. 하지만, 역설적으로 더 어려운 문제를 풀기 위해 노력하는 과정에서 드물게 등장하는 단어나 단어의 미세한 의미 차이를 학습하는 데에는 Skip-gram이 더 우수한 성능을 보입니다. 실제로 Word2Vec 논문뿐만 아니라 실무에서도 데이터의 양이 충분하다면 Skip-gram을 주로 사용하는 경향이 있습니다. 전체적인 단어의 의미론적 관계를 더 디테일하게 잡아내기 때문입니다.
4. 학습의 본질: 가중치 행렬이 곧 임베딩이다
그렇다면 구체적으로 어떻게 단어가 숫자로 변할까요? 여기서 많은 분들이 헷갈려 하는 부분이 있습니다. Word2Vec 신경망의 목적은 '다음 단어 맞추기' 그 자체가 아닙니다. 진짜 목적은 그 예측 과정을 잘 수행하기 위해 만들어지는 부산물, 즉 가중치 행렬(Weight Matrix)을 얻는 것입니다.
- 초기화: 처음에는 모든 단어에 대해 무작위로 초기화된 벡터값을 할당합니다.
- 예측: CBOW나 Skip-gram 방식을 통해 예측을 수행합니다.
- 오차 계산: 예측값과 실제 정답 사이의 오차(Loss)를 계산합니다.
- 역전파(Backpropagation): 오차를 줄이는 방향으로 신경망 내부의 가중치(단어 벡터)를 조금씩 수정합니다.
- 반복: 이 과정을 수만 번, 수억 번 반복하면 단어 벡터들은 의미상 관련된 단어끼리 뭉치게 됩니다.
최종적으로 학습이 끝난 후, 신경망의 은닉층(Hidden Layer)에 있는 가중치 행렬의 행(Row)들이 바로 우리가 그토록 원하던 단어 임베딩 벡터(Word Embedding Vector)가 됩니다. 이 벡터들을 추출하여 저장해 두면, 이후에는 별도의 학습 없이도 단어를 벡터로 변환하여 사용할 수 있습니다.
5. 코사인 유사도(Cosine Similarity): 의미의 거리를 재다
Word2Vec으로 얻은 벡터들이 실제로 의미가 통하는지 어떻게 검증할 수 있을까요? 벡터 공간에서 두 점 사이의 거리를 재는 방법은 여러 가지가 있지만, 텍스트 분석에서는 주로 코사인 유사도(Cosine Similarity)를 사용합니다.
유클리드 거리(직선 거리)는 벡터의 크기(Magnitude)에 영향을 받기 때문에, 단어의 빈도수 등에 따라 왜곡될 수 있습니다. 반면, 코사인 유사도는 두 벡터가 가리키는 방향의 각도(Angle)를 측정하여 유사도를 판단하므로 더 정확한 의미 비교가 가능합니다.
- 코사인 유사도가 1에 가까우면: 두 단어 벡터의 방향이 거의 일치함 (매우 유사한 의미, 예: '노트북'과 '랩톱')
- 코사인 유사도가 0에 가까우면: 두 단어는 서로 관계가 없음 (직교함, 예: '노트북'과 '바나나')
- 코사인 유사도가 -1에 가까우면: 두 단어는 반대되는 의미를 가짐
이를 통해 검색 엔진에서 사용자가 '스마트폰'을 검색했을 때, '휴대폰', '갤럭시', '아이폰' 같은 단어가 포함된 문서를 찾아줄 수 있게 되었습니다. 단어의 철자는 완전히 다르지만, 벡터 공간에서의 위치가 가깝다는 것을 컴퓨터가 알고 있기 때문입니다.
6. Word2Vec의 한계와 그 이후의 발전
Word2Vec은 자연어 처리 역사에 한 획을 그은 혁명이었지만, 완벽하지는 않습니다. 몇 가지 명확한 한계점이 존재합니다.
- OOV(Out of Vocabulary) 문제: 학습 데이터에 등장하지 않았던 새로운 단어가 나오면 벡터를 만들 수 없어 처리가 불가능합니다.
- 다의어 처리 불가: 하나의 단어가 여러 의미를 가질 때(예: '배'는 사람의 배, 타는 배, 과일 배가 있음) 이를 문맥에 따라 구분하지 못하고, 모든 의미가 섞인 하나의 벡터로만 표현한다는 한계가 있습니다.
이러한 한계를 극복하기 위해 이후 FastText(단어 내부의 철자 정보까지 학습하여 OOV 완화), ELMo, 그리고 현재 자연어 처리의 최강자인 BERT와 GPT 같은 트랜스포머(Transformer) 기반 모델들로 발전하게 되었습니다. 최신 모델들은 문맥에 따라 단어의 벡터값이 동적으로 변하는 방식을 채택하여 다의어 문제를 해결했습니다.
하지만 이 모든 최신 기술들의 밑바탕에는 "단어를 의미 공간상의 벡터로 표현한다"는 Word2Vec의 철학이 굳건히 깔려 있습니다. Word2Vec을 이해하지 않고서는 최신 NLP 트렌드를 깊이 있게 이해하기 어렵습니다.
7. 결론: 자연어 처리의 초석을 다지다
Word2Vec은 단순히 텍스트를 숫자로 변환하는 기술적 도구를 넘어, 컴퓨터에게 인간의 언어가 가진 '맥락(Context)'을 가르친 최초의 성공적인 시도였습니다. CBOW와 Skip-gram이라는 효율적인 학습 구조를 통해 방대한 텍스트 데이터를 처리할 수 있게 되었고, 이는 곧 인공지능 번역, 챗봇, 감성 분석, 추천 시스템 등 수많은 응용 분야의 폭발적인 성장을 이끌었습니다.
오늘날 우리가 사용하는 화려한 AI 서비스들의 이면에는, 단어와 단어 사이의 관계를 끊임없이 계산하며 의미의 지도를 그려나가는 Word2Vec의 원리가 숨 쉬고 있음을 기억해야 합니다. 자연어 처리를 공부하고자 한다면, Word2Vec은 반드시 거쳐 가야 할 가장 중요한 관문이자 흥미로운 탐험지입니다. 이 글이 여러분의 AI 학습 여정에 든든한 나침반이 되었기를 바랍니다.