분산 표현(Distributed Representation)
희소 표현(sparse representation) - 원-핫 벡터 표현 방법은 각 단어간 유사성을 표현할 수 없다는 단점이 있습니다. 이를 위한 대안으로 단어의 '의미'를 다차원 공간에 벡터화하는 분산 표현(distributed representation)이 이용됩니다. 그리고 이렇게 분산 표현을 이용하여 단어의 유사도를 벡터화하는 작업은 워드 임베딩(embedding) 작업에 속하기 때문에 임베딩 벡터(embedding vector)라고 하며, 저차원을 가지므로 바로 앞의 챕터에서 배운 밀집 벡터(dense vector)에도 속합니다.
분산 표현(distributed representation) 방법은 기본적으로 '비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다'라는 분포 가설(distributional hypothesis)이라는 가정 하에 만들어진 표현 방법입니다. 강아지란 단어는 귀엽다, 예쁘다, 애교 등의 단어가 주로 함께 등장하는데 분포 가설에 따라서 저런 내용을 가진 텍스트를 벡터화한다면 저 단어들은 의미적으로 가까운 단어가 됩니다.
Example)
Sparse 표현 강아지 = [ 0 0 0 0 1 0 0 0 0 0 0 0 ... 중략 ... 0]
Dense 표현 강아지 = [0.2 0.3 0.5 0.7 0.2 ... 중략 ... 0.2]
즉, 희소 표현은 고차원에 각 차원이 분리된 표현 방법이었다면, 분산 표현은 저차원에 단어의 의미를 여러 차원에다가 분산하여 표현합니다. 이런 표현 방법을 사용하면 단어 간 유사도를 계산할 수 있습니다.
Word2Vec에는 CBOW(Continuous Bag of Words)와 Skip-Gram 두 가지 방식이 있습니다.
CBOW(Continuous Bag of Words)
CBOW는 주변에 있는 단어들을 가지고, 중간에 있는 단어들을 예측하는 방법입니다.
예문 : "The fat cat sat on the mat"
주변 단어(context word) {"The", "fat", "cat", "on", "the", "mat"}으로부터 중심 단어(center word)sat을 예측하는 것은 CBOW가 하는 일입니다. 윈도우 크기가 2이고, 예측하고자 하는 중심 단어가 sat이라고 한다면 앞의 두 단어인 fat와 cat, 그리고 뒤의 두 단어인 on, the를 참고합니다. 윈도우를 계속 움직여서 주변 단어와 중심 단어 선택을 바꿔가며 학습을 위한 데이터 셋을 만들 수 있는데, 이 방법을 슬라이딩 윈도우(sliding window)라고 합니다.
Word2Vec는 입력층과 출력층 사이에 하나의 은닉층만이 존재합니다. Word2Vec의 은닉층은 일반적인 은닉층과는 달리 활성화 함수가 존재하지 않으며 룩업 테이블이라는 연산을 담당하는 층으로 일반적인 은닉층과 구분하기 위해 투사층(projection layer)이라고 부르기도 합니다.
- CBOW에서 투사층의 크기 M은 임베딩하고 난 벡터의 차원이 됩니다.
- V는 단어 집합의 크기를 의미합니다.
- 두 행렬은 동일한 행렬을 전치(transpose)한 것이 아니라, 서로 다른 행렬이라는 점입니다.
CBOW는 주변 단어로 중심 단어를 더 정확히 맞추기 위해 계속해서 이 W와 W'를 학습해가는 구조입니다.
연산방법
- 각 주변 단어인 입력 벡터 원-핫 벡터 x와 가중치 W에 대해서 Lookup 연산을 수행합니다. 원-핫 벡터 x는 i번째 인덱스만 1이고 나머지는 0이므로 가중치 W행렬 곱의 결과는 W행렬의 i번째 행을 그대로 읽어오므로 Lookup 이라고 불립니다.
- Lookup 결과는 투사층에서 벡터들의 평균인 벡터를 구합니다. 만약 윈도우 크기가 2라면, 입력 벡터의 총 개수는 2n이므로 중간 단어를 예측하기 위해서는 총 4개가 입력 벡터로 사용됩니다. 그렇기 때문에 평균을 구할 때는 4개의 결과 벡터에 대해서 평균을 구하게 됩니다.
- 이렇게 구해진 평균 벡터는 두번째 가중치 행렬 W'와 곱해집니다. 곱셈의 결과로는 원-핫 벡터들과 차원이 V로 동일한 벡터가 나옵니다. 만약 입력 벡터의 차원이 7이었다면 여기서 나오는 벡터도 마찬가지입니다.
- 소프트맥스(softmax) 함수를 취하고, 이를 스코어 벡터(score vector)라고 합니다(스코어 벡터의 j번째 인덱스가 가진 0과 1사이의 값은 j번째 단어가 중심 단어일 확률을 나타냄).
- 손실 함수로 Cross-Entropy를 사용해서 두 벡터값의 오차를 줄입니다.
- 역전파(Back Propagation)를 수행하면 W와 W'가 학습합니다.
- 학습이 다 되었다면 M차원의 크기를 갖는 W의 행이나 W'의 열로부터 어떤 것을 임베딩 벡터로 사용할지를 결정하면 됩니다.
Skip-gram
Skip-gram은 중심 단어에서 주변 단어를 예측하려고 합니다. 전반적으로 Skip-gram이 CBOW보다 성능이 좋다고 알려져 있습니다.
관련 소스는 다음 GIT에서 참고할 수 있습니다.
Reference Source
감사합니다.
Reference
- https://wikidocs.net/60854
댓글
댓글 쓰기