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 优化器的支持是实验性的。
- 参数:
示例
>>> 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}\) 是在步骤 \(t\) 时嵌入 \(i\) 的维度 \(j\) 的梯度。
注意:对稀疏 Adam 优化器的支持是实验性的。
- 参数:
params (list[dgl.nn.NodeEmbeddings]) – dgl.nn.NodeEmbeddings 的列表。
lr (float) – 学习率。
betas (tuple[float, float], Optional) – 用于计算梯度及其平方的移动平均值的系数。默认值: (0.9, 0.999)
eps (float, Optional) – 添加到分母以提高数值稳定性的项。默认值: 1e-8
use_uva (bool, Optional) – 当嵌入存储在 CPU 上时,是否使用固定内存(pinned memory)存储 '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()