Word2Vecをより高精度で32倍軽量にする手法をPairsのデータで試しました

Mizuki Kobayashi
Eureka Engineering
Published in
10 min readJul 10, 2018

はじめに

初めまして、こんにちは。BIチームの小林です。
日頃Fortniteやスプラトゥーンに精力的に打ち込んでいます。

弊社のBIチームでは、様々な数字の分析や機械学習を用いての提案を業務としています。
同様に機械学習を扱うAIチームという部隊もエウレカには存在していて、AIチームは、BIチームより機械学習主体の技術ドリブンで動いています。我々BIチームとAIチームでは、分野的に被る部分も多いため、共同で勉強会(定期的にarXivなどに上がっている最新の論文の輪読会)を行っています。
本記事では、前回の輪読会で私がチョイスしたword2bitsというword2vecを量子化して行列要素のサイズを減らす技術について書かれた論文(
Maximilian Lam. Word2Bits — Quantized Word Vectors https://arxiv.org/abs/1803.05651)を紹介します。

記事の終わりでは、実際にPairsのデータを用いてモデリングしています。今後の恋愛に使える知識が得られますので、ぜひ最後までご覧ください。

Abstract

Word vectors require significant amounts of memory and storage, posing issues to resource limited devices like mobile phones and GPUs. We show that high quality quantized word vectors using 1–2 bits per parameter can be learned by introducing a quantization function into Word2Vec. We furthermore show that training with the quantization function acts as a regularizer. We train word vectors on English Wikipedia (2017) and evaluate them on standard word similarity and analogy tasks and on question answering (SQuAD). Our quantized word vectors not only take 8–16x less space than full precision (32 bit) word vectors but also outperform them on word similarity tasks and question answering.

引用元 : https://arxiv.org/abs/1803.05651

ざっくり要約すると、

word2vecのベクトルは各要素が32bitで表現されているため、合計で語彙数*次元数*32bitとなりモバイル端末などで扱おうとするとかなりのメモリ容量を必要とする。
そこで、各要素を量子化して1~2bitとすることで軽量化してみたら、類似度やQ&Aのタスクでは精度が上がった。
と言う感じです。

モデル

既存手法(word2vec)

word2vecのベクトルを作成するアルゴリズムにはCBOWとSkipgramがありますが、今回はCBOWを高速化させた手法である、CBOW with NegativeSamplingのアルゴリズムをベースに改良します。
以下が、CBOW with NegativeSamplingの最適化関数です。

無理やり、oを中心語、cを背景語とすることでSkipgramの最適化関数と同じ形になっています。本来は記号を逆転させたほうが良いのですが、今回は論文に従いそのまま引用しました。

最適化の流れとしては、

上記を繰り返します。

提案手法(word2bits)

今回紹介するword2bitsという手法は、上記のword2vecの最適化関数に量子化を組み込んだものです。上のword2vecの最適化関数に量子化の過程を入れると、以下のようになる。

このとき

ここで、量子化関数 Q(x) は以下のように定めます。

ちなみにこれは、論文の著者がいろいろ試して一番うまくいった値だそうです。
Q(x) は離散的な関数で、微分するとある点では不定、他の点で0となります。
なので、以下のように定めます。(これは、Hinton straight through estimator と呼ばれます)

結果

上の表 : 類似度タスクでは、精度が上がった、アナロジータスクでは下がった。(Accuracy)
下の表 : 質問系タスクでは、精度が上がった。(F1-Score)

また、 以下のグラフによると
- Epoch数(学習回数)が増えると、32bit(従来のモデル)では過学習が起きている(Accuracyが下がっている)
- 次元数が増えても、32bit(従来のモデル)では過学習が起きている(Accuracyが下がっている)

Pairsのデータでやってみた

モデル

今回、Pairsに登録しているユーザーのデータからモデルを作成しました。
Pairsでは、共通の価値観を持つ相手とマッチングできるよう、自己を表現するために様々な項目が用意されています。
固定値のプロフィール項目やコミュニティ、自由入力な自己紹介文や趣味などの多種多様な項目がありますが、今回はユーザーの趣味の項を用いてモデルを作成しました。

Pairsでは、ユーザーの趣味の欄は自由入力で3つ入力できるようになっていますが、人によっては、一つの欄に多種多様な区切り文字を用いて複数の趣味を入力していたり、文章を記入しているものもあります。

例えば、それぞれの項目に一つずつ書いてある場合を
["テニス", "スポーツ", "カラオケ"]と表記すると、
["テニス,サッカー,野球", "スポーツ、運動", "*カラオケ*コスプレ*映画*"]
["テニスが好きです。", "スポーツをよくやります。", "週末はカラオケに行くこともあります。"]といった記入パターンをするユーザーもいます。

今回、シンプルなモデルを作成するために、趣味に含まれる名詞のみを抽出して利用しました。

また、パラメータは以下のように設定し、単語ベクトルを作成しました。
- 次元数 : 100
- ウィンドウ幅 : 20
- ネガティブサンプリング数 : 5
- エポック数 : 5
- 最低出現数 : 5

結果

出現頻度上位50の単語のベクトルをPCAにより次元削減してから可視化を行いました。
まとまりがわかるように、既存手法でベクトルを生成しPCAにかけたものを、k-meansで4つに分け着色しました。

既存手法
1bit量子化
2bit量子化
今回は省略しましたが、TSNEを用いて次元削減すると、それぞれかなり違ったグラフとなりました。
単語ベクトルの量子化は、大まかな位置関係は維持しつつも距離を変える操作となっていると考えられます。

これを見ると、位置関係はそこまで変わらず、まとまり自体は概ね維持されています。
ざっくり、赤は 大人系 、緑は アウトドア、青は お一人様、 紫は おしゃれ な感じにまとまっているように見えます。

また、例えば「ゲーム」に近いワードを調べてみると、

上から既存手法、1bit量子化、2bit量子化

結果は割と似通っており、どれもそこそこ納得感もあるような気がします。

論文によると、アナロジータスク(演算を用いた類似単語推定)は、結果が悪いということですが、
例えば、ゲーム − スポーツ で見てみると、

上から既存手法、1bit量子化、2bit量子化

演算に関しては答えが明確に定められないので正しいのか評価は難しいところではありますが、それぞれが少しずつ違い、特に1bit量子化したものがもっとも異なる結果となりました。

おまけ

参考までに、記事執筆時点での人気ユーザー(過去30日間での獲得いいね数の上位)100名をピックアップして、それぞれの趣味に含まれる単語ベクトルを平均してユーザーの趣味ベクトルとし、100人の趣味ベクトルを平均したものと、1位のユーザーの趣味ベクトルを図nに重ねてプロットしました。

男性100人の趣味ベクトルは重なって見えづらいですが、ほぼほぼ お酒 と被っています。

私も、今後はモテるためにお酒を趣味にしていきたいと思います。

モテる人たちの趣味は、お酒が多いわけでも紫の領域に偏っているわけでもないですが、平均するとこのようなベクトルとなりました。この結果は、このベクトルに近い趣味がモテるということを保証するものではございませんのでご了承ください。

エウレカのBIチームでは、このように実際のデータを使って最先端の技術や手法を試すことができます。私たちは一緒に働けるメンバーを常に募集していますので、少しでも興味を持っていただけましたら、下記Wantedlyからご応募をよろしくお願いいたします!

--

--