传统卷积神经网络CNN
卷积在通常的形式中,是对两个实变函数的一种数学运算。在卷积网络的术语中,卷积的第一个参数通常叫做输入,第二个参数叫做核函数,输出有时被称为特征映射。在传统的卷积神经网络中,由于卷积操作具有稀疏交互、参数共享、等变表示的特征而被广泛应用。
从本质上讲,CNN中卷积本质上是利用一个共享参数的过滤器,通过计算中心像素点以及相邻像素点的加权来实现对输入数据特征的提取。
图卷积网络GCNN
卷积神经网络在计算机视觉以及自然语言处理方面取得了巨大的成功,但是卷积神经网络的输入必须是Euclidean domain的数据,即要求输入数据有规则的空间结构。但是,依然有很多数据并不具备规则的空间结构,这些数据被称为Non Euclidean data。
Graph
Graph Convolution Network中的Graph是指图论中的用顶点和边建立相关对应关系的拓扑图,具有两个基本的特征:
每个节点都有自己的特征信息
图中的每个节点还具有结构信息
图卷积算法
图卷积算子:
h i l + 1 = σ ( ∑ j ∈ N i 1 c i j h j l w R j l ) h^{l+1}_i = \sigma(\sum_{j \in N_i}\frac{1}{c_{ij}}h^l_jw^l_{R_j})
h i l + 1 = σ ( j ∈ N i ∑ c ij 1 h j l w R j l )
其中,设中心节点为i ,h i l h^l_i h i l 为节点i 在第l 层的特征表达;c i j c_{ij} c ij 为归一化因子,比如取节点度的倒数;N i N_i N i 为节点i 的邻居,包含自身;R i R_i R i 为节点i i i 的类型;w R j w_{R_j} w R j 表示R i R_i R i 类型节点的变换权重参数。
总的来说,图卷积算法分为三步:
发射: 每一个节点将自身的特征信息经过变换后发送给邻居节点。
接收: 每个节点将邻居节点的特征聚集起来。
变换: 把前面的信息聚集之后做非线性变换。
相关论文1: Convolutional Neural Networks on Graphs with Fast Localized Spetral Filtering
论文链接 代码链接
Introduction
社交网络中的用户数据、生物信息网络中的基因数据等数据都属于non-Euclidean data,这些数据能够通过图的结构来表示。谱图论就是其中一种可以用来研究图的强大的数学工具。对于图卷积网络来说,需要三个基本的步骤:
(针对图设计的卷积核)The design of localized convolutional filters on graphs
(将相似的节点集合起来)a graph coarsening procedure that groups together similar vertices
(对图的池化操作)a graph pooling operation that trades spatial resolution for higher filter resolution
background: 拉普拉斯算子和拉普拉斯矩阵
拉普拉斯算子和拉普拉斯矩阵
拉普拉斯矩阵和拉普拉斯算子的关系
Learning Fast Localized Spectral Filters
对于无向图G = ( V , E , W ) \mathcal{G = (V, E, W)} G = ( V , E , W ) ,其中V \mathcal{V} V 为顶点集合,且∣ V ∣ = n |\mathcal{V}| = n ∣ V ∣ = n ,E \mathcal{E} E 为边的集合,W ∈ R n × n \mathcal{W} \in \mathbb{R}^{n \times n} W ∈ R n × n 为权重邻接矩阵。定义在图中节点上的信号x : V → R x : \mathcal{V} \to \mathbb{R} x : V → R 被看作一个向量x ∈ R n × n x \in \mathbb{R}^{n \times n} x ∈ R n × n ,其中,x i x_i x i 表示在第i 个节点上的x 值。这一映射关系可以看作图的函数。
在谱图分析中,需要用到拉普拉斯算子,用于描述图中节点梯度的散度,其定义为:
L = D − W ∈ R n × n L = D - W \in \mathbb{R}^{n \times n}
L = D − W ∈ R n × n
其中D ∈ R n × n D \in \mathbb{R}^{n \times n} D ∈ R n × n 是对角矩阵,对角线上元素为D i i = ∑ j W i j D_{ii} = \sum_{j}W_{ij} D ii = ∑ j W ij ,拉普拉斯算子的正则化定义为L = I n − D − 1 / 2 W D − 1 / 2 L = I_n - D^{-1/2}WD^{-1/2} L = I n − D − 1/2 W D − 1/2 ,由于矩阵L 是实对称半正定矩阵,因此,拉普拉斯矩阵的n个特征值都大于等于0。对拉普拉斯矩阵进行特征值分解:
L = U Λ U T L = U \Lambda U^T
L = U Λ U T
其中,U 为拉普拉斯矩阵的特征向量矩阵,是正交矩阵,Λ \Lambda Λ 为拉普拉斯矩阵特征值组成的对角矩阵。
从传统的傅里叶变换出发,传统的傅里叶变换被定义为F ( ω ) = F ∣ f ( t ) ∣ = ∫ f ( t ) e − i ω t d t F(\omega) = \mathcal{F}|f(t)| = \int{f(t)e^{-i \omega t}dt} F ( ω ) = F ∣ f ( t ) ∣ = ∫ f ( t ) e − iω t d t ,即信号f ( t ) f(t) f ( t ) 与基函数e − i ω t e^{-i \omega t} e − iω t 的积分。从数学上来看,e − i ω t e^{-i \omega t} e − iω t 是拉普拉斯算子的特征函数,ω \omega ω 就与特征值有关。因此,仿照传统傅里叶变换的公式,定义Graph上的傅里叶变换为:
F ( λ l ) = x ^ ( λ l ) = ∑ i = 1 N x i u l ∗ ( i ) F(\lambda_l) = \hat{x}(\lambda_l) = \sum_{i=1}^{N}x_iu_l^*(i)
F ( λ l ) = x ^ ( λ l ) = i = 1 ∑ N x i u l ∗ ( i )
将其写成矩阵形式得到图的傅里叶变换及傅里叶逆变换:
x ^ = U T x \hat{x} = U^Tx
x ^ = U T x
x = U x ^ x = U\hat{x}
x = U x ^
同在欧氏空间一样,这一转换支持基本操作的公式,如过滤。
Spectral filtering of graph signals
在上文中,我们将传统的傅里叶变换推广到图的傅里叶变换,接下来我们考虑卷积操作。
卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即对于函数f ( t ) f(t) f ( t ) 与h ( t ) h(t) h ( t ) 两者的卷积是其函数傅里叶变换乘积的逆变换:
f ∗ h = F − 1 [ f ^ ( ω ) h ^ ( ω ) ] = 1 2 Π ∫ f ^ ( ω ) h ^ ( ω ) e i ω t d ω f * h = \mathcal{F}^{-1}[\hat{f}(\omega)\hat{h}(\omega)] = \frac{1}{2\Pi}\int\hat{f}(\omega)\hat{h}(\omega)e^{i\omega t}d\omega
f ∗ h = F − 1 [ f ^ ( ω ) h ^ ( ω )] = 2Π 1 ∫ f ^ ( ω ) h ^ ( ω ) e iω t d ω
类比到Graph上并把傅里叶变换的定义带入,x x x 与卷积核h h h 可被计算:
x x x 的傅里叶变换为x ^ = U T x \hat{x} = U^Tx x ^ = U T x ,卷积核h h h 的傅里叶变换写成对角矩阵的形式即为:
[ h ^ ( λ 1 ) ⋱ h ^ ( λ n ) ] \begin{bmatrix}
\hat{h}(\lambda_1) & & \\
& \ddots & \\
& & \hat{h}(\lambda_n)
\end{bmatrix}
h ^ ( λ 1 ) ⋱ h ^ ( λ n )
其中,h ^ ( λ l ) = ∑ i = 1 N h ( i ) u l ∗ ( i ) \hat{h}(\lambda_l) = \sum^N_{i=1}h(i)u^*_l(i) h ^ ( λ l ) = ∑ i = 1 N h ( i ) u l ∗ ( i ) 是根据需要设计的卷积核h h h 在Graph上的傅里叶变换。这一矩阵也可以被写为U T h U^Th U T h 。
Graph的信号x与卷积核h两者的傅里叶变换乘积即为( U T h ) ⊙ ( U T x ) (U^Th)\odot(U^Tx) ( U T h ) ⊙ ( U T x ) (⊙ \odot ⊙ 表示Hadamard积,对于两个维度相同的向量、矩阵、张量进行对应位置的逐元素乘积运算),再乘以U U U 求两者傅里叶变换乘积的逆变换,则求出卷积:
( x ∗ h ) G = U ( ( U T h ) ⊙ ( U T x ) ) (x * h)_G = U((U^Th)\odot(U^Tx))
( x ∗ h ) G = U (( U T h ) ⊙ ( U T x ))
在图卷积网络中,我们令g θ g_{\theta} g θ 表示网络中的卷积核,也就是说,Graph中每个节点的信号x可以被卷积核g θ g_{\theta} g θ 所过滤并提取特征:
y = g θ ( L ) x = g θ ( U Λ U T ) x = U g θ ( Λ ) U T x y = g_{\theta}(L)x = g_{\theta}(U\Lambda U^T)x = Ug_{\theta}(\Lambda)U^Tx
y = g θ ( L ) x = g θ ( U Λ U T ) x = U g θ ( Λ ) U T x
因此,一种非参数的卷积核,很自然地被定义为g θ ( Λ ) = d i a g ( θ ) g_{\theta}(\Lambda) = diag(\theta) g θ ( Λ ) = d ia g ( θ ) 。
因此,卷积层被定义为y o u t p u t = σ ( U g θ ( Λ ) U T x ) y_{output} = \sigma(Ug_{\theta}(\Lambda)U^Tx) y o u tp u t = σ ( U g θ ( Λ ) U T x ) 。根据这一定义,通过对卷积核参数初始化赋值后利用误差反向传播进行调整,x x x 就是graph上对应于每个顶点的feature vector。但是,这一方法也存在弊端:首先,每一次前向传播,都需要计算U , d i a g ( θ l ) , U T U, diag(\theta_l), U^T U , d ia g ( θ l ) , U T 三者的矩阵乘积,这需要比较大的计算复杂度,第二,they are not localized in space,第三,卷积核需要n个参数。
Polynomial parametrization for localized filters
为解决上述问题,论文中使用了polynomial filter:
g θ ( Λ ) = ∑ k = 0 K − 1 θ k Λ k g_{\theta}(\Lambda) = \sum_{k=0}^{K-1}\theta_k\Lambda^k
g θ ( Λ ) = k = 0 ∑ K − 1 θ k Λ k
则每次卷积的输出为y o u t p u t = σ ( U g θ ( Λ ) U T x ) y_{output} = \sigma(Ug_{\theta}(\Lambda)U^Tx) y o u tp u t = σ ( U g θ ( Λ ) U T x )
矩阵中对角元素被定义为:
h ^ ( λ l ) = ∑ k = 0 K − 1 θ k λ l k \hat{h}(\lambda_l) = \sum^{K-1}_{k=0}\theta_k\lambda_l^k
h ^ ( λ l ) = k = 0 ∑ K − 1 θ k λ l k
式子中的参数θ ∈ R K \theta \in \mathbb{R}^{K} θ ∈ R K 可被看作多项式的系数。其中,( θ 0 , θ 2 , ⋯ , θ K − 1 ) (\theta_0, \theta_2, \cdots, \theta_{K-1}) ( θ 0 , θ 2 , ⋯ , θ K − 1 ) 是任意的参数。K K K 就是卷积核的感受域,也就是说每次卷积会将中心顶点最邻近的K层邻居上的feature进行加权求和,权系数就是θ k \theta_k θ k 。
经过上述对卷积核的改进,对于卷积后信号的计算可以重新被表示为:
y o u t p u t = σ ( U ∑ j = 0 K − 1 θ j Λ j U T ) = σ ( ∑ j = 0 K − 1 θ j L j x ) y_{output} = \sigma(U\sum_{j=0}^{K-1}\theta_j\Lambda^jU^T) = \sigma(\sum_{j=0}^{K-1}\theta_jL^jx)
y o u tp u t = σ ( U j = 0 ∑ K − 1 θ j Λ j U T ) = σ ( j = 0 ∑ K − 1 θ j L j x )
假设x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x 1 , x 2 , … , x n 是X的一个线性无关组,c 1 , c 2 , … , c n c_1, c_2, \dots, c_n c 1 , c 2 , … , c n 为R中任意数,由元素c 1 x 1 + c 2 x 2 + ⋯ + c n x n c_1x_1+c_2x_2+\dots+c_nx_n c 1 x 1 + c 2 x 2 + ⋯ + c n x n 组成的全体是X的一个子集,记为S p a n { x 1 , x 2 , … , x n } Span\{x_1, x_2,\dots,x_n\} Sp an { x 1 , x 2 , … , x n } 。
采用新的卷积核来计算,需要计算L j L^j L j 的值,但是这一计算仍然需要O ( n 2 ) O(n^2) O ( n 2 ) 的复杂度,因此,论文作者采用Chebyshev多项式拟合卷积核的方法,来降低计算复杂度。卷积核g θ ( Λ ) g_{\theta}(\Lambda) g θ ( Λ ) 可以利用截断的shifted Chebyshev多项式来逼近:
g θ ( Λ ) = ∑ k = 0 K − 1 θ k T k ( Λ ~ ) g_{\theta}(\Lambda) = \sum_{k=0}^{K-1}\theta_kT_k(\widetilde{\Lambda})
g θ ( Λ ) = k = 0 ∑ K − 1 θ k T k ( Λ )
通过Chebyshev多项式进行逼近,经过卷积之后的结果可以表示为y = g θ ( L ) x = ∑ k = 0 K − 1 θ k T k ( L ~ ) x y = g_{\theta}(L)x = \sum_{k=0}^{K-1}\theta_kT_k(\widetilde{L})x y = g θ ( L ) x = ∑ k = 0 K − 1 θ k T k ( L ) x ,其中T k ( L ~ ) ∈ R n × n T_k(\widetilde{L}) \in \mathbb{R}^{n \times n} T k ( L ) ∈ R n × n 为Chebyshev多项式的第k项,L ~ = 2 L / λ m a x − I n \widetilde{L} = 2L/\lambda_{max} - I_n L = 2 L / λ ma x − I n 。
在上文中,我们得到经过filtering操作之后的信号输出为y = g θ ( L ) x = ∑ k = 0 K − 1 θ k T k ( L ~ ) x y = g_{\theta}(L)x = \sum_{k=0}^{K-1}\theta_kT_k(\widetilde{L})x y = g θ ( L ) x = ∑ k = 0 K − 1 θ k T k ( L ) x ,其中L ~ = 2 L / λ m a x − I n \widetilde{L} = 2L/\lambda_{max} - I_n L = 2 L / λ ma x − I n 。
为尽可能降低计算的复杂度,令x ˉ k = T k ( L ~ ) x ∈ R n \bar{x}_k = T_k(\widetilde{L})x \in \mathbb{R}^n x ˉ k = T k ( L ) x ∈ R n 。之后,采用递归公式x ˉ k = 2 L ~ x ˉ k − 1 − x ˉ k − 2 \bar{x}_k = 2\widetilde{L}\bar{x}_{k-1} - \bar{x}_{k-2} x ˉ k = 2 L x ˉ k − 1 − x ˉ k − 2 (x ˉ 0 = x , x ˉ 1 = L ~ x \bar{x}_0=x, \bar{x}_1=\widetilde{L}x x ˉ 0 = x , x ˉ 1 = L x )。通过这一递归公式,使得之前的矩阵乘法转变为矩阵与向量相乘,最终filtering的计算转变为y = g θ ( L ) x = [ x ˉ 0 , … , x ˉ K − 1 ] θ y = g_\theta(L)x = [\bar{x}_0, \dots, \bar{x}_{K-1}]\theta y = g θ ( L ) x = [ x ˉ 0 , … , x ˉ K − 1 ] θ ,因此,最终计算的时间复杂度为O ( K ∣ E ∣ ) O(K|\mathcal{E}|) O ( K ∣ E ∣ ) 。
GCN代码
参考链接