# NLP: Word2Vec ## 過去回 [第1回:NLP Outline](https://hackmd.io/@kkume/HyCr7NNOD) ## 要点 * **単語の分散表現を学習するモデルである** * **ニューラルネットワークを用いた教師なしモデルである** * **学習は「単語の意味は周囲の単語によって形成される」というアイデアに基づく** * **CBOW と skip-gram の2種類のモデルがある** ## 単語 ⇔ 周辺単語 「単語の意味は周囲の単語によって形成される」というアイデアがミソである。 ある単語の分散表現は、その単語の周囲の単語を使った学習によって学習する。 ![](https://i.imgur.com/so7VDcM.png) ## skip-gram skip-gramの方が分かりやすいのでこっちで説明。 例として、周辺単語の数は2とする(ハイパーパラメータ) ![](https://i.imgur.com/Fq9B3d3.png) ### 学習Step 1. Corpus を決める ※ここでは日本語Wikipediaとする 2. Corpus から Sentence を取り出す ※ここでは「私は犬を散歩した」 3. ある単語を取り出す ※ここでは「犬」 4. 「犬」をOne-Hotベクトルに変換 5. ネットワークで計算して結果(Predict)を得る 6. LossをCrossEntropyで計算する ※上図の結果を得た場合は次のような値になる $$ Loss=-log(0.9)-log(0.1)-log(0.1)-log(0.9) $$ 7. lossを各Weightで微分してBackpropagation 8. 他の単語、他のSentenceで繰り返す 9. 学習が終われば、分散表現がほしい単語をOne-Hotベクトルに変換して、入力することで、**中間層のベクトルをとってくれば、それが分散表現**となっている ### 分散表現の使い方 Word2Vecで得られる分散表現は、文脈の意味を理解しない。つまり、「it」や「they」は Sentence内のどこを指すのかを理解しない。 ではどう使うかというと、例えば次のような使い方ができる * 近い意味を持つ単語を調べる 家族に近い単語 ``` ('親子', 0.7739133834838867) ('恋人', 0.7615703344345093) ('絆', 0.7321233749389648) ('友人', 0.7270181179046631) ('団らん', 0.724891185760498) ('友だち', 0.7237613201141357) ('ふたり', 0.7198089361190796) ('夫婦', 0.6997368931770325) ('同士', 0.6886075735092163) ('深める', 0.6761922240257263) ``` * 単語同士の演算ができる 人生 - 幸福 ``` ('現金', 0.31968846917152405) ('おら', 0.29543358087539673) ('修理', 0.29313164949417114) ('募金', 0.2858077883720398) ('ユーザー', 0.2797638177871704) ('頻度', 0.27897265553474426) ('適正', 0.2780274450778961) ('税金', 0.27565300464630127) ('かから', 0.273759663105011) ('予算', 0.2734326720237732) ```