Expander Code 相关调研

老板给我的寒假任务。
Expander 的一个经典应用——Expander Code。

Expander Code,于 19961996 年由 M. Sipser 和 D. A. Spielman 引入。作为 expander 的一个经典的应用,expander code 有着非常高效且简单的编码与解码算法。同时,expander 与低密度奇偶校验码(Lower Density Parity Check, LDPC)密切相关——随机 LDPC code 有高概率就是 expander code。

编码理论中的基本定义

Defn(纠错码):对于 F2n\mathbb F_2^n 的一个子集 C\mathcal C,我们称其为 (n,k,d)(n,k,d) 纠错码如果 C=2k|\mathcal C|=2^k 且:

C1,C1C,dH(C1,C2)d\forall C_1,C_1\in \mathcal C, d_H(C_1,C_2)\ge d

其中 dH(C1,C2)=i=1n[C1,iC2,i]d_H(C_1,C_2)=\sum_{i=1}^n [C_{1,i}\ne C_{2,i}] 表示 C1C_1C2C_2 间的汉明距离。

我们称参数 dd 为纠错码的「距离」。

更进一步,如果 C\mathcal C 在加法和数乘下构成 F2n\mathbb F_2^n 的子空间,则亦称 C\mathcal C 为线性编码。

一个重要的事实是:线性编码的距离就是集合中非 00 编码 1\ell_1 范数的最小值:

Thm(线性编码的距离):设 C\mathcal C 是一个 F2n\mathbb F_2^n 的线性编码,则其距离 dd 等于:

d=minCC andC0i=1nCid=\min_{C\in \mathcal C\text{ and} C\ne 0}\sum_{i=1}^n C_i

Proof:先写出 dd 的定义:

d=minC1,C2C and C1C2dH(C1,C2)d=\min_{C_1,C_2\in \mathcal C\text{ and }C_1\ne C_2}d_H(C_1,C_2)

又因为 dH(C1,C2)=dH(C1C2,0)d_H(C_1,C_2)=d_H(C_1-C_2,0),且 C\mathcal C 是线性编码,可得 0,C1C2C0,C_1-C_2\in \mathcal C。故:

d=minC0dH(C,0)=minCC and C0i=1nCid=\min_{C\ne 0}d_H(C,0)=\min_{C\in \mathcal C\text{ and }C\ne 0}\sum_{i=1}^n C_i

得证。\Box

Expander Code

接下来我们给出 expander code 的定义。

Defn(Parity Check Expander Code):对于 dd 左部正则的 (αn,(1ϵ)d)(\alpha n,(1-\epsilon)d)-expander GG,其右部点集大小为 mm,则由 GG 定义的 expander code C\mathcal C 为:

C={Ci[m],jN(i)Cj=0}\mathcal C=\{C\mid \forall i\in[m],\sum_{j\in N(i)}C_j=0\}

其中的加法与数乘是定义在 F2\mathbb F_2 上的。把这个话翻译一下也就是说:左部点基里的每个点都挂着 0,10,1 中的一个数,而右部点集里的每个点上都挂着一个对其邻居点的约束。可以显而易见的发现 expander code 是线性编码,因为其约束可以写为 MC=0MC=0 这样一个齐次线性方程组的形式。

这个玩意被称为 parity check expander code,是因为对于 CC 的约束条件中要求 CC11 的数量为偶数。

下文若无特殊说明,我们均用 expander code 指代 parity check expander code。

M. Sipser 和 D. A. Spielman 的结果

在 SS96 这篇文章中 M. Sipser 和 D. A. Spielman 给出了一个超级简单的可以在线性时间内解码 expander code 的算法。

大致的想法就是对于一个左部点 vv,如果 N(v)N(v) 中有超过一半的 parity check 没有被满足,我们就将 vv 上的比特翻转。

SS96

串行版本

在合理的限制下,这一算法的时间复杂度是线性的,更准确的来说,只需要不超过 mm 次翻转,就可以完成解码。

Thm(SS96 算法的适用条件):对于一个左部 dd 正则的 (αn,(1ϵ)d)(\alpha n,(1-\epsilon)d)-bipartite expander 图 G=([n][m],E)G=([n]\cup[m],E)。如果 ϵ<14\epsilon< \dfrac 14,则对于任意的至多有 (12ϵ)αn(1-2\epsilon)\alpha n 处错误的 codeword CC,该算法都可以在 mm 次翻转操作以内将 CC 修正。

