37
乱択データ構造の最新事情 MinHash HyperLogLog の最近の進歩- 東京大学 情報理工学研究科 D2 秋葉 拓哉 (@iwiwi) 2014/05/29 @ PFI セミナー

乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

Embed Size (px)

DESCRIPTION

MinHash, b-bit MinHash, HyperLogLog, Odd Sketch, HIP Estimator の解説です.

Citation preview

Page 1: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

乱択データ構造の最新事情

-MinHash と HyperLogLog の最近の進歩-

東京大学 情報理工学研究科 D2

秋葉 拓哉 (@iwiwi)

2014/05/29 @ PFI セミナー

Page 2: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

背景

誰もが大量の集合・特徴ベクトルを処理したい!

• 文章 → 単語の集合 (bag of words)

• 商品 → 購買者

• 画像データ → 局所特徴量 (SIFT, SURF, …)

• ……

色々したいが,そのまま処理するのは困難

• データが大きすぎる

• 遅すぎる

1

Page 3: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

Sketching による効率化

解決策:

集合そのものの代わりになる Sketch を使う

2

Sketch 𝑫(𝑺)集合 𝑺

hoge

piyo

fuga ???

• 小さい!• 効率的に処理ができる!• ただし結果は推定になる

Page 4: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

3

今日の話:集合 Sketching の最新技術

1. MinHash Sketches 入門• 基礎的かつ強力な手法である MinHash を復習(以降の話も両方 MinHash の派生系)

2. Odd Sketches による Jaccard 係数推定の進歩

• まず,現在よく用いられている 𝒃-bit MinHash を紹介

• 類似性が高い際 𝑏-bit MinHash が劣化する問題を解消

[Mitzenmacher-Pagh-Pham, WWW’14]

3. HIP Estimator による集合異なり数推定の進歩

• まず,現在よく用いられている HyperLogLog Counter を紹介

• 要素挿入時の情報を用い精度を改善,誤差 1.08/ 𝑚 → 0.87/ 𝑚

[Cohen, PODS’14]

WWW’14 Best Paper!

Page 5: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

1. Min-wise Hashing 入門

※この部分は岡野原さんの 2011 年の解説をベースにさせてもらっています

http://research.preferred.jp/2011/02/minhash/

4

Page 6: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

Jaccard 係数

集合の類似度として Jaccard 係数を考えます

集合 𝑺𝟏 と 𝑺𝟐 の Jaccard 係数:

𝐽 𝑆1, 𝑆2 =𝑆1 ∩ 𝑆2

|𝑆1 ∪ 𝑆2|

具体的な場面

• 文章の類似検索,重複検出

• 商品の推薦

集合の Jaccard 係数を推定したい気持ちになって下さい5

Page 7: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

MinHash Sketch 𝒌 = 𝟏

ハッシュ関数 ℎ を用意しておく

6

集合 𝑆

hoge

piyo

fuga

ℎ 𝑎 𝑎 ∈ 𝑆}

13

85

35

min ℎ 𝑎 𝑎 ∈ 𝑆}

13

全要素にハッシュ関数を適用 最小値だけを取り出す

Page 8: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

Jaccard 係数推定の基礎

重要な性質

Pr min ℎ 𝑎 |𝑎 ∈ 𝑆1 = min ℎ 𝑏 |𝑏 ∈ 𝑆2

= 𝐽 𝑆1, 𝑆2

2 つの集合のハッシュ値の min が一致する確率は

Jaccard 係数に等しい!

※ハッシュ関数は完全にランダムに振る舞うと仮定

7

𝑆1 の Sketch 𝑆2 の Sketch

Page 9: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

Jaccard 係数推定の基礎

なぜ?具体例で考えてみます.

• 𝑆1 = 2,5,7,9 , 𝑆2 = 1,2,4,7,10

𝑆1 ∩ 𝑆2 = 2,7 .例えば 2 で一致する場合とは?

• arg min ℎ 𝑎 |𝑎 ∈ 𝑆1 = 2 ⇔ {2,5,7,9} で 2 が最強

• arg min ℎ 𝑏 |𝑏 ∈ 𝑆2 = 2 ⇔ {1,2,4,7,10} で 2 が最強

条件を合わせると,

• 2 で一致 ⇔ 1,2,4,5,7,9,10 = 𝑆1 ∪ 𝑆2 中で 2 が最強

