使用 PyTorch 进行投影梯度下降

问题描述

我正在尝试在 PyTorch 中执行约束优化。具体来说,优化的张量 H 需要所有元素都为非负,并且其总和必须等于 budget=1。即

H_i =>0 对于 H 中的所有 H_i 和 torch.sum(H)==budget (条件 1)

这是一个非常简单的优化,尽管添加约束不会产生正确的结果。

我的代码如下:

per_spin = (budget)/system.graph_size
H = per_spin*torch.ones(system.graph_size,dtype=torch.float64)
H.requires_grad=True
opt = optim.SGD([H],lr=0.1)

epochs = 100
for i in range(epochs):
    opt.zero_grad()
    output = -magnetisation(system,H,0.1) 
    H=projection_simplex_sort_torch(H,z=budget) # this function constraints H tensor
    output.backward(retain_graph=True)
    opt.step()

投影单纯形排序torch函数依次由下式给出:

def projection_simplex_sort_torch(v,z=1):
    n_features = v.shape[0]
    indices,u = torch.sort(v,descending=True)[::-1]
    cssv = torch.cumsum(u,dim=0) - z
    ind = torch.arange(n_features) + 1
    cond = u - cssv / ind > 0
    rho = ind[cond][-1]
    theta = cssv[cond][-1] / float(rho)
    w = v.clone()
    w.subtract_(theta)
    torch.nn.functional.relu(w,inplace=True)
    return w 

并确保满足(条件 1)。 以下代码不起作用,因为它不会改变在整个代码执行过程中保持不变的 H 值。

我们如何修改projection_simplex_sort_torch,使其尊重H的梯度和优化问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)