问题
原文Digress项目源码中直接给出了这一段(类似)
python
# 二值边的 t 步边际混合(对应 docstring 里的 Q_bar_t):
# - clean=1 的边,以概率 alpha_bar_t 保持原值;否则以概率 (1-alpha_bar_t) 按边际采样
# - clean=0 的边,只能来自"按边际采样"的那部分
p_keep = alpha_bar_t + (1.0 - alpha_bar_t) * p_e
p_flip = (1.0 - alpha_bar_t) * p_e
在理解上就是已有边就有两种转移状态(保持原状或者变成空边),但是空边只有一种转移状态(变成实边)。空边:为什么?这不公平!!!
开庭
为什么这里是这种情况呢?其实源自后续要求的目标是 P(Et=1)P(E_t =1)P(Et=1) 的概率分布是边际分布,请听我细细道来:
首先整体上设置的转移矩阵形式是这样的,这里假定边类别只有两种 也就是在有边、无边的状态间转移,nnn是节点个数:
Qt=aIn×n+(1−a)MM=[1−pepe⋮⋮1−pepe]n×2 Q_t = aI_{n \times n} + (1-a)M \qquad M = \begin{bmatrix} 1-p_e & p_e \\ \vdots & \vdots \\ 1-p_e & p_e \end{bmatrix}_{n \times 2} Qt=aIn×n+(1−a)MM= 1−pe⋮1−pepe⋮pe n×2
以上噪声强度也就是变化的概率,即以 aaa 的概率保持不变,1−a1-a1−a 的概率按边际分布采样; pep_epe 是期望最后数据集层面的实边密度(实边的密度,比如实边占了60%,那么这里就是0.6),令mmm是期望的边际概率密度向量 [P(Et=0),P(Et=1)]=[1−pe,pe][P(E_t=0),P(E_t=1)]=[1-p_e,p_e][P(Et=0),P(Et=1)]=[1−pe,pe],我们想让整体的边状态都符合期望也就是最终每条边的概率分布都是 mmm,所以确定了 MMM 的样子。
那么把上面的公式拆开:
1.原本为实边:
P(Et=1∣E0=1)=a+(1−a)pe P(E_t=1|E_0=1)=a+(1-a)p_e P(Et=1∣E0=1)=a+(1−a)pe
让最后的状态为实边的一种情况是保持不变的话就是概率 aaa,另一种情况如果变了的话还想让状态是实边就需要:变化的概率乘以最终实边的概率也就是 (1−a)∗pe(1-a)*p_e(1−a)∗pe,两者之和既是 P(Et=1∣E0=1)P(E_t=1|E_0=1)P(Et=1∣E0=1)
为了对称这里也可以得到实边最后变成空边的概率,但是这个没用,因为后面要的是实边的分布(但是也可以反向对应)
P(Et=0∣E0=1)=(1−a)(1−pe) P(E_t=0|E_0=1)=(1-a)(1-p_e) P(Et=0∣E0=1)=(1−a)(1−pe)
2.原本为空边
P(Et=1∣E0=0)=(1−a)pe P(E_t=1|E_0=0)=(1-a)p_e P(Et=1∣E0=0)=(1−a)pe
这里如果要让状态是实边那么,对原本是空的边只存在一种方法也就是按照边际分布采样并且选择实边(1−a)pe(1-a)p_e(1−a)pe
为了对称这里也可以得到空边保持不变的概率(后续不会用到,道理同上)
P(Et=0∣E0=0)=a+(1−a)(1−pe) P(E_t=0|E_0=0)=a+(1-a)(1-p_e) P(Et=0∣E0=0)=a+(1−a)(1−pe)
以上其实就足以回答为什么代码中要那样设置了。但是下面我们再推一步,验证这样可以符合我们的转移要求。
3.全概率公式
现在问题就变简单了,验证一下,我要求 P(Et=1)P(E_t=1)P(Et=1),全概率公式展开:
qt=P(Et=1)=P(E0=1)P(Et=1∣E0=1)+P(E0=0)P(Et=1∣E0=0)=q0[a+(1−a)pe]+(1−q0)(1−a)pe=aq0+(1−a)peq_t=P(E_t=1)=P(E_0=1)P(E_t=1|E_0=1)+P(E_0=0)P(E_t=1|E_0=0)=q_0[a+(1-a)p_e]+(1-q_0)(1-a)p_e=aq_0+(1-a)p_eqt=P(Et=1)=P(E0=1)P(Et=1∣E0=1)+P(E0=0)P(Et=1∣E0=0)=q0[a+(1−a)pe]+(1−q0)(1−a)pe=aq0+(1−a)pe
可以看到最后qt=aq0+(1−a)peq_t=aq_0+(1-a)p_eqt=aq0+(1−a)pe,这个时候就满足我们的需求了,因为:
a=1qt=q0完全保持原有边密度a=1\qquad q_t=q_0 完全保持原有边密度a=1qt=q0完全保持原有边密度a=0qt=pe完全是噪声分布(给定的边际分布)a=0\qquad q_t=p_e完全是噪声分布(给定的边际分布)a=0qt=pe完全是噪声分布(给定的边际分布)0<a<1qt=aq0+(1−a)pe0<a<1\qquad q_t=aq_0+(1-a)p_e0<a<1qt=aq0+(1−a)pe
也就是边密度是原始边密度和噪声边密度的凸组合,逐步向 pep_epe 靠拢。这个状态的实现和前面 QtQ_tQt 转移公式的形式相呼应。
注意这里Digress为了保证噪声偏得不是太远这里设定上是 q0=peq_0=p_eq0=pe 的也就是边密度全程是保持不变的,这确实意味着在边密度层面上"不用转换",但是:
- 边的具体分布仍然会被扰动(因为噪声过程会随机翻转边)
- 只是总体边密度不变
这里降低难度方便模型训练。