一致するのは 7 でも良く,このように,要は

𝑆1 ∪ 𝑆2 中で最強のものが 𝑆1 ∩ 𝑆2 のいずれかであればよい.

その確率は: S1 ∩ 𝑆2 / S1 ∪ 𝑆2 = 𝐽 𝑆1, 𝑆2 .

8

最強=ハッシュ値が最低

Page 10: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

𝒌-min MinHash Sketch

あとはこれを 𝑘個並べると……!

𝒌-min MinHash Sketch

• 異なる 𝑘 個のハッシュ関数 ℎ1, ℎ2, … , ℎ𝑘 を用意

• それぞれについてさっきの min を計算&保存

Jaccard 係数の推定

• 「一致した数 / 𝑘」により 𝐽 𝑆1, 𝑆2 を推定

推定値は unbiased (不偏)

また分散は 𝐽 1 − 𝐽 / 𝑘 になることが示せる

9

Page 11: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

MinHash Family

こんな感じでハッシュ関数の最小値に注目する

Sketching の手法が一般に MinHash と呼ばれる.

(Jaccard 係数推定以外のことも色々できる.)

MinHash のバリエーション• 𝑘 個の並べ方

– 𝑘-min Sketch (OddSketch はコレ)

– 𝑘-partition Sketch (HyperLogLog はコレ)

– Bottom-𝑘 Sketch (最近の All-Distances Sketches はコレ)

• ハッシュ値の使い方

– Full Ranks (さっきのやつはコレ)

– 𝑏-bit MinHash (Jaccard 係数でよく使われているヤツ)

– Base-𝑏 Ranks (HyperLogLog は Base-2 Ranks)

– ……

10

Page 12: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

2. Odd Sketches によるJaccard 係数推定の進歩[Mitzenmacher-Pagh-Pham, WWW’14]

11

Page 13: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

𝒃-bit MinHash

MinHash の改善できそうなところ• さっきの MinHash ではハッシュ値をそのまま保存

• 各々に 32bit (or 64bit) も使うと個数 𝑘 をあまり増やせない

• 衝突を覚悟してもハッシュ値を小さくして,その分 𝑘 を増やしてはどうか?

𝒃-bit MinHash [Li-König, WWW’10]• 異なる 𝑘 個のハッシュ関数 ℎ1, ℎ2, … , ℎ𝑘 を用意

• それぞれについてさっきの min を計算

• ハッシュ値の下位 𝑏 bit のみを保存

(データサイズは 𝑘𝑏 bit になる)

12

𝑏 = 1 という極端な場合が実は一番性能が良かったり

Page 14: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

𝒃-bit MinHash による Jaccard 係数推定

Jaccard 係数の推定:

𝐽 =𝑛/𝑘 − 2−𝑏

1 −2−𝑏 と推定すれば良い (𝑛=一致箇所数)

一致確率にハッシュ値の衝突を加味して解析

• 各箇所の一致確率は 𝐽 + 1 − 𝐽 2−𝑏

• 𝐽 + 1 − 𝐽 2−𝑏 × 𝑘 = 𝑛 として解くと上が得られる

推定値は unbiased (不偏)

また分散は 1−𝐽

𝑘𝐽 +

1

2𝑏−1になることが示せる

13

Page 15: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

𝒃-bit MinHash が微妙な時

特に高い類似度の推定に興味がある時

𝒃-bit MinHash は実は微妙

なぜ?

• 類似度 𝐽 が 1 に近い時,2 つのスケッチはほぼ同じ

• 異なっている若干のビット数で,1 との差を見積もる

• つまり,1 との差を表現するのは全体のごく一部

そのような状況は少なくない

• 類似度 Top-10 を表示したい(→ 高い類似度のアイテムの精度が重要)

• Web ページの重複検出等で 𝐽 > 0.9 かを判定したい

14

Page 16: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

𝒃-bit MinHash が微妙な時

• 類似度 𝐽 が 1 に近い時,2 つのスケッチはほぼ同じ

• 異なっている若干のビット数で,1 との差を見積もる

• つまり,1 との差を表現するのは全体のごく一部

15

[Figure 1, Mitzenmacher+, WWW’14]

Page 17: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

Odd Sketches

そこで高い類似度での精度を重視し改善するのが

Odd Sketches [Mitzenmacher-Pagh-Pham, WWW’14]