Proof:我们称这一算法出于状态 (x,y)(x,y),如果左部点当前有 xx 处错误(我们设错误点集为 SS),而右部点有 yy 个 parity check 没有被满足。

假设 xαnx\le \alpha n,并设 z=#{vN(S)The parity check on v holds.}z=\#\{v\in N(S)\mid \text{The parity check on }v\text{ holds.}\}。则由 expander 的性质:

y+z(1ϵ)dxy+z\ge (1-\epsilon)dx

又因为对于每个不满足的 parity check 的右部点,其至少与错误点集 SS 间有一条边;而对于每个满足的 parity check 但是与 SS 之间有边的右部点,其至少与错误点集 SS 间有两条边。故:

dxy+2zdx\ge y+2z

综合这两个不等式可得:

y(12ϵ)dxy\ge (1-2\epsilon)dx

这表明在 SS 中至少有一个点 vv,使得在 N(v)N(v) 中至少有 (12ϵ)d>d2(1-2\epsilon)d>\dfrac d2 个 parity check 没有被满足,算法可以继续。

这一算法唯一可能失效的情况是:还存在左部点是错误的,但是没有一个点 vv,使得在 N(v)N(v) 中至少有 d2+1\dfrac d2+1 个 parity check 没有被满足。由以上的讨论知,当 S=xαn|S|=x\le \alpha n 时,这种情况不会出现。所以唯一有可能出错的情况是 S=x>αn|S|=x>\alpha n 时发生的。

如果 x>αnx>\alpha n,则 y>(12ϵ)dx>(12ϵ)αdny>(1-2\epsilon)dx>(1-2\epsilon)\alpha dn。但是注意到初始的时候 y(12ϵ)αdny'\le (1-2\epsilon)\alpha dn,而且每次翻转我们都保证了其邻居点中不满足的 parity check 数量严格大于满足的 parity check 数量,所以翻转后不满足的 parity check 数量会严格减少,故不可能突然间 y>(12ϵ)αdny>(1-2\epsilon)\alpha dn

所以这个算法是有效的,上面的讨论也给出了时间复杂度的证明方法:因为不满足的 parity check 数量会严格减少,所以至多 mm 次就会减少到 00\Box

这个算法被称为 belief-propagation algorithm,「超过一半」这一方法可以扩展,改为设定一个阈值 hh,每次翻转那些在 N(v)N(v) 中有超过 hh 个 parity check 不满足的点 vv

阅读以上证明过程,我们可以提炼出一个非常有用小结论

Thm(expander \to unique expander):设二分图 GG 是一个 (c,d,1ϵ,δ)(c,d,1-\epsilon,\delta)-expander,则 GG 也是一个 (c,d,12ϵ,δ)(c,d,1-2\epsilon,\delta)-unique expander。

其中 unique expander 的定义为:

Defn(Unique Expander):称一个二分图 GG 为一个 (c,d,α,δ)(c,d,\alpha,\delta)-unique expander,当且仅当 GG 是左部 cc 正则的,右部 dd 正则的。且对于任何大小不超过 αL\alpha|L| 的左部点集的子集 SS,都有:

N1(S)δS|N^1(S)|\ge \delta |S|

其中 N1(S):={vN(S)e(v,S)=1}N^1(S):=\{v\in N(S)\mid e(v,S)=1\}

并行版本

belief-propagation algorithm 有一个很直接的并行版本:在串行本版中,我们每次只能翻转一个比特,即使有好多比特都满足要求。如果我们有线性级别个处理器,那么我们在一次迭代中可以反翻转所有满足要求的比特。

可以证明这个并行算法的时间复杂度为 O(logn)O(\log n),具体而言:

Thm(并行版本的复杂度):设 C\mathcal C 是一个 (c,d,3/4+ϵ,δ)(c,d,3/4+\epsilon,\delta)-expander code,设算法某一步前错误位置集合为 SS,则经过这一步后,SS 的大小至多是原来的 (1+4ϵ)/2(1+4\epsilon)/2 倍。因此 belief-propagation algorithm 的并行版本时间复杂度为 O(logn)O(\log n)

Proof\Box

Michael Viderman 的结果

Find Erasures and Decode Algorithm

Viderman 给出了另一个简单的组合算法,这一算法思想是找到错误集合 corr\text{corr} 的一个超集,在这个超集的基础上执行 flip 操作。

Vid13a_1
Vid13a_2
Vid13a_3

对于这一算法的正确性,我们有如下两个定理:

Thm 1(Find Erasures 的正确性)

Thm 2(Decode From Erasures 的正确性)

ε>1/2 的必须性

