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:
示例
>>> 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()