저번 글에서 단어를 embedding하는 방법 중 word2vec에 대해서 다뤘다.
hyoeun-log.tistory.com/entry/WEEK8-Word-Embedding-word2vec?category=848132
이번에는 word2vec 학습에서 발생하는 문제점에 주목해보려고 한다.
위의 사진은 word2vec 중 CBOW를 나타낸 이미지이다.
보면 input으로는 주변 단어의 one-hot vector가 들어가고, output으로는 N*1차원의 vector가 나온다.
(여기서 N = size of vocabulary)
여기서 output의 크기가 문제가 된다.
cross-entropy loss를 구하기 위해서는 output vector와 W의 행벡터를 내적한 뒤, softmax를 적용해야 하는데,
$$ softmax(y_i) = \frac{e^{y_i}}{\sum_{j=1}^{N}e^{y_j}} $$
vocabulary의 크기가 커질수록 연산량이 급격히 증가하는 문제가 발생한다.
이것을 해결하고자 나온 방법이 negative sampling이다.
전체 단어를 대상으로 내적하고, softmax 함수를 취하는 것이 아니라
일부 단어만 뽑아서 내적하고, softmax 함수를 취하자는 아이디어이다.
nagative sampling의 구체적인 방법은 아래와 같다.
- window size 내 존재하지 않는 단어를 vocabulary에서 추출한다. (negative sampling)
- dataset의 크기가 크다면 2~5개의 단어를 무작위 추출
- dataset의 크기가 작다면 5~10개의 단어를 무작위 추출
- 주변단어와 주변단어가 아닌 단어를 합친 것을 전체 vocabulary처럼 여기고 내적과 softmax 함수를 적용
- 이 때 파라미터 업데이트는 주변단어와 주변단어가 아닌 것 중 선별된 단어에 대해서만 이뤄진다.
- ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/30/word2vec/
이 때 vocabulary에서 추출될 확률은 다음과 같다.
$$ f(w_i) = \frac{해당 단어 빈도}{전체 단어 수} $$
$$ P(w_i) = \frac{f(w_i)^{\frac{3}{4}}}{\sum_{j=1}^{vocab}f(w_j)^{\frac{3}{4}}} $$
P(w_i)는 해당 단어 등장빈도가 높다면 추출될 확률을 살짝 작게 해주고,
단어 등장빈도가 낮다면 추출될 확률을 살짝 높게 해주는 처리를 해준 값이다.
여기서 3/4의 값은 지극히 경험적으로 선택된 값이다.
'🙂 > Coursera_DL' 카테고리의 다른 글
WEEK8 : Bleu score (0) | 2020.12.27 |
---|---|
WEEK8 : beam search in language model (0) | 2020.12.27 |
WEEK8 : Word Embedding (word2vec) (0) | 2020.12.26 |
WEEK7 : LSTM, GRU (0) | 2020.12.25 |
WEEK7 : RNN (0) | 2020.12.25 |