前置き
- Enriching Word Vectors with Subword Information
- fasttextの論文
アルゴリズムの概要
- word2vecに代表されるskip-gramによるembeddingを拡張したもの。
- 単語だけでなく、単語のn-gramも考慮することで高速かつ高精度にembeddingができるようになった。
準備: Skip-gramモデル
- skip-gramモデルは下記の対数尤度を最大化するモデル。
$$\sum_{t=1}^T \sum_{c \in C_t} \log p(w_c|w_t)$$
- $C_t$は$w_t$のまわりにある単語のインデックスの集合
- 確率はsoftmaxを使って下記のように定義する。
$$p(w_c|w_t) = \frac{e^{s(w_t, w_c)}}{\sum_{j=1}^W e^{s(w_t, j)}}$$
- 実際にはnegative samplingを行い下記の最大化する。
$$\sum_{t=1}^T \sum_{c \in C_t} l(s(w_t, w_c)) + \sum_{n \in N_{t,c}} l(-s(w_t, n))$$
-
$N_{t,c}$はサンプリングされたnegative exampleの集合
-
$l(x)=\log(1 + e^{-x})$
-
またスコアリング関数$s$はembedding同士の内積とする。
$$s(w_t, w_c) = u_{w_t} \cdot v_{w_c}$$
- ここで$u_{\cdot}$と$v_{\cdot}$は違うものであることに注意。
Subword model
- 単語$w$のn-gramの集合を$\cal{G}_w \subset \{1,...,G\}$とする。
- n-gram $g$のembeddingを$z_g$とし、各単語のembeddingをその単語のn-gramのembeddingの合計とする。
- このときスコアリング関数$s$を下記のように定義する。
$$s(w, c) = \sum_{g \in \cal{G_w}} z_g \cdot v_c$$
- ここで常に単語$w$は$\cal{G}_w$に含まれるにようにする。
- ただし、n-gramとしての文字列と単語のとしての文字列が一致しても別のembeddingを持つ。
- 例えば、単語としてのasとpasteの中に含まれる2-gramのasは別のembeddingを持つ。
- このように単語間でn-gramを通じて同じembeddingを共有することでレア単語に対しても有効なembeddingを学習できる。
Dictionary of n-gram
- $\cal{G_w}$の定義に設定の余地がある。
- この論文では下記のような設定を提案している。
- 3以上6以下のn-gramを使う。
- 別途、prefixやsuffixを追加する。
- ただし最も頻出する上位P個の単語に関してはn-gramを使用しない。
使い方
- fasttextはfasttext.ccで公開されている。
- またgensimにwrapperがあるのでword2vecと同じように使えて便利。gensimのfasttextのtutorial