0. 先不要背结构:AE 到底在解决什么问题

理解自编码器,不能从“编码器加解码器”开始,因为那只是结构描述。真正的问题起点是:我们如何从高维观测中提取对数据生成机制有用的低维表示?

设一个样本为 xRdx \in \mathbb{R}^{d}。原始维度 dd 可能很大,但这些维度并不一定彼此独立。以手写数字为例,一张 28×2828 \times 28 的灰度图有 784 个像素,但决定图像外观的潜在因素可能只有数字类别、笔画粗细、倾斜角度、位置和书写风格。

这意味着真实数据往往只占据高维空间中的一个低维区域。我们希望找到一个表示 zRkz \in \mathbb{R}^{k},其中 kdk \ll d,并同时满足三个条件:

  1. 充分性zz 保留重建数据或完成下游任务所需的信息。
  2. 紧凑性zz 不机械保存输入中的每个细节。
  3. 结构性:相似样本在潜在空间中仍然接近,重要变化对应可理解的方向。

AE 的核心不是“把输入复制到输出”,而是利用一个受约束的信息通道,逼迫模型回答:如果只能保留有限信息,哪些信息最值得保留?

1. AE 是一个受约束的恒等映射

自编码器由编码器 fθf_{\theta} 和解码器 gϕg_{\phi} 组成:

z=fθ(x),z = f_{\theta}(x), x^=gϕ(z)=gϕ(fθ(x)).\hat{x} = g_{\phi}(z) = g_{\phi}(f_{\theta}(x)).

编码器参数是 θ\theta,解码器参数是 ϕ\phi。训练目标是让重构结果 x^\hat{x} 接近输入 xx

minθ,ϕ1ni=1nLrec(xi,gϕ(fθ(xi))).\min_{\theta,\phi} \frac{1}{n}\sum_{i=1}^{n} \mathcal{L}_{\mathrm{rec}} \left(x_{i},g_{\phi}(f_{\theta}(x_{i}))\right).

从函数角度看,AE 在学习一个接近恒等映射 I(x)=xI(x)=x 的复合函数:

gϕfθI.g_{\phi} \circ f_{\theta} \approx I.

但如果模型可以毫无限制地实现恒等映射,潜在表示就没有意义。一个维度不变、参数量巨大、没有噪声或正则约束的 AE,完全可能只学习“如何复制”。因此,重构目标本身不保证表示有用,约束才是表示学习发生的原因。

2. 为什么瓶颈会产生表示

最直接的约束是令潜在维度 kk 小于输入维度 dd

k<d.k < d.

编码器必须把 dd 维输入压进 kk 维通道。由于通道容量有限,它无法无损保留全部细节,只能优先保存那些能够解释训练数据中大量共同变化的方向。

可以把它理解成一次信息预算分配:

  • 偶然噪声只解释一个样本,保存价值低。
  • 重复出现的笔画、轮廓或语义结构能解释大量样本,保存价值高。
  • 解码器能利用的规律越稳定,编码器越愿意把容量分配给它。

但“低维”不是唯一约束。常见约束还包括:

  • 去噪约束:输入被污染为 x~\tilde{x},目标仍是恢复干净的 xx
  • 稀疏约束:限制只有少量潜在单元可以活跃。
  • 收缩约束:惩罚编码器对输入微小变化过度敏感。
  • 概率约束:像 VAE 一样,让潜在变量服从受控分布。

这些方法本质相同:它们都在阻止网络走向“逐样本记忆”这一退化解。

3. 线性 AE 为什么与 PCA 有关

先看最简单的情况。假设编码器和解码器都是线性的,不使用偏置和激活函数:

z=Wex,z = W_{e}x, x^=Wdz=WdWex.\hat{x} = W_{d}z = W_{d}W_{e}x.

若使用均方重构损失:

Lrec=xx^22,\mathcal{L}_{\mathrm{rec}} = \|x-\hat{x}\|_{2}^{2},

