[NLP]Word2Vec: Skip-gram

Date:     Updated:

카테고리:

Word2Vec에 관하여

1
Word2vec은 CBOW와 Skip-gram 두 종류로 나눠진다.

Word2Vec는 자연어 처리 분야에서 단어를 벡터화하는 모델 중 하나이다. 2013년 구글의 토마스 미콜로프(Thomas Mikolov)와 그의 팀이 개발한 이 모델은 단어 간의 의미적 유사성을 반영하는 벡터 표현을 생성하는 것이 주요 목표이다. Word2Vec는 기본적으로 단어를 일정한 크기의 벡터 공간에 임베딩하여 단어 간의 관계를 수치적으로 표현할 수 있게 한다.

Word2Vec 모델은 크게 두 가지 아케턱처로 나뉜다.

  • CBOW(Continuous Bag of Words)
  • Skip-gram

CBOW(Continuous Bag of Words)는 지난 포스터에서 다뤘다. 이번 포스터에서는 Skip-gram에 다루도록 하겠다.

Architecture 2) Skip-gram

Skip-gram은 단어 임베딩을 학습하는 모델 중 하나로, 주어진 단어로부터 주변 단어들을 예측하는 방식이다. CBOW와 마찬가지로 단어의 의미를 벡터로 표현하는데 사용된다.

1

중심 단어를 통해 주변 단어를 예측하기 위해서는 앞, 뒤로 몇 개의 단어를 예측할지 정해야 한다. 이를 윈도우 크기(Window size)라고 한다. 위의 그림을 예시로 들면, 윈도우 크기가 2인 것이다. 중심 단어를 기준으로 앞 뒤로 최대 두 개의 단어를 고려하기 때문이다. 정해진 윈도우 크기를 바탕으로, 문장 내 위치를 이동하며 중심 단어-주변 단어 쌍을 여러 개 만들어야 한다. 중심 단어를 하나씩 이동하면서 중심-주변 단어 쌍을 만들고, 이를 학습을 위한 데이터셋으로 삼을 수 있다. 이 방법을 슬라이싱 윈도우(Slicing window)라고 한다.

Training

1

위의 그림은 Skip-gram 모델을 인공신경망 형태로 시각화한 것이다. 입력층(Input Layer)에는 중심 단어의 원-핫 벡터가 입력으로 들어간다. 이 중심 단어 벡터는 투사층(Projection Layer)에서 고차원 벡터로 투사되며, 이 투사된 벡터를 바탕으로 출력층(Output Layer)에서는 주어진 중심 단어로부터 예측된 주변 단어들의 임베딩이 출력된다. Skip-gram 모델은 다중 퍼셉트론과 같이 은닉층이 여러 개가 아닌 단일 은닉층 하나만을 가지는 얕은 신경망(Shallow neural network) 모델이다.

Skip-gram은 입력된 중심 단어로부터 주변 단어들을 예측한다. 따라서 중심 단어와 주변 단어들 간의 관계를 학습하기 위해 가중치 행렬 \(W\)와 \(W^{'}\)를 학습하게 된다. 각각은 1) 입력층과 투사층 사이의 가중치 행렬(\(W\)), 2) 투사층과 출력층 사이의 가중치 행렬(\(W^{'}\))을 나타낸다. 이러한 구조를 통해 Skip-gram은 주어진 중심 단어를 기준으로 주변 단어들이 나타날 확률을 학습하며, 이 과정을 통해 단어의 의미를 벡터로 효과적으로 표현할 수 있게 된다.

가중치 행렬

투사층이 \(M\)차원 벡터로 표현되며, 단어 집합의 크기가 \(V\)라고 할 때, 입력층과 투사층 사이의 가중치 행렬 \(W\)의 크기는 \(V \times M\)이 된다. 입력층의 벡터는 \(1 \times V\)의 크기를 가지고 \(W\)와 곱해지면 \((1 \times V) \times (V \times M) = (1 \times M)\)의 크기가 되는 것이다. 즉, 가중치 행렬의 본질적인 의미는 중심 단어 벡터를 선형 변환하는 것이다.

