# NLP: Doc2Vec ## 過去回 [第1回:NLP Outline](https://hackmd.io/@kkume/HyCr7NNOD) [第2回:Word2Vec](https://hackmd.io/@kkume/ByfWVUEdP) ## 元論文 https://cs.stanford.edu/~quocle/paragraph_vector.pdf ## 要点 * **Document(文章)の分散表現が得られる** * **Word2VecのDocument version** * **Word2Vecと同じく、Neural Network のモデルである** * **PV-DM(Distributed Memory Model of Paragraph Vectors)とPV-DBOW(Distributed Bag of Words version of Paragraph Vector)がある** ## 文書の分散表現 Word2vecでは単語の分散表現を扱った ==**Doc2Vecでは文書の分散表現を扱う**== ![](https://i.imgur.com/aouT4Of.png) ## BoW (Bag-of-Words) 単語はOne-Hot表現によって数値化できた。 では、**文書はどうやって数値(ベクトル)化すべきか?** そのひとつの方法が ==**Bag-of-Words**== である。 BoWでは、単語の出現をカウントすることでベクトル化する。 ![](https://i.imgur.com/b4wS7eZ.png) ### BoWの問題点 当然だが、語順を無視しているので、文章の意味の全ては捉えることができない。 あくまで、文章全体のトピックのようなものを捉えるに過ぎない。 ## Doc2Vec ==Document ID==を使ってDocumentの分散表現を獲得するモデルである。 ![](https://i.imgur.com/4dQ04ZR.png) ### 注意点というか所感 * **==既存のコーパスのDocumentを分類するために学習するもの==** * **未知なるDocumentの分散表現を得るものではない** Word2Vecとの対比が多いが、個人的にはそれはミスリードしやすいと思う。 ### PV-DM(Distributed Memory Model of Paragraph Vectors) 上の図の左側にあたるモデル。 下記は論文内の図。論文ではParagraph id (このページではDocument ID)と呼んでいる。 ![](https://i.imgur.com/N1xlQOc.png) 上の図を自分の絵で説明してみる。 --- ① ![](https://i.imgur.com/hWGooj9.png) 3種類のDocumentを持ったコーパスがあるとする。それぞれのDocumentはIDが割り振られている。 ---- ② ![](https://i.imgur.com/wqNPJdP.png) Documentをひとつ選び、さらに単語をひとつ選ぶ。 今回は「だった」を選択する。 選択した単語から==X手前の単語==を取得する。 今回の場合、手前3単語まで選択する。「初めて」「の」「海外旅行」 それぞれの単語をOneHotベクトルに変換する。 Document IDもOneHotベクトルに変換する。Documentが3つしかなかったら、3次元のOneHot。 ---- ③ ![](https://i.imgur.com/TarOn9Z.png) 適当なネットワークを用意して、Weightをかけて、分散表現を得る。 ここで、赤の分散表現は、==Documentの分散表現==になっている。 そして、単語の分散表現と、Documentの分散表現を連結する。 ---- ④ ![](https://i.imgur.com/uXvMkjU.png) 連結した後、適当なWeightをかけて、単語のOneHot次元に変換する。 Softmaxをかけて確率化。 CrossEntropyでLoss計算する ---- ⑤ ![](https://i.imgur.com/7Nj6gGs.png) 学習において、==単語の分散表現のWeightは固定==する。固定というか、あらかじめ、==Word2Vecで単語の分散表現を事前学習したWeight==を使用する。 なので、実際にBack propagation によって学習されるWeightは赤と青の箇所である。 そして、学習して得られたWeightを掛けたものが、==あるDocument IDの分散表現==になっている ---- ### PV-DBOW(Paragraph Vector without word ordering: Distributed bag of words) PV-DMでは、単語の順番を意識していたり、Word2Vecで事前学習したりと学習に時間がかかった。こっちは、学習が早いけど精度が悪い。 あるDocument ID から単語をランダムにN個サンプリングして、そのN個を分類するモデルちなっている。割愛 ![](https://i.imgur.com/KFXZLjE.png) ## Doc2Vec の使い方 [参照](https://qiita.com/g-k/items/5ea94c13281f675302ca#doc2vec%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8)