🖇 왜 Word Embedding이 필요한가?
🖇 1. Word2Vec
🖇 2. FastText
🖇 3. ELMo
앞선 글에서는 자연어처리에서 가장 기초가 되는 작업인 토큰화(Tokenization)에 대해 알아보았다. 이제는 이 토큰들이 기계에게 어떤 방식으로 의미를 가질 수 있도록 만드는지를 이해해야 한다.
기계는 숫자 연산을 통해 데이터를 인지한다. 그렇다면 텍스트로 이루어진 문장을 어떻게 숫자로 바꾸고, 또 의미를 담게 할 수 있을까?
단어 하나하나를 숫자로 변환하는 가장 일반적인 방법은 바로 워드 임베딩(Word Embedding)이다. 이 글에서는 워드 임베딩의 개념과 대표적인 세 가지 임베딩 방식인 Word2Vec, FastText, ELMo를 소개한다. 전체 흐름을 이해하는 데 중점을 두고 작성하였다.
기계는 토큰 자체를 이해하지 못한다.
우리가 "고양이"라는 단어를 보면 귀엽고 털복숭복숭..인 동물을 떠올리지만, 컴퓨터는 "고양이"라는 단어가 어떤 의미를 가지는지 전혀 알지 못한다. 따라서 기계가 이해할 수 있도록 각 단어에 숫자 벡터를 부여해야 한다. 이 벡터가 단어의 의미를 표현하는 수단이 된다.
처음에는 각 단어에 랜덤한 실수값이 할당된다. 이렇게 초기화된 벡터는 의미를 담고 있지 않기 때문에 학습을 통해 단어들 사이의 의미적 유사도나 관계성이 반영된 방향으로 벡터값을 조정해줘야 한다.
이를 위해 고안된 여러 알고리즘들이 Word Embedding 방식들이다.
Word2Vec은 "단어를 벡터로 만든다"는 이름 그대로, 단어 하나하나를 벡터 공간에 위치시키는 방법이다.
핵심 아이디어는 간단하다. 어떤 단어가 어떤 단어들과 함께 자주 등장하는지를 보면 그 단어의 의미를 유추할 수 있다는 것이다. 이를 Distributional Hypothesis (분포 가설)이라고 부른다.
예를 들어, "난 오늘 술을 한 잔 마셨어" 라는 문장이 있다고 하자. 이 문장에서 '술'과 '마셨어'는 의미적으로 밀접하게 연결되어 있다. Word2Vec은 이러한 공동 등장(co-occurrence) 패턴을 학습해 단어 간의 관계를 벡터에 반영한다.
Word2Vec에는 두 가지 주요 학습 방식이 존재한다.
CBOW (Continuous Bag of Words)
Skip-gram
CBOW는 학습 속도가 빠르고 일반적인 경우에 잘 작동하지만, Skip-gram은 희귀 단어에 더 강하고, 실제 성능 면에서 조금 더 우세한 것으로 알려져 있다.
Word2Vec은 은닉층 없이 단순한 구조를 사용하고, Softmax나 Negative Sampling을 통해 단어 벡터를 학습하는 방식이기 때문에 일반적으로 Shallow Neural Network로 분류된다.
💡 Word2Vec: 단어의 주변을 보면 의미가 보인다.
Word2Vec은 당연히 약점도 존재한다. 특히 자주 등장하지 않는 희귀 단어는 학습 기회가 적기 때문에 그 벡터는 사실상 거의 초기 상태에서 멈춰버리는 경우도 생긴다.
이를 해결하기 위해 등장한 것이 FastText다.
FastText는 단어를 하위 단위(Subword)로 나누어 처리한다.
예를 들어, 'playing'이라는 단어를 3-gram으로 분해하면 pla, lay, ayi, yin, ing 같은 문자 단위 subword들이 생성되고, FastText는 이들의 벡터 평균으로 단어 임베딩을 구성한다. 이 방식 덕분에 처음 등장하는 단어도 그 하위 정보를 기반으로 의미를 추론할 수 있게 된다.
💡 FastText: 단어를 잘게 나누면 의미가 보인다.
Word2Vec이나 FastText는 아무리 뛰어나도 고정된 단어 벡터를 사용한다는 점에서 한계를 가진다. 예를 들어, 다음 두 문장을 보자.
두 문장의 '사과'는 전혀 다른 의미지만 Word2Vec은 이 두 단어를 동일한 벡터로 처리한다. 이를 해결하기 위해 등장한 것이 Contextualized Word Embedding, 문맥 기반 임베딩이다.
2018년에 발표된 ELMo(Embeddings from Language Models)는 문장 속에서 단어가 사용된 문맥 전체를 고려해 단어의 임베딩을 생성한다. 즉, 문장이 달라지면 같은 단어라도 벡터가 달라진다. 이 덕분에 동음이의어 문제나 문맥에 따른 의미 변화를 효과적으로 처리할 수 있다.
ELMo는 양방향 LSTM (Bidirectional LSTM)을 사용해 문장의 앞과 뒤 모두를 고려한다. 최종적으로 다음 세 벡터를 합쳐 단어의 의미를 결정한다.
이렇게 만들어진 벡터는 단어마다 사용된 위치와 문맥에 따라 달라지고, 보다 정교하고 정확한 자연어 처리를 가능하게 해준다.
💡 ELMo: 문맥을 반영한 의미 임베딩
지금까지 텍스트를 숫자로 바꾸는 가장 기초적인 방식인 Word Embedding의 기본 개념들을 정리해 보았다.
이렇게 되면 토큰은 단순 기호가 아니라 의미를 담은 벡터로 표현된다. 이런 벡터 덕분에 기계는 단어 간의 유사성, 문장 내의 관계성, 감정의 흐름까지도 이해할 수 있게 된다.
이 글에서는 워드 임베딩이 무엇이고, 어떤 문제를 해결하며, 왜 발전하게 되었는지를 개념적으로 이해하였다. 각 방식의 내부 구조나 수학적 원리에 대한 이해는 실제로 사용해 보면서 정리해 볼 예정이다.