传统的cnn针对的是分布在欧式空间(Euclidean domains)的数据,这些数据最显著的特征就是具有规则的空间结构,例如图像是规则的二维矩阵,语音是规则的一维序列等。这些Euclidean domains data可以用一维或二维矩阵来表示,cnn可以非常高效地处理。
离散卷积本质上就是一种加权求和。cnn中的卷积是一种离散卷积,本质上是利用过一个共享参数的滤波器(kernel),通过计算中心像素点以及相邻像素点的加权和,来构成feature map,实现空间特征的抽取。当然加权系数就是卷积核的权重系数(W)。
卷积核的参数W随机初始化后,通过网络最小化误差函数,经过反向传播,梯度下降法进行迭代优化。所以说,通过优化卷积核的参数,从而实现特征抽取。GCN的理论很大部分工作是引入了可以优化的卷积参数。
Non-Euclidean Domain data:生活中大量的数据不具备规则的空间结构,例如推荐系统、电子交易、分子结构等抽象出来的图谱。这些图谱中的每个节点连接不尽相同,有的节点有三个连接,有的节点只有一个连接,是不规则的结构。对于这些不规则的数据对象,传统卷积网络的效果不尽人意。CNN卷积操作配合pooling等在结构规则的图像等数据上效果显著,但是在非欧氏空间比如图(即graph,流形也是典型的非欧结构,这里只考虑图),难以选取固定的卷积核来适应整个图的不规则性,如邻居节点数量的不确定和节点顺序的不确定。
Graph数据的空间特征:
综上,图卷积的核心思想是利用边的信息对节点信息进行聚合从而生成新的节点表示。
GCN的本质目的就是用来提取拓扑图的空间特征:
基于spatial domain的gcn可以类比到直接在图片的像素点上进行卷积,而基于spectral domain的gcn类比到对图片的像素点进行傅里叶变换后,再进行卷积。
基于spatial domain的gcn直接将卷积定义在各个节点的边(连接关系)上,跟传统的cnn更相似一些。比较有代表性的方法有:
通过Spectral Graph Thesis(图谱理论)来实现拓扑图上的卷积操作。Spectral Graph Thesis通过Graph的Laplacian Matrix的特征值和特征向量来研究Graph的性质。GSP(Graph Signal Processing)定义了graph上的傅里叶变换(Fourier Transformation),进而定义了graph上的卷积。
对于Graph: G = ( V , E ) G=(V,E) G=(V,E),其Laplacian矩阵: L = D − A L=D-A L=D−A,其中 L L L是Laplacian矩阵, D : d i i = ∑ j A i j D:d_{ii}=\sum_{j}A_{ij} D:dii=∑jAij是节点的度量矩阵, A A A是邻居矩阵。
拉普拉斯矩阵是半正定矩阵(最小特征值大于等于0) f T L f ≥ 0 f^TLf\ge0 fTLf≥0:
f T L f = f T D f − f T A f = f T diag ( D ) f − f T A f = ∑ i = 1 n d i f i 2 − ∑ j = 1 n [ ∑ i = 1 n f j ∗ a i j ] f j = ∑ i = 1 n d i f i 2 − ∑ i , j = 1 n f i ∗ f j ∗ a i j = 1 2 [ ∑ i = 1 n d i f i 2 − 2 ∑ i , j = 1 n f i f j a i j + ∑ j = 1 n d j f j 2 ] = 1 2 ∑ i , j = 1 n a i j ( f i − f j ) 2 f^TLf=f^TDf-f^TAf=f^T\text{diag}(D)f-f^TAf\\ =\sum_{i=1}^{n}d_if_i^2-\sum_{j=1}^{n}[\sum_{i=1}^{n}f_j*a_{ij}]f_j=\sum_{i=1}^{n}d_if^2_i-\sum_{i,j=1}^{n}f_i*f_j*a_{ij}\\ =\frac{1}{2}[\sum_{i=1}^{n}d_if_i^2-2\sum_{i,j=1}^{n}f_if_ja_{ij}+\sum_{j=1}^{n}d_jf_j^2]\\ =\frac{1}{2}\sum_{i,j=1}^{n}a_{ij}(f_i-f_j)^2 fTLf=fTDf−fTAf=fTdiag(D)f−fTAf=i=1∑ndifi2−j=1∑n[i=1∑nfj∗aij]fj=i=1∑ndifi2−i,j=1∑nfi∗fj∗aij=21[i=1∑ndifi2−2i,j=1∑nfifjaij+j=1∑ndjfj2]=21i,j=1∑naij(fi−fj)2
所以,对于任意一个向量 f ∈ R n f\in \mathbb R^{n} f∈Rn,都有:
f T L f = 1 2 ∑ i , j = 1 n a i j ( f i − f j ) 2 f^TLf=\frac{1}{2}\sum_{i,j=1}^{n}a_{ij}(f_i-f_j)^2 fTLf=21i,j=1∑naij(fi−fj)2
特征值中0出现的次数就是Graph连通区域的个数。
最小特征值是0。
拉普拉斯矩阵是对称矩阵,可以进行特征分解(谱分解)。由于卷积在傅里叶域的计算相对简单,为了在graph上做傅里叶变换,需要找到graph的连续的正交基对应于傅里叶变换的基,因此要使用拉普拉斯矩阵的特征向量。
特征分解(Eigenvalue Decomposition),又称谱分解(Spectral Decomposition),是将矩阵分解为其特征值和特征向量矩阵之积的方法。
只有可对角化矩阵或有 n n n个线性无关的特征向量的矩阵才可以特征分解。矩阵可以进行特征分解的充要条件是 n n n阶方阵存在 n n n个线性无关的特征向量。由于拉普拉斯矩阵是半正定(半正定矩阵本身就是对称矩阵),有如下三个性质:
拉普拉斯矩阵的谱分解:
L = U Λ U − 1 = U [ λ 1 ⋱ λ n ] U − 1 L=U\Lambda U^{-1}=U\left[ \begin{matrix} \lambda_1 & & \\ & \ddots & \\ & & \lambda_n \end{matrix} \right]U^{-1} L=UΛU−1=U⎣⎡λ1⋱λn⎦⎤U−1
其中 U = ( u ⃗ 1 , u ⃗ 2 , … , u ⃗ n ) U=(\vec u_1,\vec u_2,\dots,\vec u_n) U=(u1,u2,…,un)是正交矩阵, Λ \Lambda Λ是由 n n n个特征值构成的对角阵。由于 U U T = I UU^T=I UUT=I,所以 L = U Λ U − 1 = U Λ U T L=U\Lambda U^{-1}=U\Lambda U^T L=UΛU−1=UΛUT。
定义:拉普拉斯算子是 n n n维欧几里德空间中的一个二阶微分算子,定义为梯度( ∇ f \nabla f ∇f)的散度( ∇ ⋅ f \nabla \cdot f ∇⋅f,即 ∇ f ⋅ f \nabla f\cdot f ∇f⋅f)。故如果 f f f是二阶可微的实函数,则 f f f的拉普拉斯算子 Δ \Delta Δ定义为:
Δ f = ∇ 2 f = ∇ ⋅ ∇ f \Delta f=\nabla^2f=\nabla\cdot\nabla f Δf=∇2f=∇⋅∇f
f f f的拉普拉斯算子也是笛卡尔坐标系 x i x_i xi中所有非混合二阶偏导数:
Δ f = ∑ i = 1 n ∂ 2 f ∂ x i 2 \Delta f=\sum_{i=1}^n\frac{\partial^2f}{\partial x_i^2} Δf=i=1∑n∂xi2∂2f
函数 f f f的拉普拉斯算子,也等于该函数的海森矩阵的迹:
Δ f = trace ( H ( f ) ) \Delta f=\text{trace}(H(f)) Δf=trace(H(f))
两个函数中的一个(取 g ( x ) g(x) g(x),可以任意取)函数,把 g ( x ) g(x) g(x)经过翻转平移,然后与 f ( x ) f(x) f(x)的相乘,得到的一个新的函数,对这个函数积分,也就是对这个新的函数求它所围成的曲边梯形的面积。
设 f ( t ) , g ( t ) f(t),g(t) f(t),g(t)是两个可积函数, f ( t ) f(t) f(t)与 g ( t ) g(t) g(t)的卷积记为 f ( t ) ∗ g ( t ) f(t)*g(t) f(t)∗g(t),它是其中一个函数翻转并平移后与另一个函数乘积的积分,是一个自变量是平移量的函数。也就是:
f ( t ) ∗ g ( t ) = ∫ − ∞ + ∞ f ( τ ) g ( t − τ ) d τ = ∫ − ∞ + ∞ f ( t − τ ) g ( τ ) d τ f(t)*g(t)=\int_{-\infin}^{+\infin}f(\tau)g(t-\tau)d\tau=\int_{-\infin}^{+\infin}f(t-\tau)g(\tau)d\tau f(t)∗g(t)=∫−∞+∞f(τ)g(t−τ)dτ=∫−∞+∞f(t−τ)g(τ)dτ
( f ∗ g ) ( t ) = ∑ τ = − ∞ + ∞ f ( τ ) g ( t − τ ) (f*g)(t)=\sum_{\tau=-\infin}^{+\infin}f(\tau)g(t-\tau) (f∗g)(t)=τ=−∞∑+∞f(τ)g(t−τ)
所谓卷积,其实就是把一个函数卷(翻)过来,然后与另一个函数求内积。
g g g函数既可以看作deep learning中的kernel(核),也可以对应到信号处理中的filter(滤波器)。而 f f f函数是机器学习中的Feature(特征),也可以是信号处理中的Signal。函数 f f f和 g g g的卷积 f ∗ g f*g f∗g就可以看作是对 f f f的加权求和:
任意函数可以分解为奇偶函数之和:
f ( x ) = f ( x ) + f ( − x ) 2 + f ( x ) − f ( − x ) 2 = f e v e n + f o d d f(x)=\frac{f(x)+f(-x)}{2}+\frac{f(x)-f(-x)}{2}=f_{even}+f_{odd} f(x)=2f(x)+f(−x)+2f(x)−f(−x)=feven+fodd
任意一个周期函数可以由若干个正交函数(由 s i n sin sin, c o s cos cos构成)的线性组合构成,写出傅里叶级数的形式:
f ( x ) = a 0 + ∑ n = 1 ∞ ( a n c o s ( 2 π n T x ) + b n s i n ( 2 π n T x ) ) , a 0 ∈ R f(x)=a_0+\sum_{n=1}^{\infin}\big (a_ncos(\frac{2\pi n}{T}x)+b_nsin(\frac{2\pi n}{T}x) \big), a_0\in \mathbb R f(x)=a0+n=1∑∞(ancos(T2πnx)+bnsin(T2πnx)),a0∈R
利用欧拉公式 e i x = cos x + i sin x e^{ix}=\text{cos}\ x+i\text{sin}\ x eix=cos x+isin x:
cos x = e i x + e − i x 2 , sin x = e i x − e − i x 2 i \text{cos}\ x=\frac{e^{ix}+e^{-ix}}{2},\text{sin}\ x=\frac{e^{ix}-e^{-ix}}{2i} cos x=2eix+e−ix,sin x=2ieix−e−ix
在时间轴 t t t上,把 e i t e^{it} eit向量的虚部记录下来,得到 s i n ( t sin\ (t sin (t):
实部记录下来,得到 c o s ( t ) cos\ (t) cos (t):
更一般的:
e i w t ⟺ { sin ( w t ) cos ( w t ) e^{iwt}\Longleftrightarrow \begin{cases} \text{sin}(wt)\\ \text{cos}(wt) \end{cases} eiwt⟺{sin(wt)cos(wt)
这两种角度,一个可以观察到旋转的频率,所以称为频域;一个可以看到流逝的时间,所以称为时域:
**任意周期函数可以表示为以 e i w t e^{iwt} eiwt为基函数,用傅里叶级数的指数形式。**即,对于一个周期函数 f ( x ) f(x) f(x)可以表示为傅里叶级数的指数形式:
f ( x ) = ∑ n = − ∞ ∞ c n ⏟ 基 的 坐 标 ⋅ e i 2 π n x T ⏟ 正 交 基 f(x)=\sum_{n=-\infin}^{\infin}\underbrace{c_n}_{基的坐标}\cdot \underbrace{e^{i \frac{2\pi nx}{T}}}_{正交基} f(x)=n=−∞∑∞基的坐标 cn⋅正交基 eiT2πnx
对于非周期函数:
f ( x ) = ∫ − ∞ + ∞ [ ∫ − ∞ + ∞ f ( x ) e − i w t d x ] e i w t d w = ∫ − ∞ + ∞ F ( w ) e i w t d w f(x)=\int^{+\infin}_{-\infin}\big[\int^{+\infin}_{-\infin}f(x)e^{-iwt}dx\big]e^{iwt}dw=\int^{+\infin}_{-\infin}F(w)e^{iwt}dw f(x)=∫−∞+∞[∫−∞+∞f(x)e−iwtdx]eiwtdw=∫−∞+∞F(w)eiwtdw
其中** F ( w ) F(w) F(w)就是 f ( x ) f(x) f(x)的连续形式的傅里叶变换:**
F ( w ) = F [ f ( x ) ] = ∫ − ∞ + ∞ f ( x ) e − i w t d x F(w)=\mathcal F[f(x)]=\int^{+\infin}_{-\infin}f(x)e^{-iwt}dx F(w)=F[f(x)]=∫−∞+∞f(x)e−iwtdx
由上述公式可以看出, f ( x ) f(x) f(x)和 F ( w ) F(w) F(w)可以通过指定的积分运算相互表达:
F ( w ) = F ( f ( x ) ) , f ( x ) = F − 1 [ F ( w ) ] F(w)=\mathcal F(f(x)),f(x)=\mathcal F^{-1}[F(w)] F(w)=F(f(x)),f(x)=F−1[F(w)]
其实可以发现这个对信号 f ( x ) f(x) f(x)的傅立叶变换 F ( w ) F(w) F(w)形式上是 f ( x ) f(x) f(x)与基函数 e − i w x e^{−iwx} e−iwx的积分,本质上将函数 f ( x ) f(x) f(x)映射到了以 e − i w x e^{-iwx} e−iwx为基向量的空间中。
把传统的傅里叶变换以及卷积迁移到Graph上来,核心工作其实就是把拉普拉斯算子的特征函数 e − i w t e^{-iwt} e−iwt变为Graph对应的拉普拉斯矩阵的特征向量。
傅立叶变换与拉普拉斯矩阵的关系:传统傅立叶变换的基,就是拉普拉斯矩阵的一组特征向量。
利用矩阵乘法将Graph上的傅里叶变换推广到矩阵形式:
⟮ f ^ ( λ 1 ) f ^ ( λ 2 ) ⋮ f ^ ( λ N ) ⟯ = ⟮ u 1 ( 1 ) u 1 ( 2 ) … u 1 ( N ) u 2 ( 1 ) u 2 ( 2 ) … u 2 ( N ) ⋮ ⋮ ⋱ ⋮ u N ( 1 ) u N ( 2 ) … u N ( N ) ⟯ ⟮ f ( 1 ) f ( 2 ) ⋮ f ( N ) ⟯ \left \lgroup \begin{matrix} \hat f(\lambda_1)\\ \hat f(\lambda_2)\\ \vdots\\ \hat f(\lambda_N) \end{matrix} \right \rgroup= \left \lgroup \begin{matrix} u_1(1)&u_1(2)&\dots&u_1(N)\\ u_2(1)&u_2(2)&\dots&u_2(N)\\ \vdots&\vdots&\ddots&\vdots\\ u_N(1)&u_N(2)&\dots&u_N(N)\\ \end{matrix} \right \rgroup \left \lgroup \begin{matrix} f(1)\\ f(2)\\ \vdots\\ f(N) \end{matrix} \right \rgroup ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧f^(λ1)f^(λ2)⋮f^(λN)⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧u1(1)u2(1)⋮uN(1)u1(2)u2(2)⋮uN(2)……⋱…u1(N)u2(N)⋮uN(N)⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧f(1)f(2)⋮f(N)⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫
即 f f f在Graph上傅里叶变换的矩阵形式为:
f ^ = U T f \hat f=U^Tf f^=UTf
⟮ f ( 1 ) f ( 2 ) ⋮ f ( N ) ⟯ = ⟮ u 1 ( 1 ) u 2 ( 1 ) … u N ( 1 ) u 1 ( 2 ) u 1 ( 2 ) … u N ( 2 ) ⋮ ⋮ ⋱ ⋮ u 1 ( N ) u 2 ( N ) … u N ( N ) ⟯ ⟮ f ^ ( λ 1 ) f ^ ( λ 2 ) ⋮ f ^ ( λ N ) ⟯ \left \lgroup \begin{matrix} f(1)\\ f(2)\\ \vdots\\ f(N) \end{matrix} \right \rgroup= \left \lgroup \begin{matrix} u_1(1)&u_2(1)&\dots&u_N(1)\\ u_1(2)&u_1(2)&\dots&u_N(2)\\ \vdots&\vdots&\ddots&\vdots\\ u_1(N)&u_2(N)&\dots&u_N(N)\\ \end{matrix} \right \rgroup \left \lgroup \begin{matrix} \hat f(\lambda_1)\\ \hat f(\lambda_2)\\ \vdots\\ \hat f(\lambda_N) \end{matrix} \right \rgroup ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧f(1)f(2)⋮f(N)⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧u1(1)u1(2)⋮u1(N)u2(1)u1(2)⋮u2(N)……⋱…uN(1)uN(2)⋮uN(N)⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧f^(λ1)f^(λ2)⋮f^(λN)⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫
即 f f f在Graph上的傅里叶逆变换的矩阵形式为:
f = U f ^ f=U\hat f f=Uf^
在上面的基础上,利用卷积定理类比来将卷积运算,推广到Graph上。
卷积定理:函数卷积的傅里叶变换是函数傅立叶变换的乘积,即对于函数 f f f与 g g g两者的卷积是其函数傅立叶变换乘积的逆变换:
f ∗ g = F − 1 { F ( f ) ⋅ F ( g ) } = F − 1 { f ^ ⋅ g ^ } f*g=\mathcal F^{-1}\{\mathcal F(f)\cdot\mathcal F(g)\}=\mathcal F^{-1}\{\hat f\cdot\hat g\} f∗g=F−1{F(f)⋅F(g)}=F−1{f^⋅g^}
所以对Graph上的 f f f和卷积核 g g g的卷积操作可以表示为:
( f ∗ g ) G = U ( ( U T f ) ( u T g ) ) = U T f U g θ (f*g)_G=U\big ((U^Tf)(u^Tg)\big)=U^TfU_{g\theta} (f∗g)G=U((UTf)(uTg))=UTfUgθ
g θ ∗ x = U g θ U T x = U ⟮ g ^ ( λ 1 ) ⋱ g ^ ( λ n ) ⟯ U T x g_\theta*x=U_{g\theta}U^Tx=U \left\lgroup \begin{matrix} \hat g(\lambda_1)& & \\ &\ddots&\\ & &\hat g(\lambda_n) \end{matrix} \right\rgroup U^Tx gθ∗x=UgθUTx=U⎩⎪⎪⎪⎪⎪⎧g^(λ1)⋱g^(λn)⎭⎪⎪⎪⎪⎪⎫UTx
Deep Learning中的卷积就是要设计含有trainable共享参数的kernel。
上式计算量很大,特征向量矩阵 U U U的复杂度是 O ( N 2 ) O(N^2) O(N2)。此外,对于大型graph来说,拉普拉斯矩阵 L L L特征分解的计算量也很大。
简单的说,Spectral CNN把 g θ g_\theta gθ看作是一个可学习参数的集合: g θ = Θ i , j k g_\theta=\Theta^k_{i,j} gθ=Θi,jk,gcn定义为:
X : , j k + 1 = δ ( ∑ i = 1 f k − 1 U Θ i , j k U T X : , j k ) X^{k+1}_{:,j}=\delta(\sum^{f_{k-1}}_{i=1}U\Theta^{k}_{i,j}U^TX^k_{:,j}) X:,jk+1=δ(i=1∑fk−1UΘi,jkUTX:,jk)
第一代的参数方法存在着一些弊端,主要在于:
定义特征向量对角矩阵的切比雪夫多项式为滤波器:
g θ = g θ ( Λ ) ≈ ∑ i = 0 K − 1 θ i T k ( Λ ~ ) g_\theta=g_\theta(\Lambda)\approx\sum^{K-1}_{i=0}\theta_iT_k(\tilde \Lambda) gθ=gθ(Λ)≈i=0∑K−1θiTk(Λ~)
其实就是利用Chebyshev多项式拟合卷积核的方法,来降低计算复杂度。
推导过程如下:
g θ ∗ x = U g θ U T x g_\theta*x=Ug_\theta U^Tx %\label{eq:chebyshev} gθ∗x=UgθUTx
其中
U U U是对称归一化的拉帕拉斯矩阵 L L L的特征向量矩阵, Λ \Lambda Λ是由 L L L的特征值构成的对角矩阵
L = D − 1 2 ( D − A ) D − 1 2 = I N − D − 1 2 A D − 1 2 = U Λ U T L=D^{-\frac{1}{2}}(D-A)D^{-\frac{1}{2}}=I_N-D^{-\frac{1}{2}}AD^{-\frac{1}{2}}=U\Lambda U^T L=D−21(D−A)D−21=IN−D−21AD−21=UΛUT
因为 L L L是对称矩阵,所以特征向量矩阵 U U U是正交矩阵: U U T = I N UU^T=I_N UUT=IN;
U T x U^Tx UTx是 x x x的傅里叶变换;
g θ = g θ ( Λ ) g_\theta=g_\theta(\Lambda) gθ=gθ(Λ)是由参数 θ \theta θ构成的对角矩阵 diag ( θ ) \text{diag}(\theta) diag(θ)。
公式\eqref{eq:chebyshev}的计算量也很大,因为特征向量矩阵 U U U的复杂度是 O ( N 2 ) O(N^2) O(N2),此外,对于大型graph, L L L特征值分解的计算量也很大。
为解决这个问题,Wavelets on graphs via spectral graph theory提出 g θ ( Λ ) g_\theta(\Lambda) gθ(Λ)可以很好的通过Chebyshev多项式 T k ( x ) T_k(x) Tk(x)的 K t h − Kth- Kth−阶截断展开来拟合,并对 Λ \Lambda Λ进行尺度变换使其元素位于 [ − 1 , 1 ] [-1,1] [−1,1]:
g θ ( Λ ) ≈ ∑ k = 0 K θ k T K ( Λ ~ ) g_\theta(\Lambda)\approx\sum^{K}_{k=0}\theta_kT_K(\tilde\Lambda) %\label{eq:cheby0} gθ(Λ)≈k=0∑KθkTK(Λ~)
其中
则Chebyshev在graph上卷积:
g θ ∗ x = ∑ k = 0 K θ k T K ( L ~ ) x g_\theta*x=\sum^K_{k=0}\theta_kT_K(\tilde L)x %\label{eq:cheb} gθ∗x=k=0∑KθkTK(L~)x
其中
现在,相比于第一种Spectral CNN:
公式\eqref{eq:cheby0}公式\eqref{eq:cheb}的证明:
先用数学归纳法证明:
U T k ( Λ ~ ) U T = T k ( U Λ ~ U T ) UT_k(\tilde\Lambda)U^T=T_k(U\tilde\Lambda U^T) UTk(Λ~)UT=Tk(UΛ~UT)
证明:
由切比雪夫多项式的定义,已知:
U T 0 ( Λ ~ ) U T = U U T = 1 = T 0 ( U Λ ~ U T ) UT_0(\tilde\Lambda)U^T=UU^T=1=T_0(U\tilde\Lambda U^T) UT0(Λ~)UT=UUT=1=T0(UΛ~UT)
U T 1 ( Λ ~ ) U T = U Λ ~ U T = T 1 ( U Λ ~ U T ) UT_1(\tilde\Lambda)U^T=U\tilde\Lambda U^T=T_1(U\tilde\Lambda U^T) UT1(Λ~)UT=UΛ~UT=T1(UΛ~UT)
假设对于任意 k > 0 k>0 k>0,满足:
U T k − 2 ( Λ ~ ) U T = T k − 2 ( U Λ ~ U T ) UT_{k-2}(\tilde\Lambda)U^T=T_{k-2}(U\tilde\Lambda U^T) UTk−2(Λ~)UT=Tk−2(UΛ~UT)
U T k − 1 ( Λ ~ ) U T = T k − 1 ( U Λ ~ U T ) UT_{k-1}(\tilde\Lambda)U^T=T_{k-1}(U\tilde\Lambda U^T) UTk−1(Λ~)UT=Tk−1(UΛ~UT)
则:
U T k ( Λ ~ ) U T = 2 U Λ ~ T k − 1 ( Λ ~ ) U T − U T k − 2 ( Λ ~ ) U T = 2 ( U Λ ~ U T ) [ U T k − 1 ( Λ ~ ) U T ] − U T k − 2 ( U Λ ~ U T ) = T k ( U Λ ~ U T ) \begin{aligned} UT_k(\tilde\Lambda)U^T&=2U\tilde\Lambda T_{k-1}(\tilde\Lambda)U^T-UT_{k-2}(\tilde\Lambda)U^T\\ &=2(U\tilde\Lambda U^T)\big[UT_{k-1}(\tilde\Lambda)U^T\big]-UT_{k-2}(U\tilde\Lambda U^T)\\ &=T_k(U\tilde\Lambda U^T) \end{aligned} UTk(Λ~)UT=2UΛ~Tk−1(Λ~)UT−UTk−2(Λ~)UT=2(UΛ~UT)[UTk−1(Λ~)UT]−UTk−2(UΛ~UT)=Tk(UΛ~UT)
证毕。
已知 L ~ = U Λ ~ U T \tilde L=U\tilde\Lambda U^T L~=UΛ~UT
g θ ∗ x = U g θ U T x = U g θ ( Λ ) U T x = U ( ∑ k − 0 K θ k T K ( U Λ ~ U T ) ) U T x = ∑ k = 0 K θ k T K ( L ~ ) x \begin{aligned} g_\theta*x&=Ug_\theta U^Tx=Ug_\theta(\Lambda)U^Tx\\ &=U\big(\sum^K_{k-0}\theta_kT_K(U\tilde\Lambda U^T)\big)U^Tx\\ &=\sum^K_{k=0}\theta_kT_K(\tilde L)x \end{aligned} gθ∗x=UgθUTx=Ugθ(Λ)UTx=U(k−0∑KθkTK(UΛ~UT))UTx=k=0∑KθkTK(L~)x
CayleyNet进一步应用了参数有理符合函数的Cayley多项式来捕获狭窄的频带,其谱图卷积定义为:
x ∗ g θ = c 0 x + 2 Re ⟮ ∑ j = 1 r c j ( h L − i I ) j ( h L + i I ) − j x ⟯ x*g_\theta=c_0x+2\text{Re}\lgroup\sum^r_{j=1}c_j(hL-iI)^j(hL+iI)^{-j}x\rgroup x∗gθ=c0x+2Re⟮j=1∑rcj(hL−iI)j(hL+iI)−jx⟯
Semi-supervised classification with graph convolutional networks,nips17是GCN的开山之作:
Kipf等人引入了一种一阶近似ChebNet,假设 K = 1 , λ m a x = 2 K=1,\lambda_{max}=2 K=1,λmax=2,则ChebNet卷积公式简化为:
x ∗ g θ = θ 0 x − θ 1 D − 1 2 A D − 1 2 x*g_\theta=\theta_0x-\theta_1D^{-\frac{1}{2}}AD^{-\frac{1}{2}} x∗gθ=θ0x−θ1D−21AD−21
为防止过拟合, 1 s t 1st 1stChebNet假设 θ = θ 0 = − θ 1 \theta=\theta_0=-\theta_1 θ=θ0=−θ1:
g θ ∗ x = θ ( I N + D − 1 2 A D − 1 2 ) x g_\theta*x=\theta(I_N+D^{-\frac{1}{2}}AD^{-\frac{1}{2}})x gθ∗x=θ(IN+D−21AD−21)x
其中
I N + D − 1 2 A D − 1 2 I_N+D^{-\frac{1}{2}}AD^{-\frac{1}{2}} IN+D−21AD−21由在 [ 0 , 2 ] [0,2] [0,2]范围内的特征值,如果在dnn中反复使用该计算方式,会导致数值不问题,进而引起梯度发散和梯度爆炸/消失等,为解决该问题,ChebNet引入了一个re-normalization trick:
I N + D − 1 2 A D − 1 2 ⟶ A ~ = A + I N D ~ − 1 2 A ~ D ~ − 1 2 I_N+D^{-\frac{1}{2}}AD^{-\frac{1}{2}}\stackrel{\tilde A=A+I_N}\longrightarrow \tilde D^{-\frac{1}{2}}\tilde A\tilde D^{-\frac{1}{2}} IN+D−21AD−21⟶A~=A+IND~−21A~D~−21
A ~ = A + I N , D ~ i i = ∑ j A ~ i j \tilde A=A+I_N,\tilde D_{ii}=\sum_{j}\tilde A_{ij} A~=A+IN,D~ii=∑jA~ij,即graph中加上自环。再加上一个激活函数,即得到ChebNet的快速卷积公式:
KaTeX parse error: Undefined control sequence: \label at position 106: …(l)}W^{(l)}) \̲l̲a̲b̲e̲l̲{eq:chebnet}
将定义KaTeX parse error: Undefined control sequence: \eqref at position 1: \̲e̲q̲r̲e̲f̲{eq:chebnet}推广到具有 C C C个输入通道(即每个节点为 C C C维特征向量)的信号 X ∈ R N × C X\in\mathbb R^{N\times C} X∈RN×C和 F F F个滤波器:
Z = D ~ − 1 2 A ~ D ~ − 1 2 X Θ Z=\tilde D^{-\frac{1}{2}}\tilde A\tilde D^{-\frac{1}{2}}X\Theta Z=D~−21A~D~−21XΘ
其中:
带一阶滤波器的多层GCN结构如下:
Input:Feature matrix X ∈ R N × D X \in \mathbb{R}^{N \times D} X∈RN×D, preprocessed adjacency matrix A ~ \tilde A A~
使用一个俱乐部会员的关系网络,使用随机初始化的GCN抽取特征,得到各个节点的embedding,可视化如下如:
经过GCN提取出的特征,已经自动聚类:
在semi-supervised设定下,只提供一个样本标签:
GCN的优点
不足:
**扩展性差:**由于训练时需要需要知道关于训练节点、测试节点在内的所有节点的邻接矩阵AAA,因此是transductive的,不能处理大图,然而工程实践中几乎面临的都是大图问题,因此在扩展性问题上局限很大,为了解决transductive的的问题,GraphSAGE:Inductive Representation Learning on Large Graphs被提出;
**局限于浅层:**GCN论文中表明,目前GCN只局限于浅层,实验中使用2层GCN效果最好。为了加深,需要使用残差连接等trick,但是即使使用了这些trick,也只能勉强保存性能不下降,并没有提高。
Deeper Insights into Graph Convolutional Networks for Semi-Supervised Learning一文也针对When GCNs Fail ?这个问题进行了分析。
论文:DeepGCNs-Can GCNs Go as Deep as CNNs?就是解决GCN局限于浅层的这个问题的,但个人觉得并没有解决实质性的问题,这方面还有值得研究的空间。
自适应GCN(AGCN, AAAI18)利用残差图来扩充图。残差图是通过计算节点对的距离来构造,计算量为 O ( N 2 ) O(N^2) O(N2)。自适应图卷积网络(AGCN)通过图的邻接矩阵学习未知的隐藏结构关系。它通过一个以两个节点的特征为输入的可学习的距离函数来构造一个所谓的残差图邻接矩阵。
对偶图卷积网络(DGCN)引入了一种对偶图卷积结构,该结构具有两个并行的图卷积层。虽然这些对偶层共享参数,他们使用归一化了的邻接矩阵 A A A,和归一化了的节点态互信息(PPMI)的共生矩阵提取节点随机游走。DGCN通过对偶图卷积层的集成输出,无需叠加多个图卷积层即可捕获局部和全局结构信息。
**NN4G是第一个基于Spatial Domain的ConvGNNs,**通过直接聚合节点的邻域信息来实现Graph的卷积。此外,还应用剩余链接和跳跃连接来记忆每一层的信息:
KaTeX parse error: Undefined control sequence: \label at position 121: …^{(k-1)}\Bigg) \̲l̲a̲b̲e̲l̲{eq:nn4g}
公式KaTeX parse error: Undefined control sequence: \eqref at position 1: \̲e̲q̲r̲e̲f̲{eq:nn4g}写成矩阵形式:
H ( k ) = f ( X W ( k − 1 ) + ∑ i = 1 k − 1 A H ( k − ) Θ ( k − 1 ) ) \bf H^{(k)}=f\Bigg(\bf X \bf W^{(k-1)}+\sum^{k-1}_{i=1}\bf A \bf H^{(k-)}\Theta^{(k-1)}\Bigg) H(k)=f(XW(k−1)+i=1∑k−1AH(k−)Θ(k−1))
DCNN将图卷积看作一个扩散过程,假设信息以一定的转移概率,从一个节点转移到相邻的一个节点,使信息分布在几轮后达到均衡。DCNN将扩散图卷积定义为:
H ( k ) = f ( w ( k ) ⊙ P ( k ) X ) \bf H^{(k)}=f\Big(\bf w^{(k)}\odot\bf P^{(k)}\bf X\Big) H(k)=f(w(k)⊙P(k)X)
**扩散图卷积:**DCNN扩散过程的平稳分布,是概率转移矩阵的幂级数的总和。因此扩散图卷积(Diffusion Graph Convolution, DGC)将每个扩散步骤的输出相加,而不是拼接。它定义扩散图卷积为:
H = ∑ k = 0 k f ( P k X W ( k ) ) \bf H=\sum^{k}_{k=0}f\bigg(\bf{P^kXW^{(k)}}\bigg) H=k=0∑kf(PkXW(k))
GraphSage(Inductive representation learning on large graphs,NIPS 2017)引入聚合函数的概念定义图形卷积。聚合函数本质上是聚合节点的邻域信息,需要满足对节点顺序的排列保持不变,例如均值函数,求和函数,最大值函数都对节点的顺序没有要求。图的卷积运算定义为:
h v ( k ) = δ ( W ( k ) ⋅ f k ( h v ( k − 1 ) , { h u ( k − 1 ) , ∀ u ∈ S N ( v ) } ) ) \bf h^{(k)}_v=\delta\bigg(\bf W^{(k)}\cdot f_k\bigg(\bf h^{(k-1)}_v,\big\{h^{(k-1)}_u,\forall u\in S_{\mathcal N(v)} \big\} \bigg) \bigg) %\label{eq:graphsage} hv(k)=δ(W(k)⋅fk(hv(k−1),{hu(k−1),∀u∈SN(v)}))
**通常GCN这样的训练函数需要将整个图数据和所有节点中间状态保存到内存中。特别是当一个图包含数百万个节点时,针对ConvGNNs的full-batch训练算法受到内存溢出问题的严重影响。为了节省内存,GraphSage提出了一种batch训练算法。它将节点看作一棵树的根节点,然后通过递归地进行K步邻域扩展,扩展时保持采样大小固定不变。对于每一棵采样树,GraphSage通过从下到上的层次聚集隐含节点表示来计算根节点的隐含表示。**首先,对一个节点的 k − h o p k-hop k−hop邻居节点采样;然后通过聚合其邻居节点的信息,来更新中心节点的最终状态;最后利用中心节点的最终状态计算误差,反向传播更新网络。
GAT在聚合邻居节点信息时,使用注意力机制确定每个邻居节点对中心节点的重要性,即权重:
h v ( 0 ) = δ ( ∑ u ∈ N ( v ) ∪ v α v u W ( k − 1 ) h u ( k − 1 ) ) \bf h^{(0)}_v=\delta\bigg(\sum_{u\in\mathcal N(v)\cup v}\alpha_{vu}\bf W^{(k-1)}\bf h^{(k-1)}_u \bigg) hv(0)=δ(u∈N(v)∪v∑αvuW(k−1)hu(k−1))
其中
h v ( 0 ) = x v \bf h^{(0)}_v=\bf x_v hv(0)=xv;
α v u \alpha_{vu} αvu表示节点 v v v与其邻居节点 u u u之间连接的权重:
α v u = softmax ( g ( a T [ W ( k − 1 ) h v ∥ W ( k − 1 h u ∥ ] ) ) \alpha_{vu}=\text{softmax}\bigg(g\bigg(\bf a^T\bigg[\bf W^{(k-1)}\bf h_v\|\bf W^{(k-1}\bf h_u\| \bigg] \bigg) \bigg) αvu=softmax(g(aT[W(k−1)hv∥W(k−1hu∥]))
g ( ⋅ ) g(\cdot) g(⋅)是LeakReLU激活函数;
a \bf a a是一个科学系的参数向量。
Softmax函数可以保证节点 v v v的所有邻居节点的注意力权值之和为1。GAT使用了multi-head注意力方式,并以concat方式对不同注意力节点进行整合,提高了模型的表达能力,在节点分类任务上比GraphSAGE有了明显的提升。
上图展示了GCN和GAN在聚合邻居节点信息时候的不同。
信息传递机制:从邻居节点中聚集信息,用来更新中心节。如下图所示:红色节点 s 1 s1 s1的邻居节点是蓝色 B 1 , B 2 , B 3 B1,B2,B3 B1,B2,B3。通过一定的信息传递机制,将信息聚合到红色节点上。
加入一个线性变换矩阵 W W W,作为聚合邻居节点的转换矩阵:
∑ u ∈ N ( v ) H ( l ) ( u ) W ( l ) \sum_{u\in\mathcal N(v)}\bf H^{(l)}(u)\bf W^{(l)} u∈N(v)∑H(l)(u)W(l)
写成矩阵形式有:
H ( l + 1 ) = ( H ( l ) , A ) = δ ( A H ( l ) W ( l ) ) \bf H^{(l+1)}=(\bf H^{(l)},\bf A)=\delta(\bf{AH^{(l)}W^{(l)}}) H(l+1)=(H(l),A)=δ(AH(l)W(l))
上式中 H ( l ) W ( l ) \bf{H^{(l)}W^{(l)}} H(l)W(l)乘以邻接矩阵 A \bf A A,本质上是选择一阶邻居节点,以实现信息传递。信息聚合时考虑中心节点本身的信息,可以在图中加入一个自环:
A ~ = A + I N D i i ~ = ∑ j A ~ i j \tilde{\bf A}=\bf{A+I_N}\\ \tilde{\bf D_{ii}}=\sum_{j}\tilde{\bf A}_{ij} A~=A+INDii~=j∑A~ij
标准化邻接矩阵 A \bf A A使得每行之和为1: A ~ = D ~ − 1 A ~ \tilde{\bf A}=\tilde{\bf D}^{-1}\tilde{\bf A} A~=D~−1A~
举例说明:
A = { 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 0 1 0 0 0 0 0 1 0 0 } , D = { 2 0 0 0 0 0 0 3 0 0 0 0 0 0 2 0 0 0 0 0 0 3 0 0 0 0 0 0 3 0 0 0 0 0 0 1 } A ~ = A + I N = { 1 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 1 1 0 0 0 0 1 0 1 } , \bf A=\left\{ \begin{matrix} 0&1&0&0&1&0\\ 1&0&1&0&1&0\\ 0&1&0&1&0&0\\ 0&0&1&0&1&1\\ 1&1&0&1&0&0\\ 0&0&0&1&0&0 \end{matrix} \right\}, \bf D=\left\{ \begin{matrix} 2&0&0&0&0&0\\ 0&3&0&0&0&0\\ 0&0&2&0&0&0\\ 0&0&0&3&0&0\\ 0&0&0&0&3&0\\ 0&0&0&0&0&1 \end{matrix} \right\} \tilde{\bf A}=\bf A+\bf I_N=\left\{ \begin{matrix} 1&1&0&0&1&0\\ 1&1&1&0&1&0\\ 0&1&1&1&0&0\\ 0&0&1&1&1&1\\ 1&1&0&1&1&0\\ 0&0&0&1&0&1 \end{matrix} \right\}, A=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧010010101010010100001011110100000100⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫,D=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧200000030000002000000300000030000001⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫A~=A+IN=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧110010111010011100001111110110000101⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫,
D ~ = ∑ j A ~ i j = D + I N = { 3 0 0 0 0 0 0 4 0 0 0 0 0 0 3 0 0 0 0 0 0 4 0 0 0 0 0 0 4 0 0 0 0 0 0 2 } \tilde{\bf D}=\sum_{j}\tilde{\bf A}_{ij}=\bf {D+I_N}=\left\{ \begin{matrix} 3&0&0&0&0&0\\ 0&4&0&0&0&0\\ 0&0&3&0&0&0\\ 0&0&0&4&0&0\\ 0&0&0&0&4&0\\ 0&0&0&0&0&2 \end{matrix} \right\} D~=j∑A~ij=D+IN=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧300000040000003000000400000040000002⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫
归一化后:
D ~ − 1 A ~ = { 1 / 3 0 0 0 0 0 0 1 / 4 0 0 0 0 0 0 1 / 3 0 0 0 0 0 0 1 / 4 0 0 0 0 0 0 1 / 4 0 0 0 0 0 0 1 / 2 } ⋅ { 1 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 1 1 0 0 0 0 1 0 1 } \tilde{\bf D}^{-1}\tilde{\bf A}=\left\{ \begin{matrix} 1/3&0&0&0&0&0\\ 0&1/4&0&0&0&0\\ 0&0&1/3&0&0&0\\ 0&0&0&1/4&0&0\\ 0&0&0&0&1/4&0\\ 0&0&0&0&0&1/2 \end{matrix} \right\}\cdot \left\{ \begin{matrix} 1&1&0&0&1&0\\ 1&1&1&0&1&0\\ 0&1&1&1&0&0\\ 0&0&1&1&1&1\\ 1&1&0&1&1&0\\ 0&0&0&1&0&1 \end{matrix} \right\} D~−1A~=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧1/30000001/40000001/30000001/40000001/40000001/2⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫⋅⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧110010111010011100001111110110000101⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫
= { 1 / 3 1 / 3 0 0 1 / 3 0 1 / 4 1 / 4 1 / 4 0 1 / 4 0 0 1 / 3 1 / 3 1 / 3 0 0 0 0 1 / 4 1 / 4 1 / 4 1 / 4 1 / 4 1 / 4 0 1 / 4 1 / 4 0 0 0 0 1 / 2 0 1 / 2 } = \left\{ \begin{matrix} 1/3&1/3&0&0&1/3&0\\ 1/4&1/4&1/4&0&1/4&0\\ 0&1/3&1/3&1/3&0&0\\ 0&0&1/4&1/4&1/4&1/4\\ 1/4&1/4&0&1/4&1/4&0\\ 0&0&0&1/2&0&1/2 \end{matrix} \right\} =⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧1/31/4001/401/31/41/301/4001/41/31/400001/31/41/41/21/31/401/41/400001/401/2⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫
上式对邻接矩阵进行了标准化 D ~ − 1 A ~ \tilde{\bf D}^{-1}\tilde{\bf A} D~−1A~,称之为random walk normalization。在实际应用中,经常使用的re-normalization:
A ~ = D ~ − 1 / 2 A D ~ − 1 / 2 \tilde{\bf A}=\tilde{\bf D}^{-1/2}\tilde{\bf A\bf D}^{-1/2} A~=D~−1/2AD~−1/2
D ~ − 1 / 2 = { 1 3 0 0 0 0 0 0 1 4 0 0 0 0 0 0 1 3 0 0 0 0 0 0 1 4 0 0 0 0 0 0 1 4 0 0 0 0 0 0 1 2 } A ~ = D ~ − 1 / 2 A D ~ − 1 / 2 = { 1 3 0 0 0 0 0 0 1 4 0 0 0 0 0 0 1 3 0 0 0 0 0 0 1 4 0 0 0 0 0 0 1 4 0 0 0 0 0 0 1 2 } ⋅ { 1 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 1 1 0 0 0 0 1 0 1 } ⋅ { 1 3 0 0 0 0 0 0 1 4 0 0 0 0 0 0 1 3 0 0 0 0 0 0 1 4 0 0 0 0 0 0 1 4 0 0 0 0 0 0 1 2 } = { 1 9 1 12 0 0 1 12 0 1 12 1 16 1 12 0 1 16 0 0 1 12 1 9 1 12 0 0 0 0 1 12 1 16 1 16 1 8 1 12 1 16 0 1 16 1 16 0 0 0 0 1 8 0 1 4 } \tilde{\bf D}^{-1/2}=\left\{ \begin{matrix} \frac{1}{\sqrt{3}}&0&0&0&0&0\\ 0&\frac{1}{\sqrt{4}}&0&0&0&0\\ 0&0&\frac{1}{\sqrt{3}}&0&0&0\\ 0&0&0&\frac{1}{\sqrt{4}}&0&0\\ 0&0&0&0&\frac{1}{\sqrt{4}}&0\\ 0&0&0&0&0&\frac{1}{\sqrt{2}} \end{matrix} \right\}\\ \tilde{\bf A}=\tilde{\bf D}^{-1/2}\tilde{\bf A\bf D}^{-1/2}=\left\{ \begin{matrix} \frac{1}{\sqrt{3}}&0&0&0&0&0\\ 0&\frac{1}{\sqrt{4}}&0&0&0&0\\ 0&0&\frac{1}{\sqrt{3}}&0&0&0\\ 0&0&0&\frac{1}{\sqrt{4}}&0&0\\ 0&0&0&0&\frac{1}{\sqrt{4}}&0\\ 0&0&0&0&0&\frac{1}{\sqrt{2}} \end{matrix} \right\}\cdot \left\{ \begin{matrix} 1&1&0&0&1&0\\ 1&1&1&0&1&0\\ 0&1&1&1&0&0\\ 0&0&1&1&1&1\\ 1&1&0&1&1&0\\ 0&0&0&1&0&1 \end{matrix} \right\} \cdot \left\{ \begin{matrix} \frac{1}{\sqrt{3}}&0&0&0&0&0\\ 0&\frac{1}{\sqrt{4}}&0&0&0&0\\ 0&0&\frac{1}{\sqrt{3}}&0&0&0\\ 0&0&0&\frac{1}{\sqrt{4}}&0&0\\ 0&0&0&0&\frac{1}{\sqrt{4}}&0\\ 0&0&0&0&0&\frac{1}{\sqrt{2}} \end{matrix} \right\}\\ =\left\{ \begin{matrix} \frac{1}{\sqrt{9}}&\frac{1}{\sqrt{12}}&0&0&\frac{1}{\sqrt{12}}&0\\ \frac{1}{\sqrt{12}}&\frac{1}{\sqrt{16}}&\frac{1}{\sqrt{12}}&0&\frac{1}{\sqrt{16}}&0\\ 0&\frac{1}{\sqrt{12}}&\frac{1}{\sqrt{9}}&\frac{1}{\sqrt{12}}&0&0\\ 0&0&\frac{1}{\sqrt{12}}&\frac{1}{\sqrt{16}}&\frac{1}{\sqrt{16}}&\frac{1}{\sqrt{8}}\\ \frac{1}{\sqrt{12}}&\frac{1}{\sqrt{16}}&0&\frac{1}{\sqrt{16}}&\frac{1}{\sqrt{16}}&0\\ 0&0&0&\frac{1}{\sqrt{8}}&0&\frac{1}{\sqrt{4}} \end{matrix} \right\} D~−1/2=⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧310000004100000031000000410000004100000021⎭⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎫A~=D~−1/2AD~−1/2=⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧310000004100000031000000410000004100000021⎭⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎫⋅⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧110010111010011100001111110110000101⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫⋅⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧310000004100000031000000410000004100000021⎭⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎫=⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧91121001210121161121016100121911210000121161161811211610