レッスン
理論 — ブルームフィルタ:「確実にない」と「たぶんある」
ブルームフィルタは、m個のビットとk個のハッシュ関数を使い、要素が集合に含まれるかどうかを判定します。要素を登録すると、ハッシュ値が指すkか所のビットを1にします。検索で調べるのも同じkか所です。0が一つでもあれば、その要素は集合に確実に含まれません。すべて1なら、たぶん含まれます。この「たぶんある」という判定が誤っている場合を偽陽性と呼びます。n個の要素を登録したとき、偽陽性率の標準的な推定値は(1 − e−kn/m)kです。これはブルームが1970年に示した式を指数関数で近似したもので、k = (m/n) ln 2のとき最小になります。
各記号の意味
m- フィルタのビット数
k- ハッシュ関数の個数。各単語の登録で1にするビット数、検索で調べるビット数でもある
n- 登録する単語数
X- n語すべてを登録した時点で、値が1になっているビット数
- 前提
- 各単語に対応するkか所は、二重ハッシュ法で、二つのハッシュ値から求めます。位置iは(h₁ + i·h₂) mod mです。h₁には単語のFNV-1aハッシュ値を、h₂にはdjb2ハッシュ値をさらに混ぜ合わせて奇数にした値を使います。mは2の累乗なので、同じ単語に対応するkか所は必ず互いに異なります。標準的な推定式は、knか所の位置がそれぞれ独立に無作為に選ばれると仮定します。二重ハッシュ法を使うことやmが小さいことが、実際のフィルタとの差につながります。偽陽性率は、文字列0から9999の10,000個について測定しています。この文字列群に対しては正確な値ですが、あらゆる単語に対する値ではありません。
全プロセスの詳細解説
-
ブルームの1970年の分綴用フィルタは、どこまで小さくできるか 4 ステップ
ブルームが1970年に挙げた例は、500,000語の分綴位置を決めるプログラムでした。分綴とは、行末などで単語を分ける際の、ハイフンを入れられる位置を決めることです。450,000語は簡単な規則で処理できますが、残る50,000語はディスク上の辞書で調べる必要があります。ブルームは、この50,000語のフィルタを主記憶に置き、規則で処理できる単語の16語に1語で無駄なディスク参照が起こることを許容しようと提案しました。必要なビット数とハッシュ関数の個数はいくつでしょう。ディスク参照は何回に減るでしょうか。このページでも単語あたりのビット数をそろえて、測ってみましょう。
-
kを最適に選ぶと、標準的な推定式で必要になるのは単語あたりlog₂(1/p) / ln 2ビットです。p = 1/16なら、4 / 0.6931 = 5.77ビット。したがって、フィルタ全体では50,000 × 5.77 = 288,539ビットとなります。ブルーム自身は「300,000ビット未満」と記しています。最適なkは5.77 × ln 2 = 4です。ハッシュ関数が4個のとき、ビットの半分が1になると見込まれます。
-
辞書を必要とする50,000語は、すべてディスクを参照します。加えて、規則で処理できる単語の16語に1語でも参照が起こるので、450,000 / 16 = 28,125回が加わります。合計は500,000語中78,125回、15.6%です。ブルームはこれを78,000回と丸め、すべての単語でディスクを参照する場合に比べて84%削減できるとしました。
-
この計算に、単語の長さは出てきません。「cat」でも「incomprehensibilities」でも、フィルタに必要なのは単語あたり5.77ビットです。一方、通常のハッシュ表で各単語を表すには、平均で少なくとも19ビット必要だとブルームは見積もりました。pを半分にするたびに、単語あたり1 / ln 2 = 1.44ビットが加わります。偽陽性を64語に1語に抑えるなら、6 / 0.6931 = 8.66ビットです。
-
このページで扱えるのは最大64語ですが、推定値を決めるのはm/nとkだけです。m = 256、n = 44(単語あたり5.82ビット)、k = 4に設定してください。256ビット中122ビット、47.7%が1になります。未登録の10,000個の文字列のうち、「たぶんある」と判定されるのは535個で、偽陽性率は5.35%。設計の目標だった1/16 = 6.25%を下回ります。このフィルタの標準的な推定値は6.11%です。
解答
288,539ビットと4個のハッシュ関数が必要で、ディスク参照は500,000回から78,125回に減ります。 このページで256ビットに44語を登録すると、実測値は5.35%で、目標を満たします。ただし、これは44語を登録した一つのフィルタでの結果です。288,539ビットに50,000語を登録しても、同じように1/16に近い値になるかどうかは、最大64語のこのページでは確かめられません。
-
学習の道すじ
データ構造が得意なこと
参考文献 (1)
- The method itself, the turning point at half the bits set in the first insight, and the hyphenation example the worked problem recomputes: Burton H. Bloom, "Space/time trade-offs in hash coding with allowable errors," Communications of the ACM 13(7), July 1970, pp. 422–426.