网络值通过线性层变为 0
network values goes to 0 by linear layers
我设计了图形注意力网络。
然而,在层内的操作过程中,特征值变得相等。
class GraphAttentionLayer(nn.Module):
## in_features = out_features = 1024
def __init__(self, in_features, out_features, dropout):
super(GraphAttentionLayer, self).__init__()
self.dropout = dropout
self.in_features = in_features
self.out_features = out_features
self.W = nn.Parameter(torch.zeros(size=(in_features, out_features)))
self.a1 = nn.Parameter(torch.zeros(size=(out_features, 1)))
self.a2 = nn.Parameter(torch.zeros(size=(out_features, 1)))
nn.init.xavier_normal_(self.W.data, gain=1.414)
nn.init.xavier_normal_(self.a1.data, gain=1.414)
nn.init.xavier_normal_(self.a2.data, gain=1.414)
self.leakyrelu = nn.LeakyReLU()
def forward(self, input, adj):
h = torch.mm(input, self.W)
a_input1 = torch.mm(h, self.a1)
a_input2 = torch.mm(h, self.a2)
a_input = torch.mm(a_input1, a_input2.transpose(1, 0))
e = self.leakyrelu(a_input)
zero_vec = torch.zeros_like(e)
attention = torch.where(adj > 0, e, zero_vec) # most of values is close to 0
attention = F.softmax(attention, dim=1) # all values are 0.0014 which is 1/707 (707^2 is the dimension of attention)
attention = F.dropout(attention, self.dropout)
return attention
'attention' 的维度是 (707 x 707),我观察到在 softmax 之前注意力值接近 0。
在softmax之后,所有的值都是0.0014,也就是1/707.
我想知道如何保持数值正常化并防止这种情况。
谢谢
既然你说这发生在训练期间,我会假设它是在开始时。通过随机初始化,您通常会在训练过程开始时在网络末端获得接近相同的值。
当所有值或多或少相等时,每个元素的 softmax 输出将为 1/num_elements
,因此它们在您选择的维度上总和为 1。所以在你的情况下你得到 1/707
作为所有值,这对我来说听起来你的权重是新初始化的并且输出在这个阶段大部分是随机的。
我会让它训练一段时间,然后观察它是否有变化。
我设计了图形注意力网络。
然而,在层内的操作过程中,特征值变得相等。
class GraphAttentionLayer(nn.Module):
## in_features = out_features = 1024
def __init__(self, in_features, out_features, dropout):
super(GraphAttentionLayer, self).__init__()
self.dropout = dropout
self.in_features = in_features
self.out_features = out_features
self.W = nn.Parameter(torch.zeros(size=(in_features, out_features)))
self.a1 = nn.Parameter(torch.zeros(size=(out_features, 1)))
self.a2 = nn.Parameter(torch.zeros(size=(out_features, 1)))
nn.init.xavier_normal_(self.W.data, gain=1.414)
nn.init.xavier_normal_(self.a1.data, gain=1.414)
nn.init.xavier_normal_(self.a2.data, gain=1.414)
self.leakyrelu = nn.LeakyReLU()
def forward(self, input, adj):
h = torch.mm(input, self.W)
a_input1 = torch.mm(h, self.a1)
a_input2 = torch.mm(h, self.a2)
a_input = torch.mm(a_input1, a_input2.transpose(1, 0))
e = self.leakyrelu(a_input)
zero_vec = torch.zeros_like(e)
attention = torch.where(adj > 0, e, zero_vec) # most of values is close to 0
attention = F.softmax(attention, dim=1) # all values are 0.0014 which is 1/707 (707^2 is the dimension of attention)
attention = F.dropout(attention, self.dropout)
return attention
'attention' 的维度是 (707 x 707),我观察到在 softmax 之前注意力值接近 0。
在softmax之后,所有的值都是0.0014,也就是1/707.
我想知道如何保持数值正常化并防止这种情况。
谢谢
既然你说这发生在训练期间,我会假设它是在开始时。通过随机初始化,您通常会在训练过程开始时在网络末端获得接近相同的值。
当所有值或多或少相等时,每个元素的 softmax 输出将为 1/num_elements
,因此它们在您选择的维度上总和为 1。所以在你的情况下你得到 1/707
作为所有值,这对我来说听起来你的权重是新初始化的并且输出在这个阶段大部分是随机的。
我会让它训练一段时间,然后观察它是否有变化。