) Locality-Sensitive Hashingを用いた近似NN探索

情報システム基礎論2:第 9 回 (担当: 古賀)
Locality-Sensitive Hashing を用いた近似 NN 探索
2014 年 6 月 17 日
レジュメ URL: http://sd.is.uec.ac.jp/koga/lecture/IF2/
今回の講義では高次元データに対する Locality Sensitive Hashing を利用した類似探索をテーマとする。
1
M 次元ハミング空間での LSH
M 次元ハミング空間では、データは M bit のビット列である。2 個のビット列 p, q 間のハミング距離
D(p, q)=値が異なる bit 数。
q = 10101
p1 = 10001
p2 = 00111
ハミング距離は D(p1 , q) = 1, D(p2 , q) = 2。
以下のハッシュ関数 h は LSH。
Step 1. 1 から M までの範囲の整数をランダムに選択。選択された整数を i とする。
Step 2. M bit のビット列 p に対するハッシュ値 h(p) = (p の i 桁目のビット値)。
この時、2 個のビット列 p, q のハッシュ値が等しい確率は、
P [h(p) = h(q)] = 1 −
D(p, q)
M − D(p, q)
=
.
M
M
これは、D(p, q) が小さいほど、p, q が同じハッシュ値となる確率が大きいので LSH。具体例では、
1
5
2
P [h(p2 ) = h(q)] = 1 −
5
P [h(p1 ) = h(q)] = 1 −
2
= 0.8.
= 0.6.
M 次元ハミング空間における LSH による類似検索
クエリ q に対する類似検索を考える。
• p1 : q の最近点。r = D(q, p1 )。
• p2 : q から距離 r(1 + ) 離れた点。D(q, p2 ) = r(1 + )
q と p1 は同じハッシュ値だが、q と p2 が異なるハッシュ値となれば 近似 NN 探索を実現できる。
1
2.1
複数 bit の使用
M bit のビット列 p から、k 個のビット位置をランダムに選択して出力するハッシュ関数を g とする
例: q = 10101。k = 3 とし、第 5bit, 第 1bit, 第 2bit がランダムに選択されたとすると、g(q) = 110。
P [g(q) = g(p)] = (k bit すべてが一致する確率)
=
=
M −Dp k
M
k
M − Dp M − Dp − 1 M − Dp − 2
M − Dp − k + 1
·
·
··· ·
M
M −1
M −2
M −k+1
具体例では、k = 3 とすると
従って、
P [g(p1 ) = g(q)] =
4 3 2
2
· · = = 0.4.
5 4 3
5
P [g(p2 ) = g(q)] =
1
3 2 1
· · =
= 0.1.
5 4 3
10
P [g(q) = g(p1 )]
M − Dp1 M − 1 − Dp1
M − k + 1 − Dp1
=
·
···
.
P [g(q) = g(p2 )]
M − Dp2 M − 1 − Dp2
M − k + 1 − Dp2
よって、k < M − Dp2 + 1 であれば、
k が増加すると、
最近点 p1 と q が同じバケツに入る確率 P [g(q) = g(p1 )] と
遠い点 p2 と q が同じバケツに入る確率 P [g(q) = g(p2 )] との比が増幅する
しかし、P [g(q) = g(p1 )] の値そのものは小さくなった。
そこで、さらに複数個のハッシュ関数 g1 , g2 , · · · , gl を用意する。各ハッシュ関数はランダムに選択され
るビット位置が異なる。
そして、g1 から gl までのどれかのハッシュ関数に対してハッシュ値が一致するかどうかで、ハッシュ値
の一致判定をする。
• if ∀i gi (p) 6= gi (q) → p と q のハッシュ値が一致しない。
• if ∃i gi (p) = gi (q) → p と q のハッシュ値は一致する。
• Ej : g1 から gl までのどれかのハッシュ関数に対して、pj と q のハッシュ値が一致する事象 (j = 1 or 2)
P [E1 ] = 1 − P [for 1 ≤ i ≤ l, gi (p1 ) 6= gi (q)]
= 1 − P [g(p1 ) 6= g(q)]l
= 1 − (1 − P [g(p1 ) = g(q)])l
≈ 1 − (1 − l · P [g(p1 ) = g(q)])
= l · P [g(p1 ) = g(q)].
2
(...P [g(p1 ) = g(q)] が十分小さい)
同様に P [E2 ] ≈ l ·P [g(q) = g(p2 )]。すわなち、l 個のハッシュ関数を使用して、P [g(q) = g(p1 )], P [g(q) =
g(p2 )] を比を保ちつつ l 倍にできる。
k と l をうまく選択すると、
P [E1 ] ≈ 1, P [E2 ] ≈ 0.
とできる。
理論的には k と l をうまく選択して、q と p1 を同じハッシュ値に、q と p2 を異なるハッシュ値にできる。
実装
2.2
しかし、適切な k, l は r と に依存するので定めるのが難しい。とくに、r はクエリ毎に変わる値であ
り、事前に知ることはできない。したがって、現実的には k, l はサンプリングなどヒューリスティックな
学習によって妥当な値を決定する。
2.2.1
近似 NN 探索アルゴリズム
距離計算を q と同じバケツに入った点に限定し、計算時間を短縮する。
(ハッシュテーブル生成)
Step 1: l 個のハッシュテーブル T1 , T2 , · · · , Tl を作成する。
Step 2: ∀p ∈ S に対して、l 個のハッシュ値 g1 (p), g2 (p), · · · , gl (p) を計算する。Ti 上で点 p はバケツ b(gi (p))
に格納される (1 ≤ i ≤ l)。
クエリ q の処理
• V : q に対する近似最近点の候補点集合。
V = φ;
for (1 ≤ i ≤ l){
q のハッシュ値 gi (q) を計算;
Ti のバケツ b(gi (q)) を調べる; V = V ∪ {p ∈ S|gi (p) = gi (q)};
}
V の中で q に最も近い点を近似最近点として返す。
3
L2 距離に対する LSH
距離には様々な種類がある。ユークリッド空間では、L2 距離と L1 距離がよく使われる。x = (x1 , x2 , · · · , xd ),
y = (y1 , y2 , · · · , yd ) を 2 個の d 次元ベクトルとする。
Definition 1 (L1 距離(マンハッタン距離)) x, y 間の L1 距離 =
Definition 2 (L2 距離) x, y 間の L2 距離:
v
u d
uX
t (x − y )2
i
i
i=1
ここでは、L2 距離における近似 NN 探索を取り扱う。
3
Pd
i=1 |xi
− yi |
q
g2(q)
g1(q)
gl(q)
hashtable T1
T2
Tl
index
bucket
b(0)
index
bucket
b(0)
index
bucket
b(0)
0
1
2
3
a list of points
p such that g1(p)=0
b(g1(q))
0
1
2
3
b(g2(q))
.............
.
.
.
.
.
.
.
.
0
1
2
3
.
.
.
.
b(gl(q))
図 1: 複数のハッシュテーブル
3.1
ハッシュ関数
Step 1. 正規分布から d 個の確率変数 a1 , a2 , · · · , ad を選択し、d 次元ベクトル a を決定。
a = (a1 , a2 , · · · , ad )
Step 2. W を正の実数とし、閉区間 [0, W ] (W > 0) から一様ランダムに選ばれた実数 b を決定。
Step 3. 次の h をハッシュ関数とする。
h(p) = b
a·p+b
c.
W
(1)
式 (1) は図 2 のようにユークリッド空間をベクトル a へ射影し,長さ W の区間に分割していることにな
る.結局,h は a に直交する等間隔の超平面で空間を分割する.
p
a
0
図 2: h による空間分割
b がないと超平面の一つが必ず原点を含む。つまり、 原点に関して点対称な点ペアはどれだけ近くても
必ずハッシュ値が異なる。→ b をランダムに選んで偏りを回避。
定理 3 h は L2 距離に関する Locality-sensitive Hashing。
4
h の定義から 2 点 p, q は内積 a · p − a · q = a · (p − q) の絶対値が小さい時に同じハッシュ値になる。内積
a · (p − q) は正規分布に従う確率変数の線形和。これは Appendix より、正規分布に従う確率変数を ||p − q||
倍した確率変数の分布に従う.
従って,a · (p − q) は p,q 間のユークリッド距離が小さいほど高確率で絶対値が小さくなり (図 3),高確
率で h(p) = h(q) となる.よって、h は LSH.
when ||p-q|| is small
when ||p-q|| is large
-10
-5
0
5
10
図 3: a · (p − q) の確率密度関数
3.2
NN 探索アルゴリズム
ハミング空間に対する LSH と同様に h を複数個用意する。具体的には,確率的な選択の結果により
a, b の値が異なるk 個のハッシュ関数 h1 , h2 , · · · , hk を用意し、k 個のハッシュ値を連結する関数 g を考
える。
g(p) = (h1 (p), h2 (p), · · · , hk (p))
そして,ハッシュ関数 g を g1 , g2 , · · · , gl までの l 個用意し,l 個のハッシュテーブルを作る。後は 2.2.1
節と同じ。
ただしハッシュテーブルの生成は自明ではない.h(p) = b a·v+b
W c の値域が有界でないので,g が取り得
るハッシュ値は無限にあり,全てのハッシュ値に対してバケツを用意できない.しかし、空でないバケツ
数は高々n 個。そこで,g のハッシュ値を O(n) の値域にマップするハッシュ関数 F を用意し,テーブル
サイズが O(n) となるハッシュテーブルを管理する (式 (3)).
F (g(p)) = (e1 h1 (p) + e2 h2 (p) + · · · + ek hk (p))%tablesize.
(2)
e1 , e2 , · · · , ek :ランダムに決定した定数
1
このアルゴリズムの計算量は ≤ 9 の時,O(dn 1+ log n) 未満であり,n に対してサブリニアである。
3.3
g の空間的な解釈
図 2 のように,h はユークリッド空間を等間隔の超平面で分割する.g は k 種類の h を使うので,k 個
の等間隔な超平面集合で空間を分割する.k = 2 の例を図 4 に示す.この図は 2 次元空間なので,空間が
菱形の領域に分割される.
5
g の性質
• 近い点同士が同じハッシュ値になりやすい。
• 空間分割のされ方によっては近い点でも異なるハッシュ値となる。例:図 4 の点 p と点 q 。
そこで複数のハッシュ関数を使用して空間分割をやり方を変更 → どれかのハッシュ関数で p と q が
同じバケツに入ることを期待。
p
q
a1
0
a2
図 4: g による空間分割
Appendix: 正規分布
平均 0, 分散 σ 2 の正規分布の確率密度関数
x2
f (x) = √
exp −
2
2πσ 2
1
!
.
X1 , X2 , · · · , Xd および X を正規分布から独立に取り出される確率変数とする.
任意の d 個の実数 c1 , c2 , · · · , cd
q
に対し,
Pd
i=1 ci Xi
の確率分布は
Pd
2
i=1 |ci | X
の確率分布と等しい。
正規分布に従う確率変数の線形和の確率分布=正規分布に従う確率変数の定数倍の確率分布
6