问题描述
我正在尝试在 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 (将#修改为@)