# NLP: Word2Vec
## 過去回
[第1回:NLP Outline](https://hackmd.io/@kkume/HyCr7NNOD)
## 要点
* **単語の分散表現を学習するモデルである**
* **ニューラルネットワークを用いた教師なしモデルである**
* **学習は「単語の意味は周囲の単語によって形成される」というアイデアに基づく**
* **CBOW と skip-gram の2種類のモデルがある**
## 単語 ⇔ 周辺単語
「単語の意味は周囲の単語によって形成される」というアイデアがミソである。
ある単語の分散表現は、その単語の周囲の単語を使った学習によって学習する。

## skip-gram
skip-gramの方が分かりやすいのでこっちで説明。
例として、周辺単語の数は2とする(ハイパーパラメータ)

### 学習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)
```