word2vecの中核技術を理解しよう
CBOWとは何か?
CBOWは「Continuous Bag-of-Words」の略で、自然言語処理の分野で広く使われている、単語の「意味」をコンピューターが扱える数値データ(ベクトル)に変換する手法の一つです。
この技術は、2013年にGoogleの研究者トマス・ミコロフらによって提案されたword2vecというツールキットに含まれるモデルとして発表されました。
一言で言うと、「周りの単語から、真ん中の単語を予測する」というタスクを通じて、単語が持つ意味的な特徴を捉えたベクトル表現を学習します。
CBOWの仕組み
CBOWモデルは、ある単語の前後にある複数の単語(これをコンテキストと呼びます)を入力として受け取り、その中心にある単語(ターゲット)を予測するようにニューラルネットワークを訓練します。
例えば、「私は ___ を食べる」という文があったとします。
CBOWは、入力として「私」「は」「を」「食べる」という周辺の単語(コンテキスト)を受け取り、真ん中の「___」に入るであろう単語、例えば「パン」を予測しようとします。この時、入力となる周辺単語の語順は考慮しない(Bag-of-Words)のが特徴です。
この予測タスクを大量のテキストデータで何度も繰り返すことで、モデルは単語同士の意味的な関係性を学習していきます。その結果、意味が近い単語(例:「犬」と「猫」)はベクトル空間上で近くに配置され、関係性が低い単語(例:「犬」と「車」)は遠くに配置されるような、高品質な単語ベクトルが得られるのです。
CBOWとSkip-gramの違い
word2vecには、CBOWの他に「Skip-gram」というもう一つの代表的なモデルがあります。両者は密接に関連していますが、予測の方向が正反対です。
項目 | CBOW (Continuous Bag-of-Words) | Skip-gram |
---|---|---|
タスク | 周辺単語(コンテキスト)から中心単語(ターゲット)を予測する | 中心単語(ターゲット)から周辺単語(コンテキスト)を予測する |
学習速度 | 一般的にSkip-gramより速い | 一般的にCBOWより遅い |
性能 | 大きなデータセットに対して効率が良い。頻繁に出現する単語の表現学習が得意。 | 比較的小さなデータセットでも機能しやすい。出現頻度の低い珍しい単語(レアワード)の表現精度が高い傾向がある。 |
例:「空は青く、雲は白い」 | 入力: [“空”, “は”, “く”, “雲”] → 予測: “青” | 入力: “青” → 予測: [“空”, “は”, “く”, “雲”] |
CBOWのメリット・デメリット
メリット
- 学習が速い: 複数の周辺単語を一度にまとめて処理するため、Skip-gramモデルに比べて計算コストが低く、学習が速い傾向にあります。大規模なテキストデータから素早く単語ベクトルを学習させたい場合に有効です。
- 一般的な単語に強い: 頻繁に出現する単語に対して、平均化された安定したベクトル表現を生成するのが得意です。
デメリット
- 珍しい単語に弱い: Skip-gramと比較して、出現頻度の低い単語の表現学習が苦手な場合があります。これは、周辺単語を平均化して扱うため、珍しい単語の持つ特異な情報が薄まりやすいためです。
Python (gensim) での簡単な例
実際にPythonのライブラリ `gensim` を使うと、比較的簡単にword2vec(CBOWモデル)を試すことができます。以下は、いくつかの文章からCBOWモデルを学習させる簡単なコードの例です。
from gensim.models import Word2Vec
# サンプルの文章データ(単語ごとに分割済み)
sentences = [ ['私', 'は', '自然', '言語', '処理', 'を', '勉強', 'する'], ['あなた', 'は', '機械', '学習', 'を', '勉強', 'する'], ['自然', '言語', '処理', 'は', '面白い'], ['機械', '学習', 'も', '面白い']
]
# CBOWモデルで学習 (sg=0 がCBOWを指定)
# vector_size: ベクトルの次元数
# window: 中心の単語を予測するために考慮する周辺単語の数
# min_count: 学習に含める単語の最低出現回数
# workers: 学習に使用するスレッド数
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, sg=0, workers=4)
# 「自然」という単語のベクトル(100次元の数値の配列)を取得
vector = model.wv['自然']
print('「自然」のベクトル表現 (最初の10次元のみ表示):')
print(vector[:10])
# 「自然」に意味が近い単語を検索
similar_words = model.wv.most_similar('自然')
print('\n「自然」に近い単語:')
print(similar_words)
上記のコードでは、sg=0
を指定することでCBOWモデルを選択しています。これを sg=1
に変更するとSkip-gramモデルで学習が行われます。
まとめ
CBOWは、現代の自然言語処理技術の根幹を支える重要な概念の一つです。そのシンプルなアイデアと効率性から、多くの応用技術(機械翻訳、感情分析、文章要約など)の基礎として利用されてきました。
- CBOWは周辺単語から中心単語を予測するモデルです。
- word2vecという技術の一部として2013年に登場しました。
- 学習が速く、頻出単語の表現学習が得意という特徴があります。
- 中心単語から周辺単語を予測するSkip-gramとは対の関係にあります。
この技術の登場は、コンピューターが言葉の意味をより深く理解する上での大きなブレークスルーとなりました。自然言語処理を学ぶ上で、CBOWとSkip-gramは避けては通れない重要な概念と言えるでしょう。