FastText | Enriching Word Vectors with Subword Information

|

FastText는 2015년 Facebook에서 발표한 라이브러리로, Word2Vec과 같이 distribution representation을 이용하여 비슷한 의미를 지닌 단어들은 유사한 word representation vector를 갖도록 하는 embedding방법이다. 해당 라이브러리는 Word2Vec을 제안한 T. Mikolov가 빈번히 등장하지 않는 단어(infrequent word)와 모르는 단어(OOV)에 대한 Word2Vec의 단점을 보완하여 새롭게 제시한 word representation방법이다.

sampling train dataset

발표된 라이브러리는 Word2Vec처럼 단어의 유사도를 cosine similarity를 사용하여 구하는 등 대부분의 내용은 Word2Vec과 유사하지만 단어를 word2vec보다 더 여러 부분으로 분리하여 다룬다는 차이점이 있다. 더 자세히 말하자면 Word2Vec은 단어를 분리 가능한 가장 작은 단위로 간주하여 한 단어의 vector값을 통으로 학습하지만, FastText는 분리 가능한 가장 작은 단위를 문자(character)로 간주하여 subword vector들의 합으로 단어를 표현한다. 따라서 FastText는 word vector가 아닌 subword vector를 학습하는 것이라 말할 수 있다. 즉 한 단어를 설정한 window size에 따라 문자 단위로 분리한 후, 그것들의 합으로 단어를 표현하여 분리된 각 vector들을 학습한다. 예를 들어 window size를 3으로 정한다면 하나의 단어를 다음과 같이 tri-gram으로 나타내게 된다(FastText모델에서 ‘<’와 ’>’는 각각 단어의 시작과 끝을 나타내는 특수 기호인데 이 기호를 포함하여 subword를 분리시켜야 한다.):

2019-11-06 (13)

위와 같이 FastText모델에서 “백설공주”라는 단어는 단어르 window size에 따라 분리시킨 것과 “백설공주” 전체를 embedding한 것의 합으로 표현된다. 이는 다음과 같이 정의될 수 있다:

\begin{matrix} { u }_ { 백설공주 }={ z }_ { <백설 }+{ z }_ { 백설공 }+{ z }_ { 설공주 }+{ z }_ { 공주> }+{ z }_ { <백설공주> } \end{matrix}

\begin{matrix} u_t=\sum_{ {g} \in { G_t } }{z_g} \end{matrix}

($G_t$는 target word($t$)에 속한 문자 단위 n-gram집합을 가리킨다.)

Model Training

\begin{matrix} L(\theta)=logP⁡(+|{ c }_ { P },{ o }_ { p })+\sum_{i=1}^klogP⁡(-|{ c }_ { n_i },{ o }_ { n_i }) \end{matrix}

위 식은 한 iteration마다 모델 파라미터($\theta$)가 업데이트되는데 이때 한 쌍의 positive sample ($c_P$, $o_p$ : 실제 같이 쓰이는 단어쌍들의 집합)과 $k$쌍의 negative sample($c_{n_i}$, $o_{n_i}$ : 코퍼스 전체에서 랜덤 추출한 함께 사용되지 않은 단어 쌍)이 학습된다는 것을 표현한 log-likelihood function이다. Skip-gram의 log-likelihood function과 같지만 center word($c$)와 context word($o$)를 학습할 때 center word로부터 나온 문자(character)단위의 n-gram vector인 $z$의 등장으로 Skip-gram과 확률이 다르게 정의된다.

위 식에서 $P(+|c_P,o_p)$는 FastText Model에서 positive sample인 center word($c$)가 output context word($o$)와 함께 쓰일 확률이다. 확률은 다음과 같이 정의될 수 있다:

\begin{matrix} P(+|c_P,o_p)=\frac{ 1 }{ 1+exp⁡({ -u }_ { c }{ v }_ { o }) }=\frac{ 1 }{ 1+exp⁡(-\sum_{ {g} \in { G_t } }z_g^{\intercal}v_o)} \end{matrix}

해당 모델의 목표는 예측된 positive sample인 center word와 context word쌍이 positive일 확률이 높이는 것이기 때문에 위 식의 결과를 최대화하는 방향으로 학습이 진행돼야 한다. 이를 위해 분모지수를 최소화해야 하는데 이는 벡터 $z$과 $v_o$의 내적 값을 높임으로써 가능하다. 벡터의 내적 값은 cosine similarity와 비례하기 때문에 내적 값이 커지면 벡터 간의 유사도 또한 높아지는 결과를 얻을 수 있다. 예를 들어 ‘백설공주’가 $c$이고 ‘먹었다’가 $o$일때 $z$는 “<백설”, “백설공”, “설공주”, “공주>”, “<백설공주>”이니, $z$와 $v_o$($o$에 해당하는 단어벡터)간의 유사도를 높이는 것이 해당 모델의 학습 목표라 생각하면 된다.

$L(\theta)$를 구하는 식에서 $P⁡(-| c_{n_i},o_{n_i})$는 negative sample인 $c_n$ 와 $o_n$가 negative sample일 확률이다. 따라서 negative sample을 negative sample이라고 얼마나 잘 맞췄는지에 대한 확률이기 때문에 이 값 또한 최대화하는 방향으로 학습이 이루어져야 한다. 확률은 다음과 같이 정의될 수 있다:

\begin{matrix} P(-|c_n,o_n)=1- P(+|c_n,o_n)=\frac{ exp⁡({ -u }_ { c }{ v }_ { o }) }{ 1+exp⁡({ -u }_ { c }{ v }_ { o }) }=\frac{ exp⁡(-\sum_{ {g} \in { G_t } }z_g^{\intercal}v_o) }{ 1+exp⁡(-\sum_{ {g} \in { G_t } }z_g^{\intercal}v_o)} \end{matrix}

해당 식을 최대화 하기 위해서는 우변의 분자지수는 키우고 분모지수는 줄여야 한다. 이를 위해서 $z$와 $v_o$의 내적 값을 줄여야 하는데 위에서 언급했 듯 벡터의 내적은 cosine similarity와 비례하므로 두 벡터의 내적 값이 줄어들면 두 벡터의 유사도 또한 낮아진다.

이렇게 $L(\theta)$를 최대화하는 학습 과정은 positive sample 단어쌍의 유사도는 높이고 negative sample 단어쌍의 유사도는 낮추는 방향으로 학습이 진행된다. 결국 FastText도 Skip-gram과 같이 center word와 주변 단어 쌍이 positive sample에 속하는지 negative sample에 속하는지 이진분류(binary classification)하는 과정에서 학습이 진행되고 학습을 통해 도출된 word embedding vector는 유사성에 관한 정보를 지니게 되는 것이다.

Reference

Francois Chaubard, Michael Fang, Guillaume Genthial, Rohit Mundra, Richard Socher.”CS224n: Natural Language Processing with Deep Learning: Part1,”(winter 2017)

Lee,Gichang.Sentence embeddings using korean corpora.seoul:acornpub,2019

P. Bojanowski, E. Grave, A. Joulin, T. Mikolov. Enriching Word Vectors with Subword Information,2017