# 自然言語処理
## word2vec
「単語の意味は、周囲の単語によって形成される」という分布仮説に基づく。
word2vecは下記のネットワークアーキテクチャと高速化手法を総称したもの。
ネットワークアーキテクチャ
- CBOW (Continuous bag-of-words)
- skip-gram
高速化手法
- Hierarchical Softmax
- Negative Sampling
原文:[Efficient Estimation of Word Representations in Vector Space](https://arxiv.org/pdf/1301.3781.pdf)
## BoW: Bag of Words
単語数分の次元を持ったベクトルを作成する。

欠点:
- 語順情報が抜ける
- 単語の類似度を表現できない
- 疎 & 高次元になる
## CBOW (Continuous bag-of-words)

周囲の複数単語(コンテキスト)から中央の単語(ターゲット)を推測する。
注目する単語を$w_i$、周辺の単語を $w_o$としたとき、下記の確率を最大化するモデルとなる($V$はコーパスに含まれる全ての単語)。
$$
p(w_i|w_o)=\frac{\exp(v_{w_o}^T・v_{w_i})}{\sum_{w_v∈V}\exp(v_{w_v}^T・v_{w_i})}
$$
損失関数
$$
L = - \log{p(w_i|w_o)}
$$
コンテキスト数を$\Delta$とすると、
$$
P(w_{t-\Delta}, ..., w_{t + \Delta} | w_t) = \prod_{\delta = -\Delta , \delta \neq0}^{\Delta}{p(w_{t+\delta}|w_i)} = \sum_{\delta = -\Delta , \delta \neq0}^{\Delta}\log{p(w_{t+\delta}|w_i)}
$$
周辺単語$w_o$の出力ベクトル$v_o$と$v_i$の内積をとり、 それを正規化することで、$w_o$と$w_i$が共起する確率を求めている。
入力層:コンテキスト分
出力層:1つ
## skip-gram

中央の単語(ターゲット)から周囲の複数単語(コンテキスト)を推測する。
注目する単語を$w_i$、周辺の単語を $w_o$としたとき、下記の確率を最大化するモデルとなる($V$は文書データ中のボキャブラリーを示す)。
$$
p(w_o|w_i)=\frac{\exp(v_{w_o}^T・v_{w_i})}{\sum_{w_v∈V}\exp(v_{w_v}^T・v_{w_i})}
$$
損失関数
$$
L = - \log{p(w_o|w_i)}
$$
コンテキスト数を$\Delta$とすると、
$$
P(w_{t-\Delta}, ..., w_{t + \Delta} | w_t) = \prod_{\delta = -\Delta , \delta \neq0}^{\Delta}{p(w_{t+\delta}|w_i)}
$$
とあらわされる。
ex) コンテキスト数が1の場合
$$
L = - \log{p(w_{i-1}, w_{i+1}| w_i)} \\
= - \log{p(w_{i-1}| w_i)}p( w_{i+1}| w_i)
$$
入力層:1つ
出力層:コンテキスト分
### skip-gramの高速化
最大化する確率を見ると、分母に$V$回の繰り返しが存在することが分かる。
$V$ の語彙数は $10^5$ 〜 $10^7$ オーダーであるため、工夫が必要。
$$
p(w_o|w_i)=\frac{\exp(v_{w_o}^T・v_{w_i})}{\sum_{w_v∈V}\exp(v_{w_v}^T・v_{w_i})}
$$
#### negative sampling
## Doc2Vec
Doc2Vecは下記2つのアルゴリズムを総称したもの。
- PV-DM(Distributed Memory Model of Paragraph Vectors)
- PV-DBOW(Distributed Bag of Words version of Paragraph Vector)
単語のベクトル化手法(CBoW, Skip-Gram)をベースに,単語の羅列である文書もベクトルにしてしまおうというもの。
原文:[Distributed Representations of Sentences and Documents](https://cs.stanford.edu/~quocle/paragraph_vector.pdf)
### PV-DBOW: Distributed Bag of Words version of Paragraph Vector
文脈窓の単語と文書IDを結合したものから中心の単語を予測することで文書の文脈情報を取得する手法
(DBoW : Distributed Bag of Words)
特徴
単語の順序を考慮しないシンプルなモデルで計算効率が良い。

### PV-DM: Distributed Memory Model of Paragraph Vectors
多数の文書の中から,文書IDを入力値に,その文書内からランダムに選択された単語を予測することで文書全体の意味を獲得する手法
CBowにドキュメントIDの情報を付与したモデル。
Word2VecのCBoWモデルと同様に、入力層は”コンテキスト”を表し、出力は予測単語として学習する。
特徴
精度高い

### 検討すべきパラメータ
| parameter | description |
|:---------------- |:------------------------------------------------------------------------------------------------------------------------------------------ |
| `dm` | 使用するアルゴリズムの選択。dm = 1の場合、「分散メモリ」(PV-DM)が使用される。それ以外の場合は、単語の分散バッグ(PV-DBOW)が使用される。 |
| `vector_size` | 特徴量ベクトルの大きさを指定 |
| `window` | context幅 |
| `alpha` | 初期学習率 |
| `seed` | シード値 |
| `min_count` | これより出現数の少ない単語を除外 |
| `max_vocab_size` | RAM使用量を制限するために使用。 これよりもユニークな単語が存在する場合は、頻度の低い単語を削除する。 |
| `workers` | 並列で実行する場合、スレッド数を指定 |
| `epochs` | エポック数 |
### ELMo・BERT
- 文脈を双方向に見ることができる
- Transformer の Encoder 部分を使用
- GoogleのJacob Devlinらの論文で発表された自然言語処理モデル
- ファインチューニングが可能
## 方針
doc2vec (skip-gram) にて分散表現を取得
↓
PCA or tSNEによって次元圧縮
↓
2成分を可視化
精度が低い場合、BERTやELMoを検討する。
## 類似度の評価
### コサイン類似度
$\vec{a}=(a_1,a_2,⋯,a_n)$, $\vec{b}=(b_1,b_2,⋯,b_n)$ について、
$$
cos(\vec{a}, \vec{b} )= \vec{a}\cdot\vec{b} = \frac{a_1 b_1 + a_2 b_2 + ⋯ + a_n b_n}{\sqrt{{a_1}^2 + {a_2}^2 + ⋯ + {a_n}^2}\sqrt{{b_1}^2 + {b_2}^2 + ⋯ + {b_n}^2}}
$$
## 参考
Word2Vec原著
https://arxiv.org/abs/1405.4053
Doc2Vecの仕組みとgensimを使った文書類似度算出チュートリアル
https://deepage.net/machine_learning/2017/01/08/doc2vec.html#bag-of-words%E3%81%AE%E6%AC%A0%E7%82%B9%E3%81%A8doc2vec%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88
Word2Vec のニューラルネットワーク学習過程を理解する
http://tkengo.github.io/blog/2016/05/09/understand-how-to-learn-word2vec/
自然言語処理の王様「BERT」の論文を徹底解説
https://qiita.com/omiita/items/72998858efc19a368e50