위의 그림을 예로 들면, Vocabulary가 총 “The”, “cat”, “sits”, “on”, “the”, “mat”으로 6개이므로 입력 벡터의 크기는 \(1 \times 6\)이 되는 것이다. 그리고 투사층(Projection Layer)의 크기가 \(M = 5\)라고 하면 가중치 행렬의 크기는 \(6 \times 5\)가 되는 것이다. 참고로, \(W\)와 \(W^{'}\)는 전치(transpose)가 아닌 서로 다른 선형층(Linear layer)를 통해 만들어진 서로 다른 행렬이다.

학습을 위한 손실 함수 정의

1

입력층에서는 중심 단어를 단어 집합의 크기를 갖는 원-핫 벡터로 만들어 입력(\(x\))으로 넣는다. 이후 은닉층에서는 입력 벡터에 가중치 행렬을 곱해 선형 변환을 한다. 이를 통해 \(n\)차원의 벡터를 얻을 수 있다.

$$x \in \mathbb{R^{\vert V \vert}}$$
v_c = Wx \in \mathbb{R^n}

이후 은닉층에서 출력층으로 한 번 더 선형 변환을 한다. \(2n\)개의 가중치 행렬 \(W^{'}\)를 곱해서, 주변 단어들에 대한 예측된 벡터 표현을 얻게 된다. 이후 손실함수에 넣기 전 최종적으로 예측된 벡터 표현이 \(0 \sim 1\) 사이의 값을 가지도록 소프트맥스 함수를 취해준다.

$$z = W^{'}v_c \in \mathbb{R}^{\vert V \vert}$$
$$\hat y = softmax(z) \in \mathbb{R}^{\vert V \vert}$$

최종적으로 손실 함수에 예측된 값을 넣어주어 파라미터 업데이트를 해줘야한다. 이 때, 손실함수로는 크로스엔트로피(Cross-Entropy)함수를 사용한다. 크로스엔트로피 손실 함수는 일반적으로 분류 문제에서 모델이 예측한 확률 분포와 실제 레이블 간의 차이를 측정하는 데 사용된다. 이 함수는 주로 지도학습(supervised learning)에서 사용되며, 모델이 예측한 클래스 확률이 실제 레이블과 얼마나 일치하는지를 평가하는 데 효과적이다.

$$\mathcal{L}(\hat{y}, y) =  -\sum_{j=0, j\ne{m}}^{2m}\sum_{k=1}^{|V|}y_{k}^{(c-j)}\log\hat{y_{k}}^{(c-j)}$$

CBOW와 Skip-gram의 차이점

CBOW(Continuous Bag of Words)와 Skip-gram은 모두 Word2Vec 모델의 두 가지 변형으로, 단어를 벡터로 임베딩하는 데 사용된다. 그러나 이 두 모델은 단어 예측 방식과 구조에서 몇 가지 중요한 차이점이 있다.

  1. 예측 방향:
    • CBOW: 주변 단어들을 이용하여 중심 단어를 예측한다. 즉, 여러 개의 주변 단어(컨텍스트 단어들)를 입력으로 받아, 그 단어들이 나타나는 중심 단어를 추정하는 방식이다.
    • Skip-gram: 중심 단어를 이용하여 주변 단어들을 예측한다. 즉, 하나의 중심 단어를 입력으로 받아, 그 단어의 주변에 나타날 가능성이 있는 단어들을 예측하는 방식이다.
  2. 모델의 복잡도:
    • CBOW: 상대적으로 간단하고 빠르다. 주변 단어들의 평균 임베딩을 사용하여 중심 단어를 예측하기 때문에 계산 비용이 낮다. 따라서 CBOW는 대체로 큰 데이터셋에서 빠르게 학습된다.
    • Skip-gram: 중심 단어로부터 각 주변 단어를 독립적으로 예측하므로 계산이 더 복잡하다. 하지만 이러한 방식은 특히 희소한(드문) 단어들에 대해 더 좋은 임베딩을 학습할 수 있게 해준다.
  3. 데이터 처리:
    • CBOW: 주변 단어들의 정보가 모두 평균화되어 하나의 입력으로 제공된다. 이는 데이터의 노이즈에 강하지만, 개별 주변 단어들의 구체적인 정보는 희석될 수 있다.
    • Skip-gram: 개별 중심 단어와 개별 주변 단어 간의 관계를 독립적으로 학습하므로, 특정 단어 쌍의 관계를 더 잘 포착할 수 있다.
  4. 성능 및 활용:
    • CBOW: 작은 데이터셋에서 더 잘 작동하며, 노이즈가 많은 상황에서 강건한 성능을 보인다.
    • Skip-gram: 큰 데이터셋에서 뛰어난 성능을 보이며, 특히 희소한 단어들에 대한 좋은 임베딩을 학습하는 데 유리하다.

이러한 차이점으로 인해 CBOW와 Skip-gram은 각각의 특성과 데이터에 따라 선택적으로 사용되며, 특정 상황에 따라 더 적합한 모델을 선택하는 것이 중요하다.

Negative Sampling

Negative Sampling은 크로스엔트로피, InfoNCE loss등 분류 문제를 위한 지도 학습이나 대조 학습에서 중요하게 사용되는 테크닉이다. Word2vec의 두 모델, CBOW와 Skip-gram역시 윈도우 사이즈가 커지거나 단어 집합의 수가 커질수록 연산량이 기하급수적으로 증가하기 때문에 효율적인 negative sampling이 필요하다.

$$\mathcal{L}_{CBOW} = -\sum_{j=1}^{|V|}y_{j}log(\hat{y})$$
$$\mathcal{L}_{Skip-gram} =  -\sum_{j=0, j\ne{m}}^{2m}\sum_{k=1}^{|V|}y_{k}^{(c-j)}\log\hat{y_{k}}^{(c-j)}$$

Negative Sampling은 학습 과정에서 전체 단어 집합의 임베딩 벡터를 업데이트하지 않고 일부 단어 집합만 업데이트하는 방법이다. 즉, 효율적인 샘플링을 통해, 모든 단어를 네거티브로 사용하는 것이 아닌, 정답 샘플과 유사하거나 음성 샘플로써 의미있는 샘플들만을 사용하여 손실 함수를 업데이트 하는 것이다.

How To Do?

Negative Sampling은 전체 문장에서 자주 사용되는 단어에 높은 가중치를 부여하고, 우선적으로 해당 단어를 선별한다. 특정 단어가 선별될 확률 \(P\)의 수식은 아래와 같다.

$$P_{n}(w_{i}) = (\frac{f(w_{i})}{\sum_{j=1}^{n}f(w_{j})})^{3/4}$$

이 때, \(w_i\)는 \(i\)번째 단어를 의미하고, \(f(w_i)\)는 그 단어의 출현 빈도(freequency)를 의미한다. 즉, \(\sum_{j=1}^{n}f(w_{j})\)는 중복을 허용한 전체 단어의 수이다. 샘플링은 보통 \(5 \sim 20\)의 음성 샘플을 추출하는 것이 성능에 가장 효과적이라고 한다.

Word2vec의 성능은 CBOW < Skip-gram < Skip-gram with Negative Sampling(SGNS)이라고 알려져 있다.

Reference

[1] Tomas Mikolov, Kai Chen, Greg Corrado, and JeffreyDean. 2013. Efficient estimation of word representations in vector space.
[2] Blog: Word2Vec: (2) CBOW 개념 및 원리
[3]\ Blog: Word2Vec: (3) Skip-gram 개념 및 원리

NLP 카테고리 내 다른 글 보러가기

댓글 남기기