在GCN中,我们常对邻接矩阵 A A A进行归一化处理,无论是随机游走归一化还是对称归一化,网上的文章都提到了同一点:
度大的节点在其特征表征中将具有较大的值,度小的节点将具有较小的值。这可能会导致梯度消失或梯度爆炸,也会影响随机梯度下降算法(随机梯度下降算法通常被用于训练这类网络,且对每个输入特征的规模(或值的范围)都很敏感)
简单起见,我们以随机游走归一化[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,即图卷积是对邻居节点的特征加权求和。
但它存在两个问题:
而在介绍反向传播、梯度消失和梯度爆炸的文章中则指出,梯度消失和梯度爆炸是由于激活函数 σ \sigma σ或权重 W W W过大或过小导致的。
那么究竟归一化是如何避免梯度消失和梯度爆炸的呢?
要知道GCN的梯度消失和梯度爆炸如何避免,就要先了解GCN的反向传播:
随机梯度下降(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)更新参数。
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的反向传播推导