Processing math: 0%

2022年2月24日木曜日

Goldreich-Levinの定理 (アルゴリズム的側面の紹介)

Goldreich-Levinの定理はGoldreich and Levin (1989)によって証明された非常に有名な定理で, 自分のお気に入りの定理の一つです. 元々は平均計算量理論の文脈でone-way functionのhardcore predicateを与えたりYaoのXOR補題の証明に使われたりしている定理ですが, その後Hadamard codeのlocal list decoding, large Fourier coefficientの計算など様々な解釈が与えられ多くの研究に影響を及ぼす重要な定理です. しかしこの定理の主張の説明の多くは理解するためにいろんな前提知識を要するため, 多くの情報系の方にとって敷居の高いものになっているような気がします.
そこで, 本記事では定理の重要性などの背景は省き, その内容と証明のアルゴリズム的な側面を本質だけ抽出して紹介します. 前提知識は特に必要ありません.


1. 線形関数の復元


\mathbb{F}_2^n上の線形関数g(x)=\langle a,x\rangle=\sum_{i=1}^n a_ix_iがオラクルで与えられるとき, 
a_1,\dots,a_n\in\mathbb{F}_2を復元せよ

という問題を考えます. つまり, 任意のx\in\mathbb{F}_2^nをクエリしたときにg(x)が得られるという仮定の下で係数を復元するという問題です. このような問題設定は学習理論の文脈と少し近い雰囲気を持っています. 学習理論の文脈では「(a,h(a))の組が複数与えられたとき, 関数h (ただしhは何らかの関数族\mathcal{F}に属する)を計算せよ」というような問題設定を考えることがあります. 上記の問題はこの設定よりも簡単で, 好きな入力に対してh(a)を得ることが出来るという設定になっています.

この問題は簡単で, n個の単位ベクトルe_1,\dots,e_nをクエリすればa_i=g(e_i)なのでn個の係数を復元することができます.

では, 「オラクルが1%の入力に対し間違っている」という設定で同じ問題が解けるでしょうか?与えられるオラクルを\mathcal{O}とします. 入力全体\mathbb{F}_2^nのうち, ある|L|\leq 0.01|\mathbb{F}_2^n|を満たすL\subseteq \mathbb{F}_2^nが存在してx\in Lに対しては\mathcal{O}(x)\neq g(x)です. オラクル\mathcal{O}のみが与えられたとき (つまり, Lは分からない), 全ての係数は復元できるでしょうか? この問題設定は学習理論の文脈ではLWE (learning with errors) に対応します.

オラクルが間違わない設定だと, 単位ベクトルe_iに対して\mathcal{O}(e_i)=a_iが成り立つので簡単に復元できましたが, この設定だと入力e_iにおいてオラクルが間違えている(つまりe_i\in L)の可能性があり, しかも間違えているかどうかが分からないので上手くいきません.

ですが実はこの問題設定においても乱択を許せば効率的なアルゴリズムが存在します. 第i番目の係数a_iを復元する以下の乱択アルゴリズムを考えます: 

r\in\mathbb{F}_2^nを一様ランダムにサンプリングし, \mathcal{O}(e_i+r)-\mathcal{O}(r)を出力する.

このアルゴリズムは98%の確率でa_iを正しく出力します. なぜならば, r\in\mathbb{F}_2^nが一様ランダムなので99%の確率でO(r)=\langle a,r\rangleであり, しかもe_i+rも(周辺分布を見ると)一様ランダムなので, 同様に99%の確率で\mathcal{O}(e_i+r)=\langle a,r+e_i\rangleです. なのでunion boundより98%の確率で両方の値は正確で, 最後に線形性よりa_i=\langle a,e_i\rangle = \langle a,r+e_i\rangle - \langle a,r\rangleにより正しく復元できています. 

