1. Dirichlet Energy Constrained Learning
1.1 dirichlet energy
归一化拉普拉斯矩阵+ 归一化邻接矩阵
通过拉普拉斯矩阵和特征矩阵的形式求得 节点与节点之间 特征的差值:谱图理论书中第一节 就有相关的定义,reyleigh 熵和 二次型的样子。实质就是拉普拉斯矩阵的性质。
指出: 小的 迪利克雷能量 表明节点很相似,over-smoothing。大的 表明 over-separating,有可能相同类别的 节点都 变得很远。 当层数变多,这个能量上界收敛到0.
1.2 松弛分析
首先本文 沿着 SGC,去掉了 非线性。
lemma1 表明: 能量的上下界 和 拉普拉斯矩阵的 特征值有关。同时 参数矩阵 Wk的 最小和最大 奇异值 也有一定给 关系
lemma2
先 松弛 下界。 真实的图拉普拉斯矩阵的 特征值[0,2) 之间,上界λ0=0时,下界的λ1=1时,lemma1 松弛到lemma2
通过经验表明 当采用 glort初始化和l2正则,在深层gcn中 Wk趋近于0,因此相应的 奇异值 也趋近于0。 相反,如果没有l2和初始化,则 smax过大,导致 over-separating。
1.3 约束
先通过linear转化最开始的X获得 X0
下界: c min,(0,1)。选择合适的cmin 满足大于0,且k层的E大于最开始X0层的E, 即 :E(X(k)) ≥ ckminE(X(0)) > 0. (使得所有层的能量都大于cmin,从而不会过平滑)
上界:c max (0,1]。 避免 相同类 有很大的 E, 避免过分开
优化目标:
交叉熵+ W的范数 约束 + 能量约束 条件
此方程的求解是 non-trivial的,求得X的E是 很昂贵的,许多的约束使问题成为一个非常复杂的优化超平面,在其中原始任务目标往往落入局部最优。
2.Energetic GNN
由于上述约束导致 问题难以求解,作者通过以下三个方式来 满足上述约束, 权重,残差,激活
2.1 Orthogonal Weight Controlling
优化目标6 如果不 对 W 加 正则约束,能量上界 会 越界 大于 E(X0). 采用两种正则
2.1.1 Orthogonal initialization 初始化方式
广泛使用的 glort正则 不能 约束 W的奇异值 ,作者采用显示地 初始化W成为对角阵,从而控制 奇异值,标黄的为 约束的等式,即就让每一层的 能量 小于下届
第一层 W1 初始化sqrt(cmax) 以及 后续层 (奇异值平方=1)的 初始化方式, 这样使得 每一层都小于 cmaxE(X0)
2.1.2 Orthogonal regularization 训练过程正则
训练过程 这些W还是会变,不能够保证满足初始时候的理想约束。 这里对于 W1 和后续的W 在进行约束,通过矩阵的F范数,使得 训练时候的 权重和 初始化权重 之间的距离 不太远。 大的γ 约束力强,小的γ 使得损失侧重于task的损失(分类)
2.2 Lower-bounded Residual Connection
尽管上面约束了 上界, 但有时候 能量 会小于 下界。 lemma1 的下界,在真实情况下,当λ1=1,会松驰到 lemma2. 这里没怎么 解释清楚,为什么会 当smin>0 ,也会小于 下界。可能是 有的 图 的拉普拉斯矩阵的 特征值 不在 [0,2) 之间。
本文通过 alpha+beta = cmin 来增加 上一层和 初始残差来保证 下界。
2.3 SReLU Activation
relu 会使得 小于0的值变成0,从而减小了 能量(表征间的差值)。如果不加 激活函数,比如 SGC,缺少了 非线性。 本文设计的SReLU在线性和非线性之间, 当b无限大,激活函数 成为 线性。当X小于b,则为非线性 映射到b。 试验中 初始化b为 一个负值,通过损失来调节。
3.code
SReLU的实现 : 借用了 relu max(0,x) 。 如果 x-b 大于0,则返回 x-b+b =x 如果 x-b 小于0, 返回 0+b ,返回b
c min 和max的调节,beta,srelu里面的 b 。
代码关于参数矩阵 W的处理:
第一层 W1 初始化为 单位矩阵* sqrt(cmax),其余层 cmax=1,,对应文章的第一个 change
代码关于 参数矩阵W 后续通过损失约束:
通过 torch.norm 来计算损失,后续的k-1层每一层 计算W权重(model.layers_GCN.weight) 和第0层 standard(sqrt(cmax))的范数
传播
layer中的以下代码 等价于上面的 公式(计算表征*W),没有激活
model中 增加激活函数层
4.think
对于 W 进行 正交约束 2022有个正交GNN, 采用 两种残差,这个 想法很直接,也可以尝试。激活函数也是比较简单 实现,可以尝试替换。