图神经网络中的梯度值非常低

问题描述

我正在使用 Pytorch-Geometric 库为回归问题实现图神经网络。模型定义为:

import torch
from torch.nn.parameter import Parameter
import torch.optim as optim
import torch.nn.functional as F
import torch.nn as nn
from torch_geometric.nn import GCNConv

class Model(nn.Module):
    def __init__(self,nin=1,nhid1=128,nout=128,hid_l=64,out_l=1):
        super(Model,self).__init__()
       
        self.gc1 = GCNConv(in_channels= nin,out_channels= nhid1)
        self.gc2 = GCNConv(in_channels= nhid1,out_channels= nout)
        self.lay1 = nn.Linear(nout,hid_l)
        self.l0 = nn.Linear(hid_l,hid_l)
        self.l1 = nn.Linear(hid_l,hid_l)
        self.lay2 = nn.Linear(hid_l,out_l)
        self.active = nn.LeakyReLU(0.1)
       
        with torch.no_grad():
            self.gc1.weight = Parameter(nn.init.uniform_(torch.empty(nin,nhid1),a=0.0,b=1.0))
            self.gc1.bias = Parameter(nn.init.uniform_(torch.empty(nhid1),b=1.0))
            self.gc2.weight = Parameter(nn.init.uniform_(torch.empty(nhid1,nout),b=1.0))
            self.gc2.bias = Parameter(nn.init.uniform_(torch.empty(nout),b=1.0))
            self.lay1.weight = Parameter(nn.init.uniform_(torch.empty(hid_l,nout ),b=1.0))
            self.l0.weight = Parameter(nn.init.uniform_(torch.empty(hid_l,hid_l),b=1.0))
            self.l1.weight = Parameter(nn.init.uniform_(torch.empty(hid_l,b=1.0))
            self.lay2.weight = Parameter(nn.init.uniform_(torch.empty(out_l,b=1.0))
                       

    def forward(self,features,edge_list):
        x = self.active(self.gc1(features,edge_list))
        x = self.active(self.gc2(x,edge_list))
        x = self.active(self.lay1(x))
        x = self.active(self.l0(x))
        x = self.active(self.l1(x))
        x = self.active(self.lay2(x))
       
        return x

其中 features 是维度 [n X 1] 的特征矩阵,edge_list 是 Pytorch-Geometric 中使用的边缘索引。即使使用批量梯度下降仅训练 40 个 epoch,梯度似乎也有非常陡峭的下降。我正在训练具有大约 1K 个节点和 ~3K 个边的无标度图。我该怎么做才能获得更好的梯度值?

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)