并将潜在维度限制为 kk,那么最优线性 AE 所学习的子空间与 PCA 的前 kk 个主成分张成的子空间一致。

为什么?因为 WdWeW_{d}W_{e} 的秩最多为 kk。模型必须在所有秩不超过 kk 的线性变换中,寻找一个对数据重构误差最小的投影。PCA 做的正是保留方差最大的 kk 个正交方向,因为丢弃这些方向会造成最大的平方误差。

这个结论揭示了 AE 的底层角色:

线性 AE 是低秩子空间学习;加入非线性后,AE 尝试学习弯曲的数据流形。

非线性 AE 不再局限于一个平面子空间。编码器可以把弯曲流形展开到潜在空间,解码器再把潜在坐标映射回观测空间。

4. 从流形角度理解编码器和解码器

假设观测数据由某些低维潜在因素 ss 经过未知生成过程 hh 产生:

x=h(s)+ϵ,x = h(s) + \epsilon,

其中 ϵ\epsilon 表示噪声。我们看不到 ss,只能看到 xx

理想情况下:

  • 编码器 fθf_{\theta} 近似求逆过程,从 xx 推断潜在坐标。
  • 解码器 gϕg_{\phi} 近似生成过程,从潜在坐标恢复观测。

但必须注意:AE 学到的 zz 通常不可唯一识别。只要编码器和解码器同时做出互相抵消的可逆变换,重构结果就可以完全不变。因此,不能因为某个潜在维度变化就轻易断言它一定对应“笔画粗细”或某个真实因果因素。

重构只能约束信息是否足够,不能自动保证语义可解释、因果正确或维度解耦。

5. 重构损失不是随便选的

不同重构损失对应不同的数据假设。

均方误差

LMSE=1dj=1d(xjx^j)2.\mathcal{L}_{\mathrm{MSE}} = \frac{1}{d}\sum_{j=1}^{d}(x_{j}-\hat{x}_{j})^{2}.

MSE 可以理解为假设每个输出维度服从以 x^j\hat{x}_{j} 为均值、方差固定的高斯分布。偏差越大,惩罚按平方增长。

二元交叉熵

对于二值数据或取值在 [0,1][0,1] 的伯努利参数,可使用:

LBCE=j=1d[xjlogx^j+(1xj)log(1x^j)].\mathcal{L}_{\mathrm{BCE}} = -\sum_{j=1}^{d} \left[ x_{j}\log \hat{x}_{j} +(1-x_{j})\log(1-\hat{x}_{j}) \right].

为什么特征尺度重要

如果一个特征取值范围是 0 到 10000,另一个特征是 0 到 1,直接使用 MSE 时,第一个特征会主导梯度。模型会把大部分容量用于重构数值尺度大的变量,而不一定是语义更重要的变量。

所以,损失函数和数据预处理共同决定了模型认为什么叫“相似”和“重要”。

6. 梯度到底怎样让 AE 学会重构

以单样本 MSE 为例:

L=12x^x22.\mathcal{L}=\frac{1}{2}\|\hat{x}-x\|_{2}^{2}.

损失对重构输出的梯度为:

Lx^=x^x.\frac{\partial \mathcal{L}}{\partial \hat{x}} = \hat{x}-x.

这个残差指出每个输出维度应该向哪个方向移动。梯度先通过解码器反向传播,更新 ϕ\phi,使解码器更善于把 zz 映射回 xx ;然后继续穿过 zz 传入编码器,更新 θ\theta,使编码器产生更容易被解码器利用的表示。

因此,AE 学到的不是“客观最正确的表示”,而是在当前编码器、解码器、损失函数和约束共同定义下,最有利于重构的表示

7. 从普通样本到图:独立同分布假设失效

普通 AE 通常把每个样本独立输入编码器。但图数据中的节点不是孤立样本。

一个图写作:

G=(V,E),G=(V,E),

