[1902.09859] Context Vectors are Reflections of Word Vectors in Half the Dimensions

単語分散表現

問題設定

語彙 \(V = \{1,2,\ldots,n\} (|V| = n)\) を考える. 単語 \(i \in V\) に対して2つの \(d\) 次元実ベクトル

を割り当てる. word vector はいわゆる単語の分散表現のこと. context vector は skipgram のことを考えていて, 最後 softmax に入れる直前に入力ベクトルに掛ける行列の単語に対応するベクトルのこと.

つまり, 単語 \(j\) の周りの文脈(固定長の単語ウィンドウ)の中に単語 \(i\) が出現する確率を, \[P(i | j) \propto p_i \exp[ w_j^T c_i ]\] とする (このように仮定をおく).

ここで \(p_i\) は単語 \(i\) が出現する (uni-gram) 確率.

仮定

次を仮定する: \[w_i \sim \mathcal N(0, \frac{1}{d} I_d)\]

ある直交行列 \(Q\) があって, \[c_i = Q w_i\]

特に2つ目の仮定から, \(c_i\)\(w_i\) と同じ分布に従うことと \[c_i \sim \mathcal N(0, \frac{1}{d} I_d)\]

内積やノルムが等しいこと \[c_i^T c_j = w_i^T Q^T Q w_j = w_i w_j\]

が言える.

知見

\(w_i\)\(c_i\) との関係については経験的な知見がある. [Bengio+, 2001] によれば \(c_i\)\(w_i\) の間の関係に制約をもたせると良い正則化になって学習も高速化する. [Press&Wolf, 2017; Gulordava+, 2018] によれば \(Q=I\) すなわち \(c_i=w_i\) とするのは全然駄目というのは分かっている. [Mimno&Thompson, 2017; Gulordava+, 2018] によれば, 少なくとも線形変換で写るものらしい: \[c_i = A w_i\] この論文はこの変換 \(Q\) がどういうものかを調べていると言える.

unigram 確率

訓練データの文書から単語 \(i\) が出現する確率 \(p_i\) を見積もりたい.

頻度で尤度を作るより frequency rank を使うのが主流らしい. つまり, 単語 \(i\) の頻度が第 \(r_i\) 位だとする \((r_i=1,2,\ldots)\) とき, \[p_i \propto r_i^{-(1-\alpha)}\] とする. ここで \(\alpha\)\(0 < \alpha \leq 1\) なる定数. \(\alpha=0\) のときがちょうど Zipf の法則になっていて, \(\alpha=1\) のときがすべての単語が一様になっている. 経験的には \(\alpha=0.25\) くらいがちょうど良いらしい.

Theorem 1

以上の仮定をおいた時,

"context vector は word vector の \(d/2\) 次元での reflextion になっている."

すなわち, \(w_i, c_i \in \mathbb R^d\) に対応する \(\tilde{w_i}, \tilde{c_i} \in \mathbb C^{d/2}\) があって (\(\mathbb R^d \simeq \mathbb C^{d/2}\) なので自然な同型射がある), \(\tilde{c_i}\)\(\tilde{w_i}\) の複素共役になっている.

証明

細かいところまでは読んでないので概要だけ.

\(w_j, c_i\) が確率変数だと思うと, \(Z_j = \sum_{i=1}^n p_i \exp[ w_j^T c_i ]\)\(Z_j \approx 1 + \frac{1}{2d}\) に収束する.

従って \(d\) が十分大きければ, \(P(i | j) \propto p_i \exp[ w_j^T c_i ]\) は正規化の必要がなく \(P(i | j) \approx p_i \exp[ w_j^T c_i ]\) になる.

次に \(c_i = Q w_i\) のとき, \(Q\) は近似的に involutary matrix (自乗して \(I\) になる) である. \(P(i | j) \approx p_i \exp[ w_j^T c_i ]\) から \[\log \frac{P(i,j)}{p_i p_j} \approx c_i^T w_j\] を得る. 左辺は単語 \(i\)\(j\) の相互情報量 (PMI). 添字を走らせて行列にすると \[\mathrm{PMI} \approx W Q^T W^T\] と掛ける. ところで PMI は \(i,j\) について対称なので, これは対称行列である. 従って自身の転置を取ったものと等しく: \[W Q^T W^T \approx W Q W^T\] \[\iff W^TW Q^T W^TW \approx W^TW Q W^TW\] \(W^TW\)\(w_i^T w_j\) で各 \(w_k\) は正規分布から取ってきたベクトルなので \(W^TW=\frac{1}{2}I\). これを代入すれば \(Q^T \approx Q\) を得る. さらに直交行列なことを仮定したので結局 \[Q^2 \approx I.\]

任意の involutary 行列はある直交行列 \(P\) を以て \[P^T \mathrm{diag}(\pm 1, \ldots, \pm 1) P\] で表せる.

そこで

と置くと, 尚 \(\hat{c_i} = Q \hat{w_i}\) となっていて見た目が良いので, この \(\hat{w_i}, \hat{c_i}\)\(w_i, c_i\) と置くことにして, \(Q\) は対角成分が \(\pm 1\) の対角行列だとする.

このようにすると, context vector は word vector の成分の一部をマイナスにした (flipped) ものだと言える. PMI行列の trace が \(0\) に収束するはずのことを使うとなんやかんやで, ちょうど半分個の成分がマイナスになるべきだと分かるらしい.

Remark

つまり, \(w_i \in mathbb R^d\) の内のちょうど \(d/2\) 個の成分を取り出した \(x_i\) と残りの \(y_i\) について, \[P(i | j) \approx p_i \exp[ x_j^T x_i - y_j^T y_i ]\] と書ける. ここで \(w_i \mapsto (x_i, y_i)\) なる射影の仕方は \(i, j\) に依らず固定.

実験

Figure 2 はよくわからんけど PMI 行列について仮定した事柄が実データセットでも成り立ってるかを見てるっぽい?

4 章では, \(q \in \mathbb R^d\) について \[c_i = q \odot w_i\] として, word2vec (SGNS; skipgram w/ negative sampling) を学習した. これは \(Q\) が対角行列にしてもいいことを使ってる.

学習するパラメータから \(\{c_i\}_{i=1,2,\ldots,n}\) が消えた分, 全体としてパラメータ数がほぼ半分になってる. なので学習率もちょっと変えたと言ってるが, 基本的には https://github.com/tensorflow/models/blob/master/tutorials/embedding/word2vec.py を使ったそう.

SGNS がただの word2vec でこれと今の制約を足した +WT とを6つのタスクで比較してる. パラメータ数がほぼ半分なのにほぼ同程度の結果を出してるので良いだろ, という主張.

感想

どちらかと言えば性能落ちてる. あと \(Q\) が対角行列であることまで使うなら, 成分が \(\pm 1\) であることまで使えばいいのに. (たぶんそこまですると目も当てられないくらい悪くなったのでは?????)