분산표현은 분포가설이라는 가정하에 만들어진 표현방법으로,
비슷한 문맥에서 등장하는 단어들은 비슷한 의미를 가진다는 가설로, 주변(window크기) 단어에 따라 정의되는 문맥의 의미를 이용하여 단어를 벡터로 표현하는 것이다. 이 또한 원-핫 벡터처럼 차원이 단어집 합의 크기일 필요가 없으므로, 효율적인 방식이다.
이는 이전에 말한 밀집 표현과 혼용하여 사용되며 하나의 차원이 하나의 속성을 표현하는 것이 아니라, 여러 차원들이 조합되어 속성들을 표현한다. 이런 방법을 이용하여 단어의 유사도 또한 계산할 수 있다.
1. Word2Vec
`Word2Vec`모델은 분포 가설 하에 표현한 분산 표현을 따르는 Google이 공개한 워드 임베딩 모델이다.
이 모델에는 두 가지 방식 `CBOW`와 `Skip-Gram` 방식이 존재한다.
1-1. CBOW
CBOW: Continuos Bag of Words는 주변에 있는 단어들을 보고 중간에 있는 단어를 예측하는 방법이다.
이는 주변단어 context로 타깃 단어를 예측하는 문제를 학습한다는 것이며 주변 단어 context는 타겟 단어의 직전 n개와 직후 n개를 의미하며 이 범위를 window라고 부르고, n을 window size라고 정의한다. (즉 window size가 n이면 주변단어 2n개를 보는 것이다.)
이때 문장하나에 대하여 한번만 학습을 진행하는 것은 아깝기 때문에 Word2Vec에서는 `sliding window`방식을 이용하여 하나의 문장을 가지고 여러 개의 학습 데이터 셋을 생성한다.
CBoW의 신경망을 이미지로 표현하면 위와 같은데, 은닉층(Hidden layer)이 1개만 존재하는 얕은 신경망이다. 또한 Word2Vec의 신경망은 일반적인 layer구조와 다르게, 활성화 함수(activation function)가 존재하지 않아 hidden layer이라고 부르기보다는 input layer들의 가중치를 모아주는 `projection layer`이라고부른다. 이를 `lookup table`이라고도 부르는데, 룩업 테이블이란, 우선 input으로 들어오는 one-hot 벡터는 문장에서 해당 단어의 위치인덱스만 1이고 나머지는 0이다. 따라서 가중치 행렬에 이 input을 곱했을 때 나오는 결괏값은 그냥 가중치 행렬의 해당 인덱스 행을 가져온 것이다.
우선 원-핫 벡터로 각 단어가 input으로 들어가게 된다. 이후 projection layer의 크기(=임베딩 벡터의 차원)가 결정된다. 각 input이 들어왔을 때 이를 밀집벡터로 변환하게 해주는, 가중치 $ w $를 학습하는 것이다. 또한 이 projection layer에 압축된 벡터를 다시 늘려줄 가중치 또한 학습한다.
저 projection layer을 거치고 두 번째 가중치행렬을 곱하여 평균을 통해 최종 출력이 나오게 되는데 이를 score vector이라고도 부르며, 이것과 target값에 대한 원하 벡터와 의 차이를 cross entropy를 통해 줄여가며 학습한다.
즉 score vector에는 아래와 같이 실수값형태의 벡터가 나올 텐데 이것과 target의 위치를 나타내는 원하 벡터와 비교하는 것이다. 결국 score vector은 해당 위치의 단어가 나올 확률을 의미하는 것과 같다고 볼 수 있다.
1-2. Skip-Gram
다음으로 skip-gram은 cbow와 학습 방식은 거의유사한데, 하나의 단어를 이용하여 주변 단어를 예측하는 것이다. 이것 역시 sliding window를 이용하여 데이터셋을 생성한다.
다만 다른 점은, 중심단어를 가지고 주변 단어를 예측하는 것이기 때문에 CBoW에서 projection layer을 거친 뒤에 사용하던 벡터들 간의 평균을 구하는 과정이 없다. 또한 한 번의 input에 대하여 2n개의 ouput이 나와 더 많은 학습이 이뤄진다.
이에 Skip-Gram이 CBoW보다 성능이 좋다는 결과가 있다.
1-3. Word2Vec 단점
Word2Vec의 단점 아래와 같다.
- 단어의 형태학적 특성을 반영하지 못함 -> (eat, ate 등은 의미적으로 유사하지만, 각 단어를 개별적으로 처리하여 모두 다른 벡터로 구성됨)
- 단어 빈도 수의 영향을 많이 받아(분포가설에 의거하기 때문) 희소한 단어를 임베딩하기 어려움.
- 새로운 단어가 등장하면 데이터 전체를 다시 학습해야 함.
- 단어 사전의 크기가 클수록 학습하는데 오랜 시간이 걸림
1-4. 트릭
결국 Word2Vec은 $ W, W' $ 인 가중치 행렬을 학습해야 한다.
이때 단어수가 10만 개라고 가정하면, 임베딩 차원 수 N이 100개로 정한다고 해도 총 2000만 개나 되는 많은 수를 계산해야 하기 때문에 논문에서 `Subsampling Frequent Words`과 `Negative sampling`을 이용하여 단어의 학습량을 조절하는 트릭을 썼다.
1-4-1. Subsampling Frequent words
이는 자연어 코퍼스에서 자주 등장하는 단어의 학습량을 확률적인 방식으로 줄인다. 자주 등장할수록 단어의 업데이트 기회가 많기 때문에 특정 규제?를 통하여 단어 사전 내 i번째 단어 $ w_i $를 학습에서 제외시킬 확률을 정한다.
$ P(w_i) = 1 - \sqrt{\frac{t}{f(w_i}} $ 이때 $ f {w_i} $는 해당 단어가 말뭉치에 등장한 비율을 말하고 t는 임의로 지정해 주는 매개변수로 보통 0.00001을 지정한다. 이 결괏값 $ P(w_i)$ 만큼을 제외시켜 학습한다.
1-4-2. Negative sampling
원래 Word2Vec은 역전파 과정에서 모든 단어의 임베딩 벡터값을 업데이트하는데, 이 과정의 계산이 많기 때문에
학습하는 중심단어와 주변단어들 외에 이 단어들과 별 연관관계가 없는 수많은 단어의 임베딩은 필요 없다고 생각하여 무작위로 negative sample을 선택하여 하나의 중심단어에 대하 주변단어+negative sample만 학습하는 것이다.
negative sampling을 사용하는 것은 다른 글에서 더 자세히 보면 좋을 것 같다.
2. FastText
다음으로 두 번째 임베딩 모델 FastText에 대하여 알아볼 것이다. FastText도 분포가설하에 표현한 분산표현을 따르는 임베딩 모델이며, 페이스북에서 공개한 모델이다.
가장 큰 특징으로 이전 Word2Vec의 한계점을 보완하기 위하여 각 단어를 Bag-of-Characters로 보고, 개별 단어가 아닌 n-gram의 연속된 글자들을 임베딩하는 방식을 이용한다.
2-1. 동작 원리
우선 모델에서 <, >는 단어의 경계를 나타내기 위한 특수 기호이며, 단어를 먼저 <,>로 감싸고 설정한 n-gram에 따라 앞에서부터 단어를 쪼갠다. 마지막으로 본 단어를 추가한다.
예를 들어, 단어가 apple이라고 하고, n을 3으로 정한 tri-gram이라고 할 때 아래와 같은 단어토큰을 벡터로 생성한다.
`<ap,app,ppl,ple,le>,<apple>`이 때 n-gram의 수를 하나로 정하는 것이 아니라 범위로 정할 수도 있다. 이는 이전에 배웠던 OOV문제를 해결하기 위한 서브토큰화의 일종이다.
이후 Word2Vec의 skip-gram과 같은 방법으로 학습된다. 이 한 단어를 나타내는 각 n-gram들의 임베딩 벡터의 합이 본단어의 벡터값이 된다.
2-2. FastText 장점
이렇게 n-gram에 대한 임베딩 구축을 통해서, OOV문제와 오타 등의 단어에 강건하게 대응할 수 있다는 장점이 있다.
또한 빈도수가 적은 단어에 대해서도 n-gram이 만들어지면서 겹치는 경우가 있기 때문에 더 높은 정확도의 임베딩 벡터값을 얻을 수 있다.
2-3. 한국어 FastText
문자단위의 n-gram을 사용하기 때문에 한국어를 처리하는데도 적합하다.
한국어는 글자나 자모음 단위로 나누어 적용할 수 있다,
이런 식의 분리를 통해 더 좋은 임베딩 벡터를 얻을 수 있다. 하지만 너무 길게 분리할수록 학습 시간이 오래 걸릴 수 있기 때문에 n을 적절히 조절해줘야 한다.
3. GloVe
마지막 방법은 GloVe이다. GloVe는 LSA는 DTM이나, TF-IDF로부터 전체적인 통계정보를 입력받아 축소한 방법론 이기 때문에 단어의 빈도수를 기준으로 유사도를 계산하게 되고 이는단어 의미 작업에 대하여 성능이 떨어졌다. 반대로 Word2Vec의 단어간유사도는 LSA보다는 뛰어나지만, 코퍼스 전체의 통계정보가 고려되지 않았고 GloVe는 이러한 점을 비판하였다. 이에 미국 스탠포드 대학에서 단어 빈도와 예측 기반의 방법론을 모두 활용하는 방법의 임베딩 방법인 GloVe를 발표하였다.
3-1. Window based Co-occurence Matrix
우선 윈도우 기반 동시 행렬에 대하여 짚고 넘어가자. 단어의 동시 등장 행렬은 행과 열을 전체 단어 집합의 단어들로 구성하고, i번째 단어의 윈도우 크기 내에서 k 단어가 등장한 횟수를 i행 k 열에 기재한 행렬을 말한다.
아래와 같은 3문장에 대해 window size 1에 대한 단어 동시 행렬은 아래와 같이 구성된다.
"I like deep learning", "I like NLP", "I enjoy flying"
3-2. Co-occurrence Probability
동시등장 확률은 위의 동시 등장 행렬을 통해 구하게 된다.
동시 등장 확률 $ P(k|i) $ 는 동시 등장 행렬로부터 특정 단어 i의 전체 등장 횟수를 카운트하고, 특정 단어 i가 등장했을 때 어떤 단어 k가 등장한 횟수를 카운트한 조건부 확률이다.
$ P(k|i) $ 에서 i를 중심단어, k를 주변단어라고 할 때, 위에서 나온 동시 등장 행렬에서 i의 모든 행을 다 더한 것을 분모,i행k열의 값을 분자로 하면 동시등장확률이 나오게 된다.
이는 말 그대로 두 단어가 동시에 나올 확률을 의미한다.
3-3. 손실함수
GloVe는 특정 단어 k가 주어졌을 때,두 단어 벡터 간의 내적값이 두 단어의 동시 등장 확률과같은 비율이 되도록 임베딩을 설계하고자 하였다.
이는 다음과 같이 나타낼 수 있다. 사실 이 식을 봐서 직관적으로 이해는 안되지만, 위의 목표를가지고 수행했다고 알면 될 것 같다.
$$ J = \sum_{i, j=1}^{V} f(P_{ij}) \left( w_i^T \tilde{w}_j + b_i + \tilde{b}_j - \log P_{ij} \right)^2 $$
사실 이 수식의 유도과정은 어려워 아래 다른 교재나 아래 블로그 참고하면 좋을 것 같다.
'ML & DL > NLP' 카테고리의 다른 글
[패캠/NLP] 문장 임베딩 (1) | 2023.12.22 |
---|---|
[패캠/NLP] Word2Vec 워드 임베딩 실습 (1) | 2023.12.20 |
[패캠/NLP] 워드 임베딩 (1) | 2023.12.20 |
[패캠/NLP] 문장 임베딩 및 유사도 측정 실습 (1) | 2023.12.18 |
[패캠/NLP] 자연어 특성과 임베딩 (0) | 2023.12.14 |