并通常包含:

  • 邻接矩阵 A{0,1}n×nA \in \{0,1\}^{n\times n}
  • 节点特征矩阵 XRn×dX \in \mathbb{R}^{n\times d}

ii 个节点的语义可能同时由 xix_{i} 、邻居属性和所在结构位置决定。若仍使用逐节点 MLP:

zi=MLP(xi),z_{i}=\mathrm{MLP}(x_{i}),

那么两个属性完全相同、结构位置完全不同的节点会得到相同表示。图结构信息被彻底丢失。

GAE 的第一个改变,就是让编码器依赖 XXAA

Z=fθ(X,A).Z=f_{\theta}(X,A).

通常,fθf_{\theta} 是 GCN、GraphSAGE、GAT 或其他消息传递网络。

8. GAE 的两个祖先:自编码器与矩阵分解

GAE 表面上是“AE 加 GNN”,但从更底层看,它还继承了图矩阵分解思想。

如果目标是重构邻接矩阵,我们希望找到低维矩阵:

ZRn×k,kn,Z \in \mathbb{R}^{n\times k}, \qquad k \ll n,

使得:

AZZT.A \approx ZZ^{T}.

AA 原本需要 n2n^{2} 个位置描述节点对关系,而 ZZ 只需要 nknk 个数。若 knk\ll n,这相当于用低秩潜在因子解释图连接。

传统矩阵分解直接把每个节点的向量当作待优化参数;GAE 则进一步规定:节点向量必须由一个共享的图编码器从特征和邻域中计算出来。

这带来两种归纳偏置:

  1. 相似局部结构通过共享编码器获得相似处理方式。
  2. 节点表示不仅要解释连接,还要与节点属性和消息传播一致。

9. 从邻域平滑推导 GCN 编码器

经典 GAE 常使用两层 GCN。先给邻接矩阵加入自环:

A~=A+I.\tilde{A}=A+I.

自环的意义是:节点更新时不仅接收邻居信息,也保留自身信息。

D~\tilde{D}A~\tilde{A} 的度矩阵:

D~ii=jA~ij.\tilde{D}_{ii}=\sum_{j}\tilde{A}_{ij}.

对称归一化邻接矩阵为:

Aˉ=D~12A~D~12.\bar{A} = \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}}.

一层 GCN 可以写成:

H(l+1)=σ(AˉH(l)W(l)).H^{(l+1)} = \sigma\left( \bar{A}H^{(l)}W^{(l)} \right).

逐项解释:

  • H(0)=XH^{(0)}=X:初始节点特征。
  • AˉH(l)\bar{A}H^{(l)}:按归一化权重聚合邻居表示。
  • W(l)W^{(l)}:模型需要学习的特征变换矩阵。
  • σ\sigma:非线性激活函数。

度归一化不是形式装饰。若直接求和,高度节点会因邻居多而产生数值更大的表示;归一化使不同度数节点的消息尺度更可控。

一个两层 GAE 编码器常写成:

Z=Aˉσ(AˉXW(0))W(1).Z = \bar{A}\, \sigma(\bar{A}XW^{(0)}) W^{(1)}.

第一层融合一阶邻域,第二层继续融合更远信息。W(0)W^{(0)}W(1)W^{(1)} 是训练学习的参数,AA 通常是给定数据,不是通过梯度直接更新的参数。

10. 内积解码器究竟假设了什么

经典 GAE 使用内积预测节点 ii 与节点 jj 是否相连:

p(Aij=1zi,zj)=σ(ziTzj),p(A_{ij}=1\mid z_{i},z_{j}) = \sigma(z_{i}^{T}z_{j}),

其中:

σ(t)=11+et.\sigma(t)=\frac{1}{1+e^{-t}}.

内积大,预测边概率高;内积小或为负,预测边概率低。

这隐含了几个重要假设:

  1. 同质性假设:容易相连的节点应该在潜在空间中相似。
  2. 对称性假设ziTzj=zjTziz_{i}^{T}z_{j}=z_{j}^{T}z_{i},因此天然适合无向关系。
  3. 低秩假设:复杂邻接关系可以由少量潜在维度解释。

