雑記: 単語分散表現の話

word2vecとGloVeが、前者が predicting で後者が counting といわれたり、結果として得られる「 v女王 \fallingdotseq v + v女性 - v男性」という関係式が直感的でめでたしめでたしとなったりしていると思うんですが、どちらも predict しているのではないのかとか、何が直感的なのかとかわからなかったので、word2vecとGloVeが何を目指しているかのメモをかきました。

モデルの定式化は全面的に参考文献1. に依っていますが、記事の最初の方と最後の方には私の適当な解釈を多分に含みます。私の誤りは私に帰属します。お気付きの点がありましたらご指摘いただけますと幸いです。

ゴールとして、「もしword2vecが単語類似度タスクに強くGloVeがニュース分類タスクに強い(要出典)のだとしたら、後者は共起行列をつくってから学習し前者はそうでないため、前者は特定の文脈にフィットする解を目指しやすいが後者はあくまで全体の平均を目指し、それゆえに前者は単語類似度タスク(特定の文脈での意味)に強く後者がニュース分類タスク(ニュースを構成する単語全体の意味)に強いのではないか」というような考察を適当ではなくきちんとできるようになりたかったのですが、そこまでいきませんでした。また参考文献1. の 2-7 節に、「単語の分散表現の性能差は各モデルの理論的な側面よりも、実装上の細かいトリックや実験設定に左右されるとの指摘がある.」との記述があります。

参考文献
  1. 岡崎 直観. 言語処理における分散表現学習のフロンティア(<特集>ニューラルネットワーク研究のフロンティア). 人工知能, 31(2), 189-201, 2016. 言語処理における分散表現学習のフロンティア(<特集>ニューラルネットワーク研究のフロンティア)
    • 人工知能学会の学会誌の2016年3月号の記事です。
  2. Mikolov, T., Sutskever, I., Chen, K., Corrado, G. S., Dean, J. Distributed Representations of Words and Phrases and their Compositionality, Proc. of NIPS, pp. 3111-3119, 2013. [1310.4546] Distributed Representations of Words and Phrases and their Compositionality
    • word2vecの原論文です。
  3. https://code.google.com/archive/p/word2vec/
    • word2vecの実装があり、architecture: skip-gram (slower, better for infrequent words) vs CBOW (fast) などのメモがあります。
  4. Pennington, J., Socher, R., Manning, C.. Glove: Global vectors for word representation, Proc. of EMNLP, pp. 1532-1543, 2014. GloVe: Global Vectors for Word Representation - ACL Anthology
    • GloVeの原論文です。
  5. https://nbviewer.jupyter.org/github/DSKSD/DeepNLP-models-Pytorch/blob/master/notebooks/03.GloVe.ipynb
    • GloVeの実装です。

まとめ(文字の定義は後述)
skip-gram も GloVe も、結局、単語 c の周辺(前後 \delta 語など、適当に決める)に出現する単語 w の分布 p(w|c) を、内積のエクスポネンシャルによるモデル q(w|c) = C_c \tilde{C}_w \exp(v_c^\top \tilde{v}_{w}) でフィッティングすることを通して単語 c のベクトル表現 v_c を得ようとするのは共通している。
  • \tilde{C}_w = 1 のときは q(w|c) = {\rm softmax}(v_c^\top \tilde{v}_{w}) に他ならない。C_c は規格化定数である。
  • q(w|c_a)q(w|c_b) の比に興味があるときは \tilde{C}_w > 0 があってもよい(比をとると消える)。