着想

• XOR を活用する

• 共通部分を打ち消させる

• 異なっている部分の情報だけを綺麗に得る

Page 18: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

Odd Sketches

Odd Sketches [Mitzenmacher-Pagh-Pham, WWW’14]

• まず集合の要素を 𝑘-min MinHash で 𝑘 個選ぶ

• 𝑛 bit のビットベクトル 𝑠 を用意,最初は全箇所 0

• 選ばれてる各要素 𝑎 について,𝑠 ℎ′ 𝑎 を反転する

𝑘と 𝑛がパラメータ.ℎ′: 値域 [1, 𝑛] のハッシュ関数を別途用意

17

集合 𝑆

hoge

piyo

fuga

1 piyo

2 hoge

𝑘-min MinHash𝑘 = 2

0 1 0 0 1 0

Odd Sketch𝑛 = 6

Page 19: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

Odd Sketches

※注意:実際には元の集合からいきなり Odd Sketches を計算するのではなく,集合の 𝑘-min MinHash Sketch の Odd Skech を計算します.

(擬似コードの 𝑆 は既に 𝑘-min MinHash Sketch)

18

Page 20: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

Odd Sketches による Jaccard 係数の推定

𝐽 = 1 +𝑛

4𝑘ln 1 −

2 × Popcount odd 𝑆1 ⨂odd 𝑆2

𝑛

導出

• E MinHash𝑘 𝑆1 Δ MinHash𝑘 𝑆2 = 2𝑘 1 − 𝐽

• ポアソン分布への近似により E 𝑠𝑖 =1−𝑒−2𝑚/𝑛

2, E[Popcount] = 𝑛

1−𝑒−2𝑚/𝑛

2

• これを適当に解くと上が得られる

精度保証

• 実は Biased (だけど bias は 1 以下)

• この式自体の分散等のカッチリした bound は今のところ無い論文中では良いパラメータ仮定の元で精度が良さそうな根拠を並べている.

実際にはパラメータも実験により決めており,このへんは若干イケてない.

19

XOR1 の数

S1の Odd Sketch

対称差

𝑚 = MinHash𝑘 𝑆1 Δ MinHash𝑘 𝑆2

Page 21: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

Odd Sketches が得をする感覚的説明

20

[Figure 1-2, Mitzenmacher+, WWW’14]

Page 22: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

実験結果

他,論文中では実際の応用に組み込んでの結果なども示されてます.

21

[Mitzenmacher+, WWW’14]

Page 23: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

3. HyperLogLog による集合異なり数推定の進歩[Cohen, PODS’14]

22

Page 24: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

集合異なり数の計算

集合異なり数 (distinct counting)

• 重複を取り除き,異なるものの数を数えたい

• 例:[1, 3, 5, 1, 2, 3, 2] → {1, 2, 3, 5} → 4

具体的な場面• ウェブページのユニークビジター数

• 単語の DF (document frequency) の計算 (tf-idf)

23

Page 25: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

集合異なり数の計算

計算が “意外と” 難しい• 既に全データある (batch) → sort して unique かける

• 少しずつ来る (stream) → set を用意して放り込む

どちらも線形のメモリを使ってしまう.

ユニークビジター数を監視したいとすると……

• 各ページについて set を用意?

• 各ページに線形のメモリは,メモリを使いすぎでは?

そこでやはり Sketching の出番!

現在最もよく使われているのが HyperLogLog Counter![Flajolet+, AOFA’07]

24

Page 26: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

HyperLogLog のインパクト

Google • PowerDrill (data analysis platform) にて使われている [Hall+, VLDB’12]

• その際行った改良についての論文も出ている [Heule+, EDBT’13]

Twitter • Algebird (Abstract algebra library for Scala) に入っている

https://github.com/twitter/algebird/search?q=hyperloglog&ref=cmdform

Redis (open source key-value store)

• データタイプとして HyperLogLog が選べるhttp://antirez.com/news/75

25

Page 27: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

HyperLogLog (𝒌 = 𝟏)

HyperLogLog も MinHash の一種,ただし

ハッシュ値を Base-2 Ranks で扱う

Base-2 Ranks• 𝑎 ∈ 𝑆 の Base-2 rank 𝜚ℎ 𝑎 ≔ ℎ 𝑎 の先頭の 0 の数

