1. 邻接矩阵归一化
在GCN中,我们常对邻接矩阵
A
A
A进行归一化处理,无论是随机游走归一化还是对称归一化,网上的文章都提到了同一点:
度大的节点在其特征表征中将具有较大的值,度小的节点将具有较小的值。这可能会导致梯度消失或梯度爆炸,也会影响随机梯度下降算法(随机梯度下降算法通常被用于训练这类网络,且对每个输入特征的规模(或值的范围)都很敏感)
1.1 随机游走归一化
简单起见,我们以随机游走归一化[1]为例:
图卷积的原始思想对应公式为:
H
(
l
+
1
)
=
σ
(
A
H
(
l
)
W
(
l
)
)
H^{(l+1)}=\sigma(AH^{(l)}W^{(l)})
H(l+1)=σ(AH(l)W(l))
其中
l
l
l为网络层数,另
(
A
H
)
i
=
A
i
H
=
∑
j
A
i
j
H
j
(AH)_i=A_iH=\sum_j A_{ij}H_j
(AH)i=AiH=∑jAijHj,即图卷积是对邻居节点的特征加权求和。
但它存在两个问题:
- 只考虑了邻居节点而忽略自己——为节点添加自连接,实现上用 A ~ = A + I \tilde A=A+I A~=A+I替代 A A A
- 度大的节点在其特征表征中将具有较大的值,度小的节点将具有较小的值。这会导致数值不稳定,且有可能产生梯度消失或梯度爆炸——使用随机游走归一化,用
D
~
=
D
+
I
\tilde D = D+I
D~=D+I替代D,
D
~
−
1
A
~
\tilde D^{-1}\tilde A
D~−1A~替代
A
~
\tilde A
A~,这里:
( D ~ − 1 A ~ H ) i = ( D ~ − 1 A ~ ) i H = ( ∑ k D ~ i k − 1 A ~ i ) H = ( D ~ i i − 1 A ~ i ) H = ( D ~ i i − 1 ) ∑ j A ~ i j H j = ∑ j 1 D ~ i i A ~ i j H j (\tilde D^{-1}\tilde AH)_i = (\tilde D^{-1}\tilde A)_iH =(\sum_k \tilde D^{-1}_{ik}\tilde A_i)H =(\tilde{D}_{ii}^{-1}{\tilde A_{i}})H =(\tilde{D}_{ii}^{-1})\sum_j{\tilde A_{ij}}H_j\\ =\sum_j\frac{1}{\tilde D_{ii}}\tilde A_{ij}H_j (D~−1A~H)i=(D~−1A~)iH=(k∑D~ik−1A~i)H=(D~ii−1A~i)H=(D~ii−1)j∑A~ijHj=j∑D~ii1A~ijHj
由此可知,随机游走归一化相当于实现了对邻居节点特征之和的求平均,由此解决了特征数值不稳定的问题,但这和梯度消失、梯度爆炸有什么关系呢?
而在介绍反向传播、梯度消失和梯度爆炸的文章中则指出,梯度消失和梯度爆炸是由于激活函数 σ \sigma σ或权重 W W W过大或过小导致的。
那么究竟归一化是如何避免梯度消失和梯度爆炸的呢?
要知道GCN的梯度消失和梯度爆炸如何避免,就要先了解GCN的反向传播:
2. GCN反向传播
2.1 随机梯度下降
随机梯度下降(SGD)[2]更新梯度方法如下:
θ
t
+
1
=
θ
t
−
α
1
K
∑
(
x
,
y
)
∈
δ
t
∂
L
(
y
,
f
(
x
,
θ
)
)
∂
θ
(
1
)
\theta_{t+1} = \theta_t - \alpha \frac{1}{K} \sum_{(x,y)\in \delta_t} \frac{\partial L(y,f(x,\theta))}{\partial\theta}\ \ \ (1)
θt+1=θt−αK1(x,y)∈δt∑∂θ∂L(y,f(x,θ)) (1)
要更新权重
W
W
W,则要计算:
W
t
+
1
=
W
t
−
α
1
K
∑
(
x
,
y
)
∈
δ
t
∂
L
(
y
,
f
(
x
,
w
)
)
∂
W
W_{t+1}=W_t - \alpha\frac{1}{K} \sum_{(x,y)\in\delta_t}\frac{\partial{L(y,f(x,w))}}{\partial W}
Wt+1=Wt−αK1(x,y)∈δt∑∂W∂L(y,f(x,w))
而其中关键是计算
∂
L
∂
W
\frac{\partial L}{\partial W}
∂W∂L,而
∂
L
∂
W
=
∂
L
∂
z
∂
z
∂
W
\frac{\partial L}{\partial W} = \frac{\partial L}{\partial z}\frac{\partial z}{\partial W}
∂W∂L=∂z∂L∂W∂z(
z
z
z是神经元的输出),将第一项
∂
L
∂
z
\frac{\partial L}{\partial z}
∂z∂L定义为误差
δ
\delta
δ,那么就可以先求出误差,再求第二项
∂
z
∂
W
\frac{\partial z}{\partial W}
∂W∂z,再根据上式(1)更新参数。
2.2 GCN的前向传播和反向传播
GCN前向传播为:
Z
(
l
+
1
)
=
P
H
(
l
)
W
(
l
)
,
H
(
l
+
1
)
=
σ
(
Z
(
l
+
1
)
)
Z^{(l+1)} = PH^{(l)}W^{(l)},\ H^{(l+1)}=\sigma(Z^{(l+1)})
Z(l+1)=PH(l)W(l), H(l+1)=σ(Z(l+1))
其中
l
l
l为网络层数,
P
P
P为归一化后的邻接矩阵
A
A
A,前馈计算每层输入
z
(
l
)
z^{(l)}
z(l)和激活值
a
(
l
)
a^{(l)}
a(l)直到最后一层,再计算每层误差
δ
(
l
)
\delta^{(l)}
δ(l):
δ
(
l
)
=
∂
L
∂
Z
=
∂
L
∂
H
(
l
)
∂
H
(
l
)
∂
Z
(
l
)
=
∂
L
∂
Z
(
l
+
1
)
∂
Z
(
l
+
1
)
∂
H
(
l
)
∂
H
(
l
)
∂
Z
(
l
)
(
2
)
\delta^{(l)} = \frac{\partial{L}}{\partial{Z}} = \frac{\partial{L}}{\partial{H^{(l)}}}\frac{\partial{H^{(l)}}}{\partial{Z^{(l)}}} = \frac{\partial{L}}{\partial{Z^{(l+1)}}}\frac{\partial{Z^{(l+1)}}}{\partial{H^{(l)}}}\frac{\partial{H^{(l)}}}{\partial{Z^{(l)}}}\ \ \ (2)
δ(l)=∂Z∂L=∂H(l)∂L∂Z(l)∂H(l)=∂Z(l+1)∂L∂H(l)∂Z(l+1)∂Z(l)∂H(l) (2)
根据前向传播可推得误差传播公式:
δ
(
l
)
=
δ
(
l
+
1
)
P
T
W
(
l
)
σ
′
(
Z
(
l
)
)
\delta^{(l)}=\delta^{(l+1)}P^TW^{(l)}\sigma^\prime(Z^{(l)})
δ(l)=δ(l+1)PTW(l)σ′(Z(l))
得到误差传播公式后,还需要计算参数的导数
∂
L
∂
W
(
l
)
=
∂
L
∂
Z
(
l
+
1
)
∂
Z
(
l
+
1
)
∂
W
(
l
)
=
δ
(
l
+
1
)
∂
Z
(
l
+
1
)
∂
W
(
l
)
\frac{\partial{L}}{\partial{W^{(l)}}}=\frac{\partial{L}}{\partial{Z^{(l+1)}}}\frac{\partial{Z^{(l+1)}}}{\partial{W^{(l)}}}=\delta^{(l+1)}\frac{\partial{Z^{(l+1)}}}{\partial{W^{(l)}}}
∂W(l)∂L=∂Z(l+1)∂L∂W(l)∂Z(l+1)=δ(l+1)∂W(l)∂Z(l+1),因此现在只需计算:
∂
Z
(
l
+
1
)
∂
W
(
l
)
=
∂
(
P
H
(
l
)
W
(
l
)
)
∂
W
(
l
)
=
(
P
H
(
l
)
)
T
(
3
)
\frac{\partial{Z^{(l+1)}}}{\partial{W^{(l)}}} = \frac{\partial {(PH^{(l)}}W^{(l)})}{\partial W^{(l)}} =(PH^{(l)})^T\ \ \ (3)
∂W(l)∂Z(l+1)=∂W(l)∂(PH(l)W(l))=(PH(l))T (3)
然后根据求得参数导数和式(1)更新参数即可,这就是GCN的反向传播过程。
由式(3)可知,每层的梯度计算都需要用到前一层的特征,因此特征数值不稳定就会导致梯度不稳定 随层数加深出现梯度消失和梯度爆炸,而归一化解决了特征数值不稳定的问题,从而解决了梯度消失和梯度爆炸问题。
[1] 深度学习:GCN(图卷积神经网络)理论学习总结
[2] GCN的反向传播推导