For Your ISHIO Blog

データ分析や機械学習やスクラムや組織とか、色々つぶやくブログです。

Embeddingについてまとめた。

下記の日本OR学会の論文を参考に、Embeddingについて整理しました。

Word Embeddingモデル再訪 オペレーション・リサーチ学会 2017年11月号

20190621追記 こちらの記事もご覧ください。

ishitonton.hatenablog.com

目次

Embeddingとは何か

自然言語処理におけるEmbedding(埋め込み)とは、「文や単語、文字など自然言語の構成要素に対して、何らかの空間におけるベクトルを与えること」を指す。

例えば、Word Embedddingでは、各単語に対して固有のベクトルを与えることを指している。

Embedding では、同じ階層の要素すべて(Word Embeddingなら単語すべて)が同じ空間内に配置され、常に同じ次元数のベクトルで表現される。このため,機械学習に特徴量として容易に投入可能。

例えば文を分類したい場合、単語ではなく文をベクトル化し埋め込む必要がある。しかし、文や文書は単語の系列として存在するため、単語より大きい要素の Embedding は単語or単語以下の Embedding を用いて表現することが多い。

Embeddingの各種アルゴリズム

One-hot表現

一番シンプルなEmbedding手法。まず表現したい語彙リストを作成し、各単語を表現する次元を準備する。表現したい文に含まれている単語に対応する次元を1に、それ以外を0にする方法。文のベクトルを作るBag-of-words(BoW)表現に利用される。

BoW表現では文のベクトルは各単語の One-hot 表現のベクトル和として表現され、文書分類の特徴量として利用される。

One-hot表現の欠点は下記。

  1. 未知語を扱うことができない。
  2. 次元数が膨大となる。->メモリ使用量が増大。

共起関係の利用

単語間の類似性を図る方法としては、単語同士の共起関係を利用する。これは、意味が似ている単語は類似した文脈で出現するだろうという分散仮説を前提としている。分散仮説に関連して開発された手法には、Count-basedpredictiveな方法がある。

count-basedな手法は、さまざま文脈の中で登場する単語の頻度を算出し共起行列を作成する。文脈とは、例えばWikipediaであれば各記事など、何か意味ある単語の集合を指す。count-basedな情報はスパースで扱いづらいものが多く、何らかの手法で情報集約して次元を減らしたりするのが一般的である。

predictiveな手法は、前後の文脈の単語のベクトルから目的の単語ベクトルを予測する(またはその逆を予測する)というタスクを通して、単語ベクトルを学習する手法。単語ベクトルの次元数は予測のアルゴリズム内で自由に決めることができる。

これらの方法は、次元圧縮された潜在変数の空間に単語がマッピングされる。One-hot 表現のように一つの要素(≒次元)が一つの概念(≒単語)に対応しているような表現ではなく、複数要素が一つの概念を構成し、一つの要素が複数概念を構成する“manyto-many”な表現 となる。

LSILatent Semantic Indexing

これは、count-basedな手法のうち代表的なもの。潜在意味インデックスと呼ばれたりする。Googleが取得している特許のひとつで単語同士の関連性に着目してコンテンツの内容を読み解くための技術である。

abicky.net

情報検索のために考えられた手法であり、各文書を潜在変数空間の点として表し,関連度を検索クエリ文書との近さで計測することを目指している。Latent Dirichlet Allocation(LDA) は、LSIの発展形である。

Word2vec

predictive な手法で実用上現在最も広く用いられている。word2vecは、大量のテキストデータを解析し、各単語の意味をベクトル表現化する手法。単語をベクトル化することで、単語同士の意味の近さを計算したり、単語同士の意味を足したり引いたりすることが可能。

Word2vecには下記2つの方法が存在。

  1. CBOW

  2. Skip-Gramモデル

今回は後者のSkip-Gramモデルについて簡単に説明。(こっちの方がわかりやすいらしい) Skip-Gramは、ある単語の前後に出現する単語の出現確率を計算することでベクトル化をする方法。これは、意味が近い(≒単語ベクトルの距離が近い)単語は、周辺の単語も似ているはずという仮説に基づきます。