如果图是有向的、多关系的,或连接主要发生在“不同类型”节点之间,简单内积解码器可能先天不合适。

11. 图重构损失如何产生“吸引与排斥”

对节点对 (i,j)(i,j),二元交叉熵为:

ij=AijlogA^ij(1Aij)log(1A^ij),\ell_{ij} = -A_{ij}\log \hat{A}_{ij} -(1-A_{ij})\log(1-\hat{A}_{ij}),

其中:

A^ij=σ(ziTzj).\hat{A}_{ij}=\sigma(z_{i}^{T}z_{j}).

对内积分数 sij=ziTzjs_{ij}=z_{i}^{T}z_{j} 求导:

ijsij=A^ijAij.\frac{\partial \ell_{ij}}{\partial s_{ij}} = \hat{A}_{ij}-A_{ij}.

这条式子揭示了 GAE 的学习动力:

  • 对真实边,Aij=1A_{ij}=1。若预测概率偏低,梯度为负,优化会推动内积增大,使两个表示更接近。
  • 对不存在的边,Aij=0A_{ij}=0。若预测概率偏高,梯度为正,优化会推动内积减小,使两个表示分离。

所以经典 GAE 的潜在空间由两股力塑造:真实边产生吸引,负边产生排斥;GNN 编码器又要求这些位置必须由邻域传播和共享参数产生。

12. 为什么负采样不是实现细节

一个含 nn 个节点的无向图大约有 n(n1)/2n(n-1)/2 个候选节点对,而真实边数通常远小于这个数量。

若把所有非边都加入损失:

  • 计算和内存接近 O(n2)O(n^{2})
  • 负样本远多于正样本。
  • 模型可能通过几乎全部预测为非边获得看似不错的平均结果。

因此训练通常只采样部分非边:

L=(i,j)E+ij+α(i,j)Esampleij.\mathcal{L} = \sum_{(i,j)\in E^{+}}\ell_{ij} + \alpha \sum_{(i,j)\in E^{-}_{\mathrm{sample}}}\ell_{ij}.

E+E^{+} 是正边集合, EsampleE^{-}_{\mathrm{sample}} 是采样负边, α\alpha 控制两类损失权重。

不同负采样会定义不同难度的问题:随机负样本通常很容易;结构相近但未连接的“困难负样本”更能检验模型是否真的理解关系。论文若没有交代负采样和数据划分,其链接预测结果很难公平比较。

13. 属性重构与结构重构在约束什么

GAE 可以重构图结构:

A^=DecoderA(Z),\hat{A}=\mathrm{Decoder}_{A}(Z),

也可以重构节点属性:

X^=DecoderX(Z).\hat{X}=\mathrm{Decoder}_{X}(Z).

联合目标为:

Ltotal=Lstructure+λLattribute.\mathcal{L}_{\mathrm{total}} = \mathcal{L}_{\mathrm{structure}} + \lambda \mathcal{L}_{\mathrm{attribute}}.

这两个目标不一定一致:

  • 结构重构要求 ZZ 能解释谁与谁连接。
  • 属性重构要求 ZZ 能保留节点自身特征。

当图具有强同质性时,两者可能互相促进;当相连节点属性差异很大时,两者可能产生梯度冲突。λ\lambda 不是普通调参项,它实际规定了“好表示”更偏向结构还是属性。

14. 一次完整的 GAE 训练到底发生了什么

以 GCN 编码器和内积解码器为例:

  1. 输入 XX 和训练图 AtrainA_{\mathrm{train}}
  2. 计算归一化矩阵 Aˉ\bar{A}
  3. GCN 通过 Aˉ\bar{A} 聚合消息,输出节点表示 ZZ
  4. 对正边和采样负边计算 ziTzjz_{i}^{T}z_{j}
  5. 经过 Sigmoid 得到边概率。
  6. 用二元交叉熵计算重构损失。
  7. 梯度先更新解码相关分数,再穿过 ZZ 回到 GCN。
  8. 优化器更新 W(0)W^{(0)}W(1)W^{(1)} 等参数。

