Count-based Representations
문서 내 사용되는 단어의 수나 문서의 길이가 문서마다 다르기 때문에 텍스트 데이터를 알고리즘에 적용하기 위해서는 각 단어를 고정된 길이의 벡터로 표현하는 것이 중요하다. 이때 각 단어가 등장한 횟수를 기반으로 표현하는 것을 Count-based Representation 라고 한다. 전체 문서에서 등장한(= corpus 내에 있는) 단어의 수가 $d$이고 각 문서를 $x$ 라고 할 때, $x \in R^{d}$ 라고 할 수 있다.
1) Bag of Words(BoW)
- 단어들의 빈도로부터 내용은 추론될 수 있다는 전제를 갖는다.
- 단어의 순서를 고려하지 않고 문서 내에 등장한 모든 단어를 나열한 뒤 해당 단어가 등장한 횟수를 표기하는 방법
- "John is quicker than Mary"와 "Mary is quicker than John"은 BoW의 관점에서 동일하게 표현된다. → BoW을 기반으로 원래의 문장을 복원하기는 어렵다.
2) Word Weighting
- 특정 단어가 해당 문서 내에서 얼마나 중요한지를 표현하는 방법
- TF-IDF(Term Frequency-Inverse Document Frequency, 단어 빈도-역 문서 빈도)
- $tf_{t, d}$ : 특정한 문서 $d$에서 단어 $t$가 등장하는 횟수
- $df_{t}$ : 특정 단어 $t$가 등장한 문서의 수 → 적게 등장한 단어에 대해 더 높은 가중치를 부여한다.
- $idf_{t}$ : $\log_{10}(N/df_{t})$ ($N$ : 전체 문서의 수)
- $TF-IDF(t) = tf(w) \times \log (\frac{N}{df(w)})$
- TF-IDF 는 모든 문서에서 자주 등장하는 단어는 중요도가 낮다고 판단하며, 특정 문서에서만 자주 등장하는 단어는 중요도가 높다고 판단한다.
3) BoW와 TF-IDF 의 단점
- BoW와 TF-IDF는 topic classification이나 document retrieval 같이 문장의 순서가 중요하지 않은 task에서 강점을 보이지만, machine translation과 같이 순서가 중요한 task에서는 순서에 대한 정보를 생략하기 때문에 성능이 떨어진다.
- corpus의 크기가 커질수록 단어를 표현하는 벡터의 크기가 커지며, 벡터의 대부분은 0으로 채워지게 된다. (Sparseness)
Distributed Representations
Count-based Representations(BoW, TF-IDF 등)은 단어가 sparse한 형태로 표현하기 때문에 매우 비효율적이며, One-hot vector로 단어를 표현할 경우에는 단어 간의 유사도를 측정할 수 없다. 이러한 sparse한 형태와 달리 실수값으로 이뤄진 벡터의 표현을 dense representation 라고 하며, dense한 형태로 벡터를 표현하는 방법을 Word Embedding 이라고 한다.
1) Word2Vec
Word2Vec은 크게 CBOW(Continuous bag-of-words)와 Skip-gram 방식을 나뉜다.
- CBOW : $t$번째 단어인 $w(t)$를 예측하기 위해 주변 단어를 input으로 사용한다.
- Skip-gram : $t$번째 단어인 $w(t)$를 이용하여 주변 단어들을 예측한다.
Skip-gram
Skip-gram은 다음과 같은 Objective function을 사용한다.
$$J(\theta) = \frac{1}{T} \Sigma_{t=1}^{T} \Sigma_{-m \leq j \leq m , j \neq 0} \log (w_{t+j}|w_{t})$$
→ 중심 단어($w_{t}$)가 주어졌을 때 주변 단어($w_{t+j}$)들의 log probability가 최대가 되도록 하는 $\theta$를 찾는 것이 Skip-gram의 목적이다.
이때, $p(w_{t+j}|w_{t})$는 다음과 같은 표현으로 대신하여 계산할 수 있다.
$$ P(o|c) = \frac{\exp(u_{o}^Tv_{c})}{\Sigma_{w=1}^W \exp(u_{w}^T v_{c})} $$
- $o$ - 주변 단어, $u$ - 주변 단어에 대한 벡터
- $c$ - 중심 단어 , $v$ - 중심 단어에 대한 벡터
- $v$는 $W_{V \times N}$의 행이며, $u$는 $W'_{N \times V}$의 열이다. (계산의 편의상, $W'= W^T$로 두기도 한다.)
위의 식을 바탕으로 Gradient를 계산하면
Objective function을 최대로 하는 $\theta$를 찾는 것이 목적이었기 때문에 Gradient Ascent를 적용한다.
CBOW와 Skip-gram의 목적함수는 코퍼스에 존재하는 단어의 수(V)가 많아짐에 따라 계산 복잡도가 커진다는 단점이 있다. 이러한 문제를 해결하기 위한 방법 중 하나로 Negative Sampling이 있다.
$$J(\theta) = \frac{1}{T} \Sigma_{t=1}^T \Sigma_{-m \leq j \leq m} \log (w_{t+j}|w_{t}) = \frac{1}{T} \Sigma_{t=1}^T J_{t}(\theta)$$
$$J_{t}(\theta) = \log \sigma (u_{t}^T v_{c}) + \Sigma_{i=1}^k E_{i P(w)} [\log \sigma (-u_{i}^T v_{c})]$$
$$P(w_{i}) = \frac{f(w_{i})^{3/4}}{\Sigma_{j=1}^n (f(w_{i})^{3/4} )} $$
- Negative Sampling은 weight를 업데이트하는 과정에서 모든 단어에 대해서 업데이트 하는 것이 아닌 일부 단어만을 업데이트하는 것을 의미한다.
2) GloVe
GloVe에서 사용하는 용어에 대한 설명은 다음과 같다.
- $X \in R^{V \times V}$ : co-occurrence matrix
- $X_{ij}$ : 단어 $i$와 단어 $j$가 동시에 발생하는 횟수
- $X_{i} = \Sigma_{k}^V X_{ik}$ : corpus 내에서 단어 $i$가 등장한 전체 횟수
- $P_{ij} = P(j|i) = \frac{X_{ij}}{X_{i}}$ : 단어 $i$가 등장했을 때 단어 $j$가 함께 등장할 확률
- $w \in R^d$ : a word embedding of dimension $d$
- $ \hat{w} \in R^d$ : a context word embedding of dimesion $d$
두 단어($w_{i}, w_{j}$)와 context word($\hat{w}_{k}$)가 주어졌을 때 그것들 사이의 관계를 표현하는 방법은 다음과 같다.
$$ F(w_{i}, w_{j}, \hat{w}_{k}) = \frac{P_{ik}}{P_{jk}} = \frac{P(k|i)}{P(k|j)} $$
(수정중)
3) FastText
Word2Vec이나 GloVe의 경우에는 형태소 변화가 다양한 언어에 대해서는 적용하기 어렵다는 단점을 지닌다. FastTest는 단어나 토큰 수준에서 임베딩을 진행하는 것이 아니라 chracter 수준에서 n-gram을 이용하여 임베딩을 진행한다.
'Al Basic > NLP' 카테고리의 다른 글
[NLP] Topic Modeling (1) | 2023.10.04 |
---|---|
[NLP] Dimensionality Reduction (0) | 2023.10.03 |
[NLP] Text Preprocessing (0) | 2023.09.20 |
[NLP] Introduction to Text Analytics (0) | 2023.09.13 |
[NLP] Attention in Seq2Seq Learning (0) | 2023.06.12 |