Skip-Gramでは、入力単語を元に周辺語を出力する、入力層・隠れ層・出力層のみのNeural Networkを考える。すなわち、ある単語を入力データに、その周辺語を教師データにして、重みを学習していく。周辺5単語位が一般的らしい。

Skip-Gramについては、下記記事が非常にわかりやすいです。

www.randpy.tokyo

Glove

Word2vec翌年の2014年に発表されたアルゴリズム。Glove はグローバルな情報を用いる count-basedな手法とローカルな文脈の情報を用いる predictive な手法を組み合わせたもの。いわゆる良いとこどりをした手法らしい。学習が速い、精度が高い、そして小さいコーパスでも動作可能とのこと。

fastText

2016年にFacebookが発表した手法。これまでの手法は単語をベースとするため、未知語に対応するのが難しい。これを克服するためのアイデアとして、単語より小さな単位でEmbedding を行う。

文字レベルのN-gram (Character N-gram) であるsub-wordを用いる。 Word2Vecでは、活用形が考慮されない(goとgoes、going、これらは全て「go」だが、字面的には異なるので別々の単語として扱う)。これに対してfastTextでは、単語を構成要素に分解(goesならgoとes)し、字面の近しい単語同士により意味のまとまりをもたせる。 f:id:ishitonton:20181125193220p:plain 下記記事がわかりやすい。

word2vec, fasttextの差と実践的な使い方 - にほんごのれんしゅう

FacebookのfastTextでFastに単語の分散表現を獲得する - Qiita

Character-based Embedding

sub-wordよりも小さい単位である文字ベースでのEmbedding (Character-based Embedding) も存在している。近年は特に RNNを用いた文章生成などで用いられている。

日本語や中国語のような漢字文化圏では、文字種数のオーダーが2 桁以上異なるために個々の文字がより複雑な単語的意味をもっており,文字レベルでの Embedding が研究されている。漢字の場合は、その字形自体も意味をエンコードしていると。まぁ、言われてみれば本当にその通りです。字形を画像として捉え、Convolutional Neural Networkを用いて視覚的特徴のEmbeddingを作成している例もあるとのこと。

Word Embedding モデルのアンサンブル

これまで見てきたEmbeddingは、それぞれ異なる特徴を持っているので、当然これらの情報をもとにアンサンブル学習するのも必然的な流れの一つ。異なるWord Embeddingモデルを複数用いたMeta Embeddingは発表されている。

また、人手で作られた言葉の概念ツリーデータベースWordNetとWord2Vecのモデルを組み合わせ、WordNetの抽象概念にベクトルを付与したAutoExtendなどもある。

日本語環境下でのEmbedding

日本語のコーパスで大規模でフリーなものは少ない。日本語におけるEmbeddingモデルの公開言語資源は英語圏と比べるとまだまだ少ないのが現状。 日本語では形態素解析が必要となる。MeCabが有名だが、近年はneologdが用いられる。MeCabとは、形態素解析をするためのライブラリであり、NEologdはWeb上から得た新語に対応しており、毎週更新されるMeCab用のシステム辞書。この二つで最新の単語に対応した形態素解析が可能。

ファインチューニング

ファインチューニングとは、機械学習タスクでまず一般的なデータで学習して得られたパラメータを初期値として、特定のタスクのデータや目的関数で再度学習することで、そのタスクにおける精度を向上させる手法。

Embedding モデルを利用する際、試験的に利用する範囲では既存の公開モデルをそのまま使うだけでも十分だが、タスクの精度を向上させるにはやはりEmbeddingモデルのファインチューニングは有力な選択肢の一つ。

一から学習し直してもよいが、学習データが少ない場合などもある。実用上はWikipediaデータのような大規模なデータセットで学習したEmbeddingモデルを、対象のタスクの精度を向上するように再学習するという形式がとられることが多い。