模型学习的是一套共享编码规则,不是给每条边背答案。但在传导式设置中,编码器训练时已经看到整张图的大部分结构,所以不能把“共享参数”误解成天然具备对新图的归纳能力。

15. 链接预测中最容易犯的数据泄漏

如果要预测测试边,就必须先把测试边从编码器使用的邻接矩阵中删除。

错误做法是:

  1. 用完整邻接矩阵进行 GCN 消息传播。
  2. 再要求模型预测其中一部分“测试边”。

此时测试边已经参与了节点表示计算,模型等于提前看到了答案。

正确流程应该先划分:

E=EtrainEvalEtest,E = E_{\mathrm{train}} \cup E_{\mathrm{val}} \cup E_{\mathrm{test}},

然后仅用 EtrainE_{\mathrm{train}} 构造编码器邻接矩阵。验证边和测试边只能用于评价,不能参与消息传播或负样本构造。

16. 从 GAE 到 VGAE:为什么要学习分布

普通 GAE 为每个节点输出一个确定向量 ziz_{i}。VGAE 则让编码器输出概率分布参数:

qθ(ziX,A)=N(μi,diag(σi2)).q_{\theta}(z_{i}\mid X,A) = \mathcal{N} \left( \mu_{i}, \mathrm{diag}(\sigma_{i}^{2}) \right).

通过重参数化采样:

zi=μi+σiϵ,ϵN(0,I).z_{i}=\mu_{i}+\sigma_{i}\odot\epsilon, \qquad \epsilon\sim\mathcal{N}(0,I).

训练目标不再只有重构,还包含 KL 散度:

LVGAE=Eqθ(ZX,A)[logpϕ(AZ)]+KL(qθ(ZX,A)p(Z)).\mathcal{L}_{\mathrm{VGAE}} = -\mathbb{E}_{q_{\theta}(Z\mid X,A)} \left[ \log p_{\phi}(A\mid Z) \right] + \mathrm{KL} \left( q_{\theta}(Z\mid X,A) \|p(Z) \right).

第一项要求潜在变量能够重构图;第二项限制后验分布不要任意散开,使其接近先验 p(Z)p(Z),通常是标准正态分布。

这带来更连续、可采样的潜在空间,但也引入新的权衡:KL 约束太强时,潜在变量可能忽略输入,出现后验坍塌;太弱时,模型又接近普通 GAE。

17. GAE 学到的表示究竟是什么

经典 GAE 学到的 ZZ 不是图结构的“真实本质”,而是以下条件共同定义的最优折中:

Z=argminZFθ(X,A)Ldecoder(A,X;Z).Z^{*} = \arg\min_{Z\in\mathcal{F}_{\theta}(X,A)} \mathcal{L}_{\mathrm{decoder}}(A,X;Z).

这里 Fθ\mathcal{F}_{\theta} 表示编码器能够产生的表示集合。

换句话说,ZZ 同时受四件事约束:

  1. 编码器允许怎样传播信息。
  2. 解码器用什么相似性判断关系。
  3. 损失函数如何定义错误。
  4. 负样本和训练数据如何分布。

只要其中一项改变,“好表示”的含义就会改变。因此,不能脱离任务和解码器孤立评价 embedding。

18. 为什么重构好不等于下游任务好

假设图中节点度数差异很大。模型可能仅凭节点度数就很好地预测大量边,从而获得很高的重构指标,但这种表示未必包含节点类别所需的语义。

同样,内积解码器偏爱同质连接。如果下游任务需要区分连接紧密但类别不同的节点,极强的结构重构反而可能压缩掉有判别力的差异。