但し、分布間の距離の指標は様々であるし、そもそも語彙数が膨大であるためにこの分布の規格化定数を直接計算するのも現実的ではない。skip-gram と GloVe は何を最小化しようとしてどのように規格化を回避するかが異なっている。
  • skip-gram は q(w|c) = {\rm softmax}(v_c^\top \tilde{v}_{w}) とし、学習コーパス内に出現するすべての「単語 c - その周辺の単語 w」の組の条件付き確率 q(w|c) の対数の和  \sum_{t=1}^T \sum_{c \in C_{w_t}} \log q(w_t|c) を最大化するように(∴ 交差エントロピーの重み付き和  - \sum_{c \in V} \#(c,\cdot) \sum_{w \in V} p(w|c) \log q(w|c) を最小化するように)学習することを目指す。が、規格化の計算が難しいので  {\rm sigmoid}(v_c^\top \tilde{v}_{w}) による2値分類タスクにしてしまう(正例1個につき負例用の周辺単語を K 個サンプリングする)。
    • CBOW(その名の通り周辺の単語を先に「カバン」に入れて=足してしまう)はこの最適化をさらに簡略化したものとも捉えられる。
  • GloVe は p(w|c) = \#(c, w) / \#(c, \cdot ) であることに着目して、「 p(w|c)q(w|c) = C_c \tilde{C}_w \exp(v_c^\top \tilde{v}_{w}) でフィッティングするタスク」を、「 \log \#(c, w)v_c^\top \tilde{v}_w + b_c + \tilde{b}_w でフィッティングするタスク」に読み替える。損失は2乗誤差を採用するが、あまり発生しない「単語 c - その周辺の単語 w」の組に対しては重みを小さくするようにする。
    • そのため、予め \#(c, w) のテーブルを用意しておくことになる。
いずれにせよ、skip-gram や GloVe で得たベクトルは「内積が対数確率をオフセットしたもの」という性質をもっている。内積は分配則が成り立つ(和の内積内積の和)ので、v_a + v_b は「周辺の単語の対数確率が単語 a の周辺の対数確率と単語 b の周辺の対数確率の和になるような仮想的な単語のベクトル」と捉えられる。となると、v + v女性 - v男性 というベクトルをもつ仮想的な単語が考えられるが、 v女王 がそれに近かったという事実は、「女王」の周りの分布がそのように「王」「女性」「男性」の分布で特徴付けられるということに他ならない。

word2vecのモデル
  • 学習コーパスを単語列 w_1, w_2, \cdots, w_T とする。
  • 単語 w_t を中心語とした前後 \delta 語の文脈窓を C_{w_t} = (w_{t-\delta}, \cdots, w_{t-1}, w_{t+1}, \cdots, w_{t+\delta}) とする。
word2vecでは、文脈窓 C を与えたときの中心語の確率分布 p(w|C) を、C 内の単語のベクトルを用いてモデリングすることを通して、単語のベクトル表現を獲得する。つまり、長さ 2 \delta の単語列を与えたときに、それらの単語のベクトル表現を用いてどんな単語がその中央にはまりそうかの分布を出すことを目指すのだが、2 \delta 個の単語の情報をどう集約するかで流派が分かれる(下図)。
f:id:cookie-box:20210217225124p:plain
  • skip-gramでは p(w|C) \prod_{c \in C} {\rm softmax}(v_c^\top \tilde{v}_{w})モデリングする。
    つまり、「文脈窓の中心にどんな単語がきそうか」を、文脈窓内の各単語の「この単語がいる文脈窓の中心にどんな単語がきそうか」の積で表現する(先に各単語からの確率を出して積をとって集約する派)。
  • CBOWでは p(w|C){\rm softmax} \left( \left( \sum_{c \in C}v_c \right)^\top \tilde{v}_{w} \right)モデリングする。
    つまり、「文脈窓の中心にどんな単語がきそうか」を、文脈窓内の全単語のベクトルの和で表現する(先に全単語のベクトルを和に集約してから確率を出す派)。
但し実際にはソフトマックスではなくシグモイドで活性化し、サンプリングした負例との2値分類を学習する。
skip-gram
skip-gramでは p(w|C) = \prod_{c \in C} p(w|c) と考える。p(w|c) はいわば「単語 c を与えたときに単語 w が単語 c のいる文脈窓の中心語である確率」になる。この p(w|c) をモデル q(w|c) = {\rm softmax}(v_c^\top \tilde{v}_{w}) でフィッティングする。ただし、v_c は単語 c の文脈語としてのベクトル、\tilde{v}_{w} は単語 w の中心語としてのベクトルであり、全単語にこれらのベクトルをどう用意すべきかがフィッティング対象となる。損失関数は以下とする(学習コーパス内のすべての中心語-文脈語の組の確率の積を最大化する=対数確率の和を最小化する)。
 \displaystyle \mathcal{L}^{\rm SG} = \sum_{t=1}^T \sum_{c \in C_{w_t}} \log q(w_t | c) = \sum_{t=1}^T \sum_{c \in C_{w_t}} \log {\rm softmax}(v_c^\top \tilde{v}_{w_t}) = \sum_{t=1}^T \sum_{c \in C_{w_t}} \log \frac{\exp (v_c^\top \tilde{v}_{w_t})}{ \sum_{w' \in V} \exp (v_c^\top \tilde{v}_{w'})}