• 例:ℎ 𝑎 = 00010101010 ⋯ → 𝜚ℎ 𝑎 = 3

HyperLogLog 𝒌 = 𝟏• 𝑝 = max 𝜚ℎ 𝑎 | 𝑎 ∈ 𝑆 を計算

• 2𝑝 として推定

26

3個

一般に base-𝑏 rank は

− log𝑏

ℎ(𝑎)

𝑛(ℎ の値域を [1, n] として)

大きいヤツが珍しいのでmax を覚える

𝑝 以上になるのは確率 2−𝑝 なので的な

Page 28: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

HyperLogLog (𝒌 > 𝟏)

Jaccard 係数の時同様, 𝑘 個並べて推定を強化する.

ただし,今回は入力を 𝒌個に分割する.

HyperLogLog [Flajolet+, AOFA’07]• 𝑘 = 2𝑏 個のバケット 𝑀 𝑖 を用意

• ハッシュ値 ℎ 𝑎 の先頭 𝑏 bit でバケットに振り分け

• 各バケットで,Base-2 rank の max を保存

集合異なり数の推定

• 各バケットで推定値を計算

• それらの normalized bias corrected harmonic mean を取る(式は若干大変なので論文を見て下さい)

27

ハッシュ値は勿論先頭 𝑏 bit を捨てたものを使う

Page 29: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

HyperLogLog

28

[Figure 2, Flajolet+, AOFA’07]

Page 30: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

HyperLogLog の理論的な性能

精度

• 相対誤差は 1.04/ 𝑘,CV (NRMSE) は 1.08/ 𝑘

• 定数確率で 1 ± 𝜀 近似するために必要な空間は

𝑂 𝜀−2 log log 𝑛 + log 𝑛

スペース

• 各 𝑀 𝑖 の保存は 5 bit とかそんなもので良い → 5𝑘 bit

これは near-optimal であるらしい.(漸近的性能はこれ以上の大幅な改善はできなさそう,ということ)

29

LogLog の名前を冠する所以

Page 31: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

HyperLogLog の問題点

実は,値が大きくならないと滅茶苦茶

30

[Figure 2, Heule+, EDBT’13]

Page 32: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

値が小さい時の対策

アルゴリズムを組み合わせる

• Linear Counting [Whang+, TODS’09] など

無理やり直す [Heule+, EDBT’13]

• 右図のような巨大な表を前計算(Google PowerDrill にはこれが組み込まれている)

美しくない!

31

Page 33: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

HIP Estimator

Historic Inverse Probability Estimator[Cohen, PODS’14]

• 値が小さい時も推定が正確になる

• 漸近的な精度も大きく向上

着想

• HyperLogLog は near-optimal だったのでは?

• データ構造の最終状態から直接推定値を得るという仮定

• 最終状態だけでなく,計算途中の全ての状態を加味するとどうか?

32

素晴らしい!

Page 34: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

HyperLogLog with HIP Estimator

33

[Figure 4, Cohen, PODS’14]

データ構造に集合を流しこみつつ最初から数の集計も進める

バケットを更新する度に「この状況でここが更新される確率」

を使って集計値に加算する

Page 35: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

HIP Estimator 仕組み&理論値

動作原理はシンプル

• 一般論:確率 𝑝 で発生 → 発生までの回数の期待値は 1/𝑝

• これに基づき,スケッチ値がそこで更新される条件付き確率を考え,その逆数を足していけば良い

理論的解析

• CV (NRMSE) 3/4𝑘 ≈ 0.866/ 𝑘 (← HLL は 1.08/ 𝑘)

• 0.56 倍のレジスタ数で同じ精度

– カウンタ 𝑐 も新しく覚えておくことを加味しても優れている

HyperLogLog 以外でも,MinHash の変化を用いる時は常に適用可能(例:All-Distances Sketches)

34

Historic Inverse Probability と呼ばれる所以

Page 36: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

実験結果

35

[Figure 3, Cohen, PODS’14]

Page 37: 乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-

まとめ

背景

• 大量の集合を皆が扱いたい時代

• そのための基礎技術としての集合 Sketching を紹介

基礎

• 全ての基本:MinHash

• Jaccard 係数推定: 𝒃-bit MinHash

• 集合異なり数推定:HyperLogLog

最新

• Jaccard 係数推定(高類似度):Odd Sketches

• 集合異なり数推定:HIP Estimator

36