所以评价表示至少需要两层证据:

  • 重构层证据:AUC、AP、重构误差等。
  • 下游层证据:节点分类、聚类、异常检测或推荐指标。

若论文只报告重构指标,就只能证明模型适合当前重构问题,不能证明表示具有普遍价值。

19. GAE 常见失效机制

19.1 过平滑

消息传播层数过多时,相连节点表示不断平均,最终趋于相似。编码器失去区分节点的能力。

19.2 过压缩

大量远距离信息必须通过固定维度向量和有限边路径传递,形成信息瓶颈。即使增加层数,也不一定能保留所有远程依赖。

19.3 度数捷径

模型可能主要学习节点度数或局部密度,而不是任务真正关心的语义结构。需要使用度数控制基线或结构扰动实验检查。

19.4 异配图失效

当相连节点倾向于属于不同类别时,邻域平滑和内积相似性假设都可能错误。此时需要关系感知、符号传播或更灵活的解码器。

19.5 结构噪声被忠实重构

重构目标默认观测图值得恢复。如果图中存在错误边、恶意连接或采样偏差,模型会把噪声也当成监督信号。

19.6 二次复杂度

完整计算 ZZTZZ^{T} 的时间和空间复杂度接近 O(n2)O(n^{2}),大图上不可行。实际系统必须采用边采样、候选召回、子图训练或分块计算。

19.7 解码器能力不足

内积无法自然表示有向边和多关系边,也难以表达非对称规则。可替换为双线性、MLP、距离函数或关系特定解码器。

20. 一个最小例子:三节点链

考虑三节点链:

A — B — C

真实正边是 (A,B)(A,B)(B,C)(B,C),非边是 (A,C)(A,C)

训练会产生三种力量:

  • 正边损失拉近 zAz_{A}zBz_{B}
  • 正边损失拉近 zBz_{B}zCz_{C}
  • 负边损失推远 zAz_{A}zCz_{C}

但因为 BB 同时连接两端,三个目标可能冲突。若潜在维度太低或解码器过于简单,模型无法同时完美满足所有关系。

这个小例子说明:图嵌入不是把每条边单独拟合,而是在有限维空间中寻找全局折中。图越复杂,折中越明显。

21. 读 AE/GAE 论文时的第一性检查表

问题层

  1. 作者真正要保留的信息是什么?
  2. 为什么原始空间不适合直接完成任务?
  3. 重构是最终目的,还是获得表示的代理任务?

模型层

  1. 编码器的归纳偏置是什么?
  2. 瓶颈在哪里:维度、噪声、稀疏性还是分布约束?
  3. 解码器能表达哪些关系,不能表达哪些关系?

目标层

  1. 损失函数隐含什么数据分布假设?
  2. 正负样本怎样构造,权重如何设置?
  3. 多个损失之间是否存在梯度冲突?

实验层

  1. 测试边是否从消息传播图中移除?
  2. 提升来自编码器、解码器、采样策略还是更大计算量?
  3. 是否用下游任务证明表示价值,而不只报告重构效果?

适用边界

  1. 方法是否依赖同质性、低秩性或图结构可靠性?
  2. 时间和空间复杂度能否扩展到真实图?
  3. 面对新节点、新图或分布变化时还能否工作?

22. 最后的统一理解

AE 的第一性原理是:通过受约束的信息通道和重构目标,迫使模型寻找能够解释观测数据的紧凑表示。

GAE 在此基础上增加两层结构:

  1. 用 GNN 规定信息如何沿图传播。
  2. 用图解码器规定什么样的潜在几何能够解释连接关系。

经典 GAE 既可以看成图上的自编码器,也可以看成由 GNN 参数化的非线性低秩矩阵分解。

真正应该记住的不是“编码器—解码器”六个字,而是下面这条因果链:

约束信息容量,产生表示压力;用消息传递引入图结构;用重构误差定义好坏;用梯度把真实边变成吸引、非边变成排斥;最终得到在特定假设和任务下有效的节点表示。