Word2Vecとは
単語の周辺文脈から、意味的な類似性を反映した低次元の分散表現(単語埋め込み)を学習する手法
ひとことで言うと
「王様」と「女王様」のように意味が近い単語を、数値の並びとして近い位置に配置する古典的な技術。
概要
Word2Vecは、大量のテキストコーパスから、各単語をその周辺に出現しやすい単語(文脈)の傾向に基づいて低次元の実数ベクトルへ変換する学習手法で、単語埋め込み(Word Embedding)を代表する初期の手法の1つ。 周辺単語から中心単語を予測するCBOW(Continuous Bag-of-Words)と、中心単語から周辺単語を予測するSkip-gramという2つの学習方式があり、いずれも浅いニューラルネットワークで効率的に学習できる。 学習されたベクトル空間では、意味的に似た単語同士が近い位置に配置されるだけでなく、「king - man + woman ≈ queen」のように単語間の意味的な関係をベクトル演算として表現できることが知られている。 現在のLLMで使われる埋め込みはTransformerベースの文脈依存表現が主流だが、Word2Vecは単語埋め込みという概念そのものをNLPに広めた基礎的な手法として位置づけられる。
背景
従来のNLPでは単語をone-hotベクトル(語彙数次元の疎な0/1ベクトル)として扱っており、単語間の意味的な近さを表現できなかった。 Word2Vecは、大量のテキストから教師なしで単語の意味的な近さを低次元の密なベクトルとして学習する方法を示し、以降の埋め込み技術の基礎となった。
歴史
2013年: Googleの Mikolov らが論文「Efficient Estimation of Word Representations in Vector Space」でWord2Vecを発表。 2013年: 続報論文でSkip-gramとNegative Samplingを組み合わせ、計算量を抑えつつ学習できる手法を発表。 2014年: GloVeなど、共起統計に基づく別方式の単語埋め込み手法も登場。 2018年以降: BERTなどの文脈依存埋め込みの登場により、静的な単語埋め込みとしての利用は徐々に減少。
アーキテクチャ
入力層は語彙数次元のone-hotベクトル、隠れ層(投影層)は埋め込み行列との積として計算される低次元ベクトル、出力層は語彙全体に対するSoftmaxという浅い構造を持つ。 CBOWでは周辺の複数単語の埋め込みを平均・合計したベクトルから中心単語を予測し、Skip-gramでは中心単語の埋め込みから周辺の各単語を予測する。 出力層のSoftmax計算は語彙数が大きいと非常に高コストになるため、実際の学習では計算対象を少数の負例に絞るNegative Samplingや階層的Softmaxを使って効率化するのが一般的。
ワークフロー
大量のテキストコーパスを準備 → 各単語をウィンドウサイズ内の周辺単語とペアにして学習データを構成 → CBOWまたはSkip-gramのいずれかの方式で、浅いニューラルネットワークを使い周辺単語との共起関係を学習 → 学習後の隠れ層の重みを、各単語の埋め込みベクトルとして取り出す。
コード例
gensimでのWord2Vec学習
from gensim.models import Word2Vec
sentences = [["king", "queen", "man", "woman"], ["paris", "france", "tokyo", "japan"]]
model = Word2Vec(sentences, vector_size=50, window=2, min_count=1, sg=1)
vector = model.wv["king"]
similar = model.wv.most_similar("king", topn=3)利点
- 大規模コーパスから教師なしで、意味的な類似性を反映した単語ベクトルを効率的に学習できる
- 単語間の意味的な関係を、ベクトルの加減算として近似的に表現できる
- 学習・推論のコストが低く、比較的軽量な計算資源でも扱える
欠点
比較
関連用語
よくある質問
CBOWとSkip-gramの違いは?
CBOWは周辺単語から中心単語を予測し、Skip-gramは中心単語から周辺単語を予測する。Skip-gramは低頻度語の学習に強いとされ、CBOWは学習が高速とされる。