Vid13a 中还论述了 expander code 中 ϵ>12\epsilon >\dfrac 12 的必须性,具体来说:

Thm(Proposition D.1 of Vid13a,ϵ>1/2\epsilon>1/2 的必须性):存在 c,d2c,d\ge 2,与 0<δ<10<\delta<1 都是常数,以及无限多个正整数 nn,使得存在一个大小为 n+2n+2(c+1,d,1/2,0.9δ)(c+1,d,1/2,0.9\delta)-expander code C\mathcal C',使得 Δ(C)2\Delta(\mathcal C')\le 2(于是乎 C\mathcal C' 没有办法被解码,即使只有 11 处的错误)

Proof:取一个大小为 nn(c,d,3/4,δ)(c,d,3/4,\delta)-expander code C\mathcal C,其中 c,d,δc,d,\delta 都是常数,且 c+1<dc+1<d。(实际上随机的 expander code 就满足这些性质)

我们尝试构造一个大小为 n+2n+2(c+1,d,1/2,0.9δ)(c+1,d,1/2,0.9\delta)-expander code C\mathcal C',具体构造方式如下:

我们在 C\mathcal C 的左部点集中加两个点 n+1,n+2n+1,n+2;而对于右部点集,不妨设 t=(n+2)(c+1)dncdt=\dfrac{(n+2)(c+1)}d-\dfrac {nc}d 是整数,则相应的要往右部点集里加 tt 个点 u1,u2,,utu_1,u_2,\ldots,u_t

对于边集,我们在原先的边集 EE 的基础上再加入如下边:

NC(ui)={(i1)(d2)+jj[d2]}{n+1,n+2},1ic+1;NC(ui)={(d2)(c+1)+(i1)d+jj[d]},c+2it.N_{\mathcal C'}(u_i)=\{(i-1)(d-2)+j\mid j\in[d-2]\}\cup \{n+1,n+2\},\, \forall 1\le i\le c+1; \\ N_{\mathcal C'}(u_i)=\{(d-2)(c+1)+(i-1)d+j\mid j\in[d]\},\, \forall c+2\le i\le t.

显然得到的新二分图是 (c+1,d)(c+1,d)-正则的。并且由这个新二分图定义的 code C\mathcal C' 满足:0n11C0^n11\in \mathcal C',所以 Δ(C)2\Delta(\mathcal C')\le 2。剩下的工作是说明这个新图有着对应的扩展性。

对于任何一个大小至多为 0.9δ(n+2)0.9\delta (n+2) 的集合 S[n+2]S\subset [n+2],令 S1=S[n],S2=S\S1S_1=S\cap [n],S_2=S\backslash S_1

假设 nn 充分大,则有:S0.9δ(n+2)δn|S|\le 0.9\delta (n+2)\le \delta n,所以 S1Sδn|S_1|\le |S|\le \delta n。由原图的 vertex expansion 性质,有:NC(S1)34cS1c+12S1|N_{\mathcal C}(S_1)|\ge \dfrac 34 c|S_1|\ge \dfrac{c+1}2|S_1|

对于 S2S_2 部分:若 S2=0|S_2|=0,则 NC(S2)=0|N_{\mathcal C'}(S_2)|=0;若 S2=1 or 2|S_2|=1\text{ or }2,则 NC(S2)c+1|N_{\mathcal C'}(S_2)|\ge c+1,总是有 NC(S2)c+12S2|N_{\mathcal C'}(S_2)|\ge \dfrac{c+1}2|S_2| 成立。

又注意到:NC(S1)NC(S2)N_{\mathcal C}(S_1)\subset N_{\mathcal C'}(S_2)NC(S1)NC(S2)=N_{\mathcal C}(S_1)\cap N_{\mathcal C'}(S_2)=\varnothing,所以:

NC(S)=NC(S1S2)NC(S1)+NC(S2)c+12S1+c+12S2=c+12S|N_{\mathcal C'}(S)|=|N_{\mathcal C'}(S_1\cup S_2)|\ge |N_{\mathcal C}(S_1)|+|N_{\mathcal C'}(S_2)| \\ \ge \dfrac{c+1}2|S_1|+\dfrac{c+1}2|S_2|=\dfrac{c+1}2|S|

所以 C\mathcal C' 是一个 (c+1,d,1/2,0.9δ)(c+1,d,1/2,0.9\delta)-expander code,且有 Δ(C)2\Delta(\mathcal C')\le 2

这样就完成了证明。\Box

陈雪、程宽、李新与欧阳铭晖的结果

在 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.