Featured image of post 텍스트 임베딩

텍스트 임베딩

단어의 의미적 유사도를 고려하여 임베딩 벡터를 구하는 과정

Word2Vec

Word2Vec은 단어 간의 유사성을 측정하기 위해 분포 가설을 기반으로 개발된 임베딩 모델이다.

분포 가설이란, 같은 문맥에서 함께 자주 나타나는 단어들은 서로 유사한 의미를 가질 가능성이 높다는 가정이다. 단어 간의 동시 발생 확률 분포를 이용해 단어 간의 유사성을 측정한다.

“나는 자전거를 타고 간다” 와, “나는 자동차를 타고 간다” 라는 문장에서 ‘자전거’와 ‘자동차’는 이동수단이라는 맥락에서 서로 유사한 단어이다. 이런식으로 분포 가설에 의해 주변에 분포한 단어들이 동일하거나 유사하므로 비슷한 의미를 가질 것이라고 모델이 학습한다.

이런 가정을 통해 단어의 분산 표현(Distributed Representation)을 학습할 수 있다. 분산 표현이란 단어를 고차원 벡터 공간에 매핑하여 단어의 의미를 담는 것을 의미한다. 유사한 문맥에서 등장하는 단어는 비슷한 벡터 공간상 위치를 갖게 된다.

Word2Vec은 단어 임베딩 벡터 기법이다. 이는 밀집 표현이라고도 하는데, 벡터 표편이 sparse 하지 않아 단어를 고정된 크기의 실수 벡터로 표현하기 때문에 단어 사전의 크기가 커지더라도 벡터의 크기가 커지지 않는다.

CBoW

CBoW(Continuous Bag of Wbrds)란 주변에 있는 단어를 가지고 중간에 있는 단어를 예측하는 방법이다. 중심 단어(Center Word)는 예측해야 할 단어를 의미하며, 예측에 사용되는 단어들을 주변 단어(Context Word) 라고 한다.

학습할 떈 슬라이딩 윈도우 기법을 적용하여 학습한다. 한 번 학습할 때 중심 단어를 기준으로, 좌우로 윈도우 사이즈 크기만큼의 주변 단어를 함께 학습한다.

CBoW는 원-핫 벡터를 입력으로 받아, 입력 문장 내 모든 단어의 임베딩 벡터를 평균내어 중심 단어의 임베딩 벡터를 예측한다.

입력 단어는 원-핫 벡터로 표현돼 투사층(Projection Layer)에 입력된다. 투사층이란 원-핫 벡터의 인덱스에 해당하는 임베딩 벡터를 반환하는 룩업 테이블(LUT)이 된다. 투사층을 통과하면 각 단어는 임베딩 벡터로 변환된다. 이 벡터에 소프트맥스 함수를 이용해 중심 단어를 예측한다.

Skip-gram

Skip-gram은 CBoW와 비슷하지만, 중심 단어를 입력으로 받아서 주변 단어를 예측하는 모델이다.

CBoW는 하나의 윈도우에서 하나의 학습 데이터가 만들어졌지만, Skip-gram은 중심 단어와 주변 단어를 하나의 쌍으로 한 여러 데이터가 만들어진다. 따라서 더욱 많은 학습 데이터세트를 추출할 수 있어 더욱 높은 성능을 보인다. 또한 드물게 등장하는 단어도 더 잘 학습할 수 있고 벡터 공간에서 더 유의미한 거리 관계를 형성할 수 있다.

계층적 소프트맥스

corpus의 크기가 커지면 단어 사전의 크기도 커져 학습 속도가 느려진다. 이를 해결하기 위해 계층적 소프트맥스를 사용한다.

출력층을 이진 트리 구조로 표현하고 등장하는 단어일수록 트리의 상위 노드에 배치, 드물게 등장하는 단어는 하위 노드에 배치한다.

단어 사전의 크기를 $V$라고 했을 때, $\bigo(V)$의 시간복잡도를 갖지만, 계층적 소프트맥스의 시간 복잡도는 $\bigo(\log_2V)$의 시간복잡도를 갖는다.

네거티브 샘플링

네거티브 샘플링은 확률적인 샘플링 기법으로, Word2Vec 모델에서 사용한다. 학습 윈도우 내에 등장하지 않는 단어를 $n$개 추출하여 정답 단어와 함께 소프트맥스 연산을 수행한다. 각 단어가 추출될 확률은 아래와 같다.

$$ P(w_i)=\frac{f(w_i)^{0.75}}{\sum^{V}_{j=0}f(w_i)^{0.75}} $$

$P(w_i)$는 단어 $w_i$가 네거티브 샘플로 추출될 확률이다. 이때 0.75제곱한 값을 정규화 상수로 사용하는데, 이 값은 실험적으로 얻어낸 값이다.