たけのこブログ

凡人が頑張って背伸びするブログ

word2vecやfasttextを使って類似単語を抽出できる仕組みを数学を一切使わずに頑張って説明してみる

背景

機械学習で過去に実装したものの原理を教えて欲しいと言われて社内勉強会でword2vecを説明した時、数学にあまり詳しくない人にword2vecの仕組みを伝えるのに苦労した。実際に他の現場でも、「単語を学習してるのは分かるんだけど、そもそもなんで似ている単語とかが抽出できるの?」「単語の足し引きって数学じゃあるまいし...」と素朴な質問をされた言われたことは結構ありました。その時に、「word embeddingという原理がありまして...」とか「誤差を最小にするように訓練して...」とか「CBOWやskip-gramの仕組み」とか説明した途端にお通夜になってしまう経験は一度だけではないです。

word2vecやfasttextの原理はネットで調べればいくらでも原理は出て来ますが、数学の「す」の字も使わずに類似単語を取り出す仕組みを説明している記事はあまりなさそうだなと思いました。そこで、今回は自分なりの比喩表現を使って「数学を一切使わずにword2vecやfasttextで実用されている類似単語の抽出がどのように成り立っているのか」を説明したいと思います。

類似単語を抽出できるまでの道のり

まず、出て来た単語の種類ごとに番号を降っている

パソコンの世界では、全ての文字列は何かしらの符号化方法を通して数字の羅列に変換されます。ですが、単語を学習するときは文章内の単語を使って学習を行うので、単語を認識する必要があります。このとき、文章内で出て来た単語ごとに番号を与えて認識させています。つまり、人ではない機械が単語を認識できるように、新しく出現したポケモンに図鑑番号を与えている感じです。

文章の周辺で使われる単語から該当の単語を予測する

word2vecやfasttextのモチベーションは、「同じ文脈で使われる単語は似た意味を持っている可能性がありそうだから、周辺の単語情報から虫食い単語を回答しようぜ」です。つまり、小学校の算数でやった数字の虫食い問題の応用バージョンです(例えば、「四天王のシバがよく使う岩タイプの〇〇は、防御以外はポッポ並み」の文章から「イワーク」を当てる問題)。

このとき、実際に機械が予測した単語と実際に埋め込まれている単語を比較して、間違っていれば正解になるように何度も繰り返して間違いを極限まで減らしていきます。この光景は、まさに子供に何回も(実際は機械だから数百回とかですが)復習プリントを解かせて満点になるようにする小学校の補修そのものです。まさに「鬼畜訓練」です。

訓練した結果、単語の分散表現を獲得する

またまた難しい単語が出て来ました。分散表現ってなんぞ?ってなります。先ほどのポケモン図鑑で例えるなら、たくさんのポケモンに関する文章(例えば、「イワークは大きい岩タイプのポケモンで防御が高い」など)で何度も復習して訓練した結果、「イワーク」だけから該当するポケモンのタイプや外見の特徴などが予測できるようになった感じです。まさに学習器くんは正真正銘の「ポケモン博士」になったわけです。

これはつまり、ポケモンの単語(で振られた図鑑番号)からある種の概念(タイプや個体値)を獲得したことになります。つまり、「イワーク」を構成する潜在的な情報を学んだことになります。ですので、この潜在的な情報が類似してる文脈が存在すれば、類似単語として解釈されることになります(例えば、「イワークはポッポ並みの低い攻撃力を持っている」「イワークの攻撃はポッポ以下」「ポッポといえばイワーク」と類似した文章がたくさんあれば、「ポッポ」を構成する潜在的情報がイワークと等しい物になり、類似度が高くなる)。さらに、この潜在的な情報を利用して、例えば「イワーク」-「ポッポ」=「防御力」だったり、「オーキド」-「博士」=「爺さん」のような潜在的情報の足し算や引き算ができます!!

つまり、word2vecやfasttextで行われている処理は、「文章中の該当単語の周辺の単語情報からその単語が何かを当てる虫食い問題を何百回も解かせる鬼畜訓練を行い、該当単語の潜在的な情報を文脈から獲得した」ことになります。

まとめると、以下のようになります。

単語->番号を降る->周辺の単語(機械上では番号の集まり)から穴埋め問題をして訓練->単語の潜在的な情報を獲得する

まとめ

今回は、word2vecやfasttextを使ってなぜある単語と類似した単語を取り出したり単語の足し引きができるのかを「数学をほぼ一切用いず」比喩だけで頑張って説明してみました。技術がなくても応用の仕組みを把握したい方や細かい仕組みを知る前の」足がかりにしたい方への助けとなれば幸いです。