但し実際には全単語 V 上でソフトマックスをとることは難しいので損失関数を少し変更する。「文脈語 c から中心語 w を当てる  \# V 値分類タスク」ではなく「文脈語 c と中心語 w が正しい文脈語と中心語の組かどうか当てる 2 値分類タスク」と考えることにして、活性化関数をソフトマックスからシグモイドに取り換える。このタスク設定にすると負例が必要になるので、中心語-文脈語の組1つにつき、負例のための中心語 w^{(k)}K 回サンプリングする(単語のユニグラム分布からサンプリングする)。
 \displaystyle \mathcal{L}^{\rm SG} = \sum_{t=1}^T \sum_{c \in C_{w_t}} \left( \log \frac{\exp (v_c^\top \tilde{v}_{w_t})}{1 + \exp (v_c^\top \tilde{v}_{w_t})} + \sum_{k=1}^K \log \left( 1 - \frac{\exp (v_c^\top \tilde{v}_{w^{(k)}})}{1 + \exp (v_c^\top \tilde{v}_{w^{(k)}})} \right) \right)
この損失関数を最小化するように学習し、各単語の文脈語としてのベクトル v_c をその単語のベクトル表現とする。
CBOW(continuous bag-of-words)
文脈窓 C に対して、文脈窓内の単語の文脈語としてのベクトルの和を v_C = \sum_{c \in C} v_c とする。CBOWでは p(w|C)={\rm softmax}(v_C^\top \tilde{v}_{w}) と考える。損失関数は以下となる。
 \displaystyle \mathcal{L}^{\rm CBOW} = \sum_{t=1}^T \log q(w_t | C_{w_t}) = \sum_{t=1}^T \log {\rm softmax}(v_{C_{w_t}}^\top \tilde{v}_{w_t}) = \sum_{t=1}^T \log \frac{\exp (v_{C_{w_t}}^\top \tilde{v}_{w_t})}{ \sum_{w' \in V} \exp (v_{C_{w_t}}^\top \tilde{v}_{w'})}
但し実際には全単語 V 上でソフトマックスをとることは難しいので skip-gram 同様に損失関数を変更する。
 \displaystyle \mathcal{L}^{\rm CBOW} = \sum_{t=1}^T \left( \log \frac{\exp (v_{C_{w_t}}^\top \tilde{v}_{w_t})}{1 + \exp (v_{C_{w_t}}^\top \tilde{v}_{w_t})} + \sum_{k=1}^K \log \left( 1 - \frac{\exp (v_{C_{w_t}}^\top \tilde{v}_{w^{(k)}})}{1 + \exp (v_{C_{w_t}}^\top \tilde{v}_{w^{(k)}})} \right) \right)
GloVeのモデル
GloVeでは、2単語のベクトルの差でそれぞれの単語の周辺に出現する単語の確率分布の比をモデリングすることを通して、単語のベクトル表現を獲得する。但し、「周辺に出現する単語のベクトルと内積をとった上でエクスポネンシャルをとる」というモデルにしたため、結局、個々の単語の確率分布をモデリングすることになっている。
f:id:cookie-box:20210218003922p:plain
具体的に、
  • 単語 i の周辺に単語 j が出現した回数を \#(i, j) とする。
  • 単語 i の周辺に任意の単語が出現した回数を \#(i, \cdot ) とする。
  • 単語 i の周辺に単語 j が出現する確率は p(j|i) = \#(i, j) / \#(i, \cdot ) となる。
