word2vec/負例サンプリングの数理
巨大語彙のソフトマックスを避けつつ良い単語ベクトルが学べる理由を、負例サンプリングの導出から押さえます。ユニグラム0.75乗分布の効果と、学習結果が実はPMI行列の暗黙的分解になっているという驚きの解釈まで一気通貫で理解できます。
- 1.Skip-gramは中心語から周辺語を、CBOWは周辺語から中心語を予測する。語彙全体のソフトマックスは語彙数Vに比例して重く、そのままでは学習が回らない。
- 2.負例サンプリング(SGNS)は多クラス分類を「正例ペアか、ノイズから引いた負例ペアか」を当てる二値ロジスティック回帰に置き換え、計算量をk+1個のドット積に縮める。負例はユニグラムの0.75乗分布から引く。
- 3.Levy&Goldbergは、SGNSの最適解が単語と文脈の行列でPMI−log(k)を要素にもつ行列を低ランク分解したものに一致することを示した。word2vecは暗黙的な共起行列分解である。
出発点:文脈から単語ベクトルを学ぶ2つの構図
word2vecは、大量のテキストの「どの単語がどの単語の近くに出るか」だけを教師信号にして、単語の意味を表す密ベクトルを学ぶ手法です。中心となる仮説は分布仮説、すなわち「似た文脈に現れる単語は似た意味をもつ」というものです。これを実装する構図が2つあります。
Skip-gram は中心語 w から、その周辺(ウィンドウ内)の単語 c を予測します。CBOW(Continuous Bag-of-Words) は逆に、周辺語の集合から中心語を予測します。どちらも入力埋め込み行列 W(中心語側)と出力埋め込み行列 C(文脈語側)の2つを学習し、最終的に欲しい単語ベクトルとして W の行を使うのが一般的です。
Skip-gramの素朴な目的関数は、各 (中心語, 文脈語) ペアの条件付き確率の対数尤度の和です。
最大化対象 = Σ_(w,c)∈D log p(c | w)
p(c | w) = exp(v_c · u_w) / Σ_(c'∈V) exp(v_c' · u_w)
ここで u_w は中心語 w の入力ベクトル、v_c は文脈語 c の出力ベクトル、D はコーパスから取れる全ペアの集合、V は語彙です。CBOWは入力側を周辺語ベクトルの平均にした、ほぼ鏡像の式になります。
なぜ素朴なソフトマックスは回らないのか
問題は分母です。p(c | w) の正規化項は語彙全体 V にわたる和で、語彙は数十万〜数百万になります。1ペアの勾配を計算するたびに全語彙とのドット積と指数和が必要で、計算量はペアあたり O(V)。コーパス全体では絶望的に重くなります。
この O(V) を潰すアプローチは2つあります。1つは語彙を二分木に並べて確率を経路の積に分解する階層的ソフトマックスで、計算量を O(log V) に落とします。もう1つが本稿の主役、負例サンプリング(negative sampling) です。こちらはそもそも確率分布の正規化をやめてしまう、という発想の転換です。
ソフトマックスが重いのは「全語彙にわたって和を1に揃える」正規化のためです。負例サンプリングは「正しいペアか、でたらめに作ったペアか」を見分ける別問題に問題ごと差し替えることで、正規化項を最初から登場させません。目的は良い単語ベクトルを得ることであって、厳密な確率分布 p(c|w) を再現することではない——この割り切りが効きます。
負例サンプリング(SGNS)の導出
負例サンプリング付きSkip-gram(SGNS)は、多クラス予測を二値分類に読み替えます。観測されたペア (w, c) には「これはコーパス由来か?」というラベルを与え、これを正例(ラベル1)とします。対して、同じ中心語 w に対しノイズ分布 P_n から無関係な単語 c' を k 個引き、それらを負例(ラベル0)とします。
「そのペアがコーパス由来である確率」をシグモイドでモデル化します。
P(D=1 | w, c) = σ(v_c · u_w) ただし σ(x) = 1 / (1 + exp(−x))
1ペアあたりの目的関数(最大化対象)は、正例を1に、k 個の負例を0に押す形になります。
L = log σ(v_c · u_w) + Σ_(i=1..k) E_{c_i ~ P_n}[ log σ(−v_{c_i} · u_w) ]
第1項が正例の対数尤度、第2項が負例の対数尤度です(σ(−x) = 1 − σ(x) を使っているため、負例ではドット積が負=小さくなる方向に勾配が流れます)。計算量はペアあたり O(k) で、k は典型的に小さなデータで5〜20、大きなデータで2〜5。語彙数 V に一切依存しなくなった点が決定的です。これは無関係な負例を引いて表現を引き離す構図そのものなので、対照学習の原理 のInfoNCEと骨格を共有しています(SGNSはその二値版・先駆と位置づけられます)。
名前にNoise-Contrastive Estimation(NCE)の語感がありますが、SGNSはNCEを簡略化した別物です。NCEは正規化項も学習対象に含めて真の確率分布を近似しますが、SGNSは正規化項を1と固定し分布の復元を放棄しています。良い埋め込みが欲しいだけなら確率の正規化は不要、という割り切りが速度の源泉です。
ユニグラム0.75乗分布:負例の引き方が効く
負例 c_i をどの分布 P_n から引くかは、地味に見えて性能を左右します。word2vecが採用したのは、コーパス中の単語頻度(ユニグラム分布)を0.75乗してから正規化した分布です。
P_n(c) = freq(c)^0.75 / Σ_(c'∈V) freq(c')^0.75
なぜ素のユニグラム(指数1.0)でも一様(指数0)でもなく、その中間の0.75なのか。素の頻度分布だと「the」「of」のような超高頻度語ばかりが負例に選ばれ、低頻度の内容語が負例としてほぼ出てきません。一様分布だと逆に、めったに出ない語まで等確率で引かれ、負例として的外れになります。0.75乗は両者の中間で、高頻度語の選ばれ過ぎを抑えつつ、低頻度語の出現確率を底上げする効果をもちます。指数を1未満にすると頻度の高い語ほど相対的に強く割り引かれるためです。
| 負例分布 | 高頻度語(the,of) | 低頻度の内容語 | 結果 |
|---|---|---|---|
| 一様 (指数0) | 出にくい | 出やすい | 的外れな負例が多く非効率 |
| ユニグラム (指数1.0) | 出過ぎる | ほぼ出ない | 高頻度語に勾配が偏る |
| 0.75乗 (採用) | ほどよく抑制 | 底上げされる | 経験的に最良のバランス |
この0.75は理論から導かれた値ではなく、経験的に最良だった値です。あわせて、高頻度語そのものを学習対象から確率的に間引くサブサンプリング(頻度が高い語ほど高確率でスキップ)も併用され、頻出機能語の支配を二重に抑えています。
Levy&Goldberg:SGNSはPMI行列の暗黙的分解である
SGNSの最も美しい理論的帰結が、Levy & Goldberg(2014)による解釈です。彼らは、SGNSの目的関数を埋め込みの自由度が十分(次元が大きい)な理想状況で各 (単語, 文脈) ペアについて最適化したとき、内積 u_w · v_c がどんな値に収束するかを解析しました。
各ペアごとに目的関数を x = u_w · v_c で微分して0と置くと、最適解は次の閉じた形になります。
u_w · v_c = log( #(w,c) · |D| / (#(w) · #(c)) ) − log(k)
= PMI(w, c) − log(k)
ここで #(w,c) は共起回数、#(w)・#(c) は各単独の出現回数、|D| は全ペア数です。第1項はまさに自己相互情報量(PMI, Pointwise Mutual Information)——「単語 w と文脈 c が独立な場合に比べてどれだけ一緒に出やすいか」を測る、共起の基本量です。相互情報量の単語ペア版にあたり、情報理論の基礎 で扱う I(X;Y) を1つの結果対 (w,c) に落とした量と読めます。
つまりSGNSは、内積が PMI(w,c) − log(k) に等しくなるよう単語・文脈ベクトルを並べています。これを行列で書けば、#V × #V の Shifted PPMI 行列(要素が PMI − log(k)、負値を0でクリップした版がPPMI)を、低ランクの W · C^T で暗黙的に分解していることに他なりません。
SGNSが学んでいる単語ベクトルの内積は、本質的に「2語の共起がどれだけ強いか(PMI)」を再現するように決まる——これがLevy&Goldbergの核心です。ニューラル手法に見えるword2vecは、古典的なカウントベース手法(共起行列+PMI+次元削減)と地続きであり、k(負例数)は単に分解する行列を log(k) だけ下にシフトするノブとして現れます。k が大きいほどシフトが深くなり、生き残る(正の)共起が絞られます。
この等価性は、word2vecが「謎の深層学習」ではなく、解釈可能な統計量の分解だと教えてくれます。実際、明示的にPPMI行列を作って PCA・SVD のような特異値分解にかけても、SGNSに近い品質の埋め込みが得られることが報告されています。
まとめ:速さと意味づけの両立
| 論点 | 中身 | 押さえどころ |
|---|---|---|
| 構図 | Skip-gram(中心→周辺)/CBOW(周辺→中心) | 学習する単語ベクトルは入力側行列 W の行 |
| 素朴な難点 | ソフトマックス分母が語彙全体の和でO(V) | 数十万語の和を毎回計算するのは非現実的 |
| SGNS | 正例1+負例k個のシグモイド二値分類 | 計算量O(k)、語彙数Vに非依存 |
| 負例分布 | ユニグラムの0.75乗 | 高頻度語を抑え低頻度語を底上げ(経験値) |
| 理論的正体 | PMI−log(k)行列の暗黙的低ランク分解 | ニューラルに見えて中身は共起行列分解 |
word2vecの負例サンプリングは、O(V) のソフトマックスを O(k) の二値分類へ落とすことで大規模コーパス上の学習を可能にし、ユニグラム0.75乗という経験則で負例の質を整えました。そしてその最適解はPMIから log(k) を引いた共起行列の低ランク分解に一致するという、速度と解釈性が両立した稀有な手法です。ここで得た密ベクトルがどう意味空間を作り検索に使われるかは 埋め込み(Embedding) を、自己教師あり表現学習としての発展形は 対照学習の原理 を続けて読むと、現代の表現学習までの系譜がつながります。
AI/機械学習 Article
word2vec/負例サンプリングの数理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
word2vec
比較で見る軸
難易度: advanced / カテゴリ: AI/機械学習 / タグ数: 5
導入後に効く点
負例サンプリング(SGNS)は多クラス分類を「正例ペアか、ノイズから引いた負例ペアか」を当てる二値ロジスティック回帰に置き換え、計算量をk+1個のドット積に縮める。負例はユニグラムの0.75乗分布から引く。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- AI/機械学習
- タグ数
- 5
判断チェックリスト
- 自社の用途が「word2vec / 負例サンプリング」に近いか確認する。
- 強みである「Skip-gramは中心語から周辺語を、CBOWは周辺語から中心語を予測する。語彙全体のソフトマックスは語彙数Vに比例して重く、そのままでは学習が回らない。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。