老板给我的寒假任务。
Expander 的一个经典应用——Expander Code。
Expander Code,于 1996 年由 M. Sipser 和 D. A. Spielman 引入。作为 expander 的一个经典的应用,expander code 有着非常高效且简单的编码与解码算法。同时,expander 与低密度奇偶校验码(Lower Density Parity Check, LDPC)密切相关——随机 LDPC code 有高概率就是 expander code。
编码理论中的基本定义
Defn(纠错码):对于 F2n 的一个子集 C,我们称其为 (n,k,d) 纠错码如果 ∣C∣=2k 且:
∀C1,C1∈C,dH(C1,C2)≥d
其中 dH(C1,C2)=∑i=1n[C1,i=C2,i] 表示 C1 与 C2 间的汉明距离。
我们称参数 d 为纠错码的「距离」。
更进一步,如果 C 在加法和数乘下构成 F2n 的子空间,则亦称 C 为线性编码。
一个重要的事实是:线性编码的距离就是集合中非 0 编码 ℓ1 范数的最小值:
Thm(线性编码的距离):设 C 是一个 F2n 的线性编码,则其距离 d 等于:
d=C∈C andC=0mini=1∑nCi
Proof:先写出 d 的定义:
d=C1,C2∈C and C1=C2mindH(C1,C2)
又因为 dH(C1,C2)=dH(C1−C2,0),且 C 是线性编码,可得 0,C1−C2∈C。故:
d=C=0mindH(C,0)=C∈C and C=0mini=1∑nCi
得证。□
Expander Code
接下来我们给出 expander code 的定义。
Defn(Parity Check Expander Code):对于 d 左部正则的 (αn,(1−ϵ)d)-expander G,其右部点集大小为 m,则由 G 定义的 expander code C 为:
C={C∣∀i∈[m],j∈N(i)∑Cj=0}
其中的加法与数乘是定义在 F2 上的。把这个话翻译一下也就是说:左部点基里的每个点都挂着 0,1 中的一个数,而右部点集里的每个点上都挂着一个对其邻居点的约束。可以显而易见的发现 expander code 是线性编码,因为其约束可以写为 MC=0 这样一个齐次线性方程组的形式。
这个玩意被称为 parity check expander code,是因为对于 C 的约束条件中要求 C 中 1 的数量为偶数。
下文若无特殊说明,我们均用 expander code 指代 parity check expander code。
M. Sipser 和 D. A. Spielman 的结果
在 SS96 这篇文章中 M. Sipser 和 D. A. Spielman 给出了一个超级简单的可以在线性时间内解码 expander code 的算法。
大致的想法就是对于一个左部点 v,如果 N(v) 中有超过一半的 parity check 没有被满足,我们就将 v 上的比特翻转。
串行版本
在合理的限制下,这一算法的时间复杂度是线性的,更准确的来说,只需要不超过 m 次翻转,就可以完成解码。
Thm(SS96 算法的适用条件):对于一个左部 d 正则的 (αn,(1−ϵ)d)-bipartite expander 图 G=([n]∪[m],E)。如果 ϵ<41,则对于任意的至多有 (1−2ϵ)αn 处错误的 codeword C,该算法都可以在 m 次翻转操作以内将 C 修正。
Proof:我们称这一算法出于状态 (x,y),如果左部点当前有 x 处错误(我们设错误点集为 S),而右部点有 y 个 parity check 没有被满足。
假设 x≤αn,并设 z=#{v∈N(S)∣The parity check on v holds.}。则由 expander 的性质:
y+z≥(1−ϵ)dx
又因为对于每个不满足的 parity check 的右部点,其至少与错误点集 S 间有一条边;而对于每个满足的 parity check 但是与 S 之间有边的右部点,其至少与错误点集 S 间有两条边。故:
dx≥y+2z
综合这两个不等式可得:
y≥(1−2ϵ)dx
这表明在 S 中至少有一个点 v,使得在 N(v) 中至少有 (1−2ϵ)d>2d 个 parity check 没有被满足,算法可以继续。
这一算法唯一可能失效的情况是:还存在左部点是错误的,但是没有一个点 v,使得在 N(v) 中至少有 2d+1 个 parity check 没有被满足。由以上的讨论知,当 ∣S∣=x≤αn 时,这种情况不会出现。所以唯一有可能出错的情况是 ∣S∣=x>αn 时发生的。
如果 x>αn,则 y>(1−2ϵ)dx>(1−2ϵ)αdn。但是注意到初始的时候 y′≤(1−2ϵ)αdn,而且每次翻转我们都保证了其邻居点中不满足的 parity check 数量严格大于满足的 parity check 数量,所以翻转后不满足的 parity check 数量会严格减少,故不可能突然间 y>(1−2ϵ)αdn。
所以这个算法是有效的,上面的讨论也给出了时间复杂度的证明方法:因为不满足的 parity check 数量会严格减少,所以至多 m 次就会减少到 0。□
这个算法被称为 belief-propagation algorithm,「超过一半」这一方法可以扩展,改为设定一个阈值 h,每次翻转那些在 N(v) 中有超过 h 个 parity check 不满足的点 v。
阅读以上证明过程,我们可以提炼出一个非常有用小结论。
Thm(expander → unique expander):设二分图 G 是一个 (c,d,1−ϵ,δ)-expander,则 G 也是一个 (c,d,1−2ϵ,δ)-unique expander。
其中 unique expander 的定义为:
Defn(Unique Expander):称一个二分图 G 为一个 (c,d,α,δ)-unique expander,当且仅当 G 是左部 c 正则的,右部 d 正则的。且对于任何大小不超过 α∣L∣ 的左部点集的子集 S,都有:
∣N1(S)∣≥δ∣S∣
其中 N1(S):={v∈N(S)∣e(v,S)=1}。
并行版本
belief-propagation algorithm 有一个很直接的并行版本:在串行本版中,我们每次只能翻转一个比特,即使有好多比特都满足要求。如果我们有线性级别个处理器,那么我们在一次迭代中可以反翻转所有满足要求的比特。
可以证明这个并行算法的时间复杂度为 O(logn),具体而言:
Thm(并行版本的复杂度):设 C 是一个 (c,d,3/4+ϵ,δ)-expander code,设算法某一步前错误位置集合为 S,则经过这一步后,S 的大小至多是原来的 (1+4ϵ)/2 倍。因此 belief-propagation algorithm 的并行版本时间复杂度为 O(logn)。
Proof:□
Michael Viderman 的结果
Find Erasures and Decode Algorithm
Viderman 给出了另一个简单的组合算法,这一算法思想是找到错误集合 corr 的一个超集,在这个超集的基础上执行 flip 操作。
对于这一算法的正确性,我们有如下两个定理:
Thm 1(Find Erasures 的正确性):
Thm 2(Decode From Erasures 的正确性):
ε>1/2 的必须性
Vid13a 中还论述了 expander code 中 ϵ>21 的必须性,具体来说:
Thm(Proposition D.1 of Vid13a,ϵ>1/2 的必须性):存在 c,d≥2,与 0<δ<1 都是常数,以及无限多个正整数 n,使得存在一个大小为 n+2 的 (c+1,d,1/2,0.9δ)-expander code C′,使得 Δ(C′)≤2(于是乎 C′ 没有办法被解码,即使只有 1 处的错误)。
Proof:取一个大小为 n 的 (c,d,3/4,δ)-expander code C,其中 c,d,δ 都是常数,且 c+1<d。(实际上随机的 expander code 就满足这些性质)
我们尝试构造一个大小为 n+2 的 (c+1,d,1/2,0.9δ)-expander code C′,具体构造方式如下:
我们在 C 的左部点集中加两个点 n+1,n+2;而对于右部点集,不妨设 t=d(n+2)(c+1)−dnc 是整数,则相应的要往右部点集里加 t 个点 u1,u2,…,ut。
对于边集,我们在原先的边集 E 的基础上再加入如下边:
NC′(ui)={(i−1)(d−2)+j∣j∈[d−2]}∪{n+1,n+2},∀1≤i≤c+1;NC′(ui)={(d−2)(c+1)+(i−1)d+j∣j∈[d]},∀c+2≤i≤t.
显然得到的新二分图是 (c+1,d)-正则的。并且由这个新二分图定义的 code C′ 满足:0n11∈C′,所以 Δ(C′)≤2。剩下的工作是说明这个新图有着对应的扩展性。
对于任何一个大小至多为 0.9δ(n+2) 的集合 S⊂[n+2],令 S1=S∩[n],S2=S\S1。
假设 n 充分大,则有:∣S∣≤0.9δ(n+2)≤δn,所以 ∣S1∣≤∣S∣≤δn。由原图的 vertex expansion 性质,有:∣NC(S1)∣≥43c∣S1∣≥2c+1∣S1∣。
对于 S2 部分:若 ∣S2∣=0,则 ∣NC′(S2)∣=0;若 ∣S2∣=1 or 2,则 ∣NC′(S2)∣≥c+1,总是有 ∣NC′(S2)∣≥2c+1∣S2∣ 成立。
又注意到:NC(S1)⊂NC′(S2) 且 NC(S1)∩NC′(S2)=∅,所以:
∣NC′(S)∣=∣NC′(S1∪S2)∣≥∣NC(S1)∣+∣NC′(S2)∣≥2c+1∣S1∣+2c+1∣S2∣=2c+1∣S∣
所以 C′ 是一个 (c+1,d,1/2,0.9δ)-expander code,且有 Δ(C′)≤2。
这样就完成了证明。□
陈雪、程宽、李新与欧阳铭晖的结果
在 CCLO23 这篇文章中陈雪、程宽、李新与欧阳铭晖结合了 SS96 与 Vid13a 中的结果,并且运用猜测 expansion 的 idea,进一步改进了 expander code。
文章具体细节的研读请看:。
参考文献
[SS96] M. Sipser and D. A. Spielman. Expander codes. IEEE Transactions on Information Theory, 42(6):1710–1722, 1996.
[Vid13a] Michael Viderman. Linear-time decoding of regular expander codes. ACM Trans. Comput. Theory, 5(3), August 2013.
[Vid13b] Michael Viderman. Lp decoding of codes with expansion parameter above 2/3. Inf. Process. Lett., 113(7):225–228, April 2013.
[CCLO23] Xue Chen, Kuan Cheng, Xin Li, and Minghui Ouyang. 2023. Improved Decoding of Expander Codes. IEEE Trans. Inf. Theor. 69, 6 (June 2023), 3574–3589.