この議論はオラクルが正直である確率が0.75+\epsilonであれば成功確率は0.5+2\epsilonとなるので, \lceil\frac{\log (n/\delta)}{8\epsilon^2}\rceil回繰り返して多数決をとることによって成功確率を1-\delta/nまでamplifyすることができます. 実際, i番目の繰り返しにおいて, 上記のアルゴリズムが正しくa_iを計算できていればX_i=1, そうでなければX_i=0として確率変数X_iを定義(ランダムネスはベクトルrの選択)してS=X_1+\dots+X_Tとおくと (Tは繰り返しの回数), \mathrm{E}[S]\geq (0.5+2\epsilon)Tなので, Hoeffdingの不等式より
\Pr[S\leq T/2]\leq \Pr[S\leq \mathrm{E}[S]-2\epsilon T] \leq \exp(-8\epsilon^2 T)
を得ます. T=\lceil\frac{\log(n/\delta)}{8\epsilon^2}\rceilとすれば, この確率は高々\delta/nになります.
再びi=1,\dots,nでunion boundをとれば, 全ての成分a_1,\dots,a_nを確率1-\deltaで復元することができます.

上記のアルゴリズムはオラクルが高々0.25-\epsilonの割合のxに対して誤った値を返すという仮定が大前提でした. この割合がもっと大きくても (例えばオラクルが40%の確率で間違うという設定で)aを復元できるでしょうか?

定式化するために, 「オラクルが間違う入力の割合」を関数の距離として捉えます. 二つの関数f,g\colon\mathbb{F}_2^n\to\mathbb{F}_2に対してd(f,g):=\Pr_x[f(x)\neq g(x)]と定義します. これはfgを長さ2^nのbinary文字列とみなしたときの(正規化した)ハミング距離と見なすことができます.

\mathbb{F}_2^n上の二つの相異なる線形関数g(x)=\langle a,x\rangle, g'(x)=\langle a',x\rangleに対して, x\in\mathbb{F}_2^nを一様ランダムにとってくると
\Pr[g(x)=g'(x)] = \Pr[\langle a-a',x\rangle=0] = \frac{1}{2}
となります. 最後の等式はa\neq a'であることを利用しています. 対偶をとって\Pr[g(x)=g'(x)]<1/2ならばg=g'という命題を得ます. このことから, \mathbb{F}_2^nを係数に持つ線形関数の世界では二つの相異なる線形関数はハミング距離の意味でかなり離れているという面白い性質を持つことがわかります.

図1. Boolean関数全体の空間において二つの異なる線形関数は離れている (0.5以上とありますが実際はぴったり0.5です).



ここで冒頭の「0.25-\epsilonの割合の入力に対しオラクルは間違える」という問題設定に戻りましょう. 与えられるオラクル\mathcal{O}は, ある線形関数gに対してd(\mathcal{O},g)\leq 0.25-\epsilonという条件を満たしています. つまりオラクル\mathcal{O}gを中心とした半径0.25-\epsilonの円に属しているため, 一意に復元可能です.

ところが, 「0.25+\epsilonの割合の入力に対しオラクルは間違える」という問題設定だと, 図2のように二つの円が被ってしまう可能性があります.

図2. 半径が大きすぎると円が被りその共通部分にオラクルがあると一意じゃない可能性がある.


ここまでの状況を整理しましょう. 「オラクルが間違える」という表現を距離dの言葉で置き換えて以下のように問題を再定義します:

関数\mathcal{O}がある線形関数gに対してd(\mathcal{O},g)\leq 0.25-\epsilonであるとする. 
関数\mathcal{O}のオラクルが与えられたとき, g (の係数を全て) を求めよ.

この問題は先ほどのアルゴリズムで解くことができます. 定理の形で述べておくと

定理1. 上記の問題に対し確率1-\deltaで正しい係数を全て出力するO(n\epsilon^{-2}\log(n/\delta))時間乱択アルゴリズムが存在する.

一方で, 

関数\mathcal{O}がある線形関数gに対してd(\mathcal{O},g)=0.25+\epsilonであるとする. 
関数\mathcal{O}のオラクルが与えられたとき, g (の係数を全て) を求めよ.

という問題を考えると, 候補となるgが複数存在しうることを図で紹介しました. 

2. Goldreich-Levinの定理


次の列挙問題を考えてます:

関数\mathcal{O}のオラクルが与えられたとき, d(\mathcal{O},h)\leq 0.5-\epsilonを満たす線形関数hを列挙せよ.
そのようなhが存在しない場合は「なし」と出力せよ.

定理1では距離の条件が0.25-\epsilonで考えていましたが, ここでは大きく攻めて0.5-\epsilonに緩和します. なお, 任意の相異なる線形関数は距離0.5だけ離れているので, "0.5-\epsilon"を"0.5"に置き換えた場合, O=gだとすると全ての線形関数を列挙しなければならないので列挙候補の個数は2^nになってしまいます. ですが0.5-\epsilonにすると多項式時間で列挙できるということがGoldreich and Levin (1989)によって(本質的に)示されました.

定理2.
上記の列挙問題の全ての解hを含むリストLを確率1-\deltaで出力するO\left(\frac{n^3}{\delta^2\epsilon^8}\log\left(\frac{n}{\delta\epsilon^4}\right)\right)時間アルゴリズムAが存在する. 

注釈: 冒頭にも述べた通り, Goldreich-Levinの定理自体は様々な解釈ができ, Goldreich and Levin (1989) の平均計算量の文脈の結果のアルゴリズム的に本質的な部分を抽出したものが定理2なので, 定理2そのものをGoldreich-Levinの定理と呼ぶべきかどうかは微妙かもしれませんので, 注意してください.

定理2を証明していきます. まず, 以下の定理を既知として認めます.

定理3. 上記の列挙問題の解は高々1/\epsilon^2個しか存在しない.
定理3は関数\mathcal{O}のフーリエ級数解析で簡単に示せますが, 後日行います.

定理2の証明). 以下が主張にあるアルゴリズムAになります.
1:  t\leftarrow \lceil \log_2\left(1+\frac{n}{4\delta\epsilon^4}\right)\rceil;
2:  r_1,\dots,r_t\in\{0,1\}^nを独立一様ランダムに生成;
3:  L\leftarrow \emptyset;
4:  for each b=(b_1,\dots,b_t)\in\{0,1\}^t do:
5:     for each i\in\{1,\dots,n\} do:
6:        for each S\subseteq \{1,\dots,t\} of S\neq\emptyset do:
7:            b_S\leftarrow \sum_{i\in S}b_i;
8:            r_S\leftarrow \sum_{i\in S}r_i;
9:            c_S \leftarrow \mathcal{O}(r_S+e_i)-b_S;
10:       a_i \leftarrow \mathsf{maj}((c_S)_{S\neq\emptyset});
11:   L \leftarrow L\cup \{(a_1,\dots,a_n)\};
12: return L;

ただし, \mathsf{maj}は多数決をとる関数 (受け取ったビット列の中で多く登場したビットを返す関数) です.

以下ではアルゴリズムAの解析を行います. d(\mathcal{O},g)\leq 0.5-\epsilonを満たす関数を一つとってきてgとします. アルゴリズムAの重要なポイントは
  • 2行目で生成したランダムベクトルに対し, g(r_1),\dots,g(r_t)の値はオラクルに聞いていないので分からないが, 4行目で\{0,1\}^tを列挙しているためどれか一つのbに対してはb_i=g(r_i) (\forall i) が成り立ちます. 以後この条件を満たすbに対して話を進めます.
  • 7行目で与えたb_Sgの線形性よりb_S=g\left(\sum_{i\in S}r_i\right)=g(r_S)が成り立ちます. ここまでの議論は任意の線形関数gで成り立ちます.
  • 9行目では, ベクトルr_1,\dots,r_tの一様ランダム性によりr_S+e_iの分布も一様ランダムです. なのでオラクル\mathcal{O}の性質により, \Pr[c_S=g(e_i)]\geq 0.5+\epsilonです (b_S=g(r_S)の仮定の下で).
