Site cover image

Site icon imageSen(Qian)’s Memo

This website is Donglin Qian (Torin Sen)’s memo, especially about machine learning papers and competitive programming.

(講義ノート)乱択アルゴリズム第4回

Importance Sampling(重点サンプリング)

サンプリングをするとき、一様にではなく重み付きでサンプリングするときにどのように評価すればよいのか。

使い道の1つとしてDNF(ORとANDで構成される論理式)の解の個数の推定のアルゴリズムがある。

DNF=選言標準形の定義

まず、変数がx=(x1,,xn)\mathbf{x} = (x_1, \cdots, x_n)である。

そして、関数全体を

  1. 節はx1xix_1 \land \cdots \land x_iのようにする。このようにANDでつなげる。
  2. 節全体をORつまり\lorでつなげる。

充足可能性の判定自体は線形時間でできるが、解が何個存在するのか?

#P困難である。

なお、節の中身がORで、節全体をつなげるのがANDの場合はCNF=連言標準形であり、それの充足可能性はSATである。

FPRAS(Fully Polynomial-time Randomized Approximation Scheme)

解の個数をS(ϕ)S(\phi)とする。このとき、多項式関数ffが存在し、

ϵ>0,f(n,m,1/ϵ)\forall \epsilon > 0, f(n, m, 1 / \epsilon)

の時間で動作し、その出力は高確率(1/2より高ければよい)でS(ϕ)S(\phi)1±ϵ1 \pm \epsilon近似である。

ここでn,mn, mを出したのはDNFの解の個数の推定をやりたいから。

KL.KLMのアルゴリズム

O(nm2/ϵ2)O(n m^2/\epsilon ^ 2)のアルゴリズムである。

  • SiS_iii番目の節を充足する解の集合
  • 推定したいのはA=i=1mSiA = |\bigcup_{i=1}^m S_i |である。ORなのでいずれかのSiS_iに入れば解である。
  • Si=2nli|S_i| = 2^{n - l_i}lil_iSiS_iのリテラルの個数。
    • 全体でnn個の変数がある中で、ii番目の節を充足するのは、節の中のlil_iの変数からなる1通りの配置だけ。その節の外はどうなろうが問題ないので、任意に配置していい。
  • B=i=1mSiB = \sum_{i=1}^m |S_i|は単純に加算すればいいので簡単である。

ここで、A/B[0,1]A / B \in[0, 1]を推定することを考える。

https://users.soe.ucsc.edu/~sesh/Teaching/2020/CSE290A/Slides/Lecture4.pdf

for j in [1, t]: 
		節iを確率|Si|/Bで選ぶ。(ここで重点サンプリング)
		節iを充足する解xを選ぶ。(節に含まれない変数は一様にランダムに決める)
		あるkがあって、k < iでxが節kをみたすのならばX_j=0
		それ以外ならばX_j=1

(sum(X, [1, t]))/tがA/Bの推定値

ii以外のii以前の節に対して、ランダムにとってきた割り当てが何かしらの節の解であるなら0になり、1は他の解ではないということ。今の節を満たす解だが、以前のどの他の節の解ではないのならば、排他的で集合として純粋に足してよいといういい性質があり、それの和をAとして近似する

推定値にBBを乗じると、Aの推定値yyになる。

高い確率でyy AA1±ϵ1 \pm \epsilon近似であるの証明

ここでの高い確率は2/32/3であるとする。

集合PP(x,i)(x,i)を元としてとり、解xxは節iiを充足することが集合に入る条件。よって下式が成り立つ。

P=i=1mSi=B|P| = \sum_{i=1}^m |S_i|=B

お気持ちとしては、xxを充足する節の中で、indexが最小のものに割り当てる(お互い排他的になれないなら一番小さいindexに割り当てる)=「良い割り当て」PPのうちの(x,i)(x,i)がが何個その割り当てに対応しているか?それがAAの割合となるといいね

証明は以下の通り。

x,ix, iをまず固定する。この時、「x,ix, iがサンプリングされる確率」は、ベイズの定理から「iiがサンプリングされる確率」と「iiがサンプリングされる条件で、xxがサンプリングされる確率」の積である。これはそれぞれSi/B|S_i|/B1/Si1/|S_i|であり、それの積は1/B1/Bである。

よって、「PPからサンプリングした(x,i)(x,i)が良い割り当てである確率」はA/BA/Bである。

Pr[Xj=1]=A/BPr[X_j=1] = A/Bも成り立つし、E[Xj]=A/B\mathbb{E}[X_j] = A/B

ここで、X=j=1tXjX = \sum_{j=1}^t X_jとなり、E[X]=tA/B\mathbb{E}[X] = tA / Bであるので、チェルノフ上界を用いると、以下の式が成り立つ。

Pr[X∉(1±ϵ)E[X]]2exp(ϵ2E[X]3)=2exp(ϵ2tA3B)Pr[X \not \in (1 \pm \epsilon) \mathbb{E}[X]] \leq 2 \exp(-\frac{\epsilon^2 \mathbb{E}[X]}{3}) = 2 \exp(-\frac{\epsilon^2 t A}{3B})

このように、期待値が逸れる確率が求まった。ここで、A/BA/B

AB=SiSimaxSiSi1m\frac{A}{B} = \frac{|\bigcup S_i|}{\sum |S_i|} \geq \frac{\max |S_i|}{\sum |S_i|} \geq \frac{1}{m}

と下限を評価できる。したがって代入することで、ttを適切に大きくすることによって確かに1/31/3で抑えることができる。

Pr[X∉(1±ϵ)E[X]]2exp(ϵ2tA3B)2exp(ϵ2t3m)13Pr[X \not \in (1 \pm \epsilon) \mathbb{E}[X]] \leq 2 \exp(-\frac{\epsilon^2 t A}{3B}) \leq 2 \exp(- \frac{\epsilon^2 t}{3m}) \leq \frac{1}{3}

計算時間

t=mϵ2t=\frac{m}{\epsilon^2}にとって、1回当たりの走査は(x,i)(x,i)が良いか調べるのにO(nm)O(nm)かかるので普通にやるとO(nm2ϵ2)O(\frac{nm^2}{\epsilon^2})である。

SiS_iについての極端なケースを考える。

  1. SiS_iが互いに素であるならば、A/B=1A/B=1である。この時下界は1/m1/mではなく1なので、1つmmを落とせる。
    1. 良い(x,i)(x,i)かどうかを調べるのには、お互い互いに素なので重ならず、O(nm)O(nm)かかる。
  2. SiS_iが互いにほぼ重なっているのならば、A/B1/mA/B \approx 1/mであるので、mmは落ちない。
    1. 良い(x,i)(x,i)稼働かを調べるとき、お互いほぼ重複しているので、実質はO(n)O(n)で済ませられる。

1と2のいいところどりをすれば、O(nmϵ2)O(\frac{nm}{\epsilon ^2})である。

改良版

それを実現するには以下のようなアルゴリズムである。

for j in [1, O(m / epsilon^2)]
		(x, i)を同様にサンプルし、l = 0とする。
		while True: 
				節kを一様にサンプル。
				l++
				if xが節kを充足
						break
		l / mを記録。

記録したl / mの平均をAとして扱う。

オリジナルでは、他を充足しない解xxの数を直接数え上げた。

ここでは、節iiを充足するとわかっている解xxについて、ランダムに節を選びそれに充足するまでランダムに選ぶ。それまでの回数は、先ほどの他を充足しない解xxの数から計算される割合を代替する。

何故うまく行くのかは以下の証明である。

C(x)C(x)を解xxが充足する節の数だとする。この時、「(x,i)(x,i)でサンプリングしたxxが節kkに対して1回でbreakする確率」はC(x)/mC(x) / mである。これを何回も試行し続けるのは幾何分布であり、結果的に期待値はE[lx]=m/C(x)\mathbb{E}[l | x] = m / C(x)となる。

よって、E[l/mx]=1/C(x)\mathbb{E}[l/m | x] = 1/C(x)であり、ここからE[l/m]\mathbb{E}[l/m]を計算する。これは、xSix \in \bigcup S_i についてPr(x)E[l/mx]=C(x)B1C(x)=ABPr(x) \cdot \mathbb{E}[l/m|x] = \frac{C(x)}{B} \cdot \frac{1}{C(x)} = \frac{A}{B}となるので、上のアルゴリズムはちゃんと正しい。