が、確率分布 p(j|i) そのものは、どんな単語の周辺にもよく出現するような単語 j で大きくなるため、単語 i のよい特徴になっていない。それよりも、他の単語 k の分布との比を取った p(j|i)/p(j|k) の方が単語 i の単語 k との関係のよい特徴になっている。ので、確率分布の比 p(j|i)/p(j|k)F(v_i, v_k, \tilde{v}_j)モデリングすることを目指す。ここで、F の関数形に以下を仮定する。
  • v_i, v_k に依存する項は v_i, v_k の差 v_i - v_k にのみ依存する。
  • v_i - v_kスカラーに変換するにあたり \tilde{v}_j との内積 (v_i - v_k)^\top \tilde{v}_j をとる。
  • (v_i - v_k)^\top \tilde{v}_j を確率分布の比に変換するにあたり、和を変換したものが変換したものの積になるように \exp を採用する(同じ単語どうしの確率分布の比は常に1にならなければならない)
よって、F(v_i, v_k, \tilde{v}_j) = \exp \bigl( (v_i - v_k)^\top \tilde{v}_j \bigr) となるが、そうなると p(j|i)/p(j|k)\exp(v_i^\top \tilde{v}_j)/\exp(v_k^\top \tilde{v}_j)モデリングすることになるので、p(j|i)\tilde{C}_j \exp(v_i^\top \tilde{v}_j)モデリングすることと同じである(\tilde{C}_jj にのみ依存する係数)。さらに、p(j|i) = \#(i, j) / \#(i, \cdot ) を利用すると、\log \#(i, j)v_i^\top \tilde{v}_j + b_i + \tilde{b}_jモデリングすることになる。損失は2乗誤差を採用する。
 \displaystyle \mathcal{L}^{\rm GloVe} = \sum_{i=1}^{|V|} \sum_{j=1}^{|C|} f(\#(i,j)) \left( v_i^\top \tilde{v}_j + b_i + \tilde{b}_j - \log \#(i, j) \right)^2
但し、f(\#(i,j)) は共起頻度が小さいペアの重みを小さくするための因子で、例えば以下(共起頻度が100回未満のペアの重みを徐々に軽くする例)が用いられる。
 \displaystyle f(x) = \begin{cases} (x / 100)^{0.75}  & (x < 100) \\ 1 & ({\rm otherwise}) \end{cases}

得られたベクトル表現の性質
これらの手法で得られた単語のベクトル表現は、モデルより、別の単語のベクトル表現との内積が意味をもつ(対数確率をオフセットしたものになる)。もし C_a \fallingdotseq C_b であれば、
  • v_a^\top \tilde{v}_x が、単語 x が単語 a の周辺にいそうな度合いになる。
  • v_b^\top \tilde{v}_x が、単語 x が単語 b の周辺にいそうな度合いになる。
  • v_b^\top \tilde{v}_x - v_a^\top \tilde{v}_x = (v_b - v_a)^\top \tilde{v}_x は、それらの差になる。
    • (v女性 - v男性)^\top \tilde{v}スカート は、正になりそう(※ 適当な例)。
    • (v女性 - v男性)^\top \tilde{v}ズボン は、負になりそう(※ 適当な例)。
  •  v_{a'}^\top \tilde{v}_x + v_b^\top \tilde{v}_x - v_a^\top \tilde{v}_x = (v_{a'} + v_b - v_a)^\top \tilde{v}_x は、単語 x が単語 a' の周辺にいそうな度合いに先の差を足したものになる。
    • (v + v女性 - v男性)^\top \tilde{v}スカート は、「王」の文脈に「スカート」がいそうな度合いを大きくしたもの。
    • (v + v女性 - v男性)^\top \tilde{v}ズボン は、「王」の文脈に「ズボン」がいそうな度合いを小さくしたもの。
    • 同様に、任意の単語 x について、(v + v女性 - v男性)^\top \tilde{v}_x は、「王」の周辺に x がいそうな度合いに、「女性」の周辺に x がいそうな度合いを足して、「男性」の周辺に x がいそうな度合いを引いたもの。
word2vecで(GloVeでも)  v女王 \fallingdotseq v + v女性 - v男性 となることがよく知られているが、それは、任意の単語 x について、「女王」の周辺に x がいそうな度合いが、「王」の周辺に x がいそうな度合いに「女性」の周辺に x がいそうな度合いを足して「男性」の周辺に x がいそうな度合いを引いたものに近くなっていることを示唆しているのに他ならない。