dgl.optim

用于PyTorch的DGL稀疏优化器。

节点嵌入优化器

class dgl.optim.pytorch.SparseAdagrad(params, lr, eps=1e-10)[source]

使用Adagrad算法的节点嵌入优化器。

此优化器实现了Adagrad算法的稀疏版本,用于优化dgl.nn.NodeEmbedding。稀疏意味着它只更新那些梯度有更新的嵌入,这些嵌入通常是总嵌入中非常小的一部分。

Adagrad 为嵌入中的每个参数维护一个 \(G_{t,i,j}\),其中 \(G_{t,i,j}=G_{t-1,i,j} + g_{t,i,j}^2\) 并且 \(g_{t,i,j}\) 是在步骤 \(t\) 时嵌入 \(i\) 的维度 \(j\) 的梯度。

注意:稀疏Adagrad优化器的支持是实验性的。

Parameters:
  • params (list[dgl.nn.NodeEmbedding]) – dgl.nn.NodeEmbedding 的列表。

  • lr (float) – 学习率。

  • eps (float, Optional) – 添加到分母以提高数值稳定性的项 默认值:1e-10

示例

>>> def initializer(emb):
        th.nn.init.xavier_uniform_(emb)
        return emb
>>> emb = dgl.nn.NodeEmbedding(g.num_nodes(), 10, 'emb', init_func=initializer)
>>> optimizer = dgl.optim.SparseAdagrad([emb], lr=0.001)
>>> for blocks in dataloader:
...     ...
...     feats = emb(nids, gpu_0)
...     loss = F.sum(feats + 1, 0)
...     loss.backward()
...     optimizer.step()
class dgl.optim.pytorch.SparseAdam(params, lr, betas=(0.9, 0.999), eps=1e-08, use_uva=None, dtype=torch.float32)[source]

使用Adam算法的节点嵌入优化器。

此优化器实现了Adagrad算法的稀疏版本,用于优化dgl.nn.NodeEmbedding。稀疏意味着它只更新那些梯度有更新的嵌入,这些嵌入通常是总嵌入中非常小的一部分。

Adam 为嵌入中的每个参数维护一个 \(Gm_{t,i,j}\)Gp_{t,i,j},其中 \(Gm_{t,i,j}=beta1 * Gm_{t-1,i,j} + (1-beta1) * g_{t,i,j}\), \(Gp_{t,i,j}=beta2 * Gp_{t-1,i,j} + (1-beta2) * g_{t,i,j}^2\), \(g_{t,i,j} = lr * Gm_{t,i,j} / (1 - beta1^t) / \sqrt{Gp_{t,i,j} / (1 - beta2^t)}\) 并且 \(g_{t,i,j}\) 是嵌入 \(i\) 的维度 \(j\) 在步骤 \(t\) 的梯度。

注意:稀疏Adam优化器的支持是实验性的。

Parameters:
  • params (list[dgl.nn.NodeEmbedding]) – dgl.nn.NodeEmbeddings 的列表。

  • lr (float) – 学习率。

  • betas (tuple[float, float], Optional) – 用于计算梯度及其平方的运行平均值的系数。 默认值: (0.9, 0.999)

  • eps (float, Optional) – 添加到分母中以提高数值稳定性的项 默认值:1e-8

  • use_uva (bool, Optional) – 当嵌入存储在CPU上时,是否使用固定内存来存储‘mem’和‘power’参数。这将提高训练速度,但需要锁定大量的虚拟内存页面。对于存储在GPU内存中的嵌入,此设置将无效。 默认值:如果梯度在GPU上生成,则为True;如果梯度在CPU上生成,则为False。

  • dtype (torch.dtype, Optional) – 用于存储优化器状态的类型。默认值:th.float32。

示例

>>> def initializer(emb):
        th.nn.init.xavier_uniform_(emb)
        return emb
>>> emb = dgl.nn.NodeEmbedding(g.num_nodes(), 10, 'emb', init_func=initializer)
>>> optimizer = dgl.optim.SparseAdam([emb], lr=0.001)
>>> for blocks in dataloader:
...     ...
...     feats = emb(nids, gpu_0)
...     loss = F.sum(feats + 1, 0)
...     loss.backward()
...     optimizer.step()