Chebyshev多项式与图滤波器

1. 引言

在谱图神经网络的实践中,直接计算拉普拉斯矩阵的特征分解代价高昂(),且滤波器难以迁移到不同图上。Chebyshev多项式近似提供了一种高效、局域化的解决方案,使得谱域卷积可以在不显式计算特征分解的情况下完成。1


2. Chebyshev多项式基础

2.1 定义

Chebyshev多项式有第一类和第二类两种定义:

第一类Chebyshev多项式

递推关系

第二类Chebyshev多项式

递推关系:

2.2 重要性质

性质2.1(正交性):

性质2.2(极性):

且在 外, 次多项式增长。

性质2.3(最佳一致逼近):
在所有 次多项式中, 是最佳逼近 的多项式(在 上)。

2.3 归一化Chebyshev多项式

为适应拉普拉斯特征值范围 ,定义归一化多项式:

注意:,这会导致边界处的Runge现象。


3. 多项式近似的理论基础

3.1 函数逼近论

设目标滤波器函数 定义在 上。我们希望用 阶多项式 逼近

一致逼近误差

其中 与函数的解析性有关——函数越光滑, 越大,收敛越快。

3.2 谱收敛性

对于解析滤波器(如指数滤波器 ),Chebyshev近似具有指数级收敛速度:

其中 是函数在包含 的椭圆域上的最大值。

3.3 Runge现象

当目标函数在 区间有极点时,等距节点的多项式插值会出现Runge现象——在区间边界出现剧烈震荡。

问题:Chebyshev近似的边界行为可能导致:

  1. 滤波器系数 绝对值过大(非法系数)
  2. 训练时过拟合
  3. 泛化性能下降

4. ChebNet:理论与实现

4.1 核心思想

ChebNet1 的核心思想是:用截断的Chebyshev多项式级数近似谱域滤波器

的特征值范围为 ,滤波器 在谱域定义为:

其中

4.2 递归计算

Chebyshev多项式的递归特性使得计算可以高效进行:

T_0(x) = 1
T_1(x) = x
T_k(x) = 2x T_{k-1}(x) - T_{k-2}(x)

在图上,这对应于:

def chebyshev_polynomials(L, K, lambda_max):
    """
    计算归一化拉普拉斯上的Chebyshev多项式基
    
    参数:
        L: 归一化拉普拉斯矩阵 (n x n)
        K: 多项式阶数
        lambda_max: 最大特征值
    返回:
        T_k: K个(n x n)的张量,每层一个多项式基
    """
    # 归一化
    L_norm = 2 * L / lambda_max - torch.eye(L.size(0))
    
    T = [torch.eye(L.size(0)), L_norm]  # T_0, T_1
    
    for k in range(2, K):
        T_k = 2 * L_norm @ T[-1] - T[-2]
        T.append(T_k)
    
    return torch.stack(T)  # (K, n, n)

4.3 ChebNet卷积层

class ChebConv(nn.Module):
    def __init__(self, in_channels, out_channels, K, lambda_max):
        super().__init__()
        self.K = K
        self.lambda_max = lambda_max
        self.weight = nn.Parameter(torch.randn(K, in_channels, out_channels))
        self.bias = nn.Parameter(torch.zeros(out_channels))
        
    def forward(self, x, L):
        """
        x: (batch, n, in_channels)
        L: (n, n)
        """
        # 计算Chebyshev基
        T = chebyshev_polynomials(L, self.K, self.lambda_max)  # (K, n, n)
        
        # 多项式卷积:x * T_k -> (batch, n, in_channels) @ (n, n) -> (batch, n, n)
        # 对于每个k:H_k = T_k @ x @ W_k
        outputs = []
        for k in range(self.K):
            H_k = torch.einsum('bni,ij->bnj', x, T[k])  # (batch, n, in_channels)
            H_k = torch.einsum('bni,io->bno', H_k, self.weight[k])  # (batch, n, out_channels)
            outputs.append(H_k)
        
        # 求和
        out = torch.stack(outputs).sum(dim=0)
        return out + self.bias

4.4 K-局部化特性

ChebNet的一个关键性质是 -局部化:滤波器 的输出仅依赖于 跳内的节点。

定理:设 表示图上 阶Chebyshev多项式,则:

将节点 的信号仅传播到距离不超过 的节点。

推论 阶ChebNet层的感受野恰好是 跳邻域。


5. ChebNetII:改进与扩展

5.1 问题分析

ChebNet的原始设计存在以下问题:

问题描述影响
非法系数学习到的 可能导致 滤波器在 处行为异常
Runge现象高阶多项式在边界振荡训练不稳定
基准比较在实际数据集上性能不如GCN理论优势未能转化为实践优势

5.2 ChebNetII核心改进

文献2提出了ChebNetII,通过以下改进解决上述问题:

改进1:Chebyshev插值而非近似

将滤波器表示为 个插值节点的线性组合:

其中 是基于Chebyshev节点 的Lagrange基函数:

改进2:消除Runge现象

Chebyshev节点分布在 上:

这种非均匀采样策略有效抑制了边界振荡。

改进3:正则化约束

添加额外的约束确保滤波器在 处有合理的值:

通过拉格朗日乘子或投影实现。

5.3 ChebNetII实现

