边权重归一化

class dgl.nn.pytorch.conv.EdgeWeightNorm(norm='both', eps=0.0)[source]

Bases: Module

该模块根据GCN中的形式对图上的正标量边权重进行归一化。

在数学上,设置 norm='both' 会产生以下归一化项:

\[c_{ji} = (\sqrt{\sum_{k\in\mathcal{N}(j)}e_{jk}}\sqrt{\sum_{k\in\mathcal{N}(i)}e_{ki}})\]

并且,设置 norm='right' 会产生以下归一化项:

\[c_{ji} = (\sum_{k\in\mathcal{N}(i)}e_{ki})\]

其中 \(e_{ji}\) 是从节点 \(j\) 到节点 \(i\) 的边上的标量权重。

该模块返回归一化的权重 \(e_{ji} / c_{ji}\)

Parameters:
  • norm (str, optional) – 如上所述的标准器。默认值为 ‘both’

  • eps (float, optional) – 分母中的一个小偏移值。默认值为0。

示例

>>> import dgl
>>> import numpy as np
>>> import torch as th
>>> from dgl.nn import EdgeWeightNorm, GraphConv
>>> g = dgl.graph(([0,1,2,3,2,5], [1,2,3,4,0,3]))
>>> g = dgl.add_self_loop(g)
>>> feat = th.ones(6, 10)
>>> edge_weight = th.tensor([0.5, 0.6, 0.4, 0.7, 0.9, 0.1, 1, 1, 1, 1, 1, 1])
>>> norm = EdgeWeightNorm(norm='both')
>>> norm_edge_weight = norm(g, edge_weight)
>>> conv = GraphConv(10, 2, norm='none', weight=True, bias=True)
>>> res = conv(g, feat, edge_weight=norm_edge_weight)
>>> print(res)
tensor([[-1.1849, -0.7525],
        [-1.3514, -0.8582],
        [-1.2384, -0.7865],
        [-1.9949, -1.2669],
        [-1.3658, -0.8674],
        [-0.8323, -0.5286]], grad_fn=<AddBackward0>)
forward(graph, edge_weight)[source]

Description

为GCN模型计算归一化的边权重。

param graph:

图表。

type graph:

DGLGraph

param edge_weight:

边上的未归一化标量权重。 形状应为 \((|E|)\)

type edge_weight:

torch.Tensor

returns:

归一化的边权重。

rtype:

torch.Tensor

raises DGLError:

案例1: 边的权重是多维的。目前这个模块 只支持每条边上的标量权重。 案例2: 边的权重具有非正值,且使用了norm='both'。 这将触发平方根和除以非正数的操作。