MONACAT開発日誌

勉強したこととか面白い技術の話

単語分散表現を得る方法【BoW, Word2Vec, GloVe, fastText】

単語分散表現とは

単語埋め込み(Word Embedding)とも呼ばれる、単語をベクトルで表現したものです。単語分散表現は色んな自然言語処理の技術で使われます。そもそもNNにテキストを入力するにはベクトル表現でなければなりません。

単語分散表現を得る方法として、タスクごとに学習させてチューニングして…ということが行われますが、学習済みモデルを使うと便利です。

BoW

Bag-of-wordsは最もシンプル(雑)な手法です。One-hot表現とも呼ばれ、[0, 1]ないしは[0, N]で表現します。次元数=単語数なので次元が膨れやすく、出現順序や他の単語との関係性が無視されます。大切なのは単語の定義で、前置詞や助詞を除いたり、そもそも名詞しか使わなかったり、色んな定義ができると思います。

LSA(潜在意味解析)

BoWの課題である次元数を圧縮し、単語を集約できたら便利です。LSA(Latent Semantic Analysis)とは特異値分解(SVD)を用いて潜在的な意味を求める手法です。SVDはX=TSD^{T}で表記され、T, D^{T}は直行行列、Sは対角行列です。この対角成分こそが元の行列Xの特異値であり、特異値の小さいものを情報が少ないものとして削除することにより次元圧縮できます。当然、次元圧縮するほど元のデータを表現できなくなります。

f:id:sakura-ika:20200512210030p:plain
【技術解説】潜在意味解析(LSA) ~特異値分解(SVD)から文書検索まで~ - ミエルカAI は、自然言語処理技術を中心とした、RPA開発・サイト改善・流入改善レコメンドエンジンを開発より引用

LSAは情報検索の分野で利用されてきましたが、実際にはLDAやNMFの方が解釈が容易でよく使われているようです。また、行列の大きさは単語数に比例するので計算量も膨大になるという欠点もあります。

Word2Vec

Word2Vecは前後の文脈から単語を予測することでEmbeddingを得る手法です。前述の手法がカウントベースなのに対して、Word2Vecは推論ベースの手法です。本来はWord2Vecはツールの名前であってCBOWとSkip-gramという2つの手法があるのですが、一般的にはWord2Vecで浸透していますね。違いは間の単語を予測するか、周りの単語を予測するかの違いだけです。

文書単位に拡張したDoc2Vecもありますが、あまり使われていませんね。精度やドメインの問題でしょうか。文書単位では意外とWord2Vecの平均をとる方が使われているかもしれません。

GloVe

Stanfordが開発したGloVeは単語間の共起行列から学習する手法です。Word2Vecよりも速く、精度が良いらしい。要は良いとこどりのような手法なのでカウントベースにおけるスパースの問題や、推論ベースにおける一部のウィンドウのみを参照していて全体を考慮していないという欠点を解消しているんだと思います。この中では多分マイナーな部類。

fastText

Facebookが開発した、名前からして学習速度を強調してそうな手法です。サブワードの概念を導入し、単語をより小さな構成要素に分解したWord2Vecの手法です。学習モデル自体は大きく変わっておらず、アルゴリズム的に超高速化を図っているという認識です。

実装の話は以前Qiitaで書いた気がするので、こちらも良ければ。

Sentence Embedding

近年ではELMoやBERTといった文脈全体を考慮した分散表現が台頭しています。BERTベースのモデルは今もSOTA合戦が繰り広げられているので頑張って追います…。

最近BERT解説系の記事が増えたので読みたいと思ってます:自然言語処理の王様「BERT」の論文を徹底解説 - Qiita

このブログの目的と概要

はじめに

初めまして、MonaCatです。当ブログでは主に技術に関する話をしますが、技術特化ではありません。面白い話題や趣味の話なども気軽に書いていきたいと思っています。

ブログの内容は個人の意見・見解を含むため、決して正確であるとは限りません。もし明らかに間違いな記述がありましたら、コメント等で教えてくださると有難いです。

ロードマップ

まだ。

おすすめ

まだ。