ここまでをまとめると, 
あるb\in\{0,1\}^tが存在して\forall S\neq\emptyset, \Pr[c_S=g(e_i)]\geq 1/2+\epsilon
が成り立ちます. 10行目では多数決をとってこの確率をamplifyしています. この部分を解析します. 確率変数X_Sを, c_S=g(e_i)ならばX_S=1, そうでなければX_S=0と定義してX=\sum_{S\neq\emptyset} X_Sとします. r_1,\dots,r_tは全て独立ですが, (r_S)_{S\neq\emptyset}はそうではないので, Hoeffdingの不等式を適用してXの集中性を示すことはできません. 代わりにChebyshevの不等式 (以前の記事参照) を利用してXの集中性を示します. Chebyshevの不等式は分散が小さければ集中することを主張する不等式なので, X=\sum X_Sの分散を抑えれば良いことになります. これは(r_S)のpairwise independentという性質を用いると可能です.

定義. 確率変数の族(R_i)が任意のi\neq jに対し
\Pr[R_i=a\land R_j=b] = \Pr[R_i=a]\Pr[R_j=b]
を満たすとき, (R_i)pairwise independentであるという.

例えば(R_i)が全て独立ならば自動的にpairwise independentになります. ところでアルゴリズムAで考えた確率変数の族(r_S)も実はpairwise independentです (簡単な計算で確認できます). 従ってX_Sもpairwise independentです. 次に分散\mathrm{Var}[X]=\mathrm{E}[X^2]-\mathrm{E}[X]^2を計算しましょう.

\mathrm{E}[X^2]=\mathrm{E}\left[\sum_{S,S'\neq\emptyset}X_S X_{S'}\right] =\left(\sum_{S}\mathrm{E}[X_S]\right)^2 + \sum_{S}\mathrm{E}[X_S](1-\mathrm{E}[X_S]^2) \leq \mathrm{E}[X]^2 + \frac{2^t-1}{4}
より\mathrm{Var}[X]\leq (2^t-1)/4です. ここの式変形ではpairwise independentであることから\mathrm{E}[X_SX_{S'}]=\mathrm{E}[X_S]\mathrm{E}[X_{S'}]が成り立つことを利用しています (2番目の等式). 最後の不等式では任意のx\in[0,1]に対してx(1-x)\leq 1/4であることを用いました.

よってChebyshevの不等式およびtの条件より
\Pr[X\leq (2^t-1)/2] \leq \Pr[X\leq\mathrm{E}[X]-(2^t-1)\epsilon] \leq \frac{\mathrm{Var}[X]}{(2^t-1)^2\epsilon^2} \leq \frac{1}{4(2^t-1)\epsilon^2}\leq \frac{\delta\epsilon^2}{n}.

を得ます. つまり確率1-\epsilon^2\delta/na_i=g(e_i)が成り立つので, i=1,\dots,nと条件を満たす線形関数g (定理3より高々\epsilon^{-2}個) に関するunion boundにより, アルゴリズムAの出力リストの中にgの第i番目の係数が入っていない確率は高々\deltaとなる, すなわちAは確率1-\deltaで答えが含まれるリストを出力することができました.

なお, Aの計算時間はO(nt 2^{2t})=O\left(\frac{n^3}{\delta^2\epsilon^8}\log\left(\frac{n}{\delta\epsilon^4}\right)\right)です.
(証明終)

なお, アルゴリズムAの出力されたリストLの中からd(h,\mathcal{O})\leq 0.5-\epsilonを満たす関数hを抽出するのは(乱択を許せば)ある程度までは簡単で, 「ランダムな入力x\in\{0,1\}^nに対して\mathcal{O}(x)=h(x)かどうかをチェックする」という操作を何度も行って正答数が0.5+\epsilonくらいになるようなhのみを抽出すればOKです (ただし, d(h,\mathcal{O})\leq 0.5-(1-o(1))\epsilonを満たすhも抽出される可能性もあるので完璧ではありません).

0 件のコメント:

コメントを投稿

講義資料をNotionで書いてみた

 プログラミング応用という名前の講義を受け持っており, そこで組合せ最適化のベーシックな話題とそのPythonでの実装を教えているのですが, 資料をNotionで書いてみました. 講義資料をNotionで公開しているのでアルゴリズムの基礎とかNP困難性とかを勉強したい人はどう...