class ChebNetII(nn.Module):
    def __init__(self, in_channels, out_channels, K, lambda_max):
        super().__init__()
        self.K = K
        self.lambda_max = lambda_max
        
        # Chebyshev节点
        self.nodes = self._chebyshev_nodes(lambda_max)
        
        # Lagrange基函数的系数(预计算)
        self.L_coeffs = self._precompute_lagrange_coeffs()
        
        # 可学习权重
        self.weight = nn.Parameter(torch.randn(K, in_channels, out_channels))
        self.bias = nn.Parameter(torch.zeros(out_channels))
        
    def _chebyshev_nodes(self, lambda_max):
        """生成Chebyshev节点"""
        i = torch.arange(1, self.K + 1)
        nodes = lambda_max / 2 * (1 + torch.cos((2 * i - 1) * torch.pi / (2 * self.K)))
        return nodes
    
    def _lagrange_basis(self, lambda_val, k):
        """
        计算第k个Lagrange基函数在lambda_val处的值
        
        L_k(lambda) = prod_{j!=k} (lambda - lambda_j) / (lambda_k - lambda_j)
        """
        result = torch.ones_like(lambda_val)
        for j in range(self.K):
            if j != k:
                result *= (lambda_val - self.nodes[j]) / (self.nodes[k] - self.nodes[j])
        return result
    
    def forward(self, x, L):
        batch_size, n, _ = x.shape
        
        # 评估谱域的Lagrange基
        # 特征值lambda_i对应谱域位置
        # 对于每个节点,使用幂迭代近似
        
        # 简化的实现:使用多项式基
        T = self._chebyshev_polynomials_sparse(L)
        
        # 卷积
        out = torch.zeros(batch_size, n, self.out_channels)
        for k in range(self.K):
            H_k = x @ T[k] @ self.weight[k]
            out += H_k
        
        return out + self.bias

5.4 与其他多项式基的比较

文献2系统比较了不同多项式基的性能:

多项式基ChebNetChebNetIIGPR-GNNBernNet
理论基础最佳一致逼近Chebyshev插值PageRank谱Bernstein多项式
数值稳定性中等
表达能力受限完全完全完全
实际性能较弱最优

关键发现:虽然经典逼近理论认为Chebyshev基是最优的,但在图神经网络的有限多项式阶数下,插值方法(ChebNetII)反而表现更好。


6. 其他多项式基

6.1 Monomial基

Monomial基 最为简单,但存在两个问题:

  1. 条件数爆炸:高阶Monomial的条件数随 指数增长
  2. 数值不稳定:直接求逆 困难

6.2 Bernstein基

Bernstein多项式定义为:

优势

  • 总是正的:
  • 归一化:
  • 数值稳定

BernNet3 基于Bernstein基设计谱滤波器:

6.3 Jacobi基

更一般地,Jacobi多项式 提供了自由度 调节基函数的性质:

  • :Legendre多项式
  • :Chebyshev第一类
  • :Chebyshev第二类

7. 自适应谱滤波器

7.1 可学习的谱响应

最近的工作允许网络直接从数据中学习谱滤波器,无需预设多项式形式。

GPR-GNN4 使用参数化的PageRank谱:

7.2 频率注意力

Specformer5 引入注意力机制学习频率响应:

class SpectralAttention(nn.Module):
    def __init__(self, num_freqs, hidden_dim):
        super().__init__()
        self.freq_proj = nn.Linear(num_freqs, hidden_dim)
        self.attention = nn.MultiheadAttention(hidden_dim, num_heads=4)
        
    def forward(self, eigvals, x):
        # eigvals: (n,) 特征值
        # x: (n, d) 节点特征
        
        # 特征值投影作为注意力查询
        freq_query = self.freq_proj(eigvals)  # (n, hidden_dim)
        
        # 谱域注意力
        out, _ = self.attention(freq_query.unsqueeze(0), x.unsqueeze(0), x.unsqueeze(0))
        return out.squeeze(0)

8. 大规模图上的应用

8.1 随机SVD加速

对于大规模图,可以利用随机SVD近似特征分解:

from scipy.sparse.linalg import svds
 
def lanczos_filter(L, k, p=10):
    """
    使用Lanczos方法近似计算k阶Chebyshev多项式
    
    参数:
        L: 稀疏拉普拉斯矩阵
        k: 多项式阶数
        p: 额外迭代次数(提高精度)
    """
    # 随机投影
    m = min(k + p, L.shape[0] - 1)
    Q, _ = scipy.linalg.qr(np.random.randn(L.shape[0], m))
    
    # Lanczos迭代
    T = q.T @ L @ q  # tridiagonal T
    eigenvalues, eigenvectors = np.linalg.eigh(T)
    
    return eigenvalues[:k], eigenvectors[:, :k]

8.2 分块对角化

对于异构图或分块图,可以分别处理各连通分量,然后合并结果。


9. 小结

方法多项式基收敛速度数值稳定性表达能力
ChebNetChebyshev指数中等受限(非法系数)
ChebNetIIChebyshev插值指数完全
GPR-GNNPageRank代数完全
BernNetBernstein代数完全

Chebyshev多项式为谱图卷积提供了理论基础,但实际应用中需要注意数值稳定性和表达能力的问题。ChebNetII等改进方法通过插值和正则化策略有效解决了这些问题。


参考文献

Footnotes

  1. Defferrard, M., Bresson, X., & Vandergheynst, P. (2016). “Convolutional Neural Networks on Graphs with Chebyshev Approximation.” NeurIPS 2016. 2

  2. He, M., Wei, Z., Wen, J., & Shang, C. (2022). “Convolutional Neural Networks on Graphs with Chebyshev Approximation, Revisited.” NeurIPS 2022. arXiv:2202.03580 2

  3. Biagetti, G., et al. (2021). “BernNet: Learning Arbitrary Graph Spectral Filters via Bernstein Approximation.” NeurIPS 2021.

  4. Chien, E., et al. (2020). “Adaptive Universal Generalized PageRank Graph Neural Network.” ICLR 2021.

  5. Liu, N., et al. (2025). “Specformer: Spectral Graph Neural Networks with